From 7a4cae77ccfca1ade80a76be7585b42b3d31c2d1 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 13 Oct 2017 09:59:38 +0200 Subject: Fix crash due to inconsistent state in QLEController during JobDisconnectDevice This bug was caused by a problem in the patch for QTBUG-55150. While the termination of an ongoing BTLE connection is being processed, the QLEController instance is in Connecting state and the internal socket is still null. If the user triggers a call to QLEController::disconnectDevice() while the above state is pending, it crashes due to a call to the socket's close() function. The time window for this to happen is very small. It takes the duration of the bluez dbus call to disconnect a device. This patch addresses the above crash bug and adds a bit more debug output to catch similar cases later on. Task-number: QTBUG-63619 Change-Id: I893990a9ce8ccf55ddbf619fe177379f79dc9ee3 Reviewed-by: Timur Pocheptsov Reviewed-by: Oliver Wolff --- src/bluetooth/bluez/remotedevicemanager.cpp | 5 ++++- src/bluetooth/qlowenergycontroller_bluez.cpp | 15 +++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/bluetooth/bluez/remotedevicemanager.cpp b/src/bluetooth/bluez/remotedevicemanager.cpp index f63b21e6..5d17d571 100644 --- a/src/bluetooth/bluez/remotedevicemanager.cpp +++ b/src/bluetooth/bluez/remotedevicemanager.cpp @@ -106,6 +106,7 @@ void RemoteDeviceManager::prepareNextJob() jobQueue.pop_front(); jobInProgress = false; + qDebug(QT_BT_BLUEZ) << "RemoteDeviceManager job queue status:" << jobQueue.empty(); if (jobQueue.empty()) emit finished(); else @@ -163,8 +164,10 @@ void RemoteDeviceManager::disconnectDevice(const QBluetoothAddress &remote) } } - if (!jobStarted) + if (!jobStarted) { + qDebug(QT_BT_BLUEZ) << "RemoteDeviceManager JobDisconnectDevice failed"; QTimer::singleShot(0, this, [this](){ prepareNextJob(); }); + } } QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index 0744bcc4..d80389da 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -527,8 +527,10 @@ void QLowEnergyControllerPrivate::connectToDevice() } setState(QLowEnergyController::ConnectingState); - if (l2cpSocket) + if (l2cpSocket) { delete l2cpSocket; + l2cpSocket = nullptr; + } createServicesForCentralIfRequired(); @@ -581,6 +583,7 @@ void QLowEnergyControllerPrivate::activeConnectionTerminationDone() qCWarning(QT_BT_BLUEZ) << "Cannot close pending external BTLE connections. Aborting connect attempt"; setError(QLowEnergyController::ConnectionError); setState(QLowEnergyController::UnconnectedState); + l2cpDisconnected(); return; } else { establishL2cpClientSocket(); @@ -726,8 +729,16 @@ void QLowEnergyControllerPrivate::l2cpConnected() void QLowEnergyControllerPrivate::disconnectFromDevice() { setState(QLowEnergyController::ClosingState); - l2cpSocket->close(); + if (l2cpSocket) + l2cpSocket->close(); resetController(); + + // this may happen when RemoteDeviceManager::JobType::JobDisconnectDevice + // is pending. + if (!l2cpSocket) { + qWarning(QT_BT_BLUEZ) << "Unexpected closure of device. Cleaning up internal states."; + l2cpDisconnected(); + } } void QLowEnergyControllerPrivate::l2cpDisconnected() -- cgit v1.2.3 From b171cddac0eac66294b7bb1a03ac051d7ec12d19 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 28 Sep 2017 15:52:24 +0200 Subject: Fix outdated BSD license header Change-Id: I28f5936913a6127806325df34af4bf71a142e72e Reviewed-by: Alex Blasche --- examples/bluetooth/btchat/chat.cpp | 16 +++++++++++++--- examples/bluetooth/btchat/chat.h | 16 +++++++++++++--- examples/bluetooth/btchat/chatclient.cpp | 16 +++++++++++++--- examples/bluetooth/btchat/chatclient.h | 16 +++++++++++++--- examples/bluetooth/btchat/chatserver.cpp | 16 +++++++++++++--- examples/bluetooth/btchat/chatserver.h | 16 +++++++++++++--- examples/bluetooth/btchat/main.cpp | 16 +++++++++++++--- examples/bluetooth/btchat/remoteselector.cpp | 16 +++++++++++++--- examples/bluetooth/btchat/remoteselector.h | 16 +++++++++++++--- examples/bluetooth/btfiletransfer/main.cpp | 16 +++++++++++++--- examples/bluetooth/btfiletransfer/pindisplay.cpp | 16 +++++++++++++--- examples/bluetooth/btfiletransfer/pindisplay.h | 16 +++++++++++++--- examples/bluetooth/btfiletransfer/progress.cpp | 16 +++++++++++++--- examples/bluetooth/btfiletransfer/progress.h | 16 +++++++++++++--- examples/bluetooth/btfiletransfer/remoteselector.cpp | 16 +++++++++++++--- examples/bluetooth/btfiletransfer/remoteselector.h | 16 +++++++++++++--- examples/bluetooth/btscanner/device.cpp | 16 +++++++++++++--- examples/bluetooth/btscanner/device.h | 16 +++++++++++++--- examples/bluetooth/btscanner/main.cpp | 16 +++++++++++++--- examples/bluetooth/btscanner/service.cpp | 16 +++++++++++++--- examples/bluetooth/btscanner/service.h | 16 +++++++++++++--- examples/bluetooth/chat/Button.qml | 16 +++++++++++++--- examples/bluetooth/chat/InputBox.qml | 16 +++++++++++++--- examples/bluetooth/chat/Search.qml | 16 +++++++++++++--- examples/bluetooth/chat/chat.qml | 16 +++++++++++++--- examples/bluetooth/chat/qmlchat.cpp | 16 +++++++++++++--- examples/bluetooth/heartrate-game/bluetoothbaseclass.cpp | 14 ++++++++++++-- examples/bluetooth/heartrate-game/bluetoothbaseclass.h | 14 ++++++++++++-- examples/bluetooth/heartrate-game/connectionhandler.cpp | 14 ++++++++++++-- examples/bluetooth/heartrate-game/connectionhandler.h | 14 ++++++++++++-- examples/bluetooth/heartrate-game/devicefinder.cpp | 14 ++++++++++++-- examples/bluetooth/heartrate-game/devicefinder.h | 14 ++++++++++++-- examples/bluetooth/heartrate-game/devicehandler.cpp | 14 ++++++++++++-- examples/bluetooth/heartrate-game/devicehandler.h | 14 ++++++++++++-- examples/bluetooth/heartrate-game/deviceinfo.cpp | 14 ++++++++++++-- examples/bluetooth/heartrate-game/deviceinfo.h | 14 ++++++++++++-- examples/bluetooth/heartrate-game/heartrate-global.h | 14 ++++++++++++-- examples/bluetooth/heartrate-game/main.cpp | 14 ++++++++++++-- examples/bluetooth/heartrate-game/qml/App.qml | 14 ++++++++++++-- .../heartrate-game/qml/BluetoothAlarmDialog.qml | 14 ++++++++++++-- examples/bluetooth/heartrate-game/qml/BottomLine.qml | 14 ++++++++++++-- examples/bluetooth/heartrate-game/qml/Connect.qml | 14 ++++++++++++-- examples/bluetooth/heartrate-game/qml/GameButton.qml | 14 ++++++++++++-- examples/bluetooth/heartrate-game/qml/GamePage.qml | 14 ++++++++++++-- examples/bluetooth/heartrate-game/qml/GameSettings.qml | 14 ++++++++++++-- examples/bluetooth/heartrate-game/qml/Measure.qml | 14 ++++++++++++-- examples/bluetooth/heartrate-game/qml/SplashScreen.qml | 14 ++++++++++++-- examples/bluetooth/heartrate-game/qml/Stats.qml | 14 ++++++++++++-- examples/bluetooth/heartrate-game/qml/StatsLabel.qml | 14 ++++++++++++-- examples/bluetooth/heartrate-game/qml/TitleBar.qml | 14 ++++++++++++-- examples/bluetooth/heartrate-game/qml/main.qml | 14 ++++++++++++-- examples/bluetooth/heartrate-server/main.cpp | 16 +++++++++++++--- .../lowenergyscanner/assets/Characteristics.qml | 16 +++++++++++++--- examples/bluetooth/lowenergyscanner/assets/Dialog.qml | 14 ++++++++++++-- examples/bluetooth/lowenergyscanner/assets/Header.qml | 14 ++++++++++++-- examples/bluetooth/lowenergyscanner/assets/Label.qml | 14 ++++++++++++-- examples/bluetooth/lowenergyscanner/assets/Menu.qml | 16 +++++++++++++--- examples/bluetooth/lowenergyscanner/assets/Services.qml | 16 +++++++++++++--- examples/bluetooth/lowenergyscanner/assets/main.qml | 16 +++++++++++++--- .../bluetooth/lowenergyscanner/characteristicinfo.cpp | 16 +++++++++++++--- examples/bluetooth/lowenergyscanner/characteristicinfo.h | 16 +++++++++++++--- examples/bluetooth/lowenergyscanner/device.cpp | 16 +++++++++++++--- examples/bluetooth/lowenergyscanner/device.h | 16 +++++++++++++--- examples/bluetooth/lowenergyscanner/deviceinfo.cpp | 16 +++++++++++++--- examples/bluetooth/lowenergyscanner/deviceinfo.h | 16 +++++++++++++--- examples/bluetooth/lowenergyscanner/main.cpp | 16 +++++++++++++--- examples/bluetooth/lowenergyscanner/serviceinfo.cpp | 16 +++++++++++++--- examples/bluetooth/lowenergyscanner/serviceinfo.h | 16 +++++++++++++--- examples/bluetooth/picturetransfer/Button.qml | 14 ++++++++++++-- examples/bluetooth/picturetransfer/DeviceDiscovery.qml | 16 +++++++++++++--- examples/bluetooth/picturetransfer/FileSending.qml | 14 ++++++++++++-- examples/bluetooth/picturetransfer/PictureSelector.qml | 16 +++++++++++++--- examples/bluetooth/picturetransfer/bttransfer.qml | 16 +++++++++++++--- examples/bluetooth/picturetransfer/filetransfer.cpp | 14 ++++++++++++-- examples/bluetooth/picturetransfer/filetransfer.h | 14 ++++++++++++-- examples/bluetooth/picturetransfer/main.cpp | 14 ++++++++++++-- examples/bluetooth/pingpong/assets/Board.qml | 14 ++++++++++++-- examples/bluetooth/pingpong/assets/Dialog.qml | 14 ++++++++++++-- examples/bluetooth/pingpong/assets/Menu.qml | 14 ++++++++++++-- examples/bluetooth/pingpong/assets/main.qml | 14 ++++++++++++-- examples/bluetooth/pingpong/main.cpp | 14 ++++++++++++-- examples/bluetooth/pingpong/pingpong.cpp | 14 ++++++++++++-- examples/bluetooth/pingpong/pingpong.h | 14 ++++++++++++-- examples/bluetooth/scanner/Button.qml | 14 ++++++++++++-- examples/bluetooth/scanner/qmlscanner.cpp | 16 +++++++++++++--- examples/bluetooth/scanner/scanner.qml | 16 +++++++++++++--- examples/nfc/annotatedurl/annotatedurl.cpp | 16 +++++++++++++--- examples/nfc/annotatedurl/annotatedurl.h | 16 +++++++++++++--- examples/nfc/annotatedurl/main.cpp | 16 +++++++++++++--- examples/nfc/annotatedurl/mainwindow.cpp | 16 +++++++++++++--- examples/nfc/annotatedurl/mainwindow.h | 16 +++++++++++++--- examples/nfc/corkboard/Mode.qml | 16 +++++++++++++--- examples/nfc/corkboard/corkboards.qml | 16 +++++++++++++--- examples/nfc/corkboard/main.cpp | 16 +++++++++++++--- examples/nfc/ndefeditor/main.cpp | 16 +++++++++++++--- examples/nfc/ndefeditor/mainwindow.cpp | 16 +++++++++++++--- examples/nfc/ndefeditor/mainwindow.h | 16 +++++++++++++--- examples/nfc/ndefeditor/mimeimagerecordeditor.cpp | 16 +++++++++++++--- examples/nfc/ndefeditor/mimeimagerecordeditor.h | 16 +++++++++++++--- examples/nfc/ndefeditor/textrecordeditor.cpp | 16 +++++++++++++--- examples/nfc/ndefeditor/textrecordeditor.h | 16 +++++++++++++--- examples/nfc/ndefeditor/urirecordeditor.cpp | 16 +++++++++++++--- examples/nfc/ndefeditor/urirecordeditor.h | 16 +++++++++++++--- examples/nfc/poster/poster.qml | 16 +++++++++++++--- examples/nfc/poster/qmlposter.cpp | 16 +++++++++++++--- src/bluetooth/doc/snippets/doc_src_qtbluetooth.cpp | 16 +++++++++++++--- src/bluetooth/doc/snippets/doc_src_qtbluetooth.qml | 16 +++++++++++++--- src/nfc/doc/snippets/doc_src_qtnfc.cpp | 14 ++++++++++++-- src/nfc/doc/snippets/doc_src_qtnfc.qml | 16 +++++++++++++--- src/nfc/doc/snippets/foorecord.cpp | 16 +++++++++++++--- src/nfc/doc/snippets/foorecord.h | 16 +++++++++++++--- src/nfc/doc/snippets/main.cpp | 16 +++++++++++++--- src/nfc/doc/snippets/nfc.cpp | 16 +++++++++++++--- 113 files changed, 1427 insertions(+), 297 deletions(-) diff --git a/examples/bluetooth/btchat/chat.cpp b/examples/bluetooth/btchat/chat.cpp index 929a42e4..9325765e 100644 --- a/examples/bluetooth/btchat/chat.cpp +++ b/examples/bluetooth/btchat/chat.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btchat/chat.h b/examples/bluetooth/btchat/chat.h index 564b7867..57f13257 100644 --- a/examples/bluetooth/btchat/chat.h +++ b/examples/bluetooth/btchat/chat.h @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btchat/chatclient.cpp b/examples/bluetooth/btchat/chatclient.cpp index 09a2f138..6682667f 100644 --- a/examples/bluetooth/btchat/chatclient.cpp +++ b/examples/bluetooth/btchat/chatclient.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btchat/chatclient.h b/examples/bluetooth/btchat/chatclient.h index 73b1bc91..a2f2eafc 100644 --- a/examples/bluetooth/btchat/chatclient.h +++ b/examples/bluetooth/btchat/chatclient.h @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btchat/chatserver.cpp b/examples/bluetooth/btchat/chatserver.cpp index dc1cda57..e4293c75 100644 --- a/examples/bluetooth/btchat/chatserver.cpp +++ b/examples/bluetooth/btchat/chatserver.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btchat/chatserver.h b/examples/bluetooth/btchat/chatserver.h index c40daf52..f7117b74 100644 --- a/examples/bluetooth/btchat/chatserver.h +++ b/examples/bluetooth/btchat/chatserver.h @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btchat/main.cpp b/examples/bluetooth/btchat/main.cpp index 50e682e7..84b33ae4 100644 --- a/examples/bluetooth/btchat/main.cpp +++ b/examples/bluetooth/btchat/main.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btchat/remoteselector.cpp b/examples/bluetooth/btchat/remoteselector.cpp index 5a417c5c..c1302f6b 100644 --- a/examples/bluetooth/btchat/remoteselector.cpp +++ b/examples/bluetooth/btchat/remoteselector.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btchat/remoteselector.h b/examples/bluetooth/btchat/remoteselector.h index 2165cdd9..9174cabd 100644 --- a/examples/bluetooth/btchat/remoteselector.h +++ b/examples/bluetooth/btchat/remoteselector.h @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btfiletransfer/main.cpp b/examples/bluetooth/btfiletransfer/main.cpp index 2e96ce45..2c2b6df5 100644 --- a/examples/bluetooth/btfiletransfer/main.cpp +++ b/examples/bluetooth/btfiletransfer/main.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btfiletransfer/pindisplay.cpp b/examples/bluetooth/btfiletransfer/pindisplay.cpp index 1aabb719..7458fbf3 100644 --- a/examples/bluetooth/btfiletransfer/pindisplay.cpp +++ b/examples/bluetooth/btfiletransfer/pindisplay.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btfiletransfer/pindisplay.h b/examples/bluetooth/btfiletransfer/pindisplay.h index f8d89352..b7ad8866 100644 --- a/examples/bluetooth/btfiletransfer/pindisplay.h +++ b/examples/bluetooth/btfiletransfer/pindisplay.h @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btfiletransfer/progress.cpp b/examples/bluetooth/btfiletransfer/progress.cpp index 7b7c6bac..e72ef0c8 100644 --- a/examples/bluetooth/btfiletransfer/progress.cpp +++ b/examples/bluetooth/btfiletransfer/progress.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btfiletransfer/progress.h b/examples/bluetooth/btfiletransfer/progress.h index b71009b7..6dc9d6be 100644 --- a/examples/bluetooth/btfiletransfer/progress.h +++ b/examples/bluetooth/btfiletransfer/progress.h @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btfiletransfer/remoteselector.cpp b/examples/bluetooth/btfiletransfer/remoteselector.cpp index 4a1f96c0..766bd028 100644 --- a/examples/bluetooth/btfiletransfer/remoteselector.cpp +++ b/examples/bluetooth/btfiletransfer/remoteselector.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btfiletransfer/remoteselector.h b/examples/bluetooth/btfiletransfer/remoteselector.h index 1d2c3de2..b0850c41 100644 --- a/examples/bluetooth/btfiletransfer/remoteselector.h +++ b/examples/bluetooth/btfiletransfer/remoteselector.h @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btscanner/device.cpp b/examples/bluetooth/btscanner/device.cpp index 3d8a98dc..e97c0637 100644 --- a/examples/bluetooth/btscanner/device.cpp +++ b/examples/bluetooth/btscanner/device.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btscanner/device.h b/examples/bluetooth/btscanner/device.h index 9e5c59f6..a8202898 100644 --- a/examples/bluetooth/btscanner/device.h +++ b/examples/bluetooth/btscanner/device.h @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btscanner/main.cpp b/examples/bluetooth/btscanner/main.cpp index 8ec92769..ca762802 100644 --- a/examples/bluetooth/btscanner/main.cpp +++ b/examples/bluetooth/btscanner/main.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btscanner/service.cpp b/examples/bluetooth/btscanner/service.cpp index bd4b7207..12e8bd2b 100644 --- a/examples/bluetooth/btscanner/service.cpp +++ b/examples/bluetooth/btscanner/service.cpp @@ -1,13 +1,23 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. +** Copyright (C) 2017 The Qt Company Ltd. ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/btscanner/service.h b/examples/bluetooth/btscanner/service.h index 5b47d11a..83b4bf42 100644 --- a/examples/bluetooth/btscanner/service.h +++ b/examples/bluetooth/btscanner/service.h @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/chat/Button.qml b/examples/bluetooth/chat/Button.qml index d1136730..8c0096c9 100644 --- a/examples/bluetooth/chat/Button.qml +++ b/examples/bluetooth/chat/Button.qml @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/chat/InputBox.qml b/examples/bluetooth/chat/InputBox.qml index 8a10a5d1..b37d9f57 100644 --- a/examples/bluetooth/chat/InputBox.qml +++ b/examples/bluetooth/chat/InputBox.qml @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/chat/Search.qml b/examples/bluetooth/chat/Search.qml index ea542462..78a7f030 100644 --- a/examples/bluetooth/chat/Search.qml +++ b/examples/bluetooth/chat/Search.qml @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/chat/chat.qml b/examples/bluetooth/chat/chat.qml index eee29789..5c2818b2 100644 --- a/examples/bluetooth/chat/chat.qml +++ b/examples/bluetooth/chat/chat.qml @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/chat/qmlchat.cpp b/examples/bluetooth/chat/qmlchat.cpp index c6ff6341..e7ce3f3a 100644 --- a/examples/bluetooth/chat/qmlchat.cpp +++ b/examples/bluetooth/chat/qmlchat.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/bluetoothbaseclass.cpp b/examples/bluetooth/heartrate-game/bluetoothbaseclass.cpp index 0d7f0bbe..7f6a8f63 100644 --- a/examples/bluetooth/heartrate-game/bluetoothbaseclass.cpp +++ b/examples/bluetooth/heartrate-game/bluetoothbaseclass.cpp @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/bluetoothbaseclass.h b/examples/bluetooth/heartrate-game/bluetoothbaseclass.h index ccdb60e3..74fe4576 100644 --- a/examples/bluetooth/heartrate-game/bluetoothbaseclass.h +++ b/examples/bluetooth/heartrate-game/bluetoothbaseclass.h @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/connectionhandler.cpp b/examples/bluetooth/heartrate-game/connectionhandler.cpp index 40572b71..5ab85c85 100644 --- a/examples/bluetooth/heartrate-game/connectionhandler.cpp +++ b/examples/bluetooth/heartrate-game/connectionhandler.cpp @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/connectionhandler.h b/examples/bluetooth/heartrate-game/connectionhandler.h index 23168b28..b4280978 100644 --- a/examples/bluetooth/heartrate-game/connectionhandler.h +++ b/examples/bluetooth/heartrate-game/connectionhandler.h @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/devicefinder.cpp b/examples/bluetooth/heartrate-game/devicefinder.cpp index aed47b6c..38f538e9 100644 --- a/examples/bluetooth/heartrate-game/devicefinder.cpp +++ b/examples/bluetooth/heartrate-game/devicefinder.cpp @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/devicefinder.h b/examples/bluetooth/heartrate-game/devicefinder.h index c82c0fe5..2c54f550 100644 --- a/examples/bluetooth/heartrate-game/devicefinder.h +++ b/examples/bluetooth/heartrate-game/devicefinder.h @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/devicehandler.cpp b/examples/bluetooth/heartrate-game/devicehandler.cpp index dfc514b5..ec83586b 100644 --- a/examples/bluetooth/heartrate-game/devicehandler.cpp +++ b/examples/bluetooth/heartrate-game/devicehandler.cpp @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/devicehandler.h b/examples/bluetooth/heartrate-game/devicehandler.h index 950ed6e9..05984ea5 100644 --- a/examples/bluetooth/heartrate-game/devicehandler.h +++ b/examples/bluetooth/heartrate-game/devicehandler.h @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/deviceinfo.cpp b/examples/bluetooth/heartrate-game/deviceinfo.cpp index cf364393..3925ce66 100644 --- a/examples/bluetooth/heartrate-game/deviceinfo.cpp +++ b/examples/bluetooth/heartrate-game/deviceinfo.cpp @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/deviceinfo.h b/examples/bluetooth/heartrate-game/deviceinfo.h index bbddbdd4..f8fc3a19 100644 --- a/examples/bluetooth/heartrate-game/deviceinfo.h +++ b/examples/bluetooth/heartrate-game/deviceinfo.h @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/heartrate-global.h b/examples/bluetooth/heartrate-game/heartrate-global.h index 376c7990..cc47bbb4 100644 --- a/examples/bluetooth/heartrate-game/heartrate-global.h +++ b/examples/bluetooth/heartrate-game/heartrate-global.h @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/main.cpp b/examples/bluetooth/heartrate-game/main.cpp index 0b0cae12..33760e9d 100644 --- a/examples/bluetooth/heartrate-game/main.cpp +++ b/examples/bluetooth/heartrate-game/main.cpp @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/qml/App.qml b/examples/bluetooth/heartrate-game/qml/App.qml index fc8b1c89..b61a7374 100644 --- a/examples/bluetooth/heartrate-game/qml/App.qml +++ b/examples/bluetooth/heartrate-game/qml/App.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/qml/BluetoothAlarmDialog.qml b/examples/bluetooth/heartrate-game/qml/BluetoothAlarmDialog.qml index ef32f5ea..df55c300 100644 --- a/examples/bluetooth/heartrate-game/qml/BluetoothAlarmDialog.qml +++ b/examples/bluetooth/heartrate-game/qml/BluetoothAlarmDialog.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/qml/BottomLine.qml b/examples/bluetooth/heartrate-game/qml/BottomLine.qml index af644228..6e99474a 100644 --- a/examples/bluetooth/heartrate-game/qml/BottomLine.qml +++ b/examples/bluetooth/heartrate-game/qml/BottomLine.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/qml/Connect.qml b/examples/bluetooth/heartrate-game/qml/Connect.qml index 9e4efb17..519fe302 100644 --- a/examples/bluetooth/heartrate-game/qml/Connect.qml +++ b/examples/bluetooth/heartrate-game/qml/Connect.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/qml/GameButton.qml b/examples/bluetooth/heartrate-game/qml/GameButton.qml index e7fc36af..eabd8dcd 100644 --- a/examples/bluetooth/heartrate-game/qml/GameButton.qml +++ b/examples/bluetooth/heartrate-game/qml/GameButton.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/qml/GamePage.qml b/examples/bluetooth/heartrate-game/qml/GamePage.qml index 663eb047..5e432e58 100644 --- a/examples/bluetooth/heartrate-game/qml/GamePage.qml +++ b/examples/bluetooth/heartrate-game/qml/GamePage.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/qml/GameSettings.qml b/examples/bluetooth/heartrate-game/qml/GameSettings.qml index 868f32ac..e9edde90 100644 --- a/examples/bluetooth/heartrate-game/qml/GameSettings.qml +++ b/examples/bluetooth/heartrate-game/qml/GameSettings.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/qml/Measure.qml b/examples/bluetooth/heartrate-game/qml/Measure.qml index f8c51eb4..07056e6e 100644 --- a/examples/bluetooth/heartrate-game/qml/Measure.qml +++ b/examples/bluetooth/heartrate-game/qml/Measure.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/qml/SplashScreen.qml b/examples/bluetooth/heartrate-game/qml/SplashScreen.qml index f480125e..59870188 100644 --- a/examples/bluetooth/heartrate-game/qml/SplashScreen.qml +++ b/examples/bluetooth/heartrate-game/qml/SplashScreen.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/qml/Stats.qml b/examples/bluetooth/heartrate-game/qml/Stats.qml index 6e34d3bc..5d45fc8c 100644 --- a/examples/bluetooth/heartrate-game/qml/Stats.qml +++ b/examples/bluetooth/heartrate-game/qml/Stats.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/qml/StatsLabel.qml b/examples/bluetooth/heartrate-game/qml/StatsLabel.qml index dd57852f..ff5e0fbb 100644 --- a/examples/bluetooth/heartrate-game/qml/StatsLabel.qml +++ b/examples/bluetooth/heartrate-game/qml/StatsLabel.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/qml/TitleBar.qml b/examples/bluetooth/heartrate-game/qml/TitleBar.qml index 46d641e6..3a3e2c42 100644 --- a/examples/bluetooth/heartrate-game/qml/TitleBar.qml +++ b/examples/bluetooth/heartrate-game/qml/TitleBar.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-game/qml/main.qml b/examples/bluetooth/heartrate-game/qml/main.qml index 66649a7a..0dfeef44 100644 --- a/examples/bluetooth/heartrate-game/qml/main.qml +++ b/examples/bluetooth/heartrate-game/qml/main.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/heartrate-server/main.cpp b/examples/bluetooth/heartrate-server/main.cpp index 5822831c..f51a1694 100644 --- a/examples/bluetooth/heartrate-server/main.cpp +++ b/examples/bluetooth/heartrate-server/main.cpp @@ -1,12 +1,22 @@ /*************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/lowenergyscanner/assets/Characteristics.qml b/examples/bluetooth/lowenergyscanner/assets/Characteristics.qml index 957eee70..4bfc2c0a 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Characteristics.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Characteristics.qml @@ -1,13 +1,23 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/lowenergyscanner/assets/Dialog.qml b/examples/bluetooth/lowenergyscanner/assets/Dialog.qml index 8195b842..8edabbbf 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Dialog.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Dialog.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/lowenergyscanner/assets/Header.qml b/examples/bluetooth/lowenergyscanner/assets/Header.qml index 721dc05c..2da35b97 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Header.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Header.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/lowenergyscanner/assets/Label.qml b/examples/bluetooth/lowenergyscanner/assets/Label.qml index aafda900..aaa7746d 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Label.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Label.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/lowenergyscanner/assets/Menu.qml b/examples/bluetooth/lowenergyscanner/assets/Menu.qml index e0a7b710..1e0aa2ad 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Menu.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Menu.qml @@ -1,13 +1,23 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/lowenergyscanner/assets/Services.qml b/examples/bluetooth/lowenergyscanner/assets/Services.qml index d593c7d5..e22d1db3 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Services.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Services.qml @@ -1,13 +1,23 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/lowenergyscanner/assets/main.qml b/examples/bluetooth/lowenergyscanner/assets/main.qml index 085c3e4f..2424dbcf 100644 --- a/examples/bluetooth/lowenergyscanner/assets/main.qml +++ b/examples/bluetooth/lowenergyscanner/assets/main.qml @@ -1,13 +1,23 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/lowenergyscanner/characteristicinfo.cpp b/examples/bluetooth/lowenergyscanner/characteristicinfo.cpp index 91bbfbc8..58f91f5d 100644 --- a/examples/bluetooth/lowenergyscanner/characteristicinfo.cpp +++ b/examples/bluetooth/lowenergyscanner/characteristicinfo.cpp @@ -1,13 +1,23 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/lowenergyscanner/characteristicinfo.h b/examples/bluetooth/lowenergyscanner/characteristicinfo.h index c0566ba7..ccc280e8 100644 --- a/examples/bluetooth/lowenergyscanner/characteristicinfo.h +++ b/examples/bluetooth/lowenergyscanner/characteristicinfo.h @@ -1,13 +1,23 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/lowenergyscanner/device.cpp b/examples/bluetooth/lowenergyscanner/device.cpp index 0275c435..77314256 100644 --- a/examples/bluetooth/lowenergyscanner/device.cpp +++ b/examples/bluetooth/lowenergyscanner/device.cpp @@ -1,13 +1,23 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/lowenergyscanner/device.h b/examples/bluetooth/lowenergyscanner/device.h index 331d4458..6dbfa948 100644 --- a/examples/bluetooth/lowenergyscanner/device.h +++ b/examples/bluetooth/lowenergyscanner/device.h @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the demonstration applications of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/lowenergyscanner/deviceinfo.cpp b/examples/bluetooth/lowenergyscanner/deviceinfo.cpp index 89371a76..69fedcea 100644 --- a/examples/bluetooth/lowenergyscanner/deviceinfo.cpp +++ b/examples/bluetooth/lowenergyscanner/deviceinfo.cpp @@ -1,13 +1,23 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/lowenergyscanner/deviceinfo.h b/examples/bluetooth/lowenergyscanner/deviceinfo.h index 0c9ad673..8b20fa76 100644 --- a/examples/bluetooth/lowenergyscanner/deviceinfo.h +++ b/examples/bluetooth/lowenergyscanner/deviceinfo.h @@ -1,13 +1,23 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/lowenergyscanner/main.cpp b/examples/bluetooth/lowenergyscanner/main.cpp index 27076f14..b3fac945 100644 --- a/examples/bluetooth/lowenergyscanner/main.cpp +++ b/examples/bluetooth/lowenergyscanner/main.cpp @@ -1,13 +1,23 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/lowenergyscanner/serviceinfo.cpp b/examples/bluetooth/lowenergyscanner/serviceinfo.cpp index c424b046..844c9cec 100644 --- a/examples/bluetooth/lowenergyscanner/serviceinfo.cpp +++ b/examples/bluetooth/lowenergyscanner/serviceinfo.cpp @@ -1,13 +1,23 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/lowenergyscanner/serviceinfo.h b/examples/bluetooth/lowenergyscanner/serviceinfo.h index af040554..e360fde7 100644 --- a/examples/bluetooth/lowenergyscanner/serviceinfo.h +++ b/examples/bluetooth/lowenergyscanner/serviceinfo.h @@ -1,13 +1,23 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/picturetransfer/Button.qml b/examples/bluetooth/picturetransfer/Button.qml index 2c5afb0b..be8bbbf8 100644 --- a/examples/bluetooth/picturetransfer/Button.qml +++ b/examples/bluetooth/picturetransfer/Button.qml @@ -1,12 +1,22 @@ /**************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/picturetransfer/DeviceDiscovery.qml b/examples/bluetooth/picturetransfer/DeviceDiscovery.qml index 16d9972e..2ab99f86 100644 --- a/examples/bluetooth/picturetransfer/DeviceDiscovery.qml +++ b/examples/bluetooth/picturetransfer/DeviceDiscovery.qml @@ -1,13 +1,23 @@ /**************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/picturetransfer/FileSending.qml b/examples/bluetooth/picturetransfer/FileSending.qml index bdd4167e..336488a6 100644 --- a/examples/bluetooth/picturetransfer/FileSending.qml +++ b/examples/bluetooth/picturetransfer/FileSending.qml @@ -1,12 +1,22 @@ /**************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/picturetransfer/PictureSelector.qml b/examples/bluetooth/picturetransfer/PictureSelector.qml index 5626cf64..d9dd401b 100644 --- a/examples/bluetooth/picturetransfer/PictureSelector.qml +++ b/examples/bluetooth/picturetransfer/PictureSelector.qml @@ -1,13 +1,23 @@ /**************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/picturetransfer/bttransfer.qml b/examples/bluetooth/picturetransfer/bttransfer.qml index 87dd70fb..46ce24a3 100644 --- a/examples/bluetooth/picturetransfer/bttransfer.qml +++ b/examples/bluetooth/picturetransfer/bttransfer.qml @@ -1,13 +1,23 @@ /**************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/picturetransfer/filetransfer.cpp b/examples/bluetooth/picturetransfer/filetransfer.cpp index 2051f69c..5816413b 100644 --- a/examples/bluetooth/picturetransfer/filetransfer.cpp +++ b/examples/bluetooth/picturetransfer/filetransfer.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/picturetransfer/filetransfer.h b/examples/bluetooth/picturetransfer/filetransfer.h index 5fb65bd4..5e2e08f9 100644 --- a/examples/bluetooth/picturetransfer/filetransfer.h +++ b/examples/bluetooth/picturetransfer/filetransfer.h @@ -1,12 +1,22 @@ /**************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/picturetransfer/main.cpp b/examples/bluetooth/picturetransfer/main.cpp index 1ce3112e..b4a1e670 100644 --- a/examples/bluetooth/picturetransfer/main.cpp +++ b/examples/bluetooth/picturetransfer/main.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/pingpong/assets/Board.qml b/examples/bluetooth/pingpong/assets/Board.qml index 0adf6508..576772bf 100644 --- a/examples/bluetooth/pingpong/assets/Board.qml +++ b/examples/bluetooth/pingpong/assets/Board.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/pingpong/assets/Dialog.qml b/examples/bluetooth/pingpong/assets/Dialog.qml index 53be3eaa..6ec4f1dc 100644 --- a/examples/bluetooth/pingpong/assets/Dialog.qml +++ b/examples/bluetooth/pingpong/assets/Dialog.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/pingpong/assets/Menu.qml b/examples/bluetooth/pingpong/assets/Menu.qml index 09eabb36..019718cf 100644 --- a/examples/bluetooth/pingpong/assets/Menu.qml +++ b/examples/bluetooth/pingpong/assets/Menu.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/pingpong/assets/main.qml b/examples/bluetooth/pingpong/assets/main.qml index 7b62f0bd..10e477df 100644 --- a/examples/bluetooth/pingpong/assets/main.qml +++ b/examples/bluetooth/pingpong/assets/main.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/pingpong/main.cpp b/examples/bluetooth/pingpong/main.cpp index b6430248..fc1029de 100644 --- a/examples/bluetooth/pingpong/main.cpp +++ b/examples/bluetooth/pingpong/main.cpp @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/pingpong/pingpong.cpp b/examples/bluetooth/pingpong/pingpong.cpp index d893f64c..d80df3d6 100644 --- a/examples/bluetooth/pingpong/pingpong.cpp +++ b/examples/bluetooth/pingpong/pingpong.cpp @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/pingpong/pingpong.h b/examples/bluetooth/pingpong/pingpong.h index 21c9ef1c..315f270b 100644 --- a/examples/bluetooth/pingpong/pingpong.h +++ b/examples/bluetooth/pingpong/pingpong.h @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/scanner/Button.qml b/examples/bluetooth/scanner/Button.qml index 566f539f..3d368cde 100644 --- a/examples/bluetooth/scanner/Button.qml +++ b/examples/bluetooth/scanner/Button.qml @@ -1,12 +1,22 @@ /*************************************************************************** ** ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/scanner/qmlscanner.cpp b/examples/bluetooth/scanner/qmlscanner.cpp index fe961511..4ead2364 100644 --- a/examples/bluetooth/scanner/qmlscanner.cpp +++ b/examples/bluetooth/scanner/qmlscanner.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/bluetooth/scanner/scanner.qml b/examples/bluetooth/scanner/scanner.qml index 10eeb83a..d4c88a05 100644 --- a/examples/bluetooth/scanner/scanner.qml +++ b/examples/bluetooth/scanner/scanner.qml @@ -1,13 +1,23 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. +** Copyright (C) 2017 The Qt Company Ltd. ** Copyright (C) 2013 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtBluetooth module. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/annotatedurl/annotatedurl.cpp b/examples/nfc/annotatedurl/annotatedurl.cpp index a07aadcc..7f63f44b 100644 --- a/examples/nfc/annotatedurl/annotatedurl.cpp +++ b/examples/nfc/annotatedurl/annotatedurl.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtNfc module. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/annotatedurl/annotatedurl.h b/examples/nfc/annotatedurl/annotatedurl.h index 08e5b38e..0fb1ae56 100644 --- a/examples/nfc/annotatedurl/annotatedurl.h +++ b/examples/nfc/annotatedurl/annotatedurl.h @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtNfc module. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/annotatedurl/main.cpp b/examples/nfc/annotatedurl/main.cpp index f46d303e..109fb3b7 100644 --- a/examples/nfc/annotatedurl/main.cpp +++ b/examples/nfc/annotatedurl/main.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtNfc module. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/annotatedurl/mainwindow.cpp b/examples/nfc/annotatedurl/mainwindow.cpp index b0c7fc18..2220d747 100644 --- a/examples/nfc/annotatedurl/mainwindow.cpp +++ b/examples/nfc/annotatedurl/mainwindow.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtNfc module. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/annotatedurl/mainwindow.h b/examples/nfc/annotatedurl/mainwindow.h index 0d367171..e56ba521 100644 --- a/examples/nfc/annotatedurl/mainwindow.h +++ b/examples/nfc/annotatedurl/mainwindow.h @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtNfc module. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/corkboard/Mode.qml b/examples/nfc/corkboard/Mode.qml index 81c42682..b06b22a5 100644 --- a/examples/nfc/corkboard/Mode.qml +++ b/examples/nfc/corkboard/Mode.qml @@ -1,13 +1,23 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. +** Copyright (C) 2017 The Qt Company Ltd. ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtNfc module. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/corkboard/corkboards.qml b/examples/nfc/corkboard/corkboards.qml index dc96865a..a1d9bee1 100644 --- a/examples/nfc/corkboard/corkboards.qml +++ b/examples/nfc/corkboard/corkboards.qml @@ -1,13 +1,23 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. +** Copyright (C) 2017 The Qt Company Ltd. ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtNfc module. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/corkboard/main.cpp b/examples/nfc/corkboard/main.cpp index 320412ff..99673c80 100644 --- a/examples/nfc/corkboard/main.cpp +++ b/examples/nfc/corkboard/main.cpp @@ -1,13 +1,23 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. +** Copyright (C) 2017 The Qt Company Ltd. ** Copyright (C) 2014 BlackBerry Limited. All rights reserved. -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the QtNfc module. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/ndefeditor/main.cpp b/examples/nfc/ndefeditor/main.cpp index c60517dc..6ea32a57 100644 --- a/examples/nfc/ndefeditor/main.cpp +++ b/examples/nfc/ndefeditor/main.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/ndefeditor/mainwindow.cpp b/examples/nfc/ndefeditor/mainwindow.cpp index 28c2054a..02a969ae 100644 --- a/examples/nfc/ndefeditor/mainwindow.cpp +++ b/examples/nfc/ndefeditor/mainwindow.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/ndefeditor/mainwindow.h b/examples/nfc/ndefeditor/mainwindow.h index 374b2ee3..e16a44a4 100644 --- a/examples/nfc/ndefeditor/mainwindow.h +++ b/examples/nfc/ndefeditor/mainwindow.h @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/ndefeditor/mimeimagerecordeditor.cpp b/examples/nfc/ndefeditor/mimeimagerecordeditor.cpp index 5ed733a4..ef8cf1fd 100644 --- a/examples/nfc/ndefeditor/mimeimagerecordeditor.cpp +++ b/examples/nfc/ndefeditor/mimeimagerecordeditor.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/ndefeditor/mimeimagerecordeditor.h b/examples/nfc/ndefeditor/mimeimagerecordeditor.h index 996cabc3..9ea7d3b4 100644 --- a/examples/nfc/ndefeditor/mimeimagerecordeditor.h +++ b/examples/nfc/ndefeditor/mimeimagerecordeditor.h @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/ndefeditor/textrecordeditor.cpp b/examples/nfc/ndefeditor/textrecordeditor.cpp index 77e8a085..390674ad 100644 --- a/examples/nfc/ndefeditor/textrecordeditor.cpp +++ b/examples/nfc/ndefeditor/textrecordeditor.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/ndefeditor/textrecordeditor.h b/examples/nfc/ndefeditor/textrecordeditor.h index 2699cdb5..65e33fb7 100644 --- a/examples/nfc/ndefeditor/textrecordeditor.h +++ b/examples/nfc/ndefeditor/textrecordeditor.h @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/ndefeditor/urirecordeditor.cpp b/examples/nfc/ndefeditor/urirecordeditor.cpp index 4ea12768..4088aece 100644 --- a/examples/nfc/ndefeditor/urirecordeditor.cpp +++ b/examples/nfc/ndefeditor/urirecordeditor.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/ndefeditor/urirecordeditor.h b/examples/nfc/ndefeditor/urirecordeditor.h index 156b5147..ef75065a 100644 --- a/examples/nfc/ndefeditor/urirecordeditor.h +++ b/examples/nfc/ndefeditor/urirecordeditor.h @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/poster/poster.qml b/examples/nfc/poster/poster.qml index d57ed5d9..3127d44e 100644 --- a/examples/nfc/poster/poster.qml +++ b/examples/nfc/poster/poster.qml @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/examples/nfc/poster/qmlposter.cpp b/examples/nfc/poster/qmlposter.cpp index eb96e1c2..5bf5f352 100644 --- a/examples/nfc/poster/qmlposter.cpp +++ b/examples/nfc/poster/qmlposter.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtNfc module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/src/bluetooth/doc/snippets/doc_src_qtbluetooth.cpp b/src/bluetooth/doc/snippets/doc_src_qtbluetooth.cpp index 1eec9206..2e28c3f5 100644 --- a/src/bluetooth/doc/snippets/doc_src_qtbluetooth.cpp +++ b/src/bluetooth/doc/snippets/doc_src_qtbluetooth.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/src/bluetooth/doc/snippets/doc_src_qtbluetooth.qml b/src/bluetooth/doc/snippets/doc_src_qtbluetooth.qml index fcafbd53..efed6cc7 100644 --- a/src/bluetooth/doc/snippets/doc_src_qtbluetooth.qml +++ b/src/bluetooth/doc/snippets/doc_src_qtbluetooth.qml @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/src/nfc/doc/snippets/doc_src_qtnfc.cpp b/src/nfc/doc/snippets/doc_src_qtnfc.cpp index f4d7f91a..760d65fd 100644 --- a/src/nfc/doc/snippets/doc_src_qtnfc.cpp +++ b/src/nfc/doc/snippets/doc_src_qtnfc.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** ** Copyright (C) 2013 Aaron McCarthy -** Contact: http://www.qt.io/licensing/ +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/src/nfc/doc/snippets/doc_src_qtnfc.qml b/src/nfc/doc/snippets/doc_src_qtnfc.qml index 65efee56..78f7f83d 100644 --- a/src/nfc/doc/snippets/doc_src_qtnfc.qml +++ b/src/nfc/doc/snippets/doc_src_qtnfc.qml @@ -1,13 +1,23 @@ /**************************************************************************** ** ** Copyright (C) 2013 Aaron McCarthy -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/src/nfc/doc/snippets/foorecord.cpp b/src/nfc/doc/snippets/foorecord.cpp index 14a83af3..4fecd712 100644 --- a/src/nfc/doc/snippets/foorecord.cpp +++ b/src/nfc/doc/snippets/foorecord.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/src/nfc/doc/snippets/foorecord.h b/src/nfc/doc/snippets/foorecord.h index e8c130e4..c2501287 100644 --- a/src/nfc/doc/snippets/foorecord.h +++ b/src/nfc/doc/snippets/foorecord.h @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/src/nfc/doc/snippets/main.cpp b/src/nfc/doc/snippets/main.cpp index 09d07b02..6f2bb0d7 100644 --- a/src/nfc/doc/snippets/main.cpp +++ b/src/nfc/doc/snippets/main.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are diff --git a/src/nfc/doc/snippets/nfc.cpp b/src/nfc/doc/snippets/nfc.cpp index eb7ef989..82297682 100644 --- a/src/nfc/doc/snippets/nfc.cpp +++ b/src/nfc/doc/snippets/nfc.cpp @@ -1,12 +1,22 @@ /**************************************************************************** ** -** Copyright (C) 2015 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ -** You may use this file under the terms of the BSD license as follows: +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are -- cgit v1.2.3 From 0fd7c68a4cd6f703d6a71e66963a357073c45452 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 19 Oct 2017 08:47:21 +0200 Subject: Add default assignment operator for QBluetoothUuid This was detected by clazy. Change-Id: I69c5a0921864b24dfdbf33fb54e8b85a7b600adb Reviewed-by: Qt CI Bot Reviewed-by: Timur Pocheptsov --- src/bluetooth/qbluetoothuuid.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/bluetooth/qbluetoothuuid.h b/src/bluetooth/qbluetoothuuid.h index 28b08583..27e26a67 100644 --- a/src/bluetooth/qbluetoothuuid.h +++ b/src/bluetooth/qbluetoothuuid.h @@ -381,6 +381,8 @@ public: bool operator==(const QBluetoothUuid &other) const; bool operator!=(const QBluetoothUuid &other) const { return !operator==(other); } + QBluetoothUuid &operator=(const QBluetoothUuid &other) = default; + int minimumSize() const; quint16 toUInt16(bool *ok = nullptr) const; -- cgit v1.2.3 From 73079b79014f058eebcf28b4d5a46abdee8008af Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 19 Oct 2017 09:34:09 +0200 Subject: Convert Q_ARG params to normalized form This was identified by clazy. Change-Id: If45c1c1898ee2dc4dd6274aa441b1c980a00686f Reviewed-by: Timur Pocheptsov --- src/nfc/qnearfieldtarget_neard_p.h | 6 +++--- src/nfc/qqmlndefrecord.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h index c84e033f..bc1baf2c 100644 --- a/src/nfc/qnearfieldtarget_neard_p.h +++ b/src/nfc/qnearfieldtarget_neard_p.h @@ -353,14 +353,14 @@ private: if (!newNdefMessage.isEmpty()) { QMetaObject::invokeMethod(this, "ndefMessageRead", Qt::QueuedConnection, - Q_ARG(const QNdefMessage, newNdefMessage)); + Q_ARG(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_currentReadRequestId)); } else { QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(const QNearFieldTarget::Error, QNearFieldTarget::UnknownError), - Q_ARG(const QNearFieldTarget::RequestId, m_currentReadRequestId)); + Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnknownError), + Q_ARG(QNearFieldTarget::RequestId, m_currentReadRequestId)); } m_readRequested = false; diff --git a/src/nfc/qqmlndefrecord.cpp b/src/nfc/qqmlndefrecord.cpp index cd6620cc..a7304f00 100644 --- a/src/nfc/qqmlndefrecord.cpp +++ b/src/nfc/qqmlndefrecord.cpp @@ -228,7 +228,7 @@ QQmlNdefRecord *qNewDeclarativeNdefRecordForNdefRecord(const QNdefRecord &record continue; return static_cast(metaObject->newInstance( - Q_ARG(QNdefRecord, record), Q_ARG(QObject *, 0))); + Q_ARG(QNdefRecord, record), Q_ARG(QObject*, 0))); } return new QQmlNdefRecord(record); -- cgit v1.2.3 From 75126f6d12c90610b80399ea8337766791e7f62b Mon Sep 17 00:00:00 2001 From: Daniel Engelke Date: Mon, 23 Oct 2017 12:10:31 +0200 Subject: Fix writing of NdefMessages on android For writing messages another QAndroidJniObject was created, which however wasn't connected or validated in any way, so calling methods failed obviously. I removed said object and made use of the implemented class member m_tagTech, that is being validated and connected beforehand. Task-number: QTBUG-62858 Change-Id: I97c28f15cdaf5c0aa36423e7aba35408b49bde4e Reviewed-by: Alex Blasche Reviewed-by: Lars Schmertmann Reviewed-by: Frank Meerkoetter --- src/nfc/qnearfieldtarget_android.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/nfc/qnearfieldtarget_android.cpp b/src/nfc/qnearfieldtarget_android.cpp index 50c5c1b3..dcdc872d 100644 --- a/src/nfc/qnearfieldtarget_android.cpp +++ b/src/nfc/qnearfieldtarget_android.cpp @@ -297,7 +297,6 @@ QNearFieldTarget::RequestId NearFieldTarget::writeNdefMessages(const QList(writeMethod, "(Landroid/nfc/NdefMessage;)V", jmessage.object()); + m_tagTech.callMethod(writeMethod, "(Landroid/nfc/NdefMessage;)V", jmessage.object()); if (catchJavaExceptions()) { QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::NdefWriteError), -- cgit v1.2.3 From 6029bad7d1007aecd155985ba13d6c23a01015b8 Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Tue, 24 Oct 2017 15:15:41 +0200 Subject: winrt: Fix build using -no-pch Task-number: QTBUG-63210 Change-Id: I98637337d8a77c8847bd0f2c567fec5e6a4ace31 Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothdevicediscoveryagent_p.h | 5 +++++ src/bluetooth/qbluetoothserver_p.h | 2 ++ src/bluetooth/qbluetoothservicediscoveryagent_p.h | 4 ++++ src/bluetooth/qbluetoothsocket_p.h | 2 ++ src/bluetooth/qlowenergycontroller_winrt.cpp | 1 + 5 files changed, 14 insertions(+) diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_p.h b/src/bluetooth/qbluetoothdevicediscoveryagent_p.h index 44834024..c4c16bb4 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_p.h +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_p.h @@ -78,6 +78,11 @@ class QDBusVariant; QT_END_NAMESPACE #endif +#ifdef QT_WINRT_BLUETOOTH +#include +#include +#endif + QT_BEGIN_NAMESPACE #ifdef QT_WINRT_BLUETOOTH diff --git a/src/bluetooth/qbluetoothserver_p.h b/src/bluetooth/qbluetoothserver_p.h index 4abadc72..9c414cdb 100644 --- a/src/bluetooth/qbluetoothserver_p.h +++ b/src/bluetooth/qbluetoothserver_p.h @@ -70,6 +70,8 @@ class ServerAcceptanceThread; #endif #ifdef QT_WINRT_BLUETOOTH +#include + #include // No forward declares because QBluetoothServerPrivate::listener does not work with them #include diff --git a/src/bluetooth/qbluetoothservicediscoveryagent_p.h b/src/bluetooth/qbluetoothservicediscoveryagent_p.h index c4ea20a9..2a57c531 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent_p.h +++ b/src/bluetooth/qbluetoothservicediscoveryagent_p.h @@ -72,6 +72,10 @@ class QXmlStreamReader; QT_END_NAMESPACE #endif +#ifdef QT_WINRT_BLUETOOTH +#include +#endif + QT_BEGIN_NAMESPACE class QBluetoothDeviceDiscoveryAgent; diff --git a/src/bluetooth/qbluetoothsocket_p.h b/src/bluetooth/qbluetoothsocket_p.h index 907acbe2..ae3c6182 100644 --- a/src/bluetooth/qbluetoothsocket_p.h +++ b/src/bluetooth/qbluetoothsocket_p.h @@ -62,6 +62,8 @@ class WorkerThread; #endif #ifdef QT_WINRT_BLUETOOTH +#include + #include namespace ABI { diff --git a/src/bluetooth/qlowenergycontroller_winrt.cpp b/src/bluetooth/qlowenergycontroller_winrt.cpp index d6fc4952..e4ae76b0 100644 --- a/src/bluetooth/qlowenergycontroller_winrt.cpp +++ b/src/bluetooth/qlowenergycontroller_winrt.cpp @@ -40,6 +40,7 @@ #include "qlowenergycontroller_p.h" #include +#include #include #include -- cgit v1.2.3 From 0d2f435672288d1084bfb6156503b6a5afe54827 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 24 Oct 2017 09:56:34 +0200 Subject: Remove qlowenergycontroller_p.cpp from macOS build This file is not needed by macOS and in fact was never added to the build. Hence there is no need to attempt to remove it. Change-Id: Ibb32c8f3d163022e88de36de6ae99d89043b4a63 Reviewed-by: Timur Pocheptsov --- src/bluetooth/bluetooth.pro | 1 - 1 file changed, 1 deletion(-) diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index b45da961..a917eefc 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -170,7 +170,6 @@ qtConfig(bluez) { SOURCES -= qlowenergyservice_p.cpp SOURCES -= qlowenergyservice.cpp SOURCES -= qlowenergycontroller.cpp - SOURCES -= qlowenergycontroller_p.cpp } else:ios|tvos { DEFINES += QT_IOS_BLUETOOTH LIBS_PRIVATE += -framework Foundation -framework CoreBluetooth -- cgit v1.2.3 From e0113f4ab1ad3a98f12ac5c3d486d4ef2732803d Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 20 Jun 2017 13:28:51 +0200 Subject: Add DBus XML descriptions for Gatt interfaces GattService1, GattCharacteristic1 and GattDescriptor1 are relevant for central role use cases. Task-number: QTBUG-46819 Change-Id: I5ab12710880ec91565c2e5c510eb55dc3410a7ee Reviewed-by: Oliver Wolff --- .../bluez/org.bluez.GattCharacteristic1.xml | 20 ++++++++++++++++++++ src/bluetooth/bluez/org.bluez.GattDescriptor1.xml | 16 ++++++++++++++++ src/bluetooth/bluez/org.bluez.GattService1.xml | 9 +++++++++ 3 files changed, 45 insertions(+) create mode 100644 src/bluetooth/bluez/org.bluez.GattCharacteristic1.xml create mode 100644 src/bluetooth/bluez/org.bluez.GattDescriptor1.xml create mode 100644 src/bluetooth/bluez/org.bluez.GattService1.xml diff --git a/src/bluetooth/bluez/org.bluez.GattCharacteristic1.xml b/src/bluetooth/bluez/org.bluez.GattCharacteristic1.xml new file mode 100644 index 00000000..598e01e9 --- /dev/null +++ b/src/bluetooth/bluez/org.bluez.GattCharacteristic1.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/bluetooth/bluez/org.bluez.GattDescriptor1.xml b/src/bluetooth/bluez/org.bluez.GattDescriptor1.xml new file mode 100644 index 00000000..ceb6f0af --- /dev/null +++ b/src/bluetooth/bluez/org.bluez.GattDescriptor1.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/src/bluetooth/bluez/org.bluez.GattService1.xml b/src/bluetooth/bluez/org.bluez.GattService1.xml new file mode 100644 index 00000000..e90eeda7 --- /dev/null +++ b/src/bluetooth/bluez/org.bluez.GattService1.xml @@ -0,0 +1,9 @@ + + + + + + + + + -- cgit v1.2.3 From 7cdda4606376400f30aee61842e166b6deba205a Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 17 Oct 2017 13:39:18 +0200 Subject: Setup GattService1, GattChar1 & GattDesc1 dbus interface classes The change adds the relevant xml raw description to the generation script and commits the generated dbus accessor classes. Task-number: QTBUG-46819 Change-Id: Ib5f7e15cef9e7225d33b7b4e43f085806a0fb1a4 Reviewed-by: Oliver Wolff --- src/bluetooth/bluez/gattchar1.cpp | 26 ++++++++++ src/bluetooth/bluez/gattchar1_p.h | 93 ++++++++++++++++++++++++++++++++++++ src/bluetooth/bluez/gattdesc1.cpp | 26 ++++++++++ src/bluetooth/bluez/gattdesc1_p.h | 73 ++++++++++++++++++++++++++++ src/bluetooth/bluez/gattservice1.cpp | 26 ++++++++++ src/bluetooth/bluez/gattservice1_p.h | 63 ++++++++++++++++++++++++ src/bluetooth/bluez/generate | 4 ++ 7 files changed, 311 insertions(+) create mode 100644 src/bluetooth/bluez/gattchar1.cpp create mode 100644 src/bluetooth/bluez/gattchar1_p.h create mode 100644 src/bluetooth/bluez/gattdesc1.cpp create mode 100644 src/bluetooth/bluez/gattdesc1_p.h create mode 100644 src/bluetooth/bluez/gattservice1.cpp create mode 100644 src/bluetooth/bluez/gattservice1_p.h diff --git a/src/bluetooth/bluez/gattchar1.cpp b/src/bluetooth/bluez/gattchar1.cpp new file mode 100644 index 00000000..cdb3fc0d --- /dev/null +++ b/src/bluetooth/bluez/gattchar1.cpp @@ -0,0 +1,26 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -p gattchar1_p.h:gattchar1.cpp org.bluez.GattCharacteristic1.xml + * + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. + * + * This is an auto-generated file. + * This file may have been hand-edited. Look for HAND-EDIT comments + * before re-generating it. + */ + +#include "gattchar1_p.h" + +/* + * Implementation of interface class OrgBluezGattCharacteristic1Interface + */ + +OrgBluezGattCharacteristic1Interface::OrgBluezGattCharacteristic1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) +{ +} + +OrgBluezGattCharacteristic1Interface::~OrgBluezGattCharacteristic1Interface() +{ +} + diff --git a/src/bluetooth/bluez/gattchar1_p.h b/src/bluetooth/bluez/gattchar1_p.h new file mode 100644 index 00000000..c19e9f58 --- /dev/null +++ b/src/bluetooth/bluez/gattchar1_p.h @@ -0,0 +1,93 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -p gattchar1_p.h:gattchar1.cpp org.bluez.GattCharacteristic1.xml + * + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#ifndef GATTCHAR1_P_H +#define GATTCHAR1_P_H + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Proxy class for interface org.bluez.GattCharacteristic1 + */ +class OrgBluezGattCharacteristic1Interface: public QDBusAbstractInterface +{ + Q_OBJECT +public: + static inline const char *staticInterfaceName() + { return "org.bluez.GattCharacteristic1"; } + +public: + OrgBluezGattCharacteristic1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); + + ~OrgBluezGattCharacteristic1Interface(); + + Q_PROPERTY(QStringList Flags READ flags) + inline QStringList flags() const + { return qvariant_cast< QStringList >(property("Flags")); } + + Q_PROPERTY(bool Notifying READ notifying) + inline bool notifying() const + { return qvariant_cast< bool >(property("Notifying")); } + + Q_PROPERTY(QDBusObjectPath Service READ service) + inline QDBusObjectPath service() const + { return qvariant_cast< QDBusObjectPath >(property("Service")); } + + Q_PROPERTY(QString UUID READ uUID) + inline QString uUID() const + { return qvariant_cast< QString >(property("UUID")); } + + Q_PROPERTY(QByteArray Value READ value) + inline QByteArray value() const + { return qvariant_cast< QByteArray >(property("Value")); } + +public Q_SLOTS: // METHODS + inline QDBusPendingReply ReadValue(const QVariantMap &options) + { + QList argumentList; + argumentList << QVariant::fromValue(options); + return asyncCallWithArgumentList(QStringLiteral("ReadValue"), argumentList); + } + + inline QDBusPendingReply<> StartNotify() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("StartNotify"), argumentList); + } + + inline QDBusPendingReply<> StopNotify() + { + QList argumentList; + return asyncCallWithArgumentList(QStringLiteral("StopNotify"), argumentList); + } + + inline QDBusPendingReply<> WriteValue(const QByteArray &value, const QVariantMap &options) + { + QList argumentList; + argumentList << QVariant::fromValue(value) << QVariant::fromValue(options); + return asyncCallWithArgumentList(QStringLiteral("WriteValue"), argumentList); + } + +Q_SIGNALS: // SIGNALS +}; + +namespace org { + namespace bluez { + typedef ::OrgBluezGattCharacteristic1Interface GattCharacteristic1; + } +} +#endif diff --git a/src/bluetooth/bluez/gattdesc1.cpp b/src/bluetooth/bluez/gattdesc1.cpp new file mode 100644 index 00000000..8447e49b --- /dev/null +++ b/src/bluetooth/bluez/gattdesc1.cpp @@ -0,0 +1,26 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -p gattdesc1_p.h:gattdesc1.cpp org.bluez.GattDescriptor1.xml + * + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. + * + * This is an auto-generated file. + * This file may have been hand-edited. Look for HAND-EDIT comments + * before re-generating it. + */ + +#include "gattdesc1_p.h" + +/* + * Implementation of interface class OrgBluezGattDescriptor1Interface + */ + +OrgBluezGattDescriptor1Interface::OrgBluezGattDescriptor1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) +{ +} + +OrgBluezGattDescriptor1Interface::~OrgBluezGattDescriptor1Interface() +{ +} + diff --git a/src/bluetooth/bluez/gattdesc1_p.h b/src/bluetooth/bluez/gattdesc1_p.h new file mode 100644 index 00000000..6ade7a42 --- /dev/null +++ b/src/bluetooth/bluez/gattdesc1_p.h @@ -0,0 +1,73 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -p gattdesc1_p.h:gattdesc1.cpp org.bluez.GattDescriptor1.xml + * + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#ifndef GATTDESC1_P_H +#define GATTDESC1_P_H + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Proxy class for interface org.bluez.GattDescriptor1 + */ +class OrgBluezGattDescriptor1Interface: public QDBusAbstractInterface +{ + Q_OBJECT +public: + static inline const char *staticInterfaceName() + { return "org.bluez.GattDescriptor1"; } + +public: + OrgBluezGattDescriptor1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); + + ~OrgBluezGattDescriptor1Interface(); + + Q_PROPERTY(QDBusObjectPath Characteristic READ characteristic) + inline QDBusObjectPath characteristic() const + { return qvariant_cast< QDBusObjectPath >(property("Characteristic")); } + + Q_PROPERTY(QString UUID READ uUID) + inline QString uUID() const + { return qvariant_cast< QString >(property("UUID")); } + + Q_PROPERTY(QByteArray Value READ value) + inline QByteArray value() const + { return qvariant_cast< QByteArray >(property("Value")); } + +public Q_SLOTS: // METHODS + inline QDBusPendingReply ReadValue(const QVariantMap &options) + { + QList argumentList; + argumentList << QVariant::fromValue(options); + return asyncCallWithArgumentList(QStringLiteral("ReadValue"), argumentList); + } + + inline QDBusPendingReply<> WriteValue(const QByteArray &value, const QVariantMap &options) + { + QList argumentList; + argumentList << QVariant::fromValue(value) << QVariant::fromValue(options); + return asyncCallWithArgumentList(QStringLiteral("WriteValue"), argumentList); + } + +Q_SIGNALS: // SIGNALS +}; + +namespace org { + namespace bluez { + typedef ::OrgBluezGattDescriptor1Interface GattDescriptor1; + } +} +#endif diff --git a/src/bluetooth/bluez/gattservice1.cpp b/src/bluetooth/bluez/gattservice1.cpp new file mode 100644 index 00000000..0b80ac90 --- /dev/null +++ b/src/bluetooth/bluez/gattservice1.cpp @@ -0,0 +1,26 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -p gattservice1_p.h:gattservice1.cpp org.bluez.GattService1.xml + * + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. + * + * This is an auto-generated file. + * This file may have been hand-edited. Look for HAND-EDIT comments + * before re-generating it. + */ + +#include "gattservice1_p.h" + +/* + * Implementation of interface class OrgBluezGattService1Interface + */ + +OrgBluezGattService1Interface::OrgBluezGattService1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent) + : QDBusAbstractInterface(service, path, staticInterfaceName(), connection, parent) +{ +} + +OrgBluezGattService1Interface::~OrgBluezGattService1Interface() +{ +} + diff --git a/src/bluetooth/bluez/gattservice1_p.h b/src/bluetooth/bluez/gattservice1_p.h new file mode 100644 index 00000000..128305f1 --- /dev/null +++ b/src/bluetooth/bluez/gattservice1_p.h @@ -0,0 +1,63 @@ +/* + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -p gattservice1_p.h:gattservice1.cpp org.bluez.GattService1.xml + * + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. + * + * This is an auto-generated file. + * Do not edit! All changes made to it will be lost. + */ + +#ifndef GATTSERVICE1_P_H +#define GATTSERVICE1_P_H + +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Proxy class for interface org.bluez.GattService1 + */ +class OrgBluezGattService1Interface: public QDBusAbstractInterface +{ + Q_OBJECT +public: + static inline const char *staticInterfaceName() + { return "org.bluez.GattService1"; } + +public: + OrgBluezGattService1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); + + ~OrgBluezGattService1Interface(); + + Q_PROPERTY(QDBusObjectPath Device READ device) + inline QDBusObjectPath device() const + { return qvariant_cast< QDBusObjectPath >(property("Device")); } + + Q_PROPERTY(QList Includes READ includes) + inline QList includes() const + { return qvariant_cast< QList >(property("Includes")); } + + Q_PROPERTY(bool Primary READ primary) + inline bool primary() const + { return qvariant_cast< bool >(property("Primary")); } + + Q_PROPERTY(QString UUID READ uUID) + inline QString uUID() const + { return qvariant_cast< QString >(property("UUID")); } + +public Q_SLOTS: // METHODS +Q_SIGNALS: // SIGNALS +}; + +namespace org { + namespace bluez { + typedef ::OrgBluezGattService1Interface GattService1; + } +} +#endif diff --git a/src/bluetooth/bluez/generate b/src/bluetooth/bluez/generate index cdba18c4..caae92f6 100755 --- a/src/bluetooth/bluez/generate +++ b/src/bluetooth/bluez/generate @@ -20,3 +20,7 @@ qdbusxml2cpp -p properties_p.h:properties.cpp org.freedesktop.dbus.properties.xm qdbusxml2cpp -p obex_client1_bluez5_p.h:obex_client1_bluez5_p.h org.bluez.Client1.xml qdbusxml2cpp -p obex_objectpush1_bluez5_p.h:obex_objectpush1_bluez5.cpp org.bluez.obex.ObjectPush1.xml qdbusxml2cpp -p obex_transfer1_bluez5_p.h:obex_transfer1_bluez5_p.h org.bluez.obex.Transfer1.xml +qdbusxml2cpp -p gattchar1_p.h:gattchar1.cpp org.bluez.GattCharacteristic1.xml +qdbusxml2cpp -p gattdesc1_p.h:gattdesc1.cpp org.bluez.GattDescriptor1.xml +qdbusxml2cpp -p gattservice1_p.h:gattservice1.cpp org.bluez.GattService1.xml + -- cgit v1.2.3 From 715b1ecd079f58e14a61c7e8867ddab65b7bf74c Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 17 Oct 2017 13:41:44 +0200 Subject: Run a general update of all dbus interface classes Mostly this permits the codebase to catchup with changes introduced by the qdbusxml2cpp tool. Change-Id: Ib16b70523b222c6babb3735f91b578e10c7542f3 Reviewed-by: Oliver Wolff --- src/bluetooth/bluez/adapter.cpp | 4 +- src/bluetooth/bluez/adapter_p.h | 60 +++++++++++----------- src/bluetooth/bluez/agent.cpp | 4 +- src/bluetooth/bluez/agent_p.h | 9 ++-- src/bluetooth/bluez/device.cpp | 4 +- src/bluetooth/bluez/device1_bluez5.cpp | 1 + src/bluetooth/bluez/device1_bluez5_p.h | 1 + src/bluetooth/bluez/device_p.h | 34 ++++++------ src/bluetooth/bluez/manager.cpp | 4 +- src/bluetooth/bluez/manager_p.h | 18 +++---- src/bluetooth/bluez/obex_agent.cpp | 6 +-- src/bluetooth/bluez/obex_agent_p.h | 11 ++-- src/bluetooth/bluez/obex_client.cpp | 4 +- src/bluetooth/bluez/obex_client1_bluez5_p.h | 14 ++--- src/bluetooth/bluez/obex_client_p.h | 30 +++++------ src/bluetooth/bluez/obex_manager.cpp | 4 +- src/bluetooth/bluez/obex_manager_p.h | 18 +++---- src/bluetooth/bluez/obex_objectpush1_bluez5.cpp | 4 +- src/bluetooth/bluez/obex_objectpush1_bluez5_p.h | 22 ++++---- src/bluetooth/bluez/obex_transfer.cpp | 4 +- src/bluetooth/bluez/obex_transfer1_bluez5_p.h | 16 +++--- src/bluetooth/bluez/obex_transfer_p.h | 14 ++--- src/bluetooth/bluez/objectmanager.cpp | 4 +- src/bluetooth/bluez/objectmanager_p.h | 12 ++--- .../bluez/org.bluez.GattCharacteristic1.xml | 2 + src/bluetooth/bluez/org.bluez.GattDescriptor1.xml | 2 + src/bluetooth/bluez/profile1.cpp | 4 +- src/bluetooth/bluez/profile1_p.h | 14 ++--- src/bluetooth/bluez/properties.cpp | 4 +- src/bluetooth/bluez/properties_p.h | 16 +++--- src/bluetooth/bluez/service.cpp | 4 +- src/bluetooth/bluez/service_p.h | 28 +++++----- 32 files changed, 190 insertions(+), 186 deletions(-) diff --git a/src/bluetooth/bluez/adapter.cpp b/src/bluetooth/bluez/adapter.cpp index 10b46f3b..eaea76f8 100644 --- a/src/bluetooth/bluez/adapter.cpp +++ b/src/bluetooth/bluez/adapter.cpp @@ -1,8 +1,8 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p adapter_p.h:adapter.cpp org.bluez.all.xml org.bluez.Adapter * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 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/adapter_p.h b/src/bluetooth/bluez/adapter_p.h index d9b6a0c7..236fe7e4 100644 --- a/src/bluetooth/bluez/adapter_p.h +++ b/src/bluetooth/bluez/adapter_p.h @@ -1,15 +1,15 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p adapter_p.h:adapter.cpp org.bluez.all.xml org.bluez.Adapter * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ -#ifndef ADAPTER_P_H_1273205927 -#define ADAPTER_P_H_1273205927 +#ifndef ADAPTER_P_H +#define ADAPTER_P_H #include #include @@ -31,7 +31,7 @@ public: { return "org.bluez.Adapter"; } public: - OrgBluezAdapterInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + OrgBluezAdapterInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); ~OrgBluezAdapterInterface(); @@ -39,106 +39,106 @@ public Q_SLOTS: // METHODS inline QDBusPendingReply<> CancelDeviceCreation(const QString &in0) { QList argumentList; - argumentList << qVariantFromValue(in0); - return asyncCallWithArgumentList(QLatin1String("CancelDeviceCreation"), argumentList); + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("CancelDeviceCreation"), argumentList); } inline QDBusPendingReply CreateDevice(const QString &in0) { QList argumentList; - argumentList << qVariantFromValue(in0); - return asyncCallWithArgumentList(QLatin1String("CreateDevice"), argumentList); + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("CreateDevice"), argumentList); } inline QDBusPendingReply CreatePairedDevice(const QString &in0, const QDBusObjectPath &in1, const QString &in2) { QList argumentList; - argumentList << qVariantFromValue(in0) << qVariantFromValue(in1) << qVariantFromValue(in2); - return asyncCallWithArgumentList(QLatin1String("CreatePairedDevice"), argumentList); + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2); + return asyncCallWithArgumentList(QStringLiteral("CreatePairedDevice"), argumentList); } inline QDBusPendingReply FindDevice(const QString &in0) { QList argumentList; - argumentList << qVariantFromValue(in0); - return asyncCallWithArgumentList(QLatin1String("FindDevice"), argumentList); + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("FindDevice"), argumentList); } inline QDBusPendingReply GetProperties() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("GetProperties"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("GetProperties"), argumentList); } inline QDBusPendingReply > ListDevices() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("ListDevices"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("ListDevices"), argumentList); } inline QDBusPendingReply<> RegisterAgent(const QDBusObjectPath &in0, const QString &in1) { QList argumentList; - argumentList << qVariantFromValue(in0) << qVariantFromValue(in1); - return asyncCallWithArgumentList(QLatin1String("RegisterAgent"), argumentList); + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); + return asyncCallWithArgumentList(QStringLiteral("RegisterAgent"), argumentList); } inline QDBusPendingReply<> ReleaseMode() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("ReleaseMode"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("ReleaseMode"), argumentList); } inline QDBusPendingReply<> ReleaseSession() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("ReleaseSession"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("ReleaseSession"), argumentList); } inline QDBusPendingReply<> RemoveDevice(const QDBusObjectPath &in0) { QList argumentList; - argumentList << qVariantFromValue(in0); - return asyncCallWithArgumentList(QLatin1String("RemoveDevice"), argumentList); + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("RemoveDevice"), argumentList); } inline QDBusPendingReply<> RequestMode(const QString &in0) { QList argumentList; - argumentList << qVariantFromValue(in0); - return asyncCallWithArgumentList(QLatin1String("RequestMode"), argumentList); + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("RequestMode"), argumentList); } inline QDBusPendingReply<> RequestSession() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("RequestSession"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("RequestSession"), argumentList); } inline QDBusPendingReply<> SetProperty(const QString &in0, const QDBusVariant &in1) { QList argumentList; - argumentList << qVariantFromValue(in0) << qVariantFromValue(in1); - return asyncCallWithArgumentList(QLatin1String("SetProperty"), argumentList); + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); + return asyncCallWithArgumentList(QStringLiteral("SetProperty"), argumentList); } inline QDBusPendingReply<> StartDiscovery() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("StartDiscovery"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("StartDiscovery"), argumentList); } inline QDBusPendingReply<> StopDiscovery() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("StopDiscovery"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("StopDiscovery"), argumentList); } inline QDBusPendingReply<> UnregisterAgent(const QDBusObjectPath &in0) { QList argumentList; - argumentList << qVariantFromValue(in0); - return asyncCallWithArgumentList(QLatin1String("UnregisterAgent"), argumentList); + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("UnregisterAgent"), argumentList); } Q_SIGNALS: // SIGNALS diff --git a/src/bluetooth/bluez/agent.cpp b/src/bluetooth/bluez/agent.cpp index 89840531..6fa80176 100644 --- a/src/bluetooth/bluez/agent.cpp +++ b/src/bluetooth/bluez/agent.cpp @@ -1,8 +1,8 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -c OrgBluezAgentAdaptor -a agent_p.h:agent.cpp org.bluez.Agent.xml org.bluez.Agent * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 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 8329089f..32efa62e 100644 --- a/src/bluetooth/bluez/agent_p.h +++ b/src/bluetooth/bluez/agent_p.h @@ -1,20 +1,19 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -c OrgBluezAgentAdaptor -a agent_p.h:agent.cpp org.bluez.Agent.xml org.bluez.Agent * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments * before re-generating it. */ -#ifndef AGENT_P_H_1291941396 -#define AGENT_P_H_1291941396 +#ifndef AGENT_P_H +#define AGENT_P_H #include #include - QT_BEGIN_NAMESPACE class QByteArray; template class QList; diff --git a/src/bluetooth/bluez/device.cpp b/src/bluetooth/bluez/device.cpp index 5dc814dc..14b91ad0 100644 --- a/src/bluetooth/bluez/device.cpp +++ b/src/bluetooth/bluez/device.cpp @@ -1,8 +1,8 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -i servicemap_p.h -p device_p.h:device.cpp org.bluez.Device.xml org.bluez.Device * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 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 491a365d..cd6453ad 100644 --- a/src/bluetooth/bluez/device1_bluez5.cpp +++ b/src/bluetooth/bluez/device1_bluez5.cpp @@ -1,5 +1,6 @@ /* * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -p device1_bluez5_p.h:device1_bluez5.cpp org.bluez.Device1.xml * * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * diff --git a/src/bluetooth/bluez/device1_bluez5_p.h b/src/bluetooth/bluez/device1_bluez5_p.h index 4feb5318..b9523a56 100644 --- a/src/bluetooth/bluez/device1_bluez5_p.h +++ b/src/bluetooth/bluez/device1_bluez5_p.h @@ -1,5 +1,6 @@ /* * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -p device1_bluez5_p.h:device1_bluez5.cpp org.bluez.Device1.xml * * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * diff --git a/src/bluetooth/bluez/device_p.h b/src/bluetooth/bluez/device_p.h index 417db3d9..2e1e39ad 100644 --- a/src/bluetooth/bluez/device_p.h +++ b/src/bluetooth/bluez/device_p.h @@ -1,15 +1,15 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -i servicemap_p.h -p device_p.h:device.cpp org.bluez.Device.xml org.bluez.Device * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ -#ifndef DEVICE_P_H_1273205927 -#define DEVICE_P_H_1273205927 +#ifndef DEVICE_P_H +#define DEVICE_P_H #include #include @@ -32,7 +32,7 @@ public: { return "org.bluez.Device"; } public: - OrgBluezDeviceInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + OrgBluezDeviceInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); ~OrgBluezDeviceInterface(); @@ -40,53 +40,53 @@ public Q_SLOTS: // METHODS inline QDBusPendingReply<> CancelDiscovery() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("CancelDiscovery"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("CancelDiscovery"), argumentList); } inline QDBusPendingReply CreateNode(const QString &in0) { QList argumentList; - argumentList << qVariantFromValue(in0); - return asyncCallWithArgumentList(QLatin1String("CreateNode"), argumentList); + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("CreateNode"), argumentList); } inline QDBusPendingReply<> Disconnect() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("Disconnect"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("Disconnect"), argumentList); } inline QDBusPendingReply DiscoverServices(const QString &in0) { QList argumentList; - argumentList << qVariantFromValue(in0); - return asyncCallWithArgumentList(QLatin1String("DiscoverServices"), argumentList); + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("DiscoverServices"), argumentList); } inline QDBusPendingReply GetProperties() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("GetProperties"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("GetProperties"), argumentList); } inline QDBusPendingReply > ListNodes() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("ListNodes"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("ListNodes"), argumentList); } inline QDBusPendingReply<> RemoveNode(const QDBusObjectPath &in0) { QList argumentList; - argumentList << qVariantFromValue(in0); - return asyncCallWithArgumentList(QLatin1String("RemoveNode"), argumentList); + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("RemoveNode"), argumentList); } inline QDBusPendingReply<> SetProperty(const QString &in0, const QDBusVariant &in1) { QList argumentList; - argumentList << qVariantFromValue(in0) << qVariantFromValue(in1); - return asyncCallWithArgumentList(QLatin1String("SetProperty"), argumentList); + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); + return asyncCallWithArgumentList(QStringLiteral("SetProperty"), argumentList); } Q_SIGNALS: // SIGNALS diff --git a/src/bluetooth/bluez/manager.cpp b/src/bluetooth/bluez/manager.cpp index b5d6590d..8ca6fb42 100644 --- a/src/bluetooth/bluez/manager.cpp +++ b/src/bluetooth/bluez/manager.cpp @@ -1,8 +1,8 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p manager_p.h:manager.cpp org.bluez.Manager.xml org.bluez.Manager * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 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 edb1c73b..a969e067 100644 --- a/src/bluetooth/bluez/manager_p.h +++ b/src/bluetooth/bluez/manager_p.h @@ -1,15 +1,15 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p manager_p.h:manager.cpp org.bluez.Manager.xml org.bluez.Manager * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ -#ifndef MANAGER_P_H_1273205927 -#define MANAGER_P_H_1273205927 +#ifndef MANAGER_P_H +#define MANAGER_P_H #include #include @@ -31,7 +31,7 @@ public: { return "org.bluez.Manager"; } public: - OrgBluezManagerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + OrgBluezManagerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); ~OrgBluezManagerInterface(); @@ -39,20 +39,20 @@ public Q_SLOTS: // METHODS inline QDBusPendingReply DefaultAdapter() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("DefaultAdapter"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("DefaultAdapter"), argumentList); } inline QDBusPendingReply FindAdapter(const QString &in0) { QList argumentList; - argumentList << qVariantFromValue(in0); - return asyncCallWithArgumentList(QLatin1String("FindAdapter"), argumentList); + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("FindAdapter"), argumentList); } inline QDBusPendingReply > ListAdapters() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("ListAdapters"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("ListAdapters"), argumentList); } Q_SIGNALS: // SIGNALS diff --git a/src/bluetooth/bluez/obex_agent.cpp b/src/bluetooth/bluez/obex_agent.cpp index c5252898..5bc05f87 100644 --- a/src/bluetooth/bluez/obex_agent.cpp +++ b/src/bluetooth/bluez/obex_agent.cpp @@ -1,8 +1,8 @@ /* - * 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 + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -a obex_agent_p.h:obex_agent.cpp org.openobex.agent.xml org.openobex.Agent * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 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 8af38d86..242b2598 100644 --- a/src/bluetooth/bluez/obex_agent_p.h +++ b/src/bluetooth/bluez/obex_agent_p.h @@ -1,20 +1,19 @@ /* - * 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 + * This file was generated by qdbusxml2cpp version 0.8 + * Command line was: qdbusxml2cpp -a obex_agent_p.h:obex_agent.cpp org.openobex.agent.xml org.openobex.Agent * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * This file may have been hand-edited. Look for HAND-EDIT comments * before re-generating it. */ -#ifndef OBEX_AGENT_P_H_1291359033 -#define OBEX_AGENT_P_H_1291359033 +#ifndef OBEX_AGENT_P_H +#define OBEX_AGENT_P_H #include #include - QT_BEGIN_NAMESPACE class QByteArray; template class QList; diff --git a/src/bluetooth/bluez/obex_client.cpp b/src/bluetooth/bluez/obex_client.cpp index 07730d42..bef9155a 100644 --- a/src/bluetooth/bluez/obex_client.cpp +++ b/src/bluetooth/bluez/obex_client.cpp @@ -1,8 +1,8 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p obex_client_p.h:obex_client.cpp org.openobex.client.xml org.openobex.Client * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 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 5133faea..ccd5b0d6 100644 --- a/src/bluetooth/bluez/obex_client1_bluez5_p.h +++ b/src/bluetooth/bluez/obex_client1_bluez5_p.h @@ -1,15 +1,15 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp org.bluez.Client1.xml -p asd + * Command line was: qdbusxml2cpp -p obex_client1_bluez5_p.h:obex_client1_bluez5_p.h org.bluez.Client1.xml * - * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ -#ifndef ASD_H_1399976174 -#define ASD_H_1399976174 +#ifndef OBEX_CLIENT1_BLUEZ5_P_H +#define OBEX_CLIENT1_BLUEZ5_P_H #include #include @@ -31,7 +31,7 @@ public: { return "org.bluez.obex.Client1"; } public: - OrgBluezObexClient1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + OrgBluezObexClient1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); ~OrgBluezObexClient1Interface(); @@ -40,14 +40,14 @@ public Q_SLOTS: // METHODS { QList argumentList; argumentList << QVariant::fromValue(destination) << QVariant::fromValue(args); - return asyncCallWithArgumentList(QLatin1String("CreateSession"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("CreateSession"), argumentList); } inline QDBusPendingReply<> RemoveSession(const QDBusObjectPath &session) { QList argumentList; argumentList << QVariant::fromValue(session); - return asyncCallWithArgumentList(QLatin1String("RemoveSession"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("RemoveSession"), argumentList); } Q_SIGNALS: // SIGNALS diff --git a/src/bluetooth/bluez/obex_client_p.h b/src/bluetooth/bluez/obex_client_p.h index b2dd0f61..13b638b6 100644 --- a/src/bluetooth/bluez/obex_client_p.h +++ b/src/bluetooth/bluez/obex_client_p.h @@ -1,15 +1,15 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p obex_client_p.h:obex_client.cpp org.openobex.client.xml org.openobex.Client * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ -#ifndef OBEX_CLIENT_P_H_1291349694 -#define OBEX_CLIENT_P_H_1291349694 +#ifndef OBEX_CLIENT_P_H +#define OBEX_CLIENT_P_H #include #include @@ -31,7 +31,7 @@ public: { return "org.openobex.Client"; } public: - OrgOpenobexClientInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + OrgOpenobexClientInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); ~OrgOpenobexClientInterface(); @@ -39,36 +39,36 @@ public Q_SLOTS: // METHODS inline QDBusPendingReply CreateSession(const QVariantMap &in0) { QList argumentList; - argumentList << qVariantFromValue(in0); - return asyncCallWithArgumentList(QLatin1String("CreateSession"), argumentList); + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("CreateSession"), argumentList); } inline QDBusPendingReply<> ExchangeBusinessCards(const QVariantMap &in0, const QString &in1, const QString &in2) { QList argumentList; - argumentList << qVariantFromValue(in0) << qVariantFromValue(in1) << qVariantFromValue(in2); - return asyncCallWithArgumentList(QLatin1String("ExchangeBusinessCards"), argumentList); + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2); + return asyncCallWithArgumentList(QStringLiteral("ExchangeBusinessCards"), argumentList); } inline QDBusPendingReply GetCapabilities(const QVariantMap &in0) { QList argumentList; - argumentList << qVariantFromValue(in0); - return asyncCallWithArgumentList(QLatin1String("GetCapabilities"), argumentList); + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("GetCapabilities"), argumentList); } inline QDBusPendingReply<> PullBusinessCard(const QVariantMap &in0, const QString &in1) { QList argumentList; - argumentList << qVariantFromValue(in0) << qVariantFromValue(in1); - return asyncCallWithArgumentList(QLatin1String("PullBusinessCard"), argumentList); + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); + return asyncCallWithArgumentList(QStringLiteral("PullBusinessCard"), argumentList); } inline QDBusPendingReply<> SendFiles(const QVariantMap &in0, const QStringList &in1, const QDBusObjectPath &in2) { QList argumentList; - argumentList << qVariantFromValue(in0) << qVariantFromValue(in1) << qVariantFromValue(in2); - return asyncCallWithArgumentList(QLatin1String("SendFiles"), argumentList); + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2); + return asyncCallWithArgumentList(QStringLiteral("SendFiles"), argumentList); } Q_SIGNALS: // SIGNALS diff --git a/src/bluetooth/bluez/obex_manager.cpp b/src/bluetooth/bluez/obex_manager.cpp index 0eb5d1c8..cc6e0ecb 100644 --- a/src/bluetooth/bluez/obex_manager.cpp +++ b/src/bluetooth/bluez/obex_manager.cpp @@ -1,8 +1,8 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p obex_manager_p.h:obex_manager.cpp org.openobex.all.xml org.openobex.Manager * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 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 a6e4d189..822954ab 100644 --- a/src/bluetooth/bluez/obex_manager_p.h +++ b/src/bluetooth/bluez/obex_manager_p.h @@ -1,15 +1,15 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p obex_manager_p.h:obex_manager.cpp org.openobex.all.xml org.openobex.Manager * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ -#ifndef OBEX_MANAGER_P_H_1291186314 -#define OBEX_MANAGER_P_H_1291186314 +#ifndef OBEX_MANAGER_P_H +#define OBEX_MANAGER_P_H #include #include @@ -31,7 +31,7 @@ public: { return "org.openobex.Manager"; } public: - OrgOpenobexManagerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + OrgOpenobexManagerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); ~OrgOpenobexManagerInterface(); @@ -39,15 +39,15 @@ public Q_SLOTS: // METHODS inline QDBusPendingReply<> RegisterAgent(const QDBusObjectPath &in0) { QList argumentList; - argumentList << qVariantFromValue(in0); - return asyncCallWithArgumentList(QLatin1String("RegisterAgent"), argumentList); + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("RegisterAgent"), argumentList); } inline QDBusPendingReply<> UnregisterAgent(const QDBusObjectPath &in0) { QList argumentList; - argumentList << qVariantFromValue(in0); - return asyncCallWithArgumentList(QLatin1String("UnregisterAgent"), argumentList); + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("UnregisterAgent"), argumentList); } Q_SIGNALS: // SIGNALS diff --git a/src/bluetooth/bluez/obex_objectpush1_bluez5.cpp b/src/bluetooth/bluez/obex_objectpush1_bluez5.cpp index 6edb27a8..59b94e80 100644 --- a/src/bluetooth/bluez/obex_objectpush1_bluez5.cpp +++ b/src/bluetooth/bluez/obex_objectpush1_bluez5.cpp @@ -1,8 +1,8 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp org.bluez.obex.ObjectPush1.xml -p obex_objectpush1_bluez5 + * Command line was: qdbusxml2cpp -p obex_objectpush1_bluez5_p.h:obex_objectpush1_bluez5.cpp org.bluez.obex.ObjectPush1.xml * - * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 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 ba5f090d..5fa1703b 100644 --- a/src/bluetooth/bluez/obex_objectpush1_bluez5_p.h +++ b/src/bluetooth/bluez/obex_objectpush1_bluez5_p.h @@ -1,15 +1,15 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp org.bluez.obex.ObjectPush1.xml -p obex_objectpush1_bluez5 + * Command line was: qdbusxml2cpp -p obex_objectpush1_bluez5_p.h:obex_objectpush1_bluez5.cpp org.bluez.obex.ObjectPush1.xml * - * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ -#ifndef OBEX_OBJECTPUSH1_BLUEZ5_H_1399989318 -#define OBEX_OBJECTPUSH1_BLUEZ5_H_1399989318 +#ifndef OBEX_OBJECTPUSH1_BLUEZ5_P_H +#define OBEX_OBJECTPUSH1_BLUEZ5_P_H #include #include @@ -31,7 +31,7 @@ public: { return "org.bluez.obex.ObjectPush1"; } public: - OrgBluezObexObjectPush1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + OrgBluezObexObjectPush1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); ~OrgBluezObexObjectPush1Interface(); @@ -40,13 +40,13 @@ public Q_SLOTS: // METHODS { QList argumentList; argumentList << QVariant::fromValue(clientfile) << QVariant::fromValue(targetfile); - return asyncCallWithArgumentList(QLatin1String("ExchangeBusinessCards"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("ExchangeBusinessCards"), argumentList); } inline QDBusReply ExchangeBusinessCards(const QString &clientfile, const QString &targetfile, QVariantMap &properties) { QList argumentList; argumentList << QVariant::fromValue(clientfile) << QVariant::fromValue(targetfile); - QDBusMessage reply = callWithArgumentList(QDBus::Block, QLatin1String("ExchangeBusinessCards"), argumentList); + QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("ExchangeBusinessCards"), argumentList); if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 2) { properties = qdbus_cast(reply.arguments().at(1)); } @@ -57,13 +57,13 @@ public Q_SLOTS: // METHODS { QList argumentList; argumentList << QVariant::fromValue(targetfile); - return asyncCallWithArgumentList(QLatin1String("PullBusinessCard"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("PullBusinessCard"), argumentList); } inline QDBusReply PullBusinessCard(const QString &targetfile, QVariantMap &properties) { QList argumentList; argumentList << QVariant::fromValue(targetfile); - QDBusMessage reply = callWithArgumentList(QDBus::Block, QLatin1String("PullBusinessCard"), argumentList); + QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("PullBusinessCard"), argumentList); if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 2) { properties = qdbus_cast(reply.arguments().at(1)); } @@ -74,13 +74,13 @@ public Q_SLOTS: // METHODS { QList argumentList; argumentList << QVariant::fromValue(sourcefile); - return asyncCallWithArgumentList(QLatin1String("SendFile"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("SendFile"), argumentList); } inline QDBusReply SendFile(const QString &sourcefile, QVariantMap &properties) { QList argumentList; argumentList << QVariant::fromValue(sourcefile); - QDBusMessage reply = callWithArgumentList(QDBus::Block, QLatin1String("SendFile"), argumentList); + QDBusMessage reply = callWithArgumentList(QDBus::Block, QStringLiteral("SendFile"), argumentList); if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() == 2) { properties = qdbus_cast(reply.arguments().at(1)); } diff --git a/src/bluetooth/bluez/obex_transfer.cpp b/src/bluetooth/bluez/obex_transfer.cpp index 49e1f7c9..be27362f 100644 --- a/src/bluetooth/bluez/obex_transfer.cpp +++ b/src/bluetooth/bluez/obex_transfer.cpp @@ -1,8 +1,8 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p obex_transfer_p.h:obex_transfer.cpp org.openobex.transfer.xml org.openobex.Transfer * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 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 2307f2ae..ccde588e 100644 --- a/src/bluetooth/bluez/obex_transfer1_bluez5_p.h +++ b/src/bluetooth/bluez/obex_transfer1_bluez5_p.h @@ -1,15 +1,15 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp org.bluez.obex.Transfer1.xml -p obex_transfer1_bluez5 + * Command line was: qdbusxml2cpp -p obex_transfer1_bluez5_p.h:obex_transfer1_bluez5_p.h org.bluez.obex.Transfer1.xml * - * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ -#ifndef OBEX_TRANSFER1_BLUEZ5_H_1400058158 -#define OBEX_TRANSFER1_BLUEZ5_H_1400058158 +#ifndef OBEX_TRANSFER1_BLUEZ5_P_H +#define OBEX_TRANSFER1_BLUEZ5_P_H #include #include @@ -31,7 +31,7 @@ public: { return "org.bluez.obex.Transfer1"; } public: - OrgBluezObexTransfer1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + OrgBluezObexTransfer1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); ~OrgBluezObexTransfer1Interface(); @@ -63,19 +63,19 @@ public Q_SLOTS: // METHODS inline QDBusPendingReply<> Cancel() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("Cancel"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("Cancel"), argumentList); } inline QDBusPendingReply<> Resume() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("Resume"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("Resume"), argumentList); } inline QDBusPendingReply<> Suspend() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("Suspend"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("Suspend"), argumentList); } Q_SIGNALS: // SIGNALS diff --git a/src/bluetooth/bluez/obex_transfer_p.h b/src/bluetooth/bluez/obex_transfer_p.h index 81b9eb22..b8fa0a5d 100644 --- a/src/bluetooth/bluez/obex_transfer_p.h +++ b/src/bluetooth/bluez/obex_transfer_p.h @@ -1,15 +1,15 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p obex_transfer_p.h:obex_transfer.cpp org.openobex.transfer.xml org.openobex.Transfer * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ -#ifndef OBEX_TRANSFER_P_H_1291853849 -#define OBEX_TRANSFER_P_H_1291853849 +#ifndef OBEX_TRANSFER_P_H +#define OBEX_TRANSFER_P_H #include #include @@ -31,7 +31,7 @@ public: { return "org.openobex.Transfer"; } public: - OrgOpenobexTransferInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + OrgOpenobexTransferInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); ~OrgOpenobexTransferInterface(); @@ -39,13 +39,13 @@ public Q_SLOTS: // METHODS inline QDBusPendingReply<> Cancel() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("Cancel"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("Cancel"), argumentList); } inline QDBusPendingReply GetProperties() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("GetProperties"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("GetProperties"), argumentList); } Q_SIGNALS: // SIGNALS diff --git a/src/bluetooth/bluez/objectmanager.cpp b/src/bluetooth/bluez/objectmanager.cpp index a8e8fdba..4484ea27 100644 --- a/src/bluetooth/bluez/objectmanager.cpp +++ b/src/bluetooth/bluez/objectmanager.cpp @@ -1,8 +1,8 @@ /* * 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 + * Command line was: qdbusxml2cpp -p objectmanager_p.h:objectmanager.cpp org.freedesktop.dbus.objectmanager.xml * - * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 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 74f5ab43..7aa2f35b 100644 --- a/src/bluetooth/bluez/objectmanager_p.h +++ b/src/bluetooth/bluez/objectmanager_p.h @@ -1,15 +1,15 @@ /* * 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 + * Command line was: qdbusxml2cpp -p objectmanager_p.h:objectmanager.cpp org.freedesktop.dbus.objectmanager.xml * - * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ -#ifndef OBJECTMANAGER_H_1396883000 -#define OBJECTMANAGER_H_1396883000 +#ifndef OBJECTMANAGER_P_H +#define OBJECTMANAGER_P_H #include #include @@ -33,7 +33,7 @@ public: { return "org.freedesktop.DBus.ObjectManager"; } public: - OrgFreedesktopDBusObjectManagerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + OrgFreedesktopDBusObjectManagerInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); ~OrgFreedesktopDBusObjectManagerInterface(); @@ -41,7 +41,7 @@ public Q_SLOTS: // METHODS inline QDBusPendingReply GetManagedObjects() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("GetManagedObjects"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("GetManagedObjects"), argumentList); } Q_SIGNALS: // SIGNALS diff --git a/src/bluetooth/bluez/org.bluez.GattCharacteristic1.xml b/src/bluetooth/bluez/org.bluez.GattCharacteristic1.xml index 598e01e9..f62014cf 100644 --- a/src/bluetooth/bluez/org.bluez.GattCharacteristic1.xml +++ b/src/bluetooth/bluez/org.bluez.GattCharacteristic1.xml @@ -3,11 +3,13 @@ + + diff --git a/src/bluetooth/bluez/org.bluez.GattDescriptor1.xml b/src/bluetooth/bluez/org.bluez.GattDescriptor1.xml index ceb6f0af..fc7ebce0 100644 --- a/src/bluetooth/bluez/org.bluez.GattDescriptor1.xml +++ b/src/bluetooth/bluez/org.bluez.GattDescriptor1.xml @@ -3,11 +3,13 @@ + + diff --git a/src/bluetooth/bluez/profile1.cpp b/src/bluetooth/bluez/profile1.cpp index c289c89b..26d42c7c 100644 --- a/src/bluetooth/bluez/profile1.cpp +++ b/src/bluetooth/bluez/profile1.cpp @@ -1,8 +1,8 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -p profile1 org.bluez.ProfileManager1.xml + * Command line was: qdbusxml2cpp -p profile1_p.h:profile1.cpp org.bluez.ProfileManager1.xml * - * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 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 a08f10e0..e61fb2a9 100644 --- a/src/bluetooth/bluez/profile1_p.h +++ b/src/bluetooth/bluez/profile1_p.h @@ -1,15 +1,15 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -p profile1 org.bluez.ProfileManager1.xml + * Command line was: qdbusxml2cpp -p profile1_p.h:profile1.cpp org.bluez.ProfileManager1.xml * - * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ -#ifndef PROFILE1_H_1400142085 -#define PROFILE1_H_1400142085 +#ifndef PROFILE1_P_H +#define PROFILE1_P_H #include #include @@ -31,7 +31,7 @@ public: { return "org.bluez.ProfileManager1"; } public: - OrgBluezProfileManager1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + OrgBluezProfileManager1Interface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); ~OrgBluezProfileManager1Interface(); @@ -40,14 +40,14 @@ public Q_SLOTS: // METHODS { QList argumentList; argumentList << QVariant::fromValue(profile) << QVariant::fromValue(UUID) << QVariant::fromValue(options); - return asyncCallWithArgumentList(QLatin1String("RegisterProfile"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("RegisterProfile"), argumentList); } inline QDBusPendingReply<> UnregisterProfile(const QDBusObjectPath &profile) { QList argumentList; argumentList << QVariant::fromValue(profile); - return asyncCallWithArgumentList(QLatin1String("UnregisterProfile"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("UnregisterProfile"), argumentList); } Q_SIGNALS: // SIGNALS diff --git a/src/bluetooth/bluez/properties.cpp b/src/bluetooth/bluez/properties.cpp index 4ddbc30c..1c10bfdc 100644 --- a/src/bluetooth/bluez/properties.cpp +++ b/src/bluetooth/bluez/properties.cpp @@ -1,8 +1,8 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -p properties -v org.freedesktop.dbus.properties.xml + * Command line was: qdbusxml2cpp -p properties_p.h:properties.cpp org.freedesktop.dbus.properties.xml * - * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 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 daadfefc..16a43e80 100644 --- a/src/bluetooth/bluez/properties_p.h +++ b/src/bluetooth/bluez/properties_p.h @@ -1,15 +1,15 @@ /* * This file was generated by qdbusxml2cpp version 0.8 - * Command line was: qdbusxml2cpp -p properties -v org.freedesktop.dbus.properties.xml + * Command line was: qdbusxml2cpp -p properties_p.h:properties.cpp org.freedesktop.dbus.properties.xml * - * qdbusxml2cpp is Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ -#ifndef PROPERTIES_H_1396952220 -#define PROPERTIES_H_1396952220 +#ifndef PROPERTIES_P_H +#define PROPERTIES_P_H #include #include @@ -31,7 +31,7 @@ public: { return "org.freedesktop.DBus.Properties"; } public: - OrgFreedesktopDBusPropertiesInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + OrgFreedesktopDBusPropertiesInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); ~OrgFreedesktopDBusPropertiesInterface(); @@ -40,21 +40,21 @@ public Q_SLOTS: // METHODS { QList argumentList; argumentList << QVariant::fromValue(interface) << QVariant::fromValue(name); - return asyncCallWithArgumentList(QLatin1String("Get"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("Get"), argumentList); } inline QDBusPendingReply GetAll(const QString &interface) { QList argumentList; argumentList << QVariant::fromValue(interface); - return asyncCallWithArgumentList(QLatin1String("GetAll"), argumentList); + 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(QLatin1String("Set"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("Set"), argumentList); } Q_SIGNALS: // SIGNALS diff --git a/src/bluetooth/bluez/service.cpp b/src/bluetooth/bluez/service.cpp index 2004bea7..d2b15fc2 100644 --- a/src/bluetooth/bluez/service.cpp +++ b/src/bluetooth/bluez/service.cpp @@ -1,8 +1,8 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p service_p.h:service.cpp org.bluez.all.xml org.bluez.Service * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 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 e8c5e1f4..573265a8 100644 --- a/src/bluetooth/bluez/service_p.h +++ b/src/bluetooth/bluez/service_p.h @@ -1,15 +1,15 @@ /* - * This file was generated by qdbusxml2cpp version 0.7 + * This file was generated by qdbusxml2cpp version 0.8 * Command line was: qdbusxml2cpp -p service_p.h:service.cpp org.bluez.all.xml org.bluez.Service * - * Copyright (C) 2015 The Qt Company Ltd. + * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd. * * This is an auto-generated file. * Do not edit! All changes made to it will be lost. */ -#ifndef SERVICE_P_H_1277421939 -#define SERVICE_P_H_1277421939 +#ifndef SERVICE_P_H +#define SERVICE_P_H #include #include @@ -31,7 +31,7 @@ public: { return "org.bluez.Service"; } public: - OrgBluezServiceInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = 0); + OrgBluezServiceInterface(const QString &service, const QString &path, const QDBusConnection &connection, QObject *parent = nullptr); ~OrgBluezServiceInterface(); @@ -39,35 +39,35 @@ public Q_SLOTS: // METHODS inline QDBusPendingReply AddRecord(const QString &in0) { QList argumentList; - argumentList << qVariantFromValue(in0); - return asyncCallWithArgumentList(QLatin1String("AddRecord"), argumentList); + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("AddRecord"), argumentList); } inline QDBusPendingReply<> CancelAuthorization() { QList argumentList; - return asyncCallWithArgumentList(QLatin1String("CancelAuthorization"), argumentList); + return asyncCallWithArgumentList(QStringLiteral("CancelAuthorization"), argumentList); } inline QDBusPendingReply<> RemoveRecord(uint in0) { QList argumentList; - argumentList << qVariantFromValue(in0); - return asyncCallWithArgumentList(QLatin1String("RemoveRecord"), argumentList); + argumentList << QVariant::fromValue(in0); + return asyncCallWithArgumentList(QStringLiteral("RemoveRecord"), argumentList); } inline QDBusPendingReply<> RequestAuthorization(const QString &in0, uint in1) { QList argumentList; - argumentList << qVariantFromValue(in0) << qVariantFromValue(in1); - return asyncCallWithArgumentList(QLatin1String("RequestAuthorization"), argumentList); + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); + return asyncCallWithArgumentList(QStringLiteral("RequestAuthorization"), argumentList); } inline QDBusPendingReply<> UpdateRecord(uint in0, const QString &in1) { QList argumentList; - argumentList << qVariantFromValue(in0) << qVariantFromValue(in1); - return asyncCallWithArgumentList(QLatin1String("UpdateRecord"), argumentList); + argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); + return asyncCallWithArgumentList(QStringLiteral("UpdateRecord"), argumentList); } Q_SIGNALS: // SIGNALS -- cgit v1.2.3 From 4ab8bd20b590f96763dd93f4436327042fbd27da Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 17 Oct 2017 14:13:00 +0200 Subject: Hook new gatt dbus classes into build system In addition, we add exception rules for the missing "We mean it" header preamble. The headers are auto generated. Task-number: QTBUG-46819 Change-Id: Ia781e2b3af597518a345019d4e9e817471706652 Reviewed-by: Oliver Wolff --- src/bluetooth/bluez/bluez.pri | 6 ++++++ sync.profile | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/bluez/bluez.pri b/src/bluetooth/bluez/bluez.pri index b99f2712..a8ca8e22 100644 --- a/src/bluetooth/bluez/bluez.pri +++ b/src/bluetooth/bluez/bluez.pri @@ -17,6 +17,9 @@ HEADERS += bluez/manager_p.h \ bluez/obex_client1_bluez5_p.h \ bluez/obex_objectpush1_bluez5_p.h \ bluez/obex_transfer1_bluez5_p.h \ + bluez/gattchar1_p.h \ + bluez/gattdesc1_p.h \ + bluez/gattservice1_p.h \ bluez/bluez_data_p.h \ bluez/hcimanager_p.h \ bluez/remotedevicemanager_p.h \ @@ -41,6 +44,9 @@ SOURCES += bluez/manager.cpp \ bluez/obex_client1_bluez5.cpp \ bluez/obex_objectpush1_bluez5.cpp \ bluez/obex_transfer1_bluez5.cpp \ + bluez/gattchar1.cpp \ + bluez/gattdesc1.cpp \ + bluez/gattservice1.cpp \ bluez/hcimanager.cpp \ bluez/remotedevicemanager.cpp \ bluez/bluetoothmanagement.cpp diff --git a/sync.profile b/sync.profile index 77a4cb6c..5d103a33 100644 --- a/sync.profile +++ b/sync.profile @@ -15,12 +15,13 @@ @ignore_for_include_check = ( - # OBEX auto-generated headers + # BlueZ & OBEX auto-generated headers "adapter1_bluez5_p.h", "adapter_p.h", "agent_p.h", "device1_bluez5_p.h", "device_p.h", "manager_p.h", "obex_agent_p.h", "obex_client1_bluez5_p.h", "obex_client_p.h", "obex_manager_p.h", "obex_objectpush1_bluez5_p.h", "obex_transfer1_bluez5_p.h", "obex_transfer_p.h", "objectmanager_p.h", - "profile1_p.h", "properties_p.h", "service_p.h", + "profile1_p.h", "properties_p.h", "service_p.h", "gattchar1_p.h", + "gattdesc1_p.h", "gattservice1_p.h", # NFC auto-generated headers # Note: "adapter_p.h", "agent_p.h" and "manager_p.h" are duplicated here "dbusobjectmanager_p.h", "dbusproperties_p.h", "tag_p.h"); -- cgit v1.2.3 From 4537a4b45f6344863271d9d780349491ac3449bf Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Wed, 1 Nov 2017 16:16:42 +0100 Subject: CoreBluetooth - fix compilation errors Apple keeps breaking things, we keep fixing their usless diagnostic, until they fix their framework for good. https://openradar.appspot.com/33375728 https://openradar.appspot.com/33375690 etc. Change-Id: I0051b4636c6082ac4d0a7d76fc8aebb952394626 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 5 +++++ src/bluetooth/osx/osxbtledeviceinquiry.mm | 5 +++++ src/bluetooth/osx/osxbtperipheralmanager.mm | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index 70473f1f..78e6b832 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -1030,6 +1030,9 @@ QT_END_NAMESPACE { using namespace OSXBluetooth; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability-new" + const auto state = central.state; #if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_10_0) || QT_OSX_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_13) if (state == CBManagerStateUnknown @@ -1099,6 +1102,8 @@ QT_END_NAMESPACE // We actually handled all known states, but .. Core Bluetooth can change? Q_ASSERT_X(0, Q_FUNC_INFO, "invalid centra's state"); } + +#pragma clang diagnostic pop } - (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)aPeripheral diff --git a/src/bluetooth/osx/osxbtledeviceinquiry.mm b/src/bluetooth/osx/osxbtledeviceinquiry.mm index 7a516dd4..60222370 100644 --- a/src/bluetooth/osx/osxbtledeviceinquiry.mm +++ b/src/bluetooth/osx/osxbtledeviceinquiry.mm @@ -220,6 +220,9 @@ QT_USE_NAMESPACE - (void)centralManagerDidUpdateState:(CBCentralManager *)central { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability-new" + if (central != manager) return; @@ -318,6 +321,8 @@ QT_USE_NAMESPACE // lost; an update is imminent. " // Wait for this imminent update. } + +#pragma clang diagnostic pop } - (void)stop diff --git a/src/bluetooth/osx/osxbtperipheralmanager.mm b/src/bluetooth/osx/osxbtperipheralmanager.mm index 64c8cd90..d3d92f41 100644 --- a/src/bluetooth/osx/osxbtperipheralmanager.mm +++ b/src/bluetooth/osx/osxbtperipheralmanager.mm @@ -388,6 +388,9 @@ bool qt_validate_value_range(const QLowEnergyCharacteristicData &data) - (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability-new" + if (peripheral != manager || !notifier) return; @@ -436,6 +439,8 @@ bool qt_validate_value_range(const QLowEnergyCharacteristicData &data) emit notifier->LEnotSupported(); state = PeripheralState::idle; } + +#pragma clang diagnostic pop } - (void)peripheralManager:(CBPeripheralManager *)peripheral -- cgit v1.2.3 From 2a5f325733fa43961d785bf9a0d5c209bd8c5c76 Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Thu, 2 Nov 2017 14:26:21 +0100 Subject: winrt: Reflect unsupported state of peripheral role of lowenergycontroller There currently is no API for supporting the peripheral role on winrt, but there is no way to reflect that inside our API. If a user tries to set up a low energy peripheral device, the application should not crash though. The crash occurred, when the controller was set up in a perihperal role and the application tried to read or write a descriptor or characteristic. In this case the functions should just return early. Task-number: QTBUG-63709 Change-Id: I30b277788d822f869743e1f294ee1402abd36309 Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller_winrt.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/bluetooth/qlowenergycontroller_winrt.cpp b/src/bluetooth/qlowenergycontroller_winrt.cpp index e4ae76b0..8517a942 100644 --- a/src/bluetooth/qlowenergycontroller_winrt.cpp +++ b/src/bluetooth/qlowenergycontroller_winrt.cpp @@ -651,6 +651,7 @@ void QLowEnergyControllerPrivate::discoverServiceDetails(const QBluetoothUuid &s void QLowEnergyControllerPrivate::startAdvertising(const QLowEnergyAdvertisingParameters &, const QLowEnergyAdvertisingData &, const QLowEnergyAdvertisingData &) { + setError(QLowEnergyController::AdvertisingError); Q_UNIMPLEMENTED(); } @@ -669,6 +670,12 @@ void QLowEnergyControllerPrivate::readCharacteristic(const QSharedPointersetError(QLowEnergyService::CharacteristicReadError); + Q_UNIMPLEMENTED(); + return; + } + if (!service->characteristicList.contains(charHandle)) { qCDebug(QT_BT_WINRT) << charHandle << "could not be found in service" << service->uuid; service->setError(QLowEnergyService::CharacteristicReadError); @@ -728,6 +735,12 @@ void QLowEnergyControllerPrivate::readDescriptor(const QSharedPointersetError(QLowEnergyService::DescriptorReadError); + Q_UNIMPLEMENTED(); + return; + } + if (!service->characteristicList.contains(charHandle)) { qCDebug(QT_BT_WINRT) << "Descriptor" << descHandle << "in characteristic" << charHandle << "cannot be found in service" << service->uuid; @@ -854,6 +867,11 @@ void QLowEnergyControllerPrivate::writeCharacteristic(const QSharedPointersetError(QLowEnergyService::CharacteristicWriteError); + Q_UNIMPLEMENTED(); + return; + } if (!service->characteristicList.contains(charHandle)) { qCDebug(QT_BT_WINRT) << "Characteristic" << charHandle << "cannot be found in service" << service->uuid; service->setError(QLowEnergyService::CharacteristicWriteError); @@ -938,6 +956,12 @@ void QLowEnergyControllerPrivate::writeDescriptor( { qCDebug(QT_BT_WINRT) << __FUNCTION__ << service << charHandle << descHandle << newValue; Q_ASSERT(!service.isNull()); + if (role == QLowEnergyController::PeripheralRole) { + service->setError(QLowEnergyService::DescriptorWriteError); + Q_UNIMPLEMENTED(); + return; + } + if (!service->characteristicList.contains(charHandle)) { qCDebug(QT_BT_WINRT) << "Descriptor" << descHandle << "in characteristic" << charHandle << "could not be found in service" << service->uuid; -- cgit v1.2.3 From 6efa28f0c193adf0151bb78d9660fa1fe6e8c525 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Tue, 24 Oct 2017 20:39:21 -0700 Subject: Update to new QRandomGenerator API Change-Id: I69f37f9304f24709a823fffd14e676c097712329 Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche --- examples/bluetooth/heartrate-game/devicehandler.cpp | 6 +++--- src/bluetooth/android/lowenergynotificationhub.cpp | 2 +- src/bluetooth/qbluetoothlocaldevice_bluez.cpp | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/bluetooth/heartrate-game/devicehandler.cpp b/examples/bluetooth/heartrate-game/devicehandler.cpp index ab203c3f..3d263a4c 100644 --- a/examples/bluetooth/heartrate-game/devicehandler.cpp +++ b/examples/bluetooth/heartrate-game/devicehandler.cpp @@ -259,11 +259,11 @@ void DeviceHandler::updateDemoHR() { int randomValue = 0; if (m_currentValue < 30) { // Initial value - randomValue = 55 + QRandomGenerator::bounded(30); + randomValue = 55 + QRandomGenerator::global()->bounded(30); } else if (!m_measuring) { // Value when relax - randomValue = qBound(55, m_currentValue - 2 + QRandomGenerator::bounded(5), 75); + randomValue = qBound(55, m_currentValue - 2 + QRandomGenerator::global()->bounded(5), 75); } else { // Measuring - randomValue = m_currentValue + QRandomGenerator::bounded(10) - 2; + randomValue = m_currentValue + QRandomGenerator::global()->bounded(10) - 2; } addMeasurement(randomValue); diff --git a/src/bluetooth/android/lowenergynotificationhub.cpp b/src/bluetooth/android/lowenergynotificationhub.cpp index 9f90e3de..fee8ce19 100644 --- a/src/bluetooth/android/lowenergynotificationhub.cpp +++ b/src/bluetooth/android/lowenergynotificationhub.cpp @@ -84,7 +84,7 @@ LowEnergyNotificationHub::LowEnergyNotificationHub(const QBluetoothAddress &remo lock.lockForWrite(); while (true) { - javaToCtoken = QRandomGenerator::get32(); + javaToCtoken = QRandomGenerator::global()->generate(); if (!hubMap()->contains(javaToCtoken)) break; } diff --git a/src/bluetooth/qbluetoothlocaldevice_bluez.cpp b/src/bluetooth/qbluetoothlocaldevice_bluez.cpp index 0982573e..4eb3ca58 100644 --- a/src/bluetooth/qbluetoothlocaldevice_bluez.cpp +++ b/src/bluetooth/qbluetoothlocaldevice_bluez.cpp @@ -800,7 +800,7 @@ void QBluetoothLocalDevicePrivate::initializeAdapter() SLOT(PropertyChanged(QString, QDBusVariant))); agent_path = agentPath; - agent_path.append(QString::fromLatin1("/%1").arg(QRandomGenerator::get32())); + agent_path.append(QString::fromLatin1("/%1").arg(QRandomGenerator::global()->generate())); } } @@ -1164,7 +1164,7 @@ QString QBluetoothLocalDevicePrivate::RequestPinCode(const QDBusObjectPath &in0) Q_Q(QBluetoothLocalDevice); qCDebug(QT_BT_BLUEZ) << Q_FUNC_INFO << in0.path(); // seeded in constructor, 6 digit pin - QString pin = QString::fromLatin1("%1").arg(QRandomGenerator::bounded(1000000)); + QString pin = QString::fromLatin1("%1").arg(QRandomGenerator::global()->bounded(1000000)); pin = QString::fromLatin1("%1").arg(pin, 6, QLatin1Char('0')); emit q->pairingDisplayPinCode(address, pin); @@ -1276,7 +1276,7 @@ uint QBluetoothLocalDevicePrivate::RequestPasskey(const QDBusObjectPath &in0) { Q_UNUSED(in0); qCDebug(QT_BT_BLUEZ) << Q_FUNC_INFO; - return (QRandomGenerator::bounded(1000000)); + return (QRandomGenerator::global()->bounded(1000000)); } // Bluez 4 -- cgit v1.2.3 From 59ae3cc2ac7baee7e9df1e6ceffcfc882fbe6121 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 24 Oct 2017 16:46:03 +0200 Subject: Introduce Base class for QLowEnergyControllerPrivate This permits alternative implementations selectable at runtime. Currently this is only used by Bluez. Change-Id: I3ddeb7f888f3b09bdc62f10d5b9a36320500f329 Reviewed-by: Timur Pocheptsov --- src/bluetooth/bluetooth.pro | 14 +- src/bluetooth/bluez/bluez5_helper.cpp | 6 + src/bluetooth/bluez/bluez5_helper_p.h | 1 + src/bluetooth/qlowenergycontroller.cpp | 146 ++++++++------------- src/bluetooth/qlowenergycontroller.h | 4 +- src/bluetooth/qlowenergycontroller_android.cpp | 4 +- src/bluetooth/qlowenergycontroller_bluez.cpp | 4 +- src/bluetooth/qlowenergycontroller_bluezdbus.cpp | 140 ++++++++++++++++++++ src/bluetooth/qlowenergycontroller_bluezdbus_p.h | 113 ++++++++++++++++ src/bluetooth/qlowenergycontroller_p.cpp | 4 +- src/bluetooth/qlowenergycontroller_p.h | 60 +++------ src/bluetooth/qlowenergycontroller_winrt.cpp | 4 +- src/bluetooth/qlowenergycontrollerbase.cpp | 144 ++++++++++++++++++++ src/bluetooth/qlowenergycontrollerbase_p.h | 159 +++++++++++++++++++++++ src/bluetooth/qlowenergyserviceprivate.cpp | 2 +- src/bluetooth/qlowenergyserviceprivate_p.h | 6 +- 16 files changed, 654 insertions(+), 157 deletions(-) create mode 100644 src/bluetooth/qlowenergycontroller_bluezdbus.cpp create mode 100644 src/bluetooth/qlowenergycontroller_bluezdbus_p.h create mode 100644 src/bluetooth/qlowenergycontrollerbase.cpp create mode 100644 src/bluetooth/qlowenergycontrollerbase_p.h diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index 1ef7406b..fe530c81 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -47,6 +47,7 @@ PRIVATE_HEADERS += \ qprivatelinearbuffer_p.h \ qbluetoothlocaldevice_p.h \ qlowenergycontroller_p.h \ + qlowenergycontrollerbase_p.h \ qlowenergyserviceprivate_p.h \ qleadvertiser_p.h \ lecmaccalculator_p.h @@ -76,6 +77,7 @@ SOURCES += \ qlowenergydescriptor.cpp \ qlowenergydescriptordata.cpp \ qlowenergycontroller.cpp \ + qlowenergycontrollerbase.cpp \ qlowenergyserviceprivate.cpp win32 { @@ -107,7 +109,11 @@ qtConfig(bluez) { SOURCES += \ qleadvertiser_bluez.cpp \ qlowenergycontroller_bluez.cpp \ - lecmaccalculator.cpp + lecmaccalculator.cpp \ + qlowenergycontroller_bluezdbus.cpp + + PRIVATE_HEADERS += qlowenergycontroller_bluezdbus_p.h + qtConfig(linux_crypto_api): DEFINES += CONFIG_LINUX_CRYPTO_API } else { DEFINES += QT_BLUEZ_NO_BTLE @@ -160,6 +166,8 @@ qtConfig(bluez) { qbluetoothtransferreply_osx_p.h \ qlowenergycontroller_osx_p.h + PRIVATE_HEADERS -= qlowenergycontrollerbase_p.h + SOURCES -= qbluetoothdevicediscoveryagent.cpp SOURCES -= qbluetoothserviceinfo.cpp SOURCES -= qbluetoothservicediscoveryagent.cpp @@ -169,6 +177,7 @@ qtConfig(bluez) { SOURCES -= qlowenergyservice.cpp SOURCES -= qlowenergycontroller.cpp SOURCES -= qlowenergycontroller_p.cpp + SOURCES -= qlowenergycontrollerbase.cpp } else:ios|tvos { DEFINES += QT_IOS_BLUETOOTH LIBS_PRIVATE += -framework Foundation -framework CoreBluetooth @@ -181,6 +190,8 @@ qtConfig(bluez) { PRIVATE_HEADERS += \ qlowenergycontroller_osx_p.h + PRIVATE_HEADERS -= qlowenergycontrollerbase_p.h + include(osx/osxbt.pri) SOURCES += \ qbluetoothlocaldevice_p.cpp \ @@ -192,6 +203,7 @@ qtConfig(bluez) { SOURCES -= qbluetoothdevicediscoveryagent.cpp SOURCES -= qlowenergyservice.cpp SOURCES -= qlowenergycontroller.cpp + SOURCES -= qlowenergycontrollerbase.cpp } else: qtConfig(winrt_bt) { DEFINES += QT_WINRT_BLUETOOTH !winrt { diff --git a/src/bluetooth/bluez/bluez5_helper.cpp b/src/bluetooth/bluez/bluez5_helper.cpp index de41003f..ffe9a58d 100644 --- a/src/bluetooth/bluez/bluez5_helper.cpp +++ b/src/bluetooth/bluez/bluez5_helper.cpp @@ -97,6 +97,12 @@ bool isBluez5() return (*bluezVersion() == BluezVersion5); } +bool isBluez5DbusGatt() +{ + //TODO implement + return false; +} + struct AdapterData { public: diff --git a/src/bluetooth/bluez/bluez5_helper_p.h b/src/bluetooth/bluez/bluez5_helper_p.h index 2d72caf1..6aeed11d 100644 --- a/src/bluetooth/bluez/bluez5_helper_p.h +++ b/src/bluetooth/bluez/bluez5_helper_p.h @@ -66,6 +66,7 @@ Q_DECLARE_METATYPE(ManagedObjectList) QT_BEGIN_NAMESPACE bool isBluez5(); +bool isBluez5DbusGatt(); QString sanitizeNameForDBus(const QString& text); diff --git a/src/bluetooth/qlowenergycontroller.cpp b/src/bluetooth/qlowenergycontroller.cpp index 7cd80072..4d0d78b6 100644 --- a/src/bluetooth/qlowenergycontroller.cpp +++ b/src/bluetooth/qlowenergycontroller.cpp @@ -48,6 +48,12 @@ #include #include + +#if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) +#include "bluez/bluez5_helper_p.h" +#include "qlowenergycontroller_bluezdbus_p.h" +#endif + #include QT_BEGIN_NAMESPACE @@ -278,79 +284,6 @@ void registerQLowEnergyControllerMetaType() } } - -void QLowEnergyControllerPrivate::setError( - QLowEnergyController::Error newError) -{ - Q_Q(QLowEnergyController); - error = newError; - - switch (newError) { - 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::ConnectionError: - errorString = QLowEnergyController::tr("Error occurred trying to connect to remote device."); - break; - case QLowEnergyController::AdvertisingError: - errorString = QLowEnergyController::tr("Error occurred trying to start advertising"); - break; - case QLowEnergyController::RemoteHostClosedError: - errorString = QLowEnergyController::tr("Remote device closed the connection"); - break; - case QLowEnergyController::NoError: - return; - default: - case QLowEnergyController::UnknownError: - errorString = QLowEnergyController::tr("Unknown Error"); - break; - } - - emit q->error(newError); -} - -bool QLowEnergyControllerPrivate::isValidLocalAdapter() -{ -#ifdef QT_WINRT_BLUETOOTH - return true; -#endif - if (localAdapter.isNull()) - return false; - - const QList foundAdapters = QBluetoothLocalDevice::allDevices(); - bool adapterFound = false; - - foreach (const QBluetoothHostInfo &info, foundAdapters) { - if (info.address() == localAdapter) { - adapterFound = true; - break; - } - } - - return adapterFound; -} - -void QLowEnergyControllerPrivate::setState( - QLowEnergyController::ControllerState newState) -{ - Q_Q(QLowEnergyController); - if (state == newState) - return; - - state = newState; - if (state == QLowEnergyController::UnconnectedState - && role == QLowEnergyController::PeripheralRole) { - remoteDevice.clear(); - } - emit q->stateChanged(state); -} - void QLowEnergyControllerPrivate::invalidateServices() { foreach (const QSharedPointer service, serviceList.values()) { @@ -361,20 +294,6 @@ void QLowEnergyControllerPrivate::invalidateServices() serviceList.clear(); } -QSharedPointer QLowEnergyControllerPrivate::serviceForHandle( - QLowEnergyHandle handle) -{ - ServiceDataMap ¤tList = serviceList; - if (role == QLowEnergyController::PeripheralRole) - currentList = localServices; - - const QList> values = currentList.values(); - for (auto service: values) - if (service->startHandle <= handle && handle <= service->endHandle) - return service; - - return QSharedPointer(); -} /*! Returns a valid characteristic if the given handle is the @@ -497,9 +416,19 @@ quint16 QLowEnergyControllerPrivate::updateValueOfDescriptor( QLowEnergyController::QLowEnergyController( const QBluetoothAddress &remoteDevice, QObject *parent) - : QObject(parent), d_ptr(new QLowEnergyControllerPrivate()) -{ + : QObject(parent) +{ +#if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) + if (isBluez5DbusGatt()) + d_ptr = new QLowEnergyControllerPrivateBluezDBus(); + else + d_ptr = new QLowEnergyControllerPrivate(); +#else + d_ptr = new QLowEnergyControllerPrivate(); +#endif + Q_D(QLowEnergyController); + d->q_ptr = this; d->role = CentralRole; d->remoteDevice = remoteDevice; @@ -524,8 +453,17 @@ QLowEnergyController::QLowEnergyController( QLowEnergyController::QLowEnergyController( const QBluetoothDeviceInfo &remoteDeviceInfo, QObject *parent) - : QObject(parent), d_ptr(new QLowEnergyControllerPrivate()) -{ + : QObject(parent) +{ +#if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) + if (isBluez5DbusGatt()) + d_ptr = new QLowEnergyControllerPrivateBluezDBus(); + else + d_ptr = new QLowEnergyControllerPrivate(); +#else + d_ptr = new QLowEnergyControllerPrivate(); +#endif + Q_D(QLowEnergyController); d->q_ptr = this; d->role = CentralRole; @@ -555,8 +493,17 @@ QLowEnergyController::QLowEnergyController( const QBluetoothAddress &remoteDevice, const QBluetoothAddress &localDevice, QObject *parent) - : QObject(parent), d_ptr(new QLowEnergyControllerPrivate()) -{ + : QObject(parent) +{ +#if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) + if (isBluez5DbusGatt()) + d_ptr = new QLowEnergyControllerPrivateBluezDBus(); + else + d_ptr = new QLowEnergyControllerPrivate(); +#else + d_ptr = new QLowEnergyControllerPrivate(); +#endif + Q_D(QLowEnergyController); d->q_ptr = this; d->role = CentralRole; @@ -598,8 +545,17 @@ QLowEnergyController *QLowEnergyController::createPeripheral(QObject *parent) } QLowEnergyController::QLowEnergyController(QObject *parent) - : QObject(parent), d_ptr(new QLowEnergyControllerPrivate()) -{ + : QObject(parent) +{ +#if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) + if (isBluez5DbusGatt()) + d_ptr = new QLowEnergyControllerPrivateBluezDBus(); + else + d_ptr = new QLowEnergyControllerPrivate(); +#else + d_ptr = new QLowEnergyControllerPrivate(); +#endif + Q_D(QLowEnergyController); d->q_ptr = this; d->role = PeripheralRole; diff --git a/src/bluetooth/qlowenergycontroller.h b/src/bluetooth/qlowenergycontroller.h index f9e6ef5d..782d042a 100644 --- a/src/bluetooth/qlowenergycontroller.h +++ b/src/bluetooth/qlowenergycontroller.h @@ -51,7 +51,7 @@ QT_BEGIN_NAMESPACE class QLowEnergyAdvertisingParameters; class QLowEnergyConnectionParameters; -class QLowEnergyControllerPrivate; +class QLowEnergyControllerPrivateBase; class QLowEnergyServiceData; class Q_BLUETOOTH_EXPORT QLowEnergyController : public QObject @@ -152,7 +152,7 @@ private: explicit QLowEnergyController(QObject *parent = nullptr); // For the peripheral role. Q_DECLARE_PRIVATE(QLowEnergyController) - QLowEnergyControllerPrivate *d_ptr; + QLowEnergyControllerPrivateBase *d_ptr; }; QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index a1decd96..137fbea1 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -70,9 +70,7 @@ static QAndroidJniObject javaUuidfromQtUuid(const QBluetoothUuid& uuid) } QLowEnergyControllerPrivate::QLowEnergyControllerPrivate() - : QObject(), - state(QLowEnergyController::UnconnectedState), - error(QLowEnergyController::NoError), + : QLowEnergyControllerPrivateBase(), hub(0) { registerQLowEnergyControllerMetaType(); diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index ca3f7760..1622ffb3 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -264,9 +264,7 @@ template<> void putDataAndIncrement(const QByteArray &value, char *&dst) } QLowEnergyControllerPrivate::QLowEnergyControllerPrivate() - : QObject(), - state(QLowEnergyController::UnconnectedState), - error(QLowEnergyController::NoError), + : QLowEnergyControllerPrivateBase(), lastLocalHandle(0), l2cpSocket(0), requestPending(false), mtuSize(ATT_DEFAULT_LE_MTU), diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp new file mode 100644 index 00000000..dc8fc721 --- /dev/null +++ b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp @@ -0,0 +1,140 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qlowenergycontroller_bluezdbus_p.h" + + +QT_BEGIN_NAMESPACE + +QLowEnergyControllerPrivateBluezDBus::QLowEnergyControllerPrivateBluezDBus() + : QLowEnergyControllerPrivateBase() +{ +} + +QLowEnergyControllerPrivateBluezDBus::~QLowEnergyControllerPrivateBluezDBus() +{ +} + +void QLowEnergyControllerPrivateBluezDBus::init() +{ +} + +void QLowEnergyControllerPrivateBluezDBus::connectToDevice() +{ + qWarning() << "QLowEnergyControllerPrivateBluezDBus::connectToDevice(): Not implemented"; + //setError(QLowEnergyController::UnknownError); +} + +void QLowEnergyControllerPrivateBluezDBus::disconnectFromDevice() +{ + +} + +void QLowEnergyControllerPrivateBluezDBus::discoverServices() +{ + +} + +void QLowEnergyControllerPrivateBluezDBus::discoverServiceDetails(const QBluetoothUuid &/*service*/) +{ + +} + +void QLowEnergyControllerPrivateBluezDBus::readCharacteristic( + const QSharedPointer /*service*/, + const QLowEnergyHandle /*charHandle*/) +{ + +} + +void QLowEnergyControllerPrivateBluezDBus::readDescriptor( + const QSharedPointer /*service*/, + const QLowEnergyHandle /*charHandle*/, + const QLowEnergyHandle /*descriptorHandle*/) +{ + +} + +void QLowEnergyControllerPrivateBluezDBus::writeCharacteristic( + const QSharedPointer /*service*/, + const QLowEnergyHandle /*charHandle*/, + const QByteArray &/*newValue*/, + QLowEnergyService::WriteMode /*writeMode*/) + { + +} + +void QLowEnergyControllerPrivateBluezDBus::writeDescriptor( + const QSharedPointer /*service*/, + const QLowEnergyHandle /*charHandle*/, + const QLowEnergyHandle /*descriptorHandle*/, + const QByteArray &/*newValue*/) +{ + +} + +void QLowEnergyControllerPrivateBluezDBus::startAdvertising( + const QLowEnergyAdvertisingParameters &/* params */, + const QLowEnergyAdvertisingData &/* advertisingData */, + const QLowEnergyAdvertisingData &/* scanResponseData */) +{ +} + +void QLowEnergyControllerPrivateBluezDBus::stopAdvertising() +{ +} + +void QLowEnergyControllerPrivateBluezDBus::requestConnectionUpdate( + const QLowEnergyConnectionParameters & /* params */) +{ +} + +void QLowEnergyControllerPrivateBluezDBus::addToGenericAttributeList( + const QLowEnergyServiceData &/* service */, + QLowEnergyHandle /* startHandle */) +{ +} + +QLowEnergyService *QLowEnergyControllerPrivateBluezDBus::addServiceHelper( + const QLowEnergyServiceData &/*service*/) +{ + return nullptr; +} + +QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h new file mode 100644 index 00000000..fb7f3e7a --- /dev/null +++ b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QLOWENERGYCONTROLLERPRIVATEDBUS_P_H +#define QLOWENERGYCONTROLLERPRIVATEDBUS_P_H + + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qlowenergycontroller.h" +#include "qlowenergycontrollerbase_p.h" + +QT_BEGIN_NAMESPACE + +class QLowEnergyControllerPrivateBluezDBus : public QLowEnergyControllerPrivateBase +{ + Q_OBJECT +public: + QLowEnergyControllerPrivateBluezDBus(); + ~QLowEnergyControllerPrivateBluezDBus(); + + void init() override; + void connectToDevice() override; + void disconnectFromDevice() override; + + void discoverServices() override; + void discoverServiceDetails(const QBluetoothUuid &/*service*/) override; + + void readCharacteristic( + const QSharedPointer /*service*/, + const QLowEnergyHandle /*charHandle*/) override; + void readDescriptor( + const QSharedPointer /*service*/, + const QLowEnergyHandle /*charHandle*/, + const QLowEnergyHandle /*descriptorHandle*/) override; + + void writeCharacteristic( + const QSharedPointer /*service*/, + const QLowEnergyHandle /*charHandle*/, + const QByteArray &/*newValue*/, + QLowEnergyService::WriteMode /*writeMode*/) override; + void writeDescriptor( + const QSharedPointer /*service*/, + const QLowEnergyHandle /*charHandle*/, + const QLowEnergyHandle /*descriptorHandle*/, + const QByteArray &/*newValue*/) override; + + void startAdvertising( + const QLowEnergyAdvertisingParameters &/* params */, + const QLowEnergyAdvertisingData &/* advertisingData */, + const QLowEnergyAdvertisingData &/* scanResponseData */) override; + void stopAdvertising() override; + + void requestConnectionUpdate( + const QLowEnergyConnectionParameters & /* params */) override; + void addToGenericAttributeList( + const QLowEnergyServiceData &/* service */, + QLowEnergyHandle /* startHandle */) override; + + QLowEnergyService *addServiceHelper(const QLowEnergyServiceData &service) override; + + QLowEnergyController::ControllerState state; + QLowEnergyController::Error error; +}; + +QT_END_NAMESPACE + +#endif // QLOWENERGYCONTROLLERPRIVATEDBUS_P_H diff --git a/src/bluetooth/qlowenergycontroller_p.cpp b/src/bluetooth/qlowenergycontroller_p.cpp index 27d16093..5c82c1fe 100644 --- a/src/bluetooth/qlowenergycontroller_p.cpp +++ b/src/bluetooth/qlowenergycontroller_p.cpp @@ -45,9 +45,7 @@ QT_BEGIN_NAMESPACE QLowEnergyControllerPrivate::QLowEnergyControllerPrivate() - : QObject(), - state(QLowEnergyController::UnconnectedState), - error(QLowEnergyController::NoError), + : QLowEnergyControllerPrivateBase(), lastLocalHandle(0) { #ifndef QT_IOS_BLUETOOTH diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index 6e866144..a9bd23fc 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -75,7 +75,7 @@ QT_END_NAMESPACE #include #include #include "qlowenergycontroller.h" -#include "qlowenergyserviceprivate_p.h" +#include "qlowenergycontrollerbase_p.h" #if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) #include @@ -107,47 +107,39 @@ class QWinRTLowEnergyServiceHandler; extern void registerQLowEnergyControllerMetaType(); -typedef QMap > ServiceDataMap; class QLeAdvertiser; -class QLowEnergyControllerPrivate : public QObject +class QLowEnergyControllerPrivate : public QLowEnergyControllerPrivateBase { Q_OBJECT - Q_DECLARE_PUBLIC(QLowEnergyController) public: QLowEnergyControllerPrivate(); ~QLowEnergyControllerPrivate(); - void init(); - - void setError(QLowEnergyController::Error newError); - bool isValidLocalAdapter(); - - void setState(QLowEnergyController::ControllerState newState); + void init() override; - void connectToDevice(); - void disconnectFromDevice(); + void connectToDevice() override; + void disconnectFromDevice() override; - void discoverServices(); + void discoverServices() override; void invalidateServices(); - void discoverServiceDetails(const QBluetoothUuid &service); + void discoverServiceDetails(const QBluetoothUuid &service) override; void startAdvertising(const QLowEnergyAdvertisingParameters ¶ms, const QLowEnergyAdvertisingData &advertisingData, - const QLowEnergyAdvertisingData &scanResponseData); - void stopAdvertising(); + const QLowEnergyAdvertisingData &scanResponseData) override; + void stopAdvertising() override; - void requestConnectionUpdate(const QLowEnergyConnectionParameters ¶ms); + void requestConnectionUpdate(const QLowEnergyConnectionParameters ¶ms) override; // misc helpers - QSharedPointer serviceForHandle( - QLowEnergyHandle handle); + QLowEnergyCharacteristic characteristicForHandle( QLowEnergyHandle handle); QLowEnergyDescriptor descriptorForHandle( QLowEnergyHandle handle); - QLowEnergyService *addServiceHelper(const QLowEnergyServiceData &service); + QLowEnergyService *addServiceHelper(const QLowEnergyServiceData &service) override; quint16 updateValueOfCharacteristic(QLowEnergyHandle charHandle, @@ -160,39 +152,25 @@ public: // read data void readCharacteristic(const QSharedPointer service, - const QLowEnergyHandle charHandle); + const QLowEnergyHandle charHandle) override; void readDescriptor(const QSharedPointer service, const QLowEnergyHandle charHandle, - const QLowEnergyHandle descriptorHandle); + const QLowEnergyHandle descriptorHandle) override; // write data void writeCharacteristic(const QSharedPointer service, const QLowEnergyHandle charHandle, - const QByteArray &newValue, QLowEnergyService::WriteMode mode); + const QByteArray &newValue, QLowEnergyService::WriteMode mode) override; void writeDescriptor(const QSharedPointer service, const QLowEnergyHandle charHandle, const QLowEnergyHandle descriptorHandle, - const QByteArray &newValue); + const QByteArray &newValue) override; void addToGenericAttributeList(const QLowEnergyServiceData &service, - QLowEnergyHandle startHandle); + QLowEnergyHandle startHandle) override; - QBluetoothAddress remoteDevice; - QBluetoothAddress localAdapter; - QLowEnergyController::Role role; - - QString remoteName; - - QLowEnergyController::ControllerState state; - QLowEnergyController::Error error; - QString errorString; - - // list of all found service uuids on remote device - ServiceDataMap serviceList; QLowEnergyHandle lastLocalHandle; - // list of all service uuids on local peripheral device - ServiceDataMap localServices; struct Attribute { Attribute() : handle(0) {} @@ -209,8 +187,6 @@ public: }; QVector localAttributes; - QLowEnergyController::RemoteAddressType addressType; - private: #if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) quint16 connectionHandle = 0; @@ -488,8 +464,6 @@ private: void obtainIncludedServices(QSharedPointer servicePointer, Microsoft::WRL::ComPtr nativeService); #endif -private: - QLowEnergyController *q_ptr; }; diff --git a/src/bluetooth/qlowenergycontroller_winrt.cpp b/src/bluetooth/qlowenergycontroller_winrt.cpp index 62b8a9d3..37195bad 100644 --- a/src/bluetooth/qlowenergycontroller_winrt.cpp +++ b/src/bluetooth/qlowenergycontroller_winrt.cpp @@ -275,9 +275,7 @@ signals: }; QLowEnergyControllerPrivate::QLowEnergyControllerPrivate() - : QObject(), - state(QLowEnergyController::UnconnectedState), - error(QLowEnergyController::NoError) + : QLowEnergyControllerPrivateBase() { qCDebug(QT_BT_WINRT) << __FUNCTION__; diff --git a/src/bluetooth/qlowenergycontrollerbase.cpp b/src/bluetooth/qlowenergycontrollerbase.cpp new file mode 100644 index 00000000..5e9228e2 --- /dev/null +++ b/src/bluetooth/qlowenergycontrollerbase.cpp @@ -0,0 +1,144 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qlowenergycontrollerbase_p.h" + +#include +#include + +QT_BEGIN_NAMESPACE + +QLowEnergyControllerPrivateBase::QLowEnergyControllerPrivateBase() + : QObject() +{ +} + +QLowEnergyControllerPrivateBase::~QLowEnergyControllerPrivateBase() +{ +} + +bool QLowEnergyControllerPrivateBase::isValidLocalAdapter() +{ +#ifdef QT_WINRT_BLUETOOTH + return true; +#endif + if (localAdapter.isNull()) + return false; + + const QList foundAdapters = QBluetoothLocalDevice::allDevices(); + bool adapterFound = false; + + foreach (const QBluetoothHostInfo &info, foundAdapters) { + if (info.address() == localAdapter) { + adapterFound = true; + break; + } + } + + return adapterFound; +} + + +void QLowEnergyControllerPrivateBase::setError( + QLowEnergyController::Error newError) +{ + Q_Q(QLowEnergyController); + error = newError; + + switch (newError) { + 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::ConnectionError: + errorString = QLowEnergyController::tr("Error occurred trying to connect to remote device."); + break; + case QLowEnergyController::AdvertisingError: + errorString = QLowEnergyController::tr("Error occurred trying to start advertising"); + break; + case QLowEnergyController::RemoteHostClosedError: + errorString = QLowEnergyController::tr("Remote device closed the connection"); + break; + case QLowEnergyController::NoError: + return; + default: + case QLowEnergyController::UnknownError: + errorString = QLowEnergyController::tr("Unknown Error"); + break; + } + + emit q->error(newError); +} + +void QLowEnergyControllerPrivateBase::setState( + QLowEnergyController::ControllerState newState) +{ + Q_Q(QLowEnergyController); + if (state == newState) + return; + + state = newState; + if (state == QLowEnergyController::UnconnectedState + && role == QLowEnergyController::PeripheralRole) { + remoteDevice.clear(); + } + emit q->stateChanged(state); +} + +QSharedPointer QLowEnergyControllerPrivateBase::serviceForHandle( + QLowEnergyHandle handle) +{ + ServiceDataMap ¤tList = serviceList; + if (role == QLowEnergyController::PeripheralRole) + currentList = localServices; + + const QList> values = currentList.values(); + for (auto service: values) + if (service->startHandle <= handle && handle <= service->endHandle) + return service; + + return QSharedPointer(); +} + +QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontrollerbase_p.h b/src/bluetooth/qlowenergycontrollerbase_p.h new file mode 100644 index 00000000..8c16bc9f --- /dev/null +++ b/src/bluetooth/qlowenergycontrollerbase_p.h @@ -0,0 +1,159 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QLOWENERGYCONTROLLERPRIVATEBASE_P_H +#define QLOWENERGYCONTROLLERPRIVATEBASE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + + +#include +#include + +#include + +#include "qlowenergyserviceprivate_p.h" + +QT_BEGIN_NAMESPACE + +typedef QMap > ServiceDataMap; + +class QLowEnergyControllerPrivateBase : public QObject +{ + Q_OBJECT +public: + // This class is required to enable selection of multiple + // alternative QLowEnergyControllerPrivate implementations on BlueZ. + // Bluez has a low level ATT protocol stack implementation and a DBus + // implementation. + + QLowEnergyControllerPrivateBase(); + virtual ~QLowEnergyControllerPrivateBase(); + + // interface definition + virtual void init() = 0; + virtual void connectToDevice() = 0; + virtual void disconnectFromDevice() = 0; + + virtual void discoverServices() = 0; + virtual void discoverServiceDetails(const QBluetoothUuid &/*service*/) = 0; + + virtual void readCharacteristic( + const QSharedPointer /*service*/, + const QLowEnergyHandle /*charHandle*/) = 0; + virtual void readDescriptor( + const QSharedPointer /*service*/, + const QLowEnergyHandle /*charHandle*/, + const QLowEnergyHandle /*descriptorHandle*/) = 0; + + virtual void writeCharacteristic( + const QSharedPointer /*service*/, + const QLowEnergyHandle /*charHandle*/, + const QByteArray &/*newValue*/, + QLowEnergyService::WriteMode /*writeMode*/) = 0; + virtual void writeDescriptor( + const QSharedPointer /*service*/, + const QLowEnergyHandle /*charHandle*/, + const QLowEnergyHandle /*descriptorHandle*/, + const QByteArray &/*newValue*/) = 0; + + virtual void startAdvertising( + const QLowEnergyAdvertisingParameters &/* params */, + const QLowEnergyAdvertisingData &/* advertisingData */, + const QLowEnergyAdvertisingData &/* scanResponseData */) = 0; + virtual void stopAdvertising() = 0; + + virtual void requestConnectionUpdate( + const QLowEnergyConnectionParameters & /* params */) = 0; + virtual void addToGenericAttributeList( + const QLowEnergyServiceData &/* service */, + QLowEnergyHandle /* startHandle */) = 0; + + + virtual QLowEnergyService *addServiceHelper( + const QLowEnergyServiceData &service) = 0; + + + // common backend methods + bool isValidLocalAdapter(); + void setError(QLowEnergyController::Error newError); + void setState(QLowEnergyController::ControllerState newState); + + // public variables + QLowEnergyController::Role role; + QLowEnergyController::RemoteAddressType addressType; + + // list of all found service uuids on remote device + ServiceDataMap serviceList; + // list of all found service uuids on local peripheral device + ServiceDataMap localServices; + + //common helper functions + + QSharedPointer serviceForHandle(QLowEnergyHandle handle); + + + +protected: + QLowEnergyController::ControllerState state = QLowEnergyController::UnconnectedState; + QLowEnergyController::Error error = QLowEnergyController::NoError; + QString errorString; + + QBluetoothAddress remoteDevice; + QBluetoothAddress localAdapter; + + + QString remoteName; // device name of the remote + + Q_DECLARE_PUBLIC(QLowEnergyController) + QLowEnergyController *q_ptr; +}; + +QT_END_NAMESPACE + +#endif // QLOWENERGYCONTROLLERPRIVATEBASE_P_H diff --git a/src/bluetooth/qlowenergyserviceprivate.cpp b/src/bluetooth/qlowenergyserviceprivate.cpp index 83724d4e..e16aec72 100644 --- a/src/bluetooth/qlowenergyserviceprivate.cpp +++ b/src/bluetooth/qlowenergyserviceprivate.cpp @@ -57,7 +57,7 @@ QLowEnergyServicePrivate::~QLowEnergyServicePrivate() { } -void QLowEnergyServicePrivate::setController(QLowEnergyControllerPrivate *control) +void QLowEnergyServicePrivate::setController(QLowEnergyControllerPrivateBase *control) { controller = control; diff --git a/src/bluetooth/qlowenergyserviceprivate_p.h b/src/bluetooth/qlowenergyserviceprivate_p.h index 7727b583..3a0edd8a 100644 --- a/src/bluetooth/qlowenergyserviceprivate_p.h +++ b/src/bluetooth/qlowenergyserviceprivate_p.h @@ -63,7 +63,7 @@ QT_BEGIN_NAMESPACE -class QLowEnergyControllerPrivate; +class QLowEnergyControllerPrivateBase; class QLowEnergyServicePrivate : public QObject { @@ -92,7 +92,7 @@ public: Characteristic = 0x2803 }; - void setController(QLowEnergyControllerPrivate* control); + void setController(QLowEnergyControllerPrivateBase* control); void setError(QLowEnergyService::ServiceError newError); void setState(QLowEnergyService::ServiceState newState); @@ -122,7 +122,7 @@ public: QHash characteristicList; - QPointer controller; + QPointer controller; #if defined(QT_ANDROID_BLUETOOTH) // reference to the BluetoothGattService object -- cgit v1.2.3 From 7a9d2e77befb13c1f714f842d4b0ee3fea2d4a6c Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 25 Oct 2017 13:59:39 +0200 Subject: Move common helper function from QLECPrivate to QLECPrivateBase Change-Id: I5f126fabebf36b61a25e23ddc12c4dae21156cbc Reviewed-by: Oliver Wolff --- src/bluetooth/qlowenergycharacteristic.h | 1 + src/bluetooth/qlowenergycontroller.cpp | 117 ----------------------------- src/bluetooth/qlowenergycontroller_p.h | 16 ---- src/bluetooth/qlowenergycontrollerbase.cpp | 116 ++++++++++++++++++++++++++++ src/bluetooth/qlowenergycontrollerbase_p.h | 13 +++- src/bluetooth/qlowenergydescriptor.h | 1 + 6 files changed, 128 insertions(+), 136 deletions(-) diff --git a/src/bluetooth/qlowenergycharacteristic.h b/src/bluetooth/qlowenergycharacteristic.h index 154c9936..7ce05343 100644 --- a/src/bluetooth/qlowenergycharacteristic.h +++ b/src/bluetooth/qlowenergycharacteristic.h @@ -97,6 +97,7 @@ protected: friend class QLowEnergyService; friend class QLowEnergyControllerPrivate; + friend class QLowEnergyControllerPrivateBase; friend class QLowEnergyControllerPrivateOSX; QLowEnergyCharacteristicPrivate *data; QLowEnergyCharacteristic(QSharedPointer p, diff --git a/src/bluetooth/qlowenergycontroller.cpp b/src/bluetooth/qlowenergycontroller.cpp index 4d0d78b6..b026e4a0 100644 --- a/src/bluetooth/qlowenergycontroller.cpp +++ b/src/bluetooth/qlowenergycontroller.cpp @@ -284,123 +284,6 @@ void registerQLowEnergyControllerMetaType() } } -void QLowEnergyControllerPrivate::invalidateServices() -{ - foreach (const QSharedPointer service, serviceList.values()) { - service->setController(0); - service->setState(QLowEnergyService::InvalidService); - } - - serviceList.clear(); -} - - -/*! - Returns a valid characteristic if the given handle is the - handle of the characteristic itself or one of its descriptors - */ -QLowEnergyCharacteristic QLowEnergyControllerPrivate::characteristicForHandle( - QLowEnergyHandle handle) -{ - QSharedPointer service = serviceForHandle(handle); - 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(handle)) - return QLowEnergyCharacteristic(service, handle); - - // 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) > handle) - continue; - - return QLowEnergyCharacteristic(service, charHandles.at(i)); - } - - return QLowEnergyCharacteristic(); -} - -/*! - Returns a valid descriptor if \a handle belongs to a descriptor; - otherwise an invalid one. - */ -QLowEnergyDescriptor QLowEnergyControllerPrivate::descriptorForHandle( - QLowEnergyHandle handle) -{ - const QLowEnergyCharacteristic matchingChar = characteristicForHandle(handle); - if (!matchingChar.isValid()) - return QLowEnergyDescriptor(); - - const QLowEnergyServicePrivate::CharData charData = matchingChar. - d_ptr->characteristicList[matchingChar.attributeHandle()]; - - if (charData.descriptorList.contains(handle)) - return QLowEnergyDescriptor(matchingChar.d_ptr, matchingChar.attributeHandle(), - handle); - - return QLowEnergyDescriptor(); -} - -/*! - Returns the length of the updated characteristic value. - */ -quint16 QLowEnergyControllerPrivate::updateValueOfCharacteristic( - QLowEnergyHandle charHandle,const QByteArray &value, bool appendValue) -{ - QSharedPointer service = serviceForHandle(charHandle); - if (!service.isNull()) { - CharacteristicDataMap::iterator charIt = service->characteristicList.find(charHandle); - if (charIt != service->characteristicList.end()) { - QLowEnergyServicePrivate::CharData &charDetails = charIt.value(); - - if (appendValue) - charDetails.value += value; - else - charDetails.value = value; - - return charDetails.value.size(); - } - } - - return 0; -} - -/*! - Returns the length of the updated descriptor value. - */ -quint16 QLowEnergyControllerPrivate::updateValueOfDescriptor( - QLowEnergyHandle charHandle, QLowEnergyHandle descriptorHandle, - const QByteArray &value, bool appendValue) -{ - QSharedPointer service = serviceForHandle(charHandle); - if (!service.isNull()) { - CharacteristicDataMap::iterator charIt = service->characteristicList.find(charHandle); - if (charIt != service->characteristicList.end()) { - QLowEnergyServicePrivate::CharData &charDetails = charIt.value(); - - DescriptorDataMap::iterator descIt = charDetails.descriptorList.find(descriptorHandle); - if (descIt != charDetails.descriptorList.end()) { - QLowEnergyServicePrivate::DescData &descDetails = descIt.value(); - - if (appendValue) - descDetails.value += value; - else - descDetails.value = value; - - return descDetails.value.size(); - } - } - } - - return 0; -} - /*! Constructs a new instance of this class with \a parent. diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index a9bd23fc..c00a56a0 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -122,8 +122,6 @@ public: void disconnectFromDevice() override; void discoverServices() override; - void invalidateServices(); - void discoverServiceDetails(const QBluetoothUuid &service) override; void startAdvertising(const QLowEnergyAdvertisingParameters ¶ms, @@ -134,22 +132,8 @@ public: void requestConnectionUpdate(const QLowEnergyConnectionParameters ¶ms) override; // misc helpers - - QLowEnergyCharacteristic characteristicForHandle( - QLowEnergyHandle handle); - QLowEnergyDescriptor descriptorForHandle( - QLowEnergyHandle handle); QLowEnergyService *addServiceHelper(const QLowEnergyServiceData &service) override; - - quint16 updateValueOfCharacteristic(QLowEnergyHandle charHandle, - const QByteArray &value, - bool appendValue); - quint16 updateValueOfDescriptor(QLowEnergyHandle charHandle, - QLowEnergyHandle descriptorHandle, - const QByteArray &value, - bool appendValue); - // read data void readCharacteristic(const QSharedPointer service, const QLowEnergyHandle charHandle) override; diff --git a/src/bluetooth/qlowenergycontrollerbase.cpp b/src/bluetooth/qlowenergycontrollerbase.cpp index 5e9228e2..0b8218e9 100644 --- a/src/bluetooth/qlowenergycontrollerbase.cpp +++ b/src/bluetooth/qlowenergycontrollerbase.cpp @@ -141,4 +141,120 @@ QSharedPointer QLowEnergyControllerPrivateBase::servic return QSharedPointer(); } +/*! + Returns a valid characteristic if the given handle is the + handle of the characteristic itself or one of its descriptors + */ +QLowEnergyCharacteristic QLowEnergyControllerPrivateBase::characteristicForHandle( + QLowEnergyHandle handle) +{ + QSharedPointer service = serviceForHandle(handle); + 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(handle)) + return QLowEnergyCharacteristic(service, handle); + + // 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) > handle) + continue; + + return QLowEnergyCharacteristic(service, charHandles.at(i)); + } + + return QLowEnergyCharacteristic(); +} + +/*! + Returns a valid descriptor if \a handle belongs to a descriptor; + otherwise an invalid one. + */ +QLowEnergyDescriptor QLowEnergyControllerPrivateBase::descriptorForHandle( + QLowEnergyHandle handle) +{ + const QLowEnergyCharacteristic matchingChar = characteristicForHandle(handle); + if (!matchingChar.isValid()) + return QLowEnergyDescriptor(); + + const QLowEnergyServicePrivate::CharData charData = matchingChar. + d_ptr->characteristicList[matchingChar.attributeHandle()]; + + if (charData.descriptorList.contains(handle)) + return QLowEnergyDescriptor(matchingChar.d_ptr, matchingChar.attributeHandle(), + handle); + + return QLowEnergyDescriptor(); +} + +/*! + Returns the length of the updated characteristic value. + */ +quint16 QLowEnergyControllerPrivateBase::updateValueOfCharacteristic( + QLowEnergyHandle charHandle,const QByteArray &value, bool appendValue) +{ + QSharedPointer service = serviceForHandle(charHandle); + if (!service.isNull()) { + CharacteristicDataMap::iterator charIt = service->characteristicList.find(charHandle); + if (charIt != service->characteristicList.end()) { + QLowEnergyServicePrivate::CharData &charDetails = charIt.value(); + + if (appendValue) + charDetails.value += value; + else + charDetails.value = value; + + return charDetails.value.size(); + } + } + + return 0; +} + +/*! + Returns the length of the updated descriptor value. + */ +quint16 QLowEnergyControllerPrivateBase::updateValueOfDescriptor( + QLowEnergyHandle charHandle, QLowEnergyHandle descriptorHandle, + const QByteArray &value, bool appendValue) +{ + QSharedPointer service = serviceForHandle(charHandle); + if (!service.isNull()) { + CharacteristicDataMap::iterator charIt = service->characteristicList.find(charHandle); + if (charIt != service->characteristicList.end()) { + QLowEnergyServicePrivate::CharData &charDetails = charIt.value(); + + DescriptorDataMap::iterator descIt = charDetails.descriptorList.find(descriptorHandle); + if (descIt != charDetails.descriptorList.end()) { + QLowEnergyServicePrivate::DescData &descDetails = descIt.value(); + + if (appendValue) + descDetails.value += value; + else + descDetails.value = value; + + return descDetails.value.size(); + } + } + } + + return 0; +} + +void QLowEnergyControllerPrivateBase::invalidateServices() +{ + foreach (const QSharedPointer service, serviceList.values()) { + service->setController(0); + service->setState(QLowEnergyService::InvalidService); + } + + serviceList.clear(); +} + QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontrollerbase_p.h b/src/bluetooth/qlowenergycontrollerbase_p.h index 8c16bc9f..3555e7e8 100644 --- a/src/bluetooth/qlowenergycontrollerbase_p.h +++ b/src/bluetooth/qlowenergycontrollerbase_p.h @@ -134,10 +134,17 @@ public: ServiceDataMap localServices; //common helper functions - QSharedPointer serviceForHandle(QLowEnergyHandle handle); - - + QLowEnergyCharacteristic characteristicForHandle(QLowEnergyHandle handle); + QLowEnergyDescriptor descriptorForHandle(QLowEnergyHandle handle); + quint16 updateValueOfCharacteristic(QLowEnergyHandle charHandle, + const QByteArray &value, + bool appendValue); + quint16 updateValueOfDescriptor(QLowEnergyHandle charHandle, + QLowEnergyHandle descriptorHandle, + const QByteArray &value, + bool appendValue); + void invalidateServices(); protected: QLowEnergyController::ControllerState state = QLowEnergyController::UnconnectedState; diff --git a/src/bluetooth/qlowenergydescriptor.h b/src/bluetooth/qlowenergydescriptor.h index 9e71fc56..efc748a3 100644 --- a/src/bluetooth/qlowenergydescriptor.h +++ b/src/bluetooth/qlowenergydescriptor.h @@ -79,6 +79,7 @@ protected: friend class QLowEnergyCharacteristic; friend class QLowEnergyService; friend class QLowEnergyControllerPrivate; + friend class QLowEnergyControllerPrivateBase; friend class QLowEnergyControllerPrivateOSX; QLowEnergyDescriptorPrivate *data; -- cgit v1.2.3 From fbf36811672de79f2a648af97ca73d6c0e3b1608 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 25 Oct 2017 14:49:47 +0200 Subject: Rename various QLEControllerPrivate classes The base class is renamed to QLEControllerPrivate and the existing QLEControllerPrivate becomes QLEControllerPrivateCommon. This is necessary to re-enable Q_DECLARE_PRIVATE. The macro uses by convention the "Private" class prefix which is currently broken because not every implementation uses QLEControllerPrivate as d-pointer type. This also avoids a SC/BC break in qlowenergycontroller.h as the d-pointer remains the same and the functions declared via Q_DECLARE_PRIVATE still return the same type. Change-Id: I84890b06280b2c473a4d370606d3bbc58a258eea Reviewed-by: Oliver Wolff --- src/bluetooth/qbluetoothsocket.h | 2 +- src/bluetooth/qlowenergycharacteristic.h | 2 +- src/bluetooth/qlowenergycontroller.cpp | 18 +-- src/bluetooth/qlowenergycontroller.h | 4 +- src/bluetooth/qlowenergycontroller_android.cpp | 84 +++++----- src/bluetooth/qlowenergycontroller_bluez.cpp | 188 +++++++++++------------ src/bluetooth/qlowenergycontroller_bluezdbus.cpp | 2 +- src/bluetooth/qlowenergycontroller_bluezdbus_p.h | 2 +- src/bluetooth/qlowenergycontroller_p.cpp | 34 ++-- src/bluetooth/qlowenergycontroller_p.h | 8 +- src/bluetooth/qlowenergycontroller_winrt.cpp | 42 ++--- src/bluetooth/qlowenergycontrollerbase.cpp | 22 +-- src/bluetooth/qlowenergycontrollerbase_p.h | 6 +- src/bluetooth/qlowenergydescriptor.h | 2 +- src/bluetooth/qlowenergyservice.h | 4 +- src/bluetooth/qlowenergyserviceprivate.cpp | 2 +- src/bluetooth/qlowenergyserviceprivate_p.h | 6 +- 17 files changed, 214 insertions(+), 214 deletions(-) diff --git a/src/bluetooth/qbluetoothsocket.h b/src/bluetooth/qbluetoothsocket.h index 3fc2892e..31e32f9a 100644 --- a/src/bluetooth/qbluetoothsocket.h +++ b/src/bluetooth/qbluetoothsocket.h @@ -164,7 +164,7 @@ protected: QBluetoothSocketPrivate *d_ptr; private: - friend class QLowEnergyControllerPrivate; + friend class QLowEnergyControllerPrivateCommon; }; #ifndef QT_NO_DEBUG_STREAM diff --git a/src/bluetooth/qlowenergycharacteristic.h b/src/bluetooth/qlowenergycharacteristic.h index 7ce05343..97b60bd2 100644 --- a/src/bluetooth/qlowenergycharacteristic.h +++ b/src/bluetooth/qlowenergycharacteristic.h @@ -96,8 +96,8 @@ protected: QSharedPointer d_ptr; friend class QLowEnergyService; + friend class QLowEnergyControllerPrivateCommon; friend class QLowEnergyControllerPrivate; - friend class QLowEnergyControllerPrivateBase; friend class QLowEnergyControllerPrivateOSX; QLowEnergyCharacteristicPrivate *data; QLowEnergyCharacteristic(QSharedPointer p, diff --git a/src/bluetooth/qlowenergycontroller.cpp b/src/bluetooth/qlowenergycontroller.cpp index b026e4a0..34b7cbec 100644 --- a/src/bluetooth/qlowenergycontroller.cpp +++ b/src/bluetooth/qlowenergycontroller.cpp @@ -305,9 +305,9 @@ QLowEnergyController::QLowEnergyController( if (isBluez5DbusGatt()) d_ptr = new QLowEnergyControllerPrivateBluezDBus(); else - d_ptr = new QLowEnergyControllerPrivate(); + d_ptr = new QLowEnergyControllerPrivateCommon(); #else - d_ptr = new QLowEnergyControllerPrivate(); + d_ptr = new QLowEnergyControllerPrivateCommon(); #endif Q_D(QLowEnergyController); @@ -342,9 +342,9 @@ QLowEnergyController::QLowEnergyController( if (isBluez5DbusGatt()) d_ptr = new QLowEnergyControllerPrivateBluezDBus(); else - d_ptr = new QLowEnergyControllerPrivate(); + d_ptr = new QLowEnergyControllerPrivateCommon(); #else - d_ptr = new QLowEnergyControllerPrivate(); + d_ptr = new QLowEnergyControllerPrivateCommon(); #endif Q_D(QLowEnergyController); @@ -382,9 +382,9 @@ QLowEnergyController::QLowEnergyController( if (isBluez5DbusGatt()) d_ptr = new QLowEnergyControllerPrivateBluezDBus(); else - d_ptr = new QLowEnergyControllerPrivate(); + d_ptr = new QLowEnergyControllerPrivateCommon(); #else - d_ptr = new QLowEnergyControllerPrivate(); + d_ptr = new QLowEnergyControllerPrivateCommon(); #endif Q_D(QLowEnergyController); @@ -434,9 +434,9 @@ QLowEnergyController::QLowEnergyController(QObject *parent) if (isBluez5DbusGatt()) d_ptr = new QLowEnergyControllerPrivateBluezDBus(); else - d_ptr = new QLowEnergyControllerPrivate(); + d_ptr = new QLowEnergyControllerPrivateCommon(); #else - d_ptr = new QLowEnergyControllerPrivate(); + d_ptr = new QLowEnergyControllerPrivateCommon(); #endif Q_D(QLowEnergyController); @@ -783,7 +783,7 @@ QLowEnergyService *QLowEnergyController::addService(const QLowEnergyServiceData return newService; } -QLowEnergyService *QLowEnergyControllerPrivate::addServiceHelper( +QLowEnergyService *QLowEnergyControllerPrivateCommon::addServiceHelper( const QLowEnergyServiceData &service) { // Spec says services "should" be grouped by uuid length (16-bit first, then 128-bit). diff --git a/src/bluetooth/qlowenergycontroller.h b/src/bluetooth/qlowenergycontroller.h index 782d042a..f9e6ef5d 100644 --- a/src/bluetooth/qlowenergycontroller.h +++ b/src/bluetooth/qlowenergycontroller.h @@ -51,7 +51,7 @@ QT_BEGIN_NAMESPACE class QLowEnergyAdvertisingParameters; class QLowEnergyConnectionParameters; -class QLowEnergyControllerPrivateBase; +class QLowEnergyControllerPrivate; class QLowEnergyServiceData; class Q_BLUETOOTH_EXPORT QLowEnergyController : public QObject @@ -152,7 +152,7 @@ private: explicit QLowEnergyController(QObject *parent = nullptr); // For the peripheral role. Q_DECLARE_PRIVATE(QLowEnergyController) - QLowEnergyControllerPrivateBase *d_ptr; + QLowEnergyControllerPrivate *d_ptr; }; QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 137fbea1..b775e299 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -69,14 +69,14 @@ static QAndroidJniObject javaUuidfromQtUuid(const QBluetoothUuid& uuid) return javaUuid; } -QLowEnergyControllerPrivate::QLowEnergyControllerPrivate() - : QLowEnergyControllerPrivateBase(), +QLowEnergyControllerPrivateCommon::QLowEnergyControllerPrivateCommon() + : QLowEnergyControllerPrivate(), hub(0) { registerQLowEnergyControllerMetaType(); } -QLowEnergyControllerPrivate::~QLowEnergyControllerPrivate() +QLowEnergyControllerPrivateCommon::~QLowEnergyControllerPrivateCommon() { if (role == QLowEnergyController::PeripheralRole) { if (hub) @@ -84,7 +84,7 @@ QLowEnergyControllerPrivate::~QLowEnergyControllerPrivate() } } -void QLowEnergyControllerPrivate::init() +void QLowEnergyControllerPrivateCommon::init() { // Android Central/Client support starts with v18 // Peripheral/Server support requires Android API v21 @@ -104,13 +104,13 @@ void QLowEnergyControllerPrivate::init() // we only connect to the peripheral role specific signals // TODO add connections as they get added later on connect(hub, &LowEnergyNotificationHub::connectionUpdated, - this, &QLowEnergyControllerPrivate::connectionUpdated); + this, &QLowEnergyControllerPrivateCommon::connectionUpdated); connect(hub, &LowEnergyNotificationHub::advertisementError, - this, &QLowEnergyControllerPrivate::advertisementError); + this, &QLowEnergyControllerPrivateCommon::advertisementError); connect(hub, &LowEnergyNotificationHub::serverCharacteristicChanged, - this, &QLowEnergyControllerPrivate::serverCharacteristicChanged); + this, &QLowEnergyControllerPrivateCommon::serverCharacteristicChanged); connect(hub, &LowEnergyNotificationHub::serverDescriptorWritten, - this, &QLowEnergyControllerPrivate::serverDescriptorWritten); + this, &QLowEnergyControllerPrivateCommon::serverDescriptorWritten); } else { if (version < 18) { qWarning() << "Qt Bluetooth LE Central/Client support not available" @@ -121,25 +121,25 @@ void QLowEnergyControllerPrivate::init() hub = new LowEnergyNotificationHub(remoteDevice, isPeripheral, this); // we only connect to the central role specific signals connect(hub, &LowEnergyNotificationHub::connectionUpdated, - this, &QLowEnergyControllerPrivate::connectionUpdated); + this, &QLowEnergyControllerPrivateCommon::connectionUpdated); connect(hub, &LowEnergyNotificationHub::servicesDiscovered, - this, &QLowEnergyControllerPrivate::servicesDiscovered); + this, &QLowEnergyControllerPrivateCommon::servicesDiscovered); connect(hub, &LowEnergyNotificationHub::serviceDetailsDiscoveryFinished, - this, &QLowEnergyControllerPrivate::serviceDetailsDiscoveryFinished); + this, &QLowEnergyControllerPrivateCommon::serviceDetailsDiscoveryFinished); connect(hub, &LowEnergyNotificationHub::characteristicRead, - this, &QLowEnergyControllerPrivate::characteristicRead); + this, &QLowEnergyControllerPrivateCommon::characteristicRead); connect(hub, &LowEnergyNotificationHub::descriptorRead, - this, &QLowEnergyControllerPrivate::descriptorRead); + this, &QLowEnergyControllerPrivateCommon::descriptorRead); connect(hub, &LowEnergyNotificationHub::characteristicWritten, - this, &QLowEnergyControllerPrivate::characteristicWritten); + this, &QLowEnergyControllerPrivateCommon::characteristicWritten); connect(hub, &LowEnergyNotificationHub::descriptorWritten, - this, &QLowEnergyControllerPrivate::descriptorWritten); + this, &QLowEnergyControllerPrivateCommon::descriptorWritten); connect(hub, &LowEnergyNotificationHub::characteristicChanged, - this, &QLowEnergyControllerPrivate::characteristicChanged); + this, &QLowEnergyControllerPrivateCommon::characteristicChanged); } } -void QLowEnergyControllerPrivate::connectToDevice() +void QLowEnergyControllerPrivateCommon::connectToDevice() { if (!hub) return; // Android version below v18 @@ -168,7 +168,7 @@ void QLowEnergyControllerPrivate::connectToDevice() } } -void QLowEnergyControllerPrivate::disconnectFromDevice() +void QLowEnergyControllerPrivateCommon::disconnectFromDevice() { /* Catch an Android timeout bug. If the device is connecting but cannot * physically connect it seems to ignore the disconnect call below. @@ -186,7 +186,7 @@ void QLowEnergyControllerPrivate::disconnectFromDevice() setState(QLowEnergyController::UnconnectedState); } -void QLowEnergyControllerPrivate::discoverServices() +void QLowEnergyControllerPrivateCommon::discoverServices() { if (hub && hub->javaObject().callMethod("discoverServices")) { qCDebug(QT_BT_ANDROID) << "Service discovery initiated"; @@ -197,7 +197,7 @@ void QLowEnergyControllerPrivate::discoverServices() } } -void QLowEnergyControllerPrivate::discoverServiceDetails(const QBluetoothUuid &service) +void QLowEnergyControllerPrivateCommon::discoverServiceDetails(const QBluetoothUuid &service) { if (!serviceList.contains(service)) { qCWarning(QT_BT_ANDROID) << "Discovery of unknown service" << service.toString() @@ -232,7 +232,7 @@ void QLowEnergyControllerPrivate::discoverServiceDetails(const QBluetoothUuid &s qCDebug(QT_BT_ANDROID) << "Discovery of" << service << "started"; } -void QLowEnergyControllerPrivate::writeCharacteristic( +void QLowEnergyControllerPrivateCommon::writeCharacteristic( const QSharedPointer service, const QLowEnergyHandle charHandle, const QByteArray &newValue, @@ -286,7 +286,7 @@ void QLowEnergyControllerPrivate::writeCharacteristic( service->setError(QLowEnergyService::CharacteristicWriteError); } -void QLowEnergyControllerPrivate::writeDescriptor( +void QLowEnergyControllerPrivateCommon::writeDescriptor( const QSharedPointer service, const QLowEnergyHandle charHandle, const QLowEnergyHandle descHandle, @@ -337,7 +337,7 @@ void QLowEnergyControllerPrivate::writeDescriptor( service->setError(QLowEnergyService::DescriptorWriteError); } -void QLowEnergyControllerPrivate::readCharacteristic( +void QLowEnergyControllerPrivateCommon::readCharacteristic( const QSharedPointer service, const QLowEnergyHandle charHandle) { @@ -365,7 +365,7 @@ void QLowEnergyControllerPrivate::readCharacteristic( service->setError(QLowEnergyService::CharacteristicReadError); } -void QLowEnergyControllerPrivate::readDescriptor( +void QLowEnergyControllerPrivateCommon::readDescriptor( const QSharedPointer service, const QLowEnergyHandle /*charHandle*/, const QLowEnergyHandle descriptorHandle) @@ -391,7 +391,7 @@ void QLowEnergyControllerPrivate::readDescriptor( service->setError(QLowEnergyService::DescriptorReadError); } -void QLowEnergyControllerPrivate::connectionUpdated( +void QLowEnergyControllerPrivateCommon::connectionUpdated( QLowEnergyController::ControllerState newState, QLowEnergyController::Error errorCode) { @@ -407,7 +407,7 @@ void QLowEnergyControllerPrivate::connectionUpdated( } // called if server/peripheral -void QLowEnergyControllerPrivate::peripheralConnectionUpdated( +void QLowEnergyControllerPrivateCommon::peripheralConnectionUpdated( QLowEnergyController::ControllerState newState, QLowEnergyController::Error errorCode) { @@ -437,7 +437,7 @@ void QLowEnergyControllerPrivate::peripheralConnectionUpdated( } // called if client/central -void QLowEnergyControllerPrivate::centralConnectionUpdated( +void QLowEnergyControllerPrivateCommon::centralConnectionUpdated( QLowEnergyController::ControllerState newState, QLowEnergyController::Error errorCode) { @@ -482,7 +482,7 @@ void QLowEnergyControllerPrivate::centralConnectionUpdated( } } -void QLowEnergyControllerPrivate::servicesDiscovered( +void QLowEnergyControllerPrivateCommon::servicesDiscovered( QLowEnergyController::Error errorCode, const QString &foundServices) { Q_Q(QLowEnergyController); @@ -513,7 +513,7 @@ void QLowEnergyControllerPrivate::servicesDiscovered( } } -void QLowEnergyControllerPrivate::serviceDetailsDiscoveryFinished( +void QLowEnergyControllerPrivateCommon::serviceDetailsDiscoveryFinished( const QString &serviceUuid, int startHandle, int endHandle) { const QBluetoothUuid service(serviceUuid); @@ -561,7 +561,7 @@ void QLowEnergyControllerPrivate::serviceDetailsDiscoveryFinished( pointer->setState(QLowEnergyService::ServiceDiscovered); } -void QLowEnergyControllerPrivate::characteristicRead( +void QLowEnergyControllerPrivateCommon::characteristicRead( const QBluetoothUuid &serviceUuid, int handle, const QBluetoothUuid &charUuid, int properties, const QByteArray &data) { @@ -592,7 +592,7 @@ void QLowEnergyControllerPrivate::characteristicRead( } } -void QLowEnergyControllerPrivate::descriptorRead( +void QLowEnergyControllerPrivateCommon::descriptorRead( const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid, int descHandle, const QBluetoothUuid &descUuid, const QByteArray &data) { @@ -633,7 +633,7 @@ void QLowEnergyControllerPrivate::descriptorRead( } } -void QLowEnergyControllerPrivate::characteristicWritten( +void QLowEnergyControllerPrivateCommon::characteristicWritten( int charHandle, const QByteArray &data, QLowEnergyService::ServiceError errorCode) { QSharedPointer service = @@ -662,7 +662,7 @@ void QLowEnergyControllerPrivate::characteristicWritten( emit service->characteristicWritten(characteristic, data); } -void QLowEnergyControllerPrivate::descriptorWritten( +void QLowEnergyControllerPrivateCommon::descriptorWritten( int descHandle, const QByteArray &data, QLowEnergyService::ServiceError errorCode) { QSharedPointer service = @@ -689,7 +689,7 @@ void QLowEnergyControllerPrivate::descriptorWritten( emit service->descriptorWritten(descriptor, data); } -void QLowEnergyControllerPrivate::serverDescriptorWritten( +void QLowEnergyControllerPrivateCommon::serverDescriptorWritten( const QAndroidJniObject &jniDesc, const QByteArray &newValue) { qCDebug(QT_BT_ANDROID) << "Server descriptor change notification" << newValue.toHex(); @@ -754,7 +754,7 @@ void QLowEnergyControllerPrivate::serverDescriptorWritten( } } -void QLowEnergyControllerPrivate::characteristicChanged( +void QLowEnergyControllerPrivateCommon::characteristicChanged( int charHandle, const QByteArray &data) { QSharedPointer service = @@ -779,7 +779,7 @@ void QLowEnergyControllerPrivate::characteristicChanged( emit service->characteristicChanged(characteristic, data); } -void QLowEnergyControllerPrivate::serverCharacteristicChanged( +void QLowEnergyControllerPrivateCommon::serverCharacteristicChanged( const QAndroidJniObject &characteristic, const QByteArray &newValue) { qCDebug(QT_BT_ANDROID) << "Server characteristic change notification" << newValue.toHex(); @@ -828,7 +828,7 @@ void QLowEnergyControllerPrivate::serverCharacteristicChanged( QLowEnergyCharacteristic(servicePrivate, foundHandle), newValue); } -void QLowEnergyControllerPrivate::serviceError( +void QLowEnergyControllerPrivateCommon::serviceError( int attributeHandle, QLowEnergyService::ServiceError errorCode) { // ignore call if it isn't really an error @@ -844,7 +844,7 @@ void QLowEnergyControllerPrivate::serviceError( service->setError(errorCode); } -void QLowEnergyControllerPrivate::advertisementError(int errorCode) +void QLowEnergyControllerPrivateCommon::advertisementError(int errorCode) { Q_Q(QLowEnergyController); @@ -995,7 +995,7 @@ static QAndroidJniObject createJavaAdvertiseSettings(const QLowEnergyAdvertising } -void QLowEnergyControllerPrivate::startAdvertising(const QLowEnergyAdvertisingParameters ¶ms, +void QLowEnergyControllerPrivateCommon::startAdvertising(const QLowEnergyAdvertisingParameters ¶ms, const QLowEnergyAdvertisingData &advertisingData, const QLowEnergyAdvertisingData &scanResponseData) { @@ -1022,13 +1022,13 @@ void QLowEnergyControllerPrivate::startAdvertising(const QLowEnergyAdvertisingPa } } -void QLowEnergyControllerPrivate::stopAdvertising() +void QLowEnergyControllerPrivateCommon::stopAdvertising() { setState(QLowEnergyController::UnconnectedState); hub->javaObject().callMethod("stopAdvertising"); } -void QLowEnergyControllerPrivate::requestConnectionUpdate(const QLowEnergyConnectionParameters ¶ms) +void QLowEnergyControllerPrivateCommon::requestConnectionUpdate(const QLowEnergyConnectionParameters ¶ms) { // Possible since Android v21 // Android does not permit specification of specific latency or min/max @@ -1167,7 +1167,7 @@ static int setupDescPermissions(const QLowEnergyDescriptorData &descData) return permissions; } -void QLowEnergyControllerPrivate::addToGenericAttributeList(const QLowEnergyServiceData &serviceData, +void QLowEnergyControllerPrivateCommon::addToGenericAttributeList(const QLowEnergyServiceData &serviceData, QLowEnergyHandle startHandle) { QSharedPointer service = serviceForHandle(startHandle); diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index 1622ffb3..84c2970f 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -263,8 +263,8 @@ template<> void putDataAndIncrement(const QByteArray &value, char *&dst) dst += value.count(); } -QLowEnergyControllerPrivate::QLowEnergyControllerPrivate() - : QLowEnergyControllerPrivateBase(), +QLowEnergyControllerPrivateCommon::QLowEnergyControllerPrivateCommon() + : QLowEnergyControllerPrivate(), lastLocalHandle(0), l2cpSocket(0), requestPending(false), mtuSize(ATT_DEFAULT_LE_MTU), @@ -278,7 +278,7 @@ QLowEnergyControllerPrivate::QLowEnergyControllerPrivate() qRegisterMetaType >(); } -void QLowEnergyControllerPrivate::init() +void QLowEnergyControllerPrivateCommon::init() { hciManager = new HciManager(localAdapter, this); if (!hciManager->isValid()) @@ -329,12 +329,12 @@ void QLowEnergyControllerPrivate::init() requestTimer->setSingleShot(true); requestTimer->setInterval(gattRequestTimeout); connect(requestTimer, &QTimer::timeout, - this, &QLowEnergyControllerPrivate::handleGattRequestTimeout); + this, &QLowEnergyControllerPrivateCommon::handleGattRequestTimeout); } } } -void QLowEnergyControllerPrivate::handleGattRequestTimeout() +void QLowEnergyControllerPrivateCommon::handleGattRequestTimeout() { // antyhing open that might require cancellation or a warning? if (encryptionChangePending) { @@ -409,7 +409,7 @@ void QLowEnergyControllerPrivate::handleGattRequestTimeout() } } -QLowEnergyControllerPrivate::~QLowEnergyControllerPrivate() +QLowEnergyControllerPrivateCommon::~QLowEnergyControllerPrivateCommon() { closeServerSocket(); delete cmacCalculator; @@ -465,7 +465,7 @@ private: }; -void QLowEnergyControllerPrivate::startAdvertising(const QLowEnergyAdvertisingParameters ¶ms, +void QLowEnergyControllerPrivateCommon::startAdvertising(const QLowEnergyAdvertisingParameters ¶ms, const QLowEnergyAdvertisingData &advertisingData, const QLowEnergyAdvertisingData &scanResponseData) { @@ -474,7 +474,7 @@ void QLowEnergyControllerPrivate::startAdvertising(const QLowEnergyAdvertisingPa advertiser = new QLeAdvertiserBluez(params, advertisingData, scanResponseData, *hciManager, this); connect(advertiser, &QLeAdvertiser::errorOccurred, this, - &QLowEnergyControllerPrivate::handleAdvertisingError); + &QLowEnergyControllerPrivateCommon::handleAdvertisingError); } setState(QLowEnergyController::AdvertisingState); advertiser->startAdvertising(); @@ -495,16 +495,16 @@ void QLowEnergyControllerPrivate::startAdvertising(const QLowEnergyAdvertisingPa const int socketFd = serverSocket.takeSocket(); serverSocketNotifier = new QSocketNotifier(socketFd, QSocketNotifier::Read, this); connect(serverSocketNotifier, &QSocketNotifier::activated, this, - &QLowEnergyControllerPrivate::handleConnectionRequest); + &QLowEnergyControllerPrivateCommon::handleConnectionRequest); } -void QLowEnergyControllerPrivate::stopAdvertising() +void QLowEnergyControllerPrivateCommon::stopAdvertising() { setState(QLowEnergyController::UnconnectedState); advertiser->stopAdvertising(); } -void QLowEnergyControllerPrivate::requestConnectionUpdate(const QLowEnergyConnectionParameters ¶ms) +void QLowEnergyControllerPrivateCommon::requestConnectionUpdate(const QLowEnergyConnectionParameters ¶ms) { // The spec says that the connection update command can be used by both slave and master // devices, but BlueZ allows it only for master devices. So for slave devices, we have to use a @@ -516,7 +516,7 @@ void QLowEnergyControllerPrivate::requestConnectionUpdate(const QLowEnergyConnec hciManager->sendConnectionParameterUpdateRequest(connectionHandle, params); } -void QLowEnergyControllerPrivate::connectToDevice() +void QLowEnergyControllerPrivateCommon::connectToDevice() { if (remoteDevice.isNull()) { qCWarning(QT_BT_BLUEZ) << "Invalid/null remote device address"; @@ -548,7 +548,7 @@ void QLowEnergyControllerPrivate::connectToDevice() if (!device1Manager) { device1Manager = new RemoteDeviceManager(localAdapter, this); connect(device1Manager, &RemoteDeviceManager::finished, - this, &QLowEnergyControllerPrivate::activeConnectionTerminationDone); + this, &QLowEnergyControllerPrivateCommon::activeConnectionTerminationDone); } QVector connectedAddresses; @@ -566,7 +566,7 @@ void QLowEnergyControllerPrivate::connectToDevice() /*! * Handles outcome of attempts to close external connections. */ -void QLowEnergyControllerPrivate::activeConnectionTerminationDone() +void QLowEnergyControllerPrivateCommon::activeConnectionTerminationDone() { if (!device1Manager) return; @@ -588,7 +588,7 @@ void QLowEnergyControllerPrivate::activeConnectionTerminationDone() /*! * Establishes the L2CP client socket. */ -void QLowEnergyControllerPrivate::establishL2cpClientSocket() +void QLowEnergyControllerPrivateCommon::establishL2cpClientSocket() { //we are already in Connecting state @@ -644,7 +644,7 @@ void QLowEnergyControllerPrivate::establishL2cpClientSocket() loadSigningDataIfNecessary(LocalSigningKey); } -void QLowEnergyControllerPrivate::createServicesForCentralIfRequired() +void QLowEnergyControllerPrivateCommon::createServicesForCentralIfRequired() { bool ok = false; int value = qEnvironmentVariableIntValue("QT_DEFAULT_CENTRAL_SERVICES", &ok); @@ -710,7 +710,7 @@ void QLowEnergyControllerPrivate::createServicesForCentralIfRequired() service->setParent(q); } -void QLowEnergyControllerPrivate::l2cpConnected() +void QLowEnergyControllerPrivateCommon::l2cpConnected() { Q_Q(QLowEnergyController); @@ -721,14 +721,14 @@ void QLowEnergyControllerPrivate::l2cpConnected() emit q->connected(); } -void QLowEnergyControllerPrivate::disconnectFromDevice() +void QLowEnergyControllerPrivateCommon::disconnectFromDevice() { setState(QLowEnergyController::ClosingState); l2cpSocket->close(); resetController(); } -void QLowEnergyControllerPrivate::l2cpDisconnected() +void QLowEnergyControllerPrivateCommon::l2cpDisconnected() { Q_Q(QLowEnergyController); @@ -740,7 +740,7 @@ void QLowEnergyControllerPrivate::l2cpDisconnected() emit q->disconnected(); } -void QLowEnergyControllerPrivate::l2cpErrorChanged(QBluetoothSocket::SocketError e) +void QLowEnergyControllerPrivateCommon::l2cpErrorChanged(QBluetoothSocket::SocketError e) { switch (e) { case QBluetoothSocket::HostNotFoundError: @@ -773,7 +773,7 @@ void QLowEnergyControllerPrivate::l2cpErrorChanged(QBluetoothSocket::SocketError } -void QLowEnergyControllerPrivate::resetController() +void QLowEnergyControllerPrivateCommon::resetController() { openRequests.clear(); openPrepareWriteRequests.clear(); @@ -790,7 +790,7 @@ void QLowEnergyControllerPrivate::resetController() advertiser->stopAdvertising(); } -void QLowEnergyControllerPrivate::restartRequestTimer() +void QLowEnergyControllerPrivateCommon::restartRequestTimer() { if (!requestTimer) return; @@ -799,7 +799,7 @@ void QLowEnergyControllerPrivate::restartRequestTimer() requestTimer->start(gattRequestTimeout); } -void QLowEnergyControllerPrivate::l2cpReadyRead() +void QLowEnergyControllerPrivateCommon::l2cpReadyRead() { const QByteArray incomingPacket = l2cpSocket->readAll(); qCDebug(QT_BT_BLUEZ) << "Received size:" << incomingPacket.size() << "data:" @@ -897,7 +897,7 @@ void QLowEnergyControllerPrivate::l2cpReadyRead() * callback is called. The first pending request in the queue is the request * that triggered the encryption request. */ -void QLowEnergyControllerPrivate::encryptionChangedEvent( +void QLowEnergyControllerPrivateCommon::encryptionChangedEvent( const QBluetoothAddress &address, bool wasSuccess) { if (!encryptionChangePending) // somebody else caused change event @@ -946,7 +946,7 @@ void QLowEnergyControllerPrivate::encryptionChangedEvent( sendNextPendingRequest(); } -void QLowEnergyControllerPrivate::sendPacket(const QByteArray &packet) +void QLowEnergyControllerPrivateCommon::sendPacket(const QByteArray &packet) { qint64 result = l2cpSocket->write(packet.constData(), packet.size()); @@ -965,7 +965,7 @@ void QLowEnergyControllerPrivate::sendPacket(const QByteArray &packet) } -void QLowEnergyControllerPrivate::sendNextPendingRequest() +void QLowEnergyControllerPrivateCommon::sendNextPendingRequest() { if (openRequests.isEmpty() || requestPending || encryptionChangePending) return; @@ -1030,7 +1030,7 @@ QLowEnergyHandle parseReadByTypeIncludeDiscovery( return attributeHandle; } -void QLowEnergyControllerPrivate::processReply( +void QLowEnergyControllerPrivateCommon::processReply( const Request &request, const QByteArray &response) { Q_Q(QLowEnergyController); @@ -1568,12 +1568,12 @@ void QLowEnergyControllerPrivate::processReply( } } -void QLowEnergyControllerPrivate::discoverServices() +void QLowEnergyControllerPrivateCommon::discoverServices() { sendReadByGroupRequest(0x0001, 0xFFFF, GATT_PRIMARY_SERVICE); } -void QLowEnergyControllerPrivate::sendReadByGroupRequest( +void QLowEnergyControllerPrivateCommon::sendReadByGroupRequest( QLowEnergyHandle start, QLowEnergyHandle end, quint16 type) { //call for primary and secondary services @@ -1598,7 +1598,7 @@ void QLowEnergyControllerPrivate::sendReadByGroupRequest( sendNextPendingRequest(); } -void QLowEnergyControllerPrivate::discoverServiceDetails(const QBluetoothUuid &service) +void QLowEnergyControllerPrivateCommon::discoverServiceDetails(const QBluetoothUuid &service) { if (!serviceList.contains(service)) { qCWarning(QT_BT_BLUEZ) << "Discovery of unknown service" << service.toString() @@ -1611,7 +1611,7 @@ void QLowEnergyControllerPrivate::discoverServiceDetails(const QBluetoothUuid &s sendReadByTypeRequest(serviceData, serviceData->startHandle, GATT_INCLUDED_SERVICE); } -void QLowEnergyControllerPrivate::sendReadByTypeRequest( +void QLowEnergyControllerPrivateCommon::sendReadByTypeRequest( QSharedPointer serviceData, QLowEnergyHandle nextHandle, quint16 attributeType) { @@ -1647,7 +1647,7 @@ void QLowEnergyControllerPrivate::sendReadByTypeRequest( \a readCharacteristics determines whether we intend to read a characteristic; otherwise we read a descriptor. */ -void QLowEnergyControllerPrivate::readServiceValues( +void QLowEnergyControllerPrivateCommon::readServiceValues( const QBluetoothUuid &serviceUuid, bool readCharacteristics) { quint8 packet[READ_REQUEST_HEADER_SIZE]; @@ -1741,7 +1741,7 @@ void QLowEnergyControllerPrivate::readServiceValues( open requests to finish the current value read up before starting the next read request. */ -void QLowEnergyControllerPrivate::readServiceValuesByOffset( +void QLowEnergyControllerPrivateCommon::readServiceValuesByOffset( uint handleData, quint16 offset, bool isLastValue) { const QLowEnergyHandle charHandle = (handleData & 0xffff); @@ -1780,7 +1780,7 @@ void QLowEnergyControllerPrivate::readServiceValuesByOffset( openRequests.prepend(request); } -void QLowEnergyControllerPrivate::discoverServiceDescriptors( +void QLowEnergyControllerPrivateCommon::discoverServiceDescriptors( const QBluetoothUuid &serviceUuid) { qCDebug(QT_BT_BLUEZ) << "Discovering descriptor values for" @@ -1800,7 +1800,7 @@ void QLowEnergyControllerPrivate::discoverServiceDescriptors( discoverNextDescriptor(service, keys, keys[0]); } -void QLowEnergyControllerPrivate::processUnsolicitedReply(const QByteArray &payload) +void QLowEnergyControllerPrivateCommon::processUnsolicitedReply(const QByteArray &payload) { const char *data = payload.constData(); bool isNotification = (data[0] == ATT_OP_HANDLE_VAL_NOTIFICATION); @@ -1824,7 +1824,7 @@ void QLowEnergyControllerPrivate::processUnsolicitedReply(const QByteArray &payl } } -void QLowEnergyControllerPrivate::exchangeMTU() +void QLowEnergyControllerPrivateCommon::exchangeMTU() { qCDebug(QT_BT_BLUEZ) << "Exchanging MTU"; @@ -1843,7 +1843,7 @@ void QLowEnergyControllerPrivate::exchangeMTU() sendNextPendingRequest(); } -int QLowEnergyControllerPrivate::securityLevel() const +int QLowEnergyControllerPrivateCommon::securityLevel() const { int socket = l2cpSocket->socketDescriptor(); if (socket < 0) { @@ -1882,7 +1882,7 @@ int QLowEnergyControllerPrivate::securityLevel() const return -1; } -bool QLowEnergyControllerPrivate::setSecurityLevel(int level) +bool QLowEnergyControllerPrivateCommon::setSecurityLevel(int level) { if (level > BT_SECURITY_HIGH || level < BT_SECURITY_LOW) return false; @@ -1929,7 +1929,7 @@ bool QLowEnergyControllerPrivate::setSecurityLevel(int level) return false; } -void QLowEnergyControllerPrivate::discoverNextDescriptor( +void QLowEnergyControllerPrivateCommon::discoverNextDescriptor( QSharedPointer serviceData, const QList pendingCharHandles, const QLowEnergyHandle startingHandle) @@ -1966,7 +1966,7 @@ void QLowEnergyControllerPrivate::discoverNextDescriptor( sendNextPendingRequest(); } -void QLowEnergyControllerPrivate::sendNextPrepareWriteRequest( +void QLowEnergyControllerPrivateCommon::sendNextPrepareWriteRequest( const QLowEnergyHandle handle, const QByteArray &newValue, quint16 offset) { @@ -2021,7 +2021,7 @@ void QLowEnergyControllerPrivate::sendNextPrepareWriteRequest( Otherwise this function sends an execute request for all pending prepare write requests. */ -void QLowEnergyControllerPrivate::sendExecuteWriteRequest( +void QLowEnergyControllerPrivateCommon::sendExecuteWriteRequest( const QLowEnergyHandle attrHandle, const QByteArray &newValue, bool isCancelation) { @@ -2053,7 +2053,7 @@ void QLowEnergyControllerPrivate::sendExecuteWriteRequest( TODO Reliable/prepare write across multiple characteristics is not supported */ -void QLowEnergyControllerPrivate::writeCharacteristic( +void QLowEnergyControllerPrivateCommon::writeCharacteristic( const QSharedPointer service, const QLowEnergyHandle charHandle, const QByteArray &newValue, @@ -2071,7 +2071,7 @@ void QLowEnergyControllerPrivate::writeCharacteristic( writeCharacteristicForCentral(service, charHandle, charData.valueHandle, newValue, mode); } -void QLowEnergyControllerPrivate::writeDescriptor( +void QLowEnergyControllerPrivateCommon::writeDescriptor( const QSharedPointer service, const QLowEnergyHandle charHandle, const QLowEnergyHandle descriptorHandle, @@ -2090,7 +2090,7 @@ void QLowEnergyControllerPrivate::writeDescriptor( Reads the value of one specific characteristic. */ -void QLowEnergyControllerPrivate::readCharacteristic( +void QLowEnergyControllerPrivateCommon::readCharacteristic( const QSharedPointer service, const QLowEnergyHandle charHandle) { @@ -2128,7 +2128,7 @@ void QLowEnergyControllerPrivate::readCharacteristic( sendNextPendingRequest(); } -void QLowEnergyControllerPrivate::readDescriptor( +void QLowEnergyControllerPrivateCommon::readDescriptor( const QSharedPointer service, const QLowEnergyHandle charHandle, const QLowEnergyHandle descriptorHandle) @@ -2167,7 +2167,7 @@ void QLowEnergyControllerPrivate::readDescriptor( * Returns true if the encryption change was successfully requested. * The request is triggered if we got a related ATT error. */ -bool QLowEnergyControllerPrivate::increaseEncryptLevelfRequired(quint8 errorCode) +bool QLowEnergyControllerPrivateCommon::increaseEncryptLevelfRequired(quint8 errorCode) { if (securityLevelValue == BT_SECURITY_HIGH) return false; @@ -2195,14 +2195,14 @@ bool QLowEnergyControllerPrivate::increaseEncryptLevelfRequired(quint8 errorCode return false; } -void QLowEnergyControllerPrivate::handleAdvertisingError() +void QLowEnergyControllerPrivateCommon::handleAdvertisingError() { qCWarning(QT_BT_BLUEZ) << "received advertising error"; setError(QLowEnergyController::AdvertisingError); setState(QLowEnergyController::UnconnectedState); } -bool QLowEnergyControllerPrivate::checkPacketSize(const QByteArray &packet, int minSize, +bool QLowEnergyControllerPrivateCommon::checkPacketSize(const QByteArray &packet, int minSize, int maxSize) { if (maxSize == -1) @@ -2215,7 +2215,7 @@ bool QLowEnergyControllerPrivate::checkPacketSize(const QByteArray &packet, int return false; } -bool QLowEnergyControllerPrivate::checkHandle(const QByteArray &packet, QLowEnergyHandle handle) +bool QLowEnergyControllerPrivateCommon::checkHandle(const QByteArray &packet, QLowEnergyHandle handle) { if (handle != 0 && handle <= lastLocalHandle) return true; @@ -2223,7 +2223,7 @@ bool QLowEnergyControllerPrivate::checkHandle(const QByteArray &packet, QLowEner return false; } -bool QLowEnergyControllerPrivate::checkHandlePair(quint8 request, QLowEnergyHandle startingHandle, +bool QLowEnergyControllerPrivateCommon::checkHandlePair(quint8 request, QLowEnergyHandle startingHandle, QLowEnergyHandle endingHandle) { if (startingHandle == 0 || startingHandle > endingHandle) { @@ -2234,7 +2234,7 @@ bool QLowEnergyControllerPrivate::checkHandlePair(quint8 request, QLowEnergyHand return true; } -void QLowEnergyControllerPrivate::handleExchangeMtuRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateCommon::handleExchangeMtuRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.2 @@ -2261,7 +2261,7 @@ void QLowEnergyControllerPrivate::handleExchangeMtuRequest(const QByteArray &pac qCDebug(QT_BT_BLUEZ) << "Sending server RX MTU" << ATT_MAX_LE_MTU; } -void QLowEnergyControllerPrivate::handleFindInformationRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateCommon::handleFindInformationRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.3.1-2 @@ -2294,7 +2294,7 @@ void QLowEnergyControllerPrivate::handleFindInformationRequest(const QByteArray } -void QLowEnergyControllerPrivate::handleFindByTypeValueRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateCommon::handleFindByTypeValueRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.3.3-4 @@ -2329,7 +2329,7 @@ void QLowEnergyControllerPrivate::handleFindByTypeValueRequest(const QByteArray sendListResponse(responsePrefix, elemSize, results, elemWriter); } -void QLowEnergyControllerPrivate::handleReadByTypeRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateCommon::handleReadByTypeRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.4.1-2 @@ -2382,7 +2382,7 @@ void QLowEnergyControllerPrivate::handleReadByTypeRequest(const QByteArray &pack sendListResponse(responsePrefix, elementSize, results, elemWriter); } -void QLowEnergyControllerPrivate::handleReadRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateCommon::handleReadRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.4.3-4 @@ -2409,7 +2409,7 @@ void QLowEnergyControllerPrivate::handleReadRequest(const QByteArray &packet) sendPacket(response); } -void QLowEnergyControllerPrivate::handleReadBlobRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateCommon::handleReadBlobRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.4.5-6 @@ -2448,7 +2448,7 @@ void QLowEnergyControllerPrivate::handleReadBlobRequest(const QByteArray &packet sendPacket(response); } -void QLowEnergyControllerPrivate::handleReadMultipleRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateCommon::handleReadMultipleRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.4.7-8 @@ -2484,7 +2484,7 @@ void QLowEnergyControllerPrivate::handleReadMultipleRequest(const QByteArray &pa sendPacket(response); } -void QLowEnergyControllerPrivate::handleReadByGroupTypeRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateCommon::handleReadByGroupTypeRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.4.9-10 @@ -2543,7 +2543,7 @@ void QLowEnergyControllerPrivate::handleReadByGroupTypeRequest(const QByteArray sendListResponse(responsePrefix, elementSize, results, elemWriter); } -void QLowEnergyControllerPrivate::updateLocalAttributeValue( +void QLowEnergyControllerPrivateCommon::updateLocalAttributeValue( QLowEnergyHandle handle, const QByteArray &value, QLowEnergyCharacteristic &characteristic, @@ -2577,7 +2577,7 @@ void QLowEnergyControllerPrivate::updateLocalAttributeValue( static bool isNotificationEnabled(quint16 clientConfigValue) { return clientConfigValue & 0x1; } static bool isIndicationEnabled(quint16 clientConfigValue) { return clientConfigValue & 0x2; } -void QLowEnergyControllerPrivate::writeCharacteristicForPeripheral( +void QLowEnergyControllerPrivateCommon::writeCharacteristicForPeripheral( QLowEnergyServicePrivate::CharData &charData, const QByteArray &newValue) { @@ -2634,7 +2634,7 @@ void QLowEnergyControllerPrivate::writeCharacteristicForPeripheral( } } -void QLowEnergyControllerPrivate::writeCharacteristicForCentral(const QSharedPointer &service, +void QLowEnergyControllerPrivateCommon::writeCharacteristicForCentral(const QSharedPointer &service, QLowEnergyHandle charHandle, QLowEnergyHandle valueHandle, const QByteArray &newValue, @@ -2708,7 +2708,7 @@ void QLowEnergyControllerPrivate::writeCharacteristicForCentral(const QSharedPoi sendNextPendingRequest(); } -void QLowEnergyControllerPrivate::writeDescriptorForPeripheral( +void QLowEnergyControllerPrivateCommon::writeDescriptorForPeripheral( const QSharedPointer &service, const QLowEnergyHandle charHandle, const QLowEnergyHandle descriptorHandle, @@ -2725,7 +2725,7 @@ void QLowEnergyControllerPrivate::writeDescriptorForPeripheral( service->characteristicList[charHandle].descriptorList[descriptorHandle].value = newValue; } -void QLowEnergyControllerPrivate::writeDescriptorForCentral( +void QLowEnergyControllerPrivateCommon::writeDescriptorForCentral( const QLowEnergyHandle charHandle, const QLowEnergyHandle descriptorHandle, const QByteArray &newValue) @@ -2758,7 +2758,7 @@ void QLowEnergyControllerPrivate::writeDescriptorForCentral( sendNextPendingRequest(); } -void QLowEnergyControllerPrivate::handleWriteRequestOrCommand(const QByteArray &packet) +void QLowEnergyControllerPrivateCommon::handleWriteRequestOrCommand(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.5.1-3 @@ -2852,7 +2852,7 @@ void QLowEnergyControllerPrivate::handleWriteRequestOrCommand(const QByteArray & } } -void QLowEnergyControllerPrivate::handlePrepareWriteRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateCommon::handlePrepareWriteRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.6.1 @@ -2883,7 +2883,7 @@ void QLowEnergyControllerPrivate::handlePrepareWriteRequest(const QByteArray &pa sendPacket(response); } -void QLowEnergyControllerPrivate::handleExecuteWriteRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateCommon::handleExecuteWriteRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.6.3 @@ -2931,7 +2931,7 @@ void QLowEnergyControllerPrivate::handleExecuteWriteRequest(const QByteArray &pa emit descriptor.d_ptr->descriptorWritten(descriptor, descriptor.value()); } -void QLowEnergyControllerPrivate::sendErrorResponse(quint8 request, quint16 handle, quint8 code) +void QLowEnergyControllerPrivateCommon::sendErrorResponse(quint8 request, quint16 handle, quint8 code) { // An ATT command never receives an error response. if (request == ATT_OP_WRITE_COMMAND || request == ATT_OP_SIGNED_WRITE_COMMAND) @@ -2947,7 +2947,7 @@ void QLowEnergyControllerPrivate::sendErrorResponse(quint8 request, quint16 hand sendPacket(packet); } -void QLowEnergyControllerPrivate::sendListResponse(const QByteArray &packetStart, int elemSize, +void QLowEnergyControllerPrivateCommon::sendListResponse(const QByteArray &packetStart, int elemSize, const QVector &attributes, const ElemWriter &elemWriter) { const int offset = packetStart.count(); @@ -2963,19 +2963,19 @@ void QLowEnergyControllerPrivate::sendListResponse(const QByteArray &packetStart sendPacket(response); } -void QLowEnergyControllerPrivate::sendNotification(QLowEnergyHandle handle) +void QLowEnergyControllerPrivateCommon::sendNotification(QLowEnergyHandle handle) { sendNotificationOrIndication(ATT_OP_HANDLE_VAL_NOTIFICATION, handle); } -void QLowEnergyControllerPrivate::sendIndication(QLowEnergyHandle handle) +void QLowEnergyControllerPrivateCommon::sendIndication(QLowEnergyHandle handle) { Q_ASSERT(!indicationInFlight); indicationInFlight = true; sendNotificationOrIndication(ATT_OP_HANDLE_VAL_INDICATION, handle); } -void QLowEnergyControllerPrivate::sendNotificationOrIndication( +void QLowEnergyControllerPrivateCommon::sendNotificationOrIndication( quint8 opCode, QLowEnergyHandle handle) { @@ -2991,13 +2991,13 @@ void QLowEnergyControllerPrivate::sendNotificationOrIndication( sendPacket(packet); } -void QLowEnergyControllerPrivate::sendNextIndication() +void QLowEnergyControllerPrivateCommon::sendNextIndication() { if (!scheduledIndications.isEmpty()) sendIndication(scheduledIndications.takeFirst()); } -void QLowEnergyControllerPrivate::handleConnectionRequest() +void QLowEnergyControllerPrivateCommon::handleConnectionRequest() { if (state != QLowEnergyController::AdvertisingState) { qCWarning(QT_BT_BLUEZ) << "Incoming connection request in unexpected state" << state; @@ -3023,10 +3023,10 @@ void QLowEnergyControllerPrivate::handleConnectionRequest() closeServerSocket(); l2cpSocket = new QBluetoothSocket(QBluetoothServiceInfo::L2capProtocol, this); connect(l2cpSocket, &QBluetoothSocket::disconnected, - this, &QLowEnergyControllerPrivate::l2cpDisconnected); + this, &QLowEnergyControllerPrivateCommon::l2cpDisconnected); connect(l2cpSocket, static_cast - (&QBluetoothSocket::error), this, &QLowEnergyControllerPrivate::l2cpErrorChanged); - connect(l2cpSocket, &QIODevice::readyRead, this, &QLowEnergyControllerPrivate::l2cpReadyRead); + (&QBluetoothSocket::error), this, &QLowEnergyControllerPrivateCommon::l2cpErrorChanged); + connect(l2cpSocket, &QIODevice::readyRead, this, &QLowEnergyControllerPrivateCommon::l2cpReadyRead); l2cpSocket->d_ptr->lowEnergySocketType = addressType == QLowEnergyController::PublicAddress ? BDADDR_LE_PUBLIC : BDADDR_LE_RANDOM; l2cpSocket->setSocketDescriptor(clientSocket, QBluetoothServiceInfo::L2capProtocol, @@ -3039,7 +3039,7 @@ void QLowEnergyControllerPrivate::handleConnectionRequest() emit q->connected(); } -void QLowEnergyControllerPrivate::closeServerSocket() +void QLowEnergyControllerPrivateCommon::closeServerSocket() { if (!serverSocketNotifier) return; @@ -3049,7 +3049,7 @@ void QLowEnergyControllerPrivate::closeServerSocket() serverSocketNotifier = nullptr; } -bool QLowEnergyControllerPrivate::isBonded() const +bool QLowEnergyControllerPrivateCommon::isBonded() const { // Pairing does not necessarily imply bonding, but we don't know whether the // bonding flag was set in the original pairing request. @@ -3057,7 +3057,7 @@ bool QLowEnergyControllerPrivate::isBonded() const != QBluetoothLocalDevice::Unpaired; } -QVector QLowEnergyControllerPrivate::gatherClientConfigData() +QVector QLowEnergyControllerPrivateCommon::gatherClientConfigData() { QVector data; foreach (const auto &service, localServices) { @@ -3078,7 +3078,7 @@ QVector QLowEnergyCont return data; } -void QLowEnergyControllerPrivate::storeClientConfigurations() +void QLowEnergyControllerPrivateCommon::storeClientConfigurations() { if (!isBonded()) { clientConfigData.remove(remoteDevice.toUInt64()); @@ -3097,7 +3097,7 @@ void QLowEnergyControllerPrivate::storeClientConfigurations() clientConfigData.insert(remoteDevice.toUInt64(), clientConfigs); } -void QLowEnergyControllerPrivate::restoreClientConfigurations() +void QLowEnergyControllerPrivateCommon::restoreClientConfigurations() { const QVector &tempConfigList = gatherClientConfigData(); const QVector &restoredClientConfigs = isBonded() @@ -3131,7 +3131,7 @@ void QLowEnergyControllerPrivate::restoreClientConfigurations() sendNextIndication(); } -void QLowEnergyControllerPrivate::loadSigningDataIfNecessary(SigningKeyType keyType) +void QLowEnergyControllerPrivateCommon::loadSigningDataIfNecessary(SigningKeyType keyType) { const auto signingDataIt = signingData.constFind(remoteDevice.toUInt64()); if (signingDataIt != signingData.constEnd()) @@ -3163,7 +3163,7 @@ void QLowEnergyControllerPrivate::loadSigningDataIfNecessary(SigningKeyType keyT signingData.insert(remoteDevice.toUInt64(), SigningData(csrk, counter - 1)); } -void QLowEnergyControllerPrivate::storeSignCounter(SigningKeyType keyType) const +void QLowEnergyControllerPrivateCommon::storeSignCounter(SigningKeyType keyType) const { const auto signingDataIt = signingData.constFind(remoteDevice.toUInt64()); if (signingDataIt == signingData.constEnd()) @@ -3184,12 +3184,12 @@ void QLowEnergyControllerPrivate::storeSignCounter(SigningKeyType keyType) const settings.setValue(counterKey, counterValue); } -QString QLowEnergyControllerPrivate::signingKeySettingsGroup(SigningKeyType keyType) const +QString QLowEnergyControllerPrivateCommon::signingKeySettingsGroup(SigningKeyType keyType) const { return QLatin1String(keyType == LocalSigningKey ? "LocalSignatureKey" : "RemoteSignatureKey"); } -QString QLowEnergyControllerPrivate::keySettingsFilePath() const +QString QLowEnergyControllerPrivateCommon::keySettingsFilePath() const { return QString::fromLatin1("/var/lib/bluetooth/%1/%2/info") .arg(localAdapter.toString(), remoteDevice.toString()); @@ -3211,7 +3211,7 @@ static QByteArray uuidToByteArray(const QBluetoothUuid &uuid) return ba; } -void QLowEnergyControllerPrivate::addToGenericAttributeList(const QLowEnergyServiceData &service, +void QLowEnergyControllerPrivateCommon::addToGenericAttributeList(const QLowEnergyServiceData &service, QLowEnergyHandle startHandle) { // Construct generic attribute data for the service with handles as keys. @@ -3321,7 +3321,7 @@ void QLowEnergyControllerPrivate::addToGenericAttributeList(const QLowEnergyServ localAttributes[serviceAttribute.handle] = serviceAttribute; } -void QLowEnergyControllerPrivate::ensureUniformAttributes(QVector &attributes, +void QLowEnergyControllerPrivateCommon::ensureUniformAttributes(QVector &attributes, const std::function &getSize) { if (attributes.isEmpty()) @@ -3334,19 +3334,19 @@ void QLowEnergyControllerPrivate::ensureUniformAttributes(QVector &at } -void QLowEnergyControllerPrivate::ensureUniformUuidSizes(QVector &attributes) +void QLowEnergyControllerPrivateCommon::ensureUniformUuidSizes(QVector &attributes) { ensureUniformAttributes(attributes, [](const Attribute &attr) { return getUuidSize(attr.type); }); } -void QLowEnergyControllerPrivate::ensureUniformValueSizes(QVector &attributes) +void QLowEnergyControllerPrivateCommon::ensureUniformValueSizes(QVector &attributes) { ensureUniformAttributes(attributes, [](const Attribute &attr) { return attr.value.count(); }); } -QVector QLowEnergyControllerPrivate::getAttributes(QLowEnergyHandle startHandle, +QVector QLowEnergyControllerPrivateCommon::getAttributes(QLowEnergyHandle startHandle, QLowEnergyHandle endHandle, const AttributePredicate &attributePredicate) { QVector results; @@ -3365,7 +3365,7 @@ QVector QLowEnergyControllerPrivate::get return results; } -int QLowEnergyControllerPrivate::checkPermissions(const Attribute &attr, +int QLowEnergyControllerPrivateCommon::checkPermissions(const Attribute &attr, QLowEnergyCharacteristic::PropertyType type) { const bool isReadAccess = type == QLowEnergyCharacteristic::Read; @@ -3399,12 +3399,12 @@ int QLowEnergyControllerPrivate::checkPermissions(const Attribute &attr, return 0; } -int QLowEnergyControllerPrivate::checkReadPermissions(const Attribute &attr) +int QLowEnergyControllerPrivateCommon::checkReadPermissions(const Attribute &attr) { return checkPermissions(attr, QLowEnergyCharacteristic::Read); } -int QLowEnergyControllerPrivate::checkReadPermissions(QVector &attributes) +int QLowEnergyControllerPrivateCommon::checkReadPermissions(QVector &attributes) { if (attributes.isEmpty()) return 0; @@ -3424,7 +3424,7 @@ int QLowEnergyControllerPrivate::checkReadPermissions(QVector &attrib return 0; } -bool QLowEnergyControllerPrivate::verifyMac(const QByteArray &message, const quint128 &csrk, +bool QLowEnergyControllerPrivateCommon::verifyMac(const QByteArray &message, const quint128 &csrk, quint32 signCounter, quint64 expectedMac) { if (!cmacCalculator) diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp index dc8fc721..95721e0c 100644 --- a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp +++ b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp @@ -43,7 +43,7 @@ QT_BEGIN_NAMESPACE QLowEnergyControllerPrivateBluezDBus::QLowEnergyControllerPrivateBluezDBus() - : QLowEnergyControllerPrivateBase() + : QLowEnergyControllerPrivate() { } diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h index fb7f3e7a..b10199f5 100644 --- a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h +++ b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h @@ -57,7 +57,7 @@ QT_BEGIN_NAMESPACE -class QLowEnergyControllerPrivateBluezDBus : public QLowEnergyControllerPrivateBase +class QLowEnergyControllerPrivateBluezDBus : public QLowEnergyControllerPrivate { Q_OBJECT public: diff --git a/src/bluetooth/qlowenergycontroller_p.cpp b/src/bluetooth/qlowenergycontroller_p.cpp index 5c82c1fe..f75c92e2 100644 --- a/src/bluetooth/qlowenergycontroller_p.cpp +++ b/src/bluetooth/qlowenergycontroller_p.cpp @@ -44,8 +44,8 @@ QT_BEGIN_NAMESPACE -QLowEnergyControllerPrivate::QLowEnergyControllerPrivate() - : QLowEnergyControllerPrivateBase(), +QLowEnergyControllerPrivateCommon::QLowEnergyControllerPrivateCommon() + : QLowEnergyControllerPrivate(), lastLocalHandle(0) { #ifndef QT_IOS_BLUETOOTH @@ -54,15 +54,15 @@ QLowEnergyControllerPrivate::QLowEnergyControllerPrivate() registerQLowEnergyControllerMetaType(); } -QLowEnergyControllerPrivate::~QLowEnergyControllerPrivate() +QLowEnergyControllerPrivateCommon::~QLowEnergyControllerPrivateCommon() { } -void QLowEnergyControllerPrivate::init() +void QLowEnergyControllerPrivateCommon::init() { } -void QLowEnergyControllerPrivate::connectToDevice() +void QLowEnergyControllerPrivateCommon::connectToDevice() { // required to pass unit test on default backend if (remoteDevice.isNull()) { @@ -71,39 +71,39 @@ void QLowEnergyControllerPrivate::connectToDevice() return; } - qWarning() << "QLowEnergyControllerPrivate::connectToDevice(): Not implemented"; + qWarning() << "QLowEnergyControllerPrivateCommon::connectToDevice(): Not implemented"; setError(QLowEnergyController::UnknownError); } -void QLowEnergyControllerPrivate::disconnectFromDevice() +void QLowEnergyControllerPrivateCommon::disconnectFromDevice() { } -void QLowEnergyControllerPrivate::discoverServices() +void QLowEnergyControllerPrivateCommon::discoverServices() { } -void QLowEnergyControllerPrivate::discoverServiceDetails(const QBluetoothUuid &/*service*/) +void QLowEnergyControllerPrivateCommon::discoverServiceDetails(const QBluetoothUuid &/*service*/) { } -void QLowEnergyControllerPrivate::readCharacteristic(const QSharedPointer /*service*/, +void QLowEnergyControllerPrivateCommon::readCharacteristic(const QSharedPointer /*service*/, const QLowEnergyHandle /*charHandle*/) { } -void QLowEnergyControllerPrivate::readDescriptor(const QSharedPointer /*service*/, +void QLowEnergyControllerPrivateCommon::readDescriptor(const QSharedPointer /*service*/, const QLowEnergyHandle /*charHandle*/, const QLowEnergyHandle /*descriptorHandle*/) { } -void QLowEnergyControllerPrivate::writeCharacteristic(const QSharedPointer /*service*/, +void QLowEnergyControllerPrivateCommon::writeCharacteristic(const QSharedPointer /*service*/, const QLowEnergyHandle /*charHandle*/, const QByteArray &/*newValue*/, QLowEnergyService::WriteMode /*writeMode*/) @@ -111,7 +111,7 @@ void QLowEnergyControllerPrivate::writeCharacteristic(const QSharedPointer /*service*/, const QLowEnergyHandle /*charHandle*/, const QLowEnergyHandle /*descriptorHandle*/, @@ -120,21 +120,21 @@ void QLowEnergyControllerPrivate::writeDescriptor( } -void QLowEnergyControllerPrivate::startAdvertising(const QLowEnergyAdvertisingParameters &/* params */, +void QLowEnergyControllerPrivateCommon::startAdvertising(const QLowEnergyAdvertisingParameters &/* params */, const QLowEnergyAdvertisingData &/* advertisingData */, const QLowEnergyAdvertisingData &/* scanResponseData */) { } -void QLowEnergyControllerPrivate::stopAdvertising() +void QLowEnergyControllerPrivateCommon::stopAdvertising() { } -void QLowEnergyControllerPrivate::requestConnectionUpdate(const QLowEnergyConnectionParameters & /* params */) +void QLowEnergyControllerPrivateCommon::requestConnectionUpdate(const QLowEnergyConnectionParameters & /* params */) { } -void QLowEnergyControllerPrivate::addToGenericAttributeList(const QLowEnergyServiceData &/* service */, +void QLowEnergyControllerPrivateCommon::addToGenericAttributeList(const QLowEnergyServiceData &/* service */, QLowEnergyHandle /* startHandle */) { } diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index c00a56a0..0cf62ad7 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -109,12 +109,12 @@ extern void registerQLowEnergyControllerMetaType(); class QLeAdvertiser; -class QLowEnergyControllerPrivate : public QLowEnergyControllerPrivateBase +class QLowEnergyControllerPrivateCommon : public QLowEnergyControllerPrivate { Q_OBJECT public: - QLowEnergyControllerPrivate(); - ~QLowEnergyControllerPrivate(); + QLowEnergyControllerPrivateCommon(); + ~QLowEnergyControllerPrivateCommon(); void init() override; @@ -451,7 +451,7 @@ private: }; -Q_DECLARE_TYPEINFO(QLowEnergyControllerPrivate::Attribute, Q_MOVABLE_TYPE); +Q_DECLARE_TYPEINFO(QLowEnergyControllerPrivateCommon::Attribute, Q_MOVABLE_TYPE); QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_winrt.cpp b/src/bluetooth/qlowenergycontroller_winrt.cpp index 37195bad..891f1ea4 100644 --- a/src/bluetooth/qlowenergycontroller_winrt.cpp +++ b/src/bluetooth/qlowenergycontroller_winrt.cpp @@ -274,8 +274,8 @@ signals: QLowEnergyHandle startHandle, QLowEnergyHandle endHandle); }; -QLowEnergyControllerPrivate::QLowEnergyControllerPrivate() - : QLowEnergyControllerPrivateBase() +QLowEnergyControllerPrivateCommon::QLowEnergyControllerPrivateCommon() + : QLowEnergyControllerPrivate() { qCDebug(QT_BT_WINRT) << __FUNCTION__; @@ -283,7 +283,7 @@ QLowEnergyControllerPrivate::QLowEnergyControllerPrivate() qRegisterMetaType(); } -QLowEnergyControllerPrivate::~QLowEnergyControllerPrivate() +QLowEnergyControllerPrivateCommon::~QLowEnergyControllerPrivateCommon() { if (mDevice && mStatusChangedToken.value) mDevice->remove_ConnectionStatusChanged(mStatusChangedToken); @@ -293,11 +293,11 @@ QLowEnergyControllerPrivate::~QLowEnergyControllerPrivate() entry.characteristic->remove_ValueChanged(entry.token); } -void QLowEnergyControllerPrivate::init() +void QLowEnergyControllerPrivateCommon::init() { } -void QLowEnergyControllerPrivate::connectToDevice() +void QLowEnergyControllerPrivateCommon::connectToDevice() { qCDebug(QT_BT_WINRT) << __FUNCTION__; Q_Q(QLowEnergyController); @@ -415,7 +415,7 @@ void QLowEnergyControllerPrivate::connectToDevice() } } -void QLowEnergyControllerPrivate::disconnectFromDevice() +void QLowEnergyControllerPrivateCommon::disconnectFromDevice() { qCDebug(QT_BT_WINRT) << __FUNCTION__; Q_Q(QLowEnergyController); @@ -427,7 +427,7 @@ void QLowEnergyControllerPrivate::disconnectFromDevice() } } -ComPtr QLowEnergyControllerPrivate::getNativeService(const QBluetoothUuid &serviceUuid) +ComPtr QLowEnergyControllerPrivateCommon::getNativeService(const QBluetoothUuid &serviceUuid) { ComPtr deviceService; HRESULT hr; @@ -437,7 +437,7 @@ ComPtr QLowEnergyControllerPrivate::getNativeService(const Q return deviceService; } -ComPtr QLowEnergyControllerPrivate::getNativeCharacteristic(const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid) +ComPtr QLowEnergyControllerPrivateCommon::getNativeCharacteristic(const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid) { ComPtr service = getNativeService(serviceUuid); if (!service) @@ -452,7 +452,7 @@ ComPtr QLowEnergyControllerPrivate::getNativeCharacteristic return characteristic; } -void QLowEnergyControllerPrivate::registerForValueChanges(const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid) +void QLowEnergyControllerPrivateCommon::registerForValueChanges(const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid) { qCDebug(QT_BT_WINRT) << "Registering characteristic" << charUuid << "in service" << serviceUuid << "for value changes"; @@ -485,7 +485,7 @@ void QLowEnergyControllerPrivate::registerForValueChanges(const QBluetoothUuid & << serviceUuid << "registered for value changes"; } -void QLowEnergyControllerPrivate::obtainIncludedServices(QSharedPointer servicePointer, +void QLowEnergyControllerPrivateCommon::obtainIncludedServices(QSharedPointer servicePointer, ComPtr service) { Q_Q(QLowEnergyController); @@ -527,7 +527,7 @@ void QLowEnergyControllerPrivate::obtainIncludedServices(QSharedPointerdiscoveryFinished(); } -void QLowEnergyControllerPrivate::discoverServiceDetails(const QBluetoothUuid &service) +void QLowEnergyControllerPrivateCommon::discoverServiceDetails(const QBluetoothUuid &service) { qCDebug(QT_BT_WINRT) << __FUNCTION__ << service; if (!serviceList.contains(service)) { @@ -654,22 +654,22 @@ void QLowEnergyControllerPrivate::discoverServiceDetails(const QBluetoothUuid &s thread->start(); } -void QLowEnergyControllerPrivate::startAdvertising(const QLowEnergyAdvertisingParameters &, const QLowEnergyAdvertisingData &, const QLowEnergyAdvertisingData &) +void QLowEnergyControllerPrivateCommon::startAdvertising(const QLowEnergyAdvertisingParameters &, const QLowEnergyAdvertisingData &, const QLowEnergyAdvertisingData &) { Q_UNIMPLEMENTED(); } -void QLowEnergyControllerPrivate::stopAdvertising() +void QLowEnergyControllerPrivateCommon::stopAdvertising() { Q_UNIMPLEMENTED(); } -void QLowEnergyControllerPrivate::requestConnectionUpdate(const QLowEnergyConnectionParameters &) +void QLowEnergyControllerPrivateCommon::requestConnectionUpdate(const QLowEnergyConnectionParameters &) { Q_UNIMPLEMENTED(); } -void QLowEnergyControllerPrivate::readCharacteristic(const QSharedPointer service, +void QLowEnergyControllerPrivateCommon::readCharacteristic(const QSharedPointer service, const QLowEnergyHandle charHandle) { qCDebug(QT_BT_WINRT) << __FUNCTION__ << service << charHandle; @@ -727,7 +727,7 @@ void QLowEnergyControllerPrivate::readCharacteristic(const QSharedPointer service, +void QLowEnergyControllerPrivateCommon::readDescriptor(const QSharedPointer service, const QLowEnergyHandle charHandle, const QLowEnergyHandle descHandle) { @@ -852,7 +852,7 @@ void QLowEnergyControllerPrivate::readDescriptor(const QSharedPointer service, +void QLowEnergyControllerPrivateCommon::writeCharacteristic(const QSharedPointer service, const QLowEnergyHandle charHandle, const QByteArray &newValue, QLowEnergyService::WriteMode mode) @@ -935,7 +935,7 @@ void QLowEnergyControllerPrivate::writeCharacteristic(const QSharedPointer service, const QLowEnergyHandle charHandle, const QLowEnergyHandle descHandle, @@ -1074,12 +1074,12 @@ void QLowEnergyControllerPrivate::writeDescriptor( } -void QLowEnergyControllerPrivate::addToGenericAttributeList(const QLowEnergyServiceData &, QLowEnergyHandle) +void QLowEnergyControllerPrivateCommon::addToGenericAttributeList(const QLowEnergyServiceData &, QLowEnergyHandle) { Q_UNIMPLEMENTED(); } -void QLowEnergyControllerPrivate::characteristicChanged( +void QLowEnergyControllerPrivateCommon::characteristicChanged( int charHandle, const QByteArray &data) { QSharedPointer service = diff --git a/src/bluetooth/qlowenergycontrollerbase.cpp b/src/bluetooth/qlowenergycontrollerbase.cpp index 0b8218e9..22fdd52b 100644 --- a/src/bluetooth/qlowenergycontrollerbase.cpp +++ b/src/bluetooth/qlowenergycontrollerbase.cpp @@ -44,16 +44,16 @@ QT_BEGIN_NAMESPACE -QLowEnergyControllerPrivateBase::QLowEnergyControllerPrivateBase() +QLowEnergyControllerPrivate::QLowEnergyControllerPrivate() : QObject() { } -QLowEnergyControllerPrivateBase::~QLowEnergyControllerPrivateBase() +QLowEnergyControllerPrivate::~QLowEnergyControllerPrivate() { } -bool QLowEnergyControllerPrivateBase::isValidLocalAdapter() +bool QLowEnergyControllerPrivate::isValidLocalAdapter() { #ifdef QT_WINRT_BLUETOOTH return true; @@ -75,7 +75,7 @@ bool QLowEnergyControllerPrivateBase::isValidLocalAdapter() } -void QLowEnergyControllerPrivateBase::setError( +void QLowEnergyControllerPrivate::setError( QLowEnergyController::Error newError) { Q_Q(QLowEnergyController); @@ -111,7 +111,7 @@ void QLowEnergyControllerPrivateBase::setError( emit q->error(newError); } -void QLowEnergyControllerPrivateBase::setState( +void QLowEnergyControllerPrivate::setState( QLowEnergyController::ControllerState newState) { Q_Q(QLowEnergyController); @@ -126,7 +126,7 @@ void QLowEnergyControllerPrivateBase::setState( emit q->stateChanged(state); } -QSharedPointer QLowEnergyControllerPrivateBase::serviceForHandle( +QSharedPointer QLowEnergyControllerPrivate::serviceForHandle( QLowEnergyHandle handle) { ServiceDataMap ¤tList = serviceList; @@ -145,7 +145,7 @@ QSharedPointer QLowEnergyControllerPrivateBase::servic Returns a valid characteristic if the given handle is the handle of the characteristic itself or one of its descriptors */ -QLowEnergyCharacteristic QLowEnergyControllerPrivateBase::characteristicForHandle( +QLowEnergyCharacteristic QLowEnergyControllerPrivate::characteristicForHandle( QLowEnergyHandle handle) { QSharedPointer service = serviceForHandle(handle); @@ -176,7 +176,7 @@ QLowEnergyCharacteristic QLowEnergyControllerPrivateBase::characteristicForHandl Returns a valid descriptor if \a handle belongs to a descriptor; otherwise an invalid one. */ -QLowEnergyDescriptor QLowEnergyControllerPrivateBase::descriptorForHandle( +QLowEnergyDescriptor QLowEnergyControllerPrivate::descriptorForHandle( QLowEnergyHandle handle) { const QLowEnergyCharacteristic matchingChar = characteristicForHandle(handle); @@ -196,7 +196,7 @@ QLowEnergyDescriptor QLowEnergyControllerPrivateBase::descriptorForHandle( /*! Returns the length of the updated characteristic value. */ -quint16 QLowEnergyControllerPrivateBase::updateValueOfCharacteristic( +quint16 QLowEnergyControllerPrivate::updateValueOfCharacteristic( QLowEnergyHandle charHandle,const QByteArray &value, bool appendValue) { QSharedPointer service = serviceForHandle(charHandle); @@ -220,7 +220,7 @@ quint16 QLowEnergyControllerPrivateBase::updateValueOfCharacteristic( /*! Returns the length of the updated descriptor value. */ -quint16 QLowEnergyControllerPrivateBase::updateValueOfDescriptor( +quint16 QLowEnergyControllerPrivate::updateValueOfDescriptor( QLowEnergyHandle charHandle, QLowEnergyHandle descriptorHandle, const QByteArray &value, bool appendValue) { @@ -247,7 +247,7 @@ quint16 QLowEnergyControllerPrivateBase::updateValueOfDescriptor( return 0; } -void QLowEnergyControllerPrivateBase::invalidateServices() +void QLowEnergyControllerPrivate::invalidateServices() { foreach (const QSharedPointer service, serviceList.values()) { service->setController(0); diff --git a/src/bluetooth/qlowenergycontrollerbase_p.h b/src/bluetooth/qlowenergycontrollerbase_p.h index 3555e7e8..27ab47ec 100644 --- a/src/bluetooth/qlowenergycontrollerbase_p.h +++ b/src/bluetooth/qlowenergycontrollerbase_p.h @@ -63,7 +63,7 @@ QT_BEGIN_NAMESPACE typedef QMap > ServiceDataMap; -class QLowEnergyControllerPrivateBase : public QObject +class QLowEnergyControllerPrivate : public QObject { Q_OBJECT public: @@ -72,8 +72,8 @@ public: // Bluez has a low level ATT protocol stack implementation and a DBus // implementation. - QLowEnergyControllerPrivateBase(); - virtual ~QLowEnergyControllerPrivateBase(); + QLowEnergyControllerPrivate(); + virtual ~QLowEnergyControllerPrivate(); // interface definition virtual void init() = 0; diff --git a/src/bluetooth/qlowenergydescriptor.h b/src/bluetooth/qlowenergydescriptor.h index efc748a3..b1ed38bd 100644 --- a/src/bluetooth/qlowenergydescriptor.h +++ b/src/bluetooth/qlowenergydescriptor.h @@ -78,8 +78,8 @@ protected: friend class QLowEnergyCharacteristic; friend class QLowEnergyService; + friend class QLowEnergyControllerPrivateCommon; friend class QLowEnergyControllerPrivate; - friend class QLowEnergyControllerPrivateBase; friend class QLowEnergyControllerPrivateOSX; QLowEnergyDescriptorPrivate *data; diff --git a/src/bluetooth/qlowenergyservice.h b/src/bluetooth/qlowenergyservice.h index 3f6cfd88..eb453ad3 100644 --- a/src/bluetooth/qlowenergyservice.h +++ b/src/bluetooth/qlowenergyservice.h @@ -47,7 +47,7 @@ QT_BEGIN_NAMESPACE class QLowEnergyServicePrivate; -class QLowEnergyControllerPrivate; +class QLowEnergyControllerPrivateCommon; class Q_BLUETOOTH_EXPORT QLowEnergyService : public QObject { Q_OBJECT @@ -134,7 +134,7 @@ private: // QLowEnergyController is the factory for this class friend class QLowEnergyController; - friend class QLowEnergyControllerPrivate; + friend class QLowEnergyControllerPrivateCommon; QLowEnergyService(QSharedPointer p, QObject *parent = nullptr); }; diff --git a/src/bluetooth/qlowenergyserviceprivate.cpp b/src/bluetooth/qlowenergyserviceprivate.cpp index e16aec72..83724d4e 100644 --- a/src/bluetooth/qlowenergyserviceprivate.cpp +++ b/src/bluetooth/qlowenergyserviceprivate.cpp @@ -57,7 +57,7 @@ QLowEnergyServicePrivate::~QLowEnergyServicePrivate() { } -void QLowEnergyServicePrivate::setController(QLowEnergyControllerPrivateBase *control) +void QLowEnergyServicePrivate::setController(QLowEnergyControllerPrivate *control) { controller = control; diff --git a/src/bluetooth/qlowenergyserviceprivate_p.h b/src/bluetooth/qlowenergyserviceprivate_p.h index 3a0edd8a..7727b583 100644 --- a/src/bluetooth/qlowenergyserviceprivate_p.h +++ b/src/bluetooth/qlowenergyserviceprivate_p.h @@ -63,7 +63,7 @@ QT_BEGIN_NAMESPACE -class QLowEnergyControllerPrivateBase; +class QLowEnergyControllerPrivate; class QLowEnergyServicePrivate : public QObject { @@ -92,7 +92,7 @@ public: Characteristic = 0x2803 }; - void setController(QLowEnergyControllerPrivateBase* control); + void setController(QLowEnergyControllerPrivate* control); void setError(QLowEnergyService::ServiceError newError); void setState(QLowEnergyService::ServiceState newState); @@ -122,7 +122,7 @@ public: QHash characteristicList; - QPointer controller; + QPointer controller; #if defined(QT_ANDROID_BLUETOOTH) // reference to the BluetoothGattService object -- cgit v1.2.3 From e1c4f25ab12892baaf43b0476fe669a48b2c58d0 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 26 Oct 2017 13:23:35 +0200 Subject: Provide own header for QLowEnergyControllerPrivate instance on Bluez This utilizes the new QLowEnergyController interface and separates the existing Bluez implementation more clearly from other platforms. The existing addServiceHelper() class is moved out into the individual backends to avoid compiling the class into the new dbus backend. Change-Id: I1eea99e493958c61cb1fae830c08a3eb26bda9c3 Reviewed-by: Oliver Wolff --- src/bluetooth/bluetooth.pro | 5 +- src/bluetooth/qbluetoothsocket.h | 2 +- src/bluetooth/qlowenergycharacteristic.h | 3 +- src/bluetooth/qlowenergycontroller.cpp | 61 +---- src/bluetooth/qlowenergycontroller_android.cpp | 51 ++++ src/bluetooth/qlowenergycontroller_bluez.cpp | 239 +++++++++------- src/bluetooth/qlowenergycontroller_bluez_p.h | 360 +++++++++++++++++++++++++ src/bluetooth/qlowenergycontroller_p.cpp | 7 + src/bluetooth/qlowenergycontroller_p.h | 230 +--------------- src/bluetooth/qlowenergycontroller_winrt.cpp | 53 ++++ src/bluetooth/qlowenergydescriptor.h | 3 +- src/bluetooth/qlowenergyservice.h | 1 + 12 files changed, 636 insertions(+), 379 deletions(-) create mode 100644 src/bluetooth/qlowenergycontroller_bluez_p.h diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index fe530c81..6b07d890 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -112,7 +112,10 @@ qtConfig(bluez) { lecmaccalculator.cpp \ qlowenergycontroller_bluezdbus.cpp - PRIVATE_HEADERS += qlowenergycontroller_bluezdbus_p.h + PRIVATE_HEADERS += qlowenergycontroller_bluezdbus_p.h \ + qlowenergycontroller_bluez_p.h + + PRIVATE_HEADERS -= qlowenergycontroller_p.h qtConfig(linux_crypto_api): DEFINES += CONFIG_LINUX_CRYPTO_API } else { diff --git a/src/bluetooth/qbluetoothsocket.h b/src/bluetooth/qbluetoothsocket.h index 31e32f9a..4524e458 100644 --- a/src/bluetooth/qbluetoothsocket.h +++ b/src/bluetooth/qbluetoothsocket.h @@ -164,7 +164,7 @@ protected: QBluetoothSocketPrivate *d_ptr; private: - friend class QLowEnergyControllerPrivateCommon; + friend class QLowEnergyControllerPrivateBluez; }; #ifndef QT_NO_DEBUG_STREAM diff --git a/src/bluetooth/qlowenergycharacteristic.h b/src/bluetooth/qlowenergycharacteristic.h index 97b60bd2..d02e6560 100644 --- a/src/bluetooth/qlowenergycharacteristic.h +++ b/src/bluetooth/qlowenergycharacteristic.h @@ -96,8 +96,9 @@ protected: QSharedPointer d_ptr; friend class QLowEnergyService; - friend class QLowEnergyControllerPrivateCommon; friend class QLowEnergyControllerPrivate; + friend class QLowEnergyControllerPrivateBluez; + friend class QLowEnergyControllerPrivateCommon; friend class QLowEnergyControllerPrivateOSX; QLowEnergyCharacteristicPrivate *data; QLowEnergyCharacteristic(QSharedPointer p, diff --git a/src/bluetooth/qlowenergycontroller.cpp b/src/bluetooth/qlowenergycontroller.cpp index 34b7cbec..e5c726b0 100644 --- a/src/bluetooth/qlowenergycontroller.cpp +++ b/src/bluetooth/qlowenergycontroller.cpp @@ -38,7 +38,6 @@ ****************************************************************************/ #include "qlowenergycontroller.h" -#include "qlowenergycontroller_p.h" #include "qlowenergycharacteristicdata.h" #include "qlowenergyconnectionparameters.h" @@ -52,6 +51,9 @@ #if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) #include "bluez/bluez5_helper_p.h" #include "qlowenergycontroller_bluezdbus_p.h" +#include "qlowenergycontroller_bluez_p.h" +#else +#include "qlowenergycontroller_p.h" #endif #include @@ -305,7 +307,7 @@ QLowEnergyController::QLowEnergyController( if (isBluez5DbusGatt()) d_ptr = new QLowEnergyControllerPrivateBluezDBus(); else - d_ptr = new QLowEnergyControllerPrivateCommon(); + d_ptr = new QLowEnergyControllerPrivateBluez(); #else d_ptr = new QLowEnergyControllerPrivateCommon(); #endif @@ -342,7 +344,7 @@ QLowEnergyController::QLowEnergyController( if (isBluez5DbusGatt()) d_ptr = new QLowEnergyControllerPrivateBluezDBus(); else - d_ptr = new QLowEnergyControllerPrivateCommon(); + d_ptr = new QLowEnergyControllerPrivateBluez(); #else d_ptr = new QLowEnergyControllerPrivateCommon(); #endif @@ -382,7 +384,7 @@ QLowEnergyController::QLowEnergyController( if (isBluez5DbusGatt()) d_ptr = new QLowEnergyControllerPrivateBluezDBus(); else - d_ptr = new QLowEnergyControllerPrivateCommon(); + d_ptr = new QLowEnergyControllerPrivateBluez(); #else d_ptr = new QLowEnergyControllerPrivateCommon(); #endif @@ -434,7 +436,7 @@ QLowEnergyController::QLowEnergyController(QObject *parent) if (isBluez5DbusGatt()) d_ptr = new QLowEnergyControllerPrivateBluezDBus(); else - d_ptr = new QLowEnergyControllerPrivateCommon(); + d_ptr = new QLowEnergyControllerPrivateBluez(); #else d_ptr = new QLowEnergyControllerPrivateCommon(); #endif @@ -783,55 +785,6 @@ QLowEnergyService *QLowEnergyController::addService(const QLowEnergyServiceData return newService; } -QLowEnergyService *QLowEnergyControllerPrivateCommon::addServiceHelper( - const QLowEnergyServiceData &service) -{ - // Spec says services "should" be grouped by uuid length (16-bit first, then 128-bit). - // Since this is not mandatory, we ignore it here and let the caller take responsibility - // for it. - - const auto servicePrivate = QSharedPointer::create(); - servicePrivate->state = QLowEnergyService::LocalService; - servicePrivate->setController(this); - servicePrivate->uuid = service.uuid(); - servicePrivate->type = service.type() == QLowEnergyServiceData::ServiceTypePrimary - ? QLowEnergyService::PrimaryService : QLowEnergyService::IncludedService; - foreach (QLowEnergyService * const includedService, service.includedServices()) { - servicePrivate->includedServices << includedService->serviceUuid(); - includedService->d_ptr->type |= QLowEnergyService::IncludedService; - } - - // Spec v4.2, Vol 3, Part G, Section 3. - const QLowEnergyHandle oldLastHandle = this->lastLocalHandle; - servicePrivate->startHandle = ++this->lastLocalHandle; // Service declaration. - this->lastLocalHandle += servicePrivate->includedServices.count(); // Include declarations. - foreach (const QLowEnergyCharacteristicData &cd, service.characteristics()) { - const QLowEnergyHandle declHandle = ++this->lastLocalHandle; - QLowEnergyServicePrivate::CharData charData; - charData.valueHandle = ++this->lastLocalHandle; - charData.uuid = cd.uuid(); - charData.properties = cd.properties(); - charData.value = cd.value(); - foreach (const QLowEnergyDescriptorData &dd, cd.descriptors()) { - QLowEnergyServicePrivate::DescData descData; - descData.uuid = dd.uuid(); - descData.value = dd.value(); - charData.descriptorList.insert(++this->lastLocalHandle, descData); - } - servicePrivate->characteristicList.insert(declHandle, charData); - } - servicePrivate->endHandle = this->lastLocalHandle; - const bool handleOverflow = this->lastLocalHandle <= oldLastHandle; - if (handleOverflow) { - qCWarning(QT_BT) << "Not enough attribute handles left to create this service"; - this->lastLocalHandle = oldLastHandle; - return nullptr; - } - - this->localServices.insert(servicePrivate->uuid, servicePrivate); - this->addToGenericAttributeList(service, servicePrivate->startHandle); - return new QLowEnergyService(servicePrivate); -} /*! Requests the controller to update the connection according to \a parameters. diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index b775e299..5c1a7060 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -1258,4 +1258,55 @@ void QLowEnergyControllerPrivateCommon::addToGenericAttributeList(const QLowEner service->androidService.object()); } +QLowEnergyService *QLowEnergyControllerPrivateCommon::addServiceHelper( + const QLowEnergyServiceData &service) +{ + // Spec says services "should" be grouped by uuid length (16-bit first, then 128-bit). + // Since this is not mandatory, we ignore it here and let the caller take responsibility + // for it. + + const auto servicePrivate = QSharedPointer::create(); + servicePrivate->state = QLowEnergyService::LocalService; + servicePrivate->setController(this); + servicePrivate->uuid = service.uuid(); + servicePrivate->type = service.type() == QLowEnergyServiceData::ServiceTypePrimary + ? QLowEnergyService::PrimaryService : QLowEnergyService::IncludedService; + foreach (QLowEnergyService * const includedService, service.includedServices()) { + servicePrivate->includedServices << includedService->serviceUuid(); + includedService->d_ptr->type |= QLowEnergyService::IncludedService; + } + + // Spec v4.2, Vol 3, Part G, Section 3. + const QLowEnergyHandle oldLastHandle = this->lastLocalHandle; + servicePrivate->startHandle = ++this->lastLocalHandle; // Service declaration. + this->lastLocalHandle += servicePrivate->includedServices.count(); // Include declarations. + foreach (const QLowEnergyCharacteristicData &cd, service.characteristics()) { + const QLowEnergyHandle declHandle = ++this->lastLocalHandle; + QLowEnergyServicePrivate::CharData charData; + charData.valueHandle = ++this->lastLocalHandle; + charData.uuid = cd.uuid(); + charData.properties = cd.properties(); + charData.value = cd.value(); + foreach (const QLowEnergyDescriptorData &dd, cd.descriptors()) { + QLowEnergyServicePrivate::DescData descData; + descData.uuid = dd.uuid(); + descData.value = dd.value(); + charData.descriptorList.insert(++this->lastLocalHandle, descData); + } + servicePrivate->characteristicList.insert(declHandle, charData); + } + servicePrivate->endHandle = this->lastLocalHandle; + const bool handleOverflow = this->lastLocalHandle <= oldLastHandle; + if (handleOverflow) { + qCWarning(QT_BT_ANDROID) << "Not enough attribute handles left to create this service"; + this->lastLocalHandle = oldLastHandle; + return nullptr; + } + + this->localServices.insert(servicePrivate->uuid, servicePrivate); + this->addToGenericAttributeList(service, servicePrivate->startHandle); + return new QLowEnergyService(servicePrivate); +} + + QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index 84c2970f..0aac1fda 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -39,7 +39,7 @@ ****************************************************************************/ #include "lecmaccalculator_p.h" -#include "qlowenergycontroller_p.h" +#include "qlowenergycontroller_bluez_p.h" #include "qbluetoothsocket_p.h" #include "qleadvertiser_p.h" #include "bluez/bluez_data_p.h" @@ -263,7 +263,7 @@ template<> void putDataAndIncrement(const QByteArray &value, char *&dst) dst += value.count(); } -QLowEnergyControllerPrivateCommon::QLowEnergyControllerPrivateCommon() +QLowEnergyControllerPrivateBluez::QLowEnergyControllerPrivateBluez() : QLowEnergyControllerPrivate(), lastLocalHandle(0), l2cpSocket(0), requestPending(false), @@ -278,7 +278,7 @@ QLowEnergyControllerPrivateCommon::QLowEnergyControllerPrivateCommon() qRegisterMetaType >(); } -void QLowEnergyControllerPrivateCommon::init() +void QLowEnergyControllerPrivateBluez::init() { hciManager = new HciManager(localAdapter, this); if (!hciManager->isValid()) @@ -329,12 +329,12 @@ void QLowEnergyControllerPrivateCommon::init() requestTimer->setSingleShot(true); requestTimer->setInterval(gattRequestTimeout); connect(requestTimer, &QTimer::timeout, - this, &QLowEnergyControllerPrivateCommon::handleGattRequestTimeout); + this, &QLowEnergyControllerPrivateBluez::handleGattRequestTimeout); } } } -void QLowEnergyControllerPrivateCommon::handleGattRequestTimeout() +void QLowEnergyControllerPrivateBluez::handleGattRequestTimeout() { // antyhing open that might require cancellation or a warning? if (encryptionChangePending) { @@ -409,7 +409,7 @@ void QLowEnergyControllerPrivateCommon::handleGattRequestTimeout() } } -QLowEnergyControllerPrivateCommon::~QLowEnergyControllerPrivateCommon() +QLowEnergyControllerPrivateBluez::~QLowEnergyControllerPrivateBluez() { closeServerSocket(); delete cmacCalculator; @@ -465,7 +465,7 @@ private: }; -void QLowEnergyControllerPrivateCommon::startAdvertising(const QLowEnergyAdvertisingParameters ¶ms, +void QLowEnergyControllerPrivateBluez::startAdvertising(const QLowEnergyAdvertisingParameters ¶ms, const QLowEnergyAdvertisingData &advertisingData, const QLowEnergyAdvertisingData &scanResponseData) { @@ -474,7 +474,7 @@ void QLowEnergyControllerPrivateCommon::startAdvertising(const QLowEnergyAdverti advertiser = new QLeAdvertiserBluez(params, advertisingData, scanResponseData, *hciManager, this); connect(advertiser, &QLeAdvertiser::errorOccurred, this, - &QLowEnergyControllerPrivateCommon::handleAdvertisingError); + &QLowEnergyControllerPrivateBluez::handleAdvertisingError); } setState(QLowEnergyController::AdvertisingState); advertiser->startAdvertising(); @@ -495,16 +495,16 @@ void QLowEnergyControllerPrivateCommon::startAdvertising(const QLowEnergyAdverti const int socketFd = serverSocket.takeSocket(); serverSocketNotifier = new QSocketNotifier(socketFd, QSocketNotifier::Read, this); connect(serverSocketNotifier, &QSocketNotifier::activated, this, - &QLowEnergyControllerPrivateCommon::handleConnectionRequest); + &QLowEnergyControllerPrivateBluez::handleConnectionRequest); } -void QLowEnergyControllerPrivateCommon::stopAdvertising() +void QLowEnergyControllerPrivateBluez::stopAdvertising() { setState(QLowEnergyController::UnconnectedState); advertiser->stopAdvertising(); } -void QLowEnergyControllerPrivateCommon::requestConnectionUpdate(const QLowEnergyConnectionParameters ¶ms) +void QLowEnergyControllerPrivateBluez::requestConnectionUpdate(const QLowEnergyConnectionParameters ¶ms) { // The spec says that the connection update command can be used by both slave and master // devices, but BlueZ allows it only for master devices. So for slave devices, we have to use a @@ -516,7 +516,7 @@ void QLowEnergyControllerPrivateCommon::requestConnectionUpdate(const QLowEnergy hciManager->sendConnectionParameterUpdateRequest(connectionHandle, params); } -void QLowEnergyControllerPrivateCommon::connectToDevice() +void QLowEnergyControllerPrivateBluez::connectToDevice() { if (remoteDevice.isNull()) { qCWarning(QT_BT_BLUEZ) << "Invalid/null remote device address"; @@ -548,7 +548,7 @@ void QLowEnergyControllerPrivateCommon::connectToDevice() if (!device1Manager) { device1Manager = new RemoteDeviceManager(localAdapter, this); connect(device1Manager, &RemoteDeviceManager::finished, - this, &QLowEnergyControllerPrivateCommon::activeConnectionTerminationDone); + this, &QLowEnergyControllerPrivateBluez::activeConnectionTerminationDone); } QVector connectedAddresses; @@ -566,7 +566,7 @@ void QLowEnergyControllerPrivateCommon::connectToDevice() /*! * Handles outcome of attempts to close external connections. */ -void QLowEnergyControllerPrivateCommon::activeConnectionTerminationDone() +void QLowEnergyControllerPrivateBluez::activeConnectionTerminationDone() { if (!device1Manager) return; @@ -588,7 +588,7 @@ void QLowEnergyControllerPrivateCommon::activeConnectionTerminationDone() /*! * Establishes the L2CP client socket. */ -void QLowEnergyControllerPrivateCommon::establishL2cpClientSocket() +void QLowEnergyControllerPrivateBluez::establishL2cpClientSocket() { //we are already in Connecting state @@ -644,7 +644,7 @@ void QLowEnergyControllerPrivateCommon::establishL2cpClientSocket() loadSigningDataIfNecessary(LocalSigningKey); } -void QLowEnergyControllerPrivateCommon::createServicesForCentralIfRequired() +void QLowEnergyControllerPrivateBluez::createServicesForCentralIfRequired() { bool ok = false; int value = qEnvironmentVariableIntValue("QT_DEFAULT_CENTRAL_SERVICES", &ok); @@ -710,7 +710,7 @@ void QLowEnergyControllerPrivateCommon::createServicesForCentralIfRequired() service->setParent(q); } -void QLowEnergyControllerPrivateCommon::l2cpConnected() +void QLowEnergyControllerPrivateBluez::l2cpConnected() { Q_Q(QLowEnergyController); @@ -721,14 +721,14 @@ void QLowEnergyControllerPrivateCommon::l2cpConnected() emit q->connected(); } -void QLowEnergyControllerPrivateCommon::disconnectFromDevice() +void QLowEnergyControllerPrivateBluez::disconnectFromDevice() { setState(QLowEnergyController::ClosingState); l2cpSocket->close(); resetController(); } -void QLowEnergyControllerPrivateCommon::l2cpDisconnected() +void QLowEnergyControllerPrivateBluez::l2cpDisconnected() { Q_Q(QLowEnergyController); @@ -740,7 +740,7 @@ void QLowEnergyControllerPrivateCommon::l2cpDisconnected() emit q->disconnected(); } -void QLowEnergyControllerPrivateCommon::l2cpErrorChanged(QBluetoothSocket::SocketError e) +void QLowEnergyControllerPrivateBluez::l2cpErrorChanged(QBluetoothSocket::SocketError e) { switch (e) { case QBluetoothSocket::HostNotFoundError: @@ -773,7 +773,7 @@ void QLowEnergyControllerPrivateCommon::l2cpErrorChanged(QBluetoothSocket::Socke } -void QLowEnergyControllerPrivateCommon::resetController() +void QLowEnergyControllerPrivateBluez::resetController() { openRequests.clear(); openPrepareWriteRequests.clear(); @@ -790,7 +790,7 @@ void QLowEnergyControllerPrivateCommon::resetController() advertiser->stopAdvertising(); } -void QLowEnergyControllerPrivateCommon::restartRequestTimer() +void QLowEnergyControllerPrivateBluez::restartRequestTimer() { if (!requestTimer) return; @@ -799,7 +799,7 @@ void QLowEnergyControllerPrivateCommon::restartRequestTimer() requestTimer->start(gattRequestTimeout); } -void QLowEnergyControllerPrivateCommon::l2cpReadyRead() +void QLowEnergyControllerPrivateBluez::l2cpReadyRead() { const QByteArray incomingPacket = l2cpSocket->readAll(); qCDebug(QT_BT_BLUEZ) << "Received size:" << incomingPacket.size() << "data:" @@ -897,7 +897,7 @@ void QLowEnergyControllerPrivateCommon::l2cpReadyRead() * callback is called. The first pending request in the queue is the request * that triggered the encryption request. */ -void QLowEnergyControllerPrivateCommon::encryptionChangedEvent( +void QLowEnergyControllerPrivateBluez::encryptionChangedEvent( const QBluetoothAddress &address, bool wasSuccess) { if (!encryptionChangePending) // somebody else caused change event @@ -946,7 +946,7 @@ void QLowEnergyControllerPrivateCommon::encryptionChangedEvent( sendNextPendingRequest(); } -void QLowEnergyControllerPrivateCommon::sendPacket(const QByteArray &packet) +void QLowEnergyControllerPrivateBluez::sendPacket(const QByteArray &packet) { qint64 result = l2cpSocket->write(packet.constData(), packet.size()); @@ -965,7 +965,7 @@ void QLowEnergyControllerPrivateCommon::sendPacket(const QByteArray &packet) } -void QLowEnergyControllerPrivateCommon::sendNextPendingRequest() +void QLowEnergyControllerPrivateBluez::sendNextPendingRequest() { if (openRequests.isEmpty() || requestPending || encryptionChangePending) return; @@ -1030,7 +1030,7 @@ QLowEnergyHandle parseReadByTypeIncludeDiscovery( return attributeHandle; } -void QLowEnergyControllerPrivateCommon::processReply( +void QLowEnergyControllerPrivateBluez::processReply( const Request &request, const QByteArray &response) { Q_Q(QLowEnergyController); @@ -1568,12 +1568,12 @@ void QLowEnergyControllerPrivateCommon::processReply( } } -void QLowEnergyControllerPrivateCommon::discoverServices() +void QLowEnergyControllerPrivateBluez::discoverServices() { sendReadByGroupRequest(0x0001, 0xFFFF, GATT_PRIMARY_SERVICE); } -void QLowEnergyControllerPrivateCommon::sendReadByGroupRequest( +void QLowEnergyControllerPrivateBluez::sendReadByGroupRequest( QLowEnergyHandle start, QLowEnergyHandle end, quint16 type) { //call for primary and secondary services @@ -1598,7 +1598,7 @@ void QLowEnergyControllerPrivateCommon::sendReadByGroupRequest( sendNextPendingRequest(); } -void QLowEnergyControllerPrivateCommon::discoverServiceDetails(const QBluetoothUuid &service) +void QLowEnergyControllerPrivateBluez::discoverServiceDetails(const QBluetoothUuid &service) { if (!serviceList.contains(service)) { qCWarning(QT_BT_BLUEZ) << "Discovery of unknown service" << service.toString() @@ -1611,7 +1611,7 @@ void QLowEnergyControllerPrivateCommon::discoverServiceDetails(const QBluetoothU sendReadByTypeRequest(serviceData, serviceData->startHandle, GATT_INCLUDED_SERVICE); } -void QLowEnergyControllerPrivateCommon::sendReadByTypeRequest( +void QLowEnergyControllerPrivateBluez::sendReadByTypeRequest( QSharedPointer serviceData, QLowEnergyHandle nextHandle, quint16 attributeType) { @@ -1647,7 +1647,7 @@ void QLowEnergyControllerPrivateCommon::sendReadByTypeRequest( \a readCharacteristics determines whether we intend to read a characteristic; otherwise we read a descriptor. */ -void QLowEnergyControllerPrivateCommon::readServiceValues( +void QLowEnergyControllerPrivateBluez::readServiceValues( const QBluetoothUuid &serviceUuid, bool readCharacteristics) { quint8 packet[READ_REQUEST_HEADER_SIZE]; @@ -1741,7 +1741,7 @@ void QLowEnergyControllerPrivateCommon::readServiceValues( open requests to finish the current value read up before starting the next read request. */ -void QLowEnergyControllerPrivateCommon::readServiceValuesByOffset( +void QLowEnergyControllerPrivateBluez::readServiceValuesByOffset( uint handleData, quint16 offset, bool isLastValue) { const QLowEnergyHandle charHandle = (handleData & 0xffff); @@ -1780,7 +1780,7 @@ void QLowEnergyControllerPrivateCommon::readServiceValuesByOffset( openRequests.prepend(request); } -void QLowEnergyControllerPrivateCommon::discoverServiceDescriptors( +void QLowEnergyControllerPrivateBluez::discoverServiceDescriptors( const QBluetoothUuid &serviceUuid) { qCDebug(QT_BT_BLUEZ) << "Discovering descriptor values for" @@ -1800,7 +1800,7 @@ void QLowEnergyControllerPrivateCommon::discoverServiceDescriptors( discoverNextDescriptor(service, keys, keys[0]); } -void QLowEnergyControllerPrivateCommon::processUnsolicitedReply(const QByteArray &payload) +void QLowEnergyControllerPrivateBluez::processUnsolicitedReply(const QByteArray &payload) { const char *data = payload.constData(); bool isNotification = (data[0] == ATT_OP_HANDLE_VAL_NOTIFICATION); @@ -1824,7 +1824,7 @@ void QLowEnergyControllerPrivateCommon::processUnsolicitedReply(const QByteArray } } -void QLowEnergyControllerPrivateCommon::exchangeMTU() +void QLowEnergyControllerPrivateBluez::exchangeMTU() { qCDebug(QT_BT_BLUEZ) << "Exchanging MTU"; @@ -1843,7 +1843,7 @@ void QLowEnergyControllerPrivateCommon::exchangeMTU() sendNextPendingRequest(); } -int QLowEnergyControllerPrivateCommon::securityLevel() const +int QLowEnergyControllerPrivateBluez::securityLevel() const { int socket = l2cpSocket->socketDescriptor(); if (socket < 0) { @@ -1882,7 +1882,7 @@ int QLowEnergyControllerPrivateCommon::securityLevel() const return -1; } -bool QLowEnergyControllerPrivateCommon::setSecurityLevel(int level) +bool QLowEnergyControllerPrivateBluez::setSecurityLevel(int level) { if (level > BT_SECURITY_HIGH || level < BT_SECURITY_LOW) return false; @@ -1929,7 +1929,7 @@ bool QLowEnergyControllerPrivateCommon::setSecurityLevel(int level) return false; } -void QLowEnergyControllerPrivateCommon::discoverNextDescriptor( +void QLowEnergyControllerPrivateBluez::discoverNextDescriptor( QSharedPointer serviceData, const QList pendingCharHandles, const QLowEnergyHandle startingHandle) @@ -1966,7 +1966,7 @@ void QLowEnergyControllerPrivateCommon::discoverNextDescriptor( sendNextPendingRequest(); } -void QLowEnergyControllerPrivateCommon::sendNextPrepareWriteRequest( +void QLowEnergyControllerPrivateBluez::sendNextPrepareWriteRequest( const QLowEnergyHandle handle, const QByteArray &newValue, quint16 offset) { @@ -2021,7 +2021,7 @@ void QLowEnergyControllerPrivateCommon::sendNextPrepareWriteRequest( Otherwise this function sends an execute request for all pending prepare write requests. */ -void QLowEnergyControllerPrivateCommon::sendExecuteWriteRequest( +void QLowEnergyControllerPrivateBluez::sendExecuteWriteRequest( const QLowEnergyHandle attrHandle, const QByteArray &newValue, bool isCancelation) { @@ -2053,7 +2053,7 @@ void QLowEnergyControllerPrivateCommon::sendExecuteWriteRequest( TODO Reliable/prepare write across multiple characteristics is not supported */ -void QLowEnergyControllerPrivateCommon::writeCharacteristic( +void QLowEnergyControllerPrivateBluez::writeCharacteristic( const QSharedPointer service, const QLowEnergyHandle charHandle, const QByteArray &newValue, @@ -2071,7 +2071,7 @@ void QLowEnergyControllerPrivateCommon::writeCharacteristic( writeCharacteristicForCentral(service, charHandle, charData.valueHandle, newValue, mode); } -void QLowEnergyControllerPrivateCommon::writeDescriptor( +void QLowEnergyControllerPrivateBluez::writeDescriptor( const QSharedPointer service, const QLowEnergyHandle charHandle, const QLowEnergyHandle descriptorHandle, @@ -2090,7 +2090,7 @@ void QLowEnergyControllerPrivateCommon::writeDescriptor( Reads the value of one specific characteristic. */ -void QLowEnergyControllerPrivateCommon::readCharacteristic( +void QLowEnergyControllerPrivateBluez::readCharacteristic( const QSharedPointer service, const QLowEnergyHandle charHandle) { @@ -2128,7 +2128,7 @@ void QLowEnergyControllerPrivateCommon::readCharacteristic( sendNextPendingRequest(); } -void QLowEnergyControllerPrivateCommon::readDescriptor( +void QLowEnergyControllerPrivateBluez::readDescriptor( const QSharedPointer service, const QLowEnergyHandle charHandle, const QLowEnergyHandle descriptorHandle) @@ -2167,7 +2167,7 @@ void QLowEnergyControllerPrivateCommon::readDescriptor( * Returns true if the encryption change was successfully requested. * The request is triggered if we got a related ATT error. */ -bool QLowEnergyControllerPrivateCommon::increaseEncryptLevelfRequired(quint8 errorCode) +bool QLowEnergyControllerPrivateBluez::increaseEncryptLevelfRequired(quint8 errorCode) { if (securityLevelValue == BT_SECURITY_HIGH) return false; @@ -2195,14 +2195,14 @@ bool QLowEnergyControllerPrivateCommon::increaseEncryptLevelfRequired(quint8 err return false; } -void QLowEnergyControllerPrivateCommon::handleAdvertisingError() +void QLowEnergyControllerPrivateBluez::handleAdvertisingError() { qCWarning(QT_BT_BLUEZ) << "received advertising error"; setError(QLowEnergyController::AdvertisingError); setState(QLowEnergyController::UnconnectedState); } -bool QLowEnergyControllerPrivateCommon::checkPacketSize(const QByteArray &packet, int minSize, +bool QLowEnergyControllerPrivateBluez::checkPacketSize(const QByteArray &packet, int minSize, int maxSize) { if (maxSize == -1) @@ -2215,7 +2215,7 @@ bool QLowEnergyControllerPrivateCommon::checkPacketSize(const QByteArray &packet return false; } -bool QLowEnergyControllerPrivateCommon::checkHandle(const QByteArray &packet, QLowEnergyHandle handle) +bool QLowEnergyControllerPrivateBluez::checkHandle(const QByteArray &packet, QLowEnergyHandle handle) { if (handle != 0 && handle <= lastLocalHandle) return true; @@ -2223,7 +2223,7 @@ bool QLowEnergyControllerPrivateCommon::checkHandle(const QByteArray &packet, QL return false; } -bool QLowEnergyControllerPrivateCommon::checkHandlePair(quint8 request, QLowEnergyHandle startingHandle, +bool QLowEnergyControllerPrivateBluez::checkHandlePair(quint8 request, QLowEnergyHandle startingHandle, QLowEnergyHandle endingHandle) { if (startingHandle == 0 || startingHandle > endingHandle) { @@ -2234,7 +2234,7 @@ bool QLowEnergyControllerPrivateCommon::checkHandlePair(quint8 request, QLowEner return true; } -void QLowEnergyControllerPrivateCommon::handleExchangeMtuRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateBluez::handleExchangeMtuRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.2 @@ -2261,7 +2261,7 @@ void QLowEnergyControllerPrivateCommon::handleExchangeMtuRequest(const QByteArra qCDebug(QT_BT_BLUEZ) << "Sending server RX MTU" << ATT_MAX_LE_MTU; } -void QLowEnergyControllerPrivateCommon::handleFindInformationRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateBluez::handleFindInformationRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.3.1-2 @@ -2294,7 +2294,7 @@ void QLowEnergyControllerPrivateCommon::handleFindInformationRequest(const QByte } -void QLowEnergyControllerPrivateCommon::handleFindByTypeValueRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateBluez::handleFindByTypeValueRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.3.3-4 @@ -2329,7 +2329,7 @@ void QLowEnergyControllerPrivateCommon::handleFindByTypeValueRequest(const QByte sendListResponse(responsePrefix, elemSize, results, elemWriter); } -void QLowEnergyControllerPrivateCommon::handleReadByTypeRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateBluez::handleReadByTypeRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.4.1-2 @@ -2382,7 +2382,7 @@ void QLowEnergyControllerPrivateCommon::handleReadByTypeRequest(const QByteArray sendListResponse(responsePrefix, elementSize, results, elemWriter); } -void QLowEnergyControllerPrivateCommon::handleReadRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateBluez::handleReadRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.4.3-4 @@ -2409,7 +2409,7 @@ void QLowEnergyControllerPrivateCommon::handleReadRequest(const QByteArray &pack sendPacket(response); } -void QLowEnergyControllerPrivateCommon::handleReadBlobRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateBluez::handleReadBlobRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.4.5-6 @@ -2448,7 +2448,7 @@ void QLowEnergyControllerPrivateCommon::handleReadBlobRequest(const QByteArray & sendPacket(response); } -void QLowEnergyControllerPrivateCommon::handleReadMultipleRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateBluez::handleReadMultipleRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.4.7-8 @@ -2484,7 +2484,7 @@ void QLowEnergyControllerPrivateCommon::handleReadMultipleRequest(const QByteArr sendPacket(response); } -void QLowEnergyControllerPrivateCommon::handleReadByGroupTypeRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateBluez::handleReadByGroupTypeRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.4.9-10 @@ -2543,7 +2543,7 @@ void QLowEnergyControllerPrivateCommon::handleReadByGroupTypeRequest(const QByte sendListResponse(responsePrefix, elementSize, results, elemWriter); } -void QLowEnergyControllerPrivateCommon::updateLocalAttributeValue( +void QLowEnergyControllerPrivateBluez::updateLocalAttributeValue( QLowEnergyHandle handle, const QByteArray &value, QLowEnergyCharacteristic &characteristic, @@ -2577,7 +2577,7 @@ void QLowEnergyControllerPrivateCommon::updateLocalAttributeValue( static bool isNotificationEnabled(quint16 clientConfigValue) { return clientConfigValue & 0x1; } static bool isIndicationEnabled(quint16 clientConfigValue) { return clientConfigValue & 0x2; } -void QLowEnergyControllerPrivateCommon::writeCharacteristicForPeripheral( +void QLowEnergyControllerPrivateBluez::writeCharacteristicForPeripheral( QLowEnergyServicePrivate::CharData &charData, const QByteArray &newValue) { @@ -2634,7 +2634,7 @@ void QLowEnergyControllerPrivateCommon::writeCharacteristicForPeripheral( } } -void QLowEnergyControllerPrivateCommon::writeCharacteristicForCentral(const QSharedPointer &service, +void QLowEnergyControllerPrivateBluez::writeCharacteristicForCentral(const QSharedPointer &service, QLowEnergyHandle charHandle, QLowEnergyHandle valueHandle, const QByteArray &newValue, @@ -2708,7 +2708,7 @@ void QLowEnergyControllerPrivateCommon::writeCharacteristicForCentral(const QSha sendNextPendingRequest(); } -void QLowEnergyControllerPrivateCommon::writeDescriptorForPeripheral( +void QLowEnergyControllerPrivateBluez::writeDescriptorForPeripheral( const QSharedPointer &service, const QLowEnergyHandle charHandle, const QLowEnergyHandle descriptorHandle, @@ -2725,7 +2725,7 @@ void QLowEnergyControllerPrivateCommon::writeDescriptorForPeripheral( service->characteristicList[charHandle].descriptorList[descriptorHandle].value = newValue; } -void QLowEnergyControllerPrivateCommon::writeDescriptorForCentral( +void QLowEnergyControllerPrivateBluez::writeDescriptorForCentral( const QLowEnergyHandle charHandle, const QLowEnergyHandle descriptorHandle, const QByteArray &newValue) @@ -2758,7 +2758,7 @@ void QLowEnergyControllerPrivateCommon::writeDescriptorForCentral( sendNextPendingRequest(); } -void QLowEnergyControllerPrivateCommon::handleWriteRequestOrCommand(const QByteArray &packet) +void QLowEnergyControllerPrivateBluez::handleWriteRequestOrCommand(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.5.1-3 @@ -2852,7 +2852,7 @@ void QLowEnergyControllerPrivateCommon::handleWriteRequestOrCommand(const QByteA } } -void QLowEnergyControllerPrivateCommon::handlePrepareWriteRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateBluez::handlePrepareWriteRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.6.1 @@ -2883,7 +2883,7 @@ void QLowEnergyControllerPrivateCommon::handlePrepareWriteRequest(const QByteArr sendPacket(response); } -void QLowEnergyControllerPrivateCommon::handleExecuteWriteRequest(const QByteArray &packet) +void QLowEnergyControllerPrivateBluez::handleExecuteWriteRequest(const QByteArray &packet) { // Spec v4.2, Vol 3, Part F, 3.4.6.3 @@ -2931,7 +2931,7 @@ void QLowEnergyControllerPrivateCommon::handleExecuteWriteRequest(const QByteArr emit descriptor.d_ptr->descriptorWritten(descriptor, descriptor.value()); } -void QLowEnergyControllerPrivateCommon::sendErrorResponse(quint8 request, quint16 handle, quint8 code) +void QLowEnergyControllerPrivateBluez::sendErrorResponse(quint8 request, quint16 handle, quint8 code) { // An ATT command never receives an error response. if (request == ATT_OP_WRITE_COMMAND || request == ATT_OP_SIGNED_WRITE_COMMAND) @@ -2947,7 +2947,7 @@ void QLowEnergyControllerPrivateCommon::sendErrorResponse(quint8 request, quint1 sendPacket(packet); } -void QLowEnergyControllerPrivateCommon::sendListResponse(const QByteArray &packetStart, int elemSize, +void QLowEnergyControllerPrivateBluez::sendListResponse(const QByteArray &packetStart, int elemSize, const QVector &attributes, const ElemWriter &elemWriter) { const int offset = packetStart.count(); @@ -2963,19 +2963,19 @@ void QLowEnergyControllerPrivateCommon::sendListResponse(const QByteArray &packe sendPacket(response); } -void QLowEnergyControllerPrivateCommon::sendNotification(QLowEnergyHandle handle) +void QLowEnergyControllerPrivateBluez::sendNotification(QLowEnergyHandle handle) { sendNotificationOrIndication(ATT_OP_HANDLE_VAL_NOTIFICATION, handle); } -void QLowEnergyControllerPrivateCommon::sendIndication(QLowEnergyHandle handle) +void QLowEnergyControllerPrivateBluez::sendIndication(QLowEnergyHandle handle) { Q_ASSERT(!indicationInFlight); indicationInFlight = true; sendNotificationOrIndication(ATT_OP_HANDLE_VAL_INDICATION, handle); } -void QLowEnergyControllerPrivateCommon::sendNotificationOrIndication( +void QLowEnergyControllerPrivateBluez::sendNotificationOrIndication( quint8 opCode, QLowEnergyHandle handle) { @@ -2991,13 +2991,13 @@ void QLowEnergyControllerPrivateCommon::sendNotificationOrIndication( sendPacket(packet); } -void QLowEnergyControllerPrivateCommon::sendNextIndication() +void QLowEnergyControllerPrivateBluez::sendNextIndication() { if (!scheduledIndications.isEmpty()) sendIndication(scheduledIndications.takeFirst()); } -void QLowEnergyControllerPrivateCommon::handleConnectionRequest() +void QLowEnergyControllerPrivateBluez::handleConnectionRequest() { if (state != QLowEnergyController::AdvertisingState) { qCWarning(QT_BT_BLUEZ) << "Incoming connection request in unexpected state" << state; @@ -3023,10 +3023,10 @@ void QLowEnergyControllerPrivateCommon::handleConnectionRequest() closeServerSocket(); l2cpSocket = new QBluetoothSocket(QBluetoothServiceInfo::L2capProtocol, this); connect(l2cpSocket, &QBluetoothSocket::disconnected, - this, &QLowEnergyControllerPrivateCommon::l2cpDisconnected); + this, &QLowEnergyControllerPrivateBluez::l2cpDisconnected); connect(l2cpSocket, static_cast - (&QBluetoothSocket::error), this, &QLowEnergyControllerPrivateCommon::l2cpErrorChanged); - connect(l2cpSocket, &QIODevice::readyRead, this, &QLowEnergyControllerPrivateCommon::l2cpReadyRead); + (&QBluetoothSocket::error), this, &QLowEnergyControllerPrivateBluez::l2cpErrorChanged); + connect(l2cpSocket, &QIODevice::readyRead, this, &QLowEnergyControllerPrivateBluez::l2cpReadyRead); l2cpSocket->d_ptr->lowEnergySocketType = addressType == QLowEnergyController::PublicAddress ? BDADDR_LE_PUBLIC : BDADDR_LE_RANDOM; l2cpSocket->setSocketDescriptor(clientSocket, QBluetoothServiceInfo::L2capProtocol, @@ -3039,7 +3039,7 @@ void QLowEnergyControllerPrivateCommon::handleConnectionRequest() emit q->connected(); } -void QLowEnergyControllerPrivateCommon::closeServerSocket() +void QLowEnergyControllerPrivateBluez::closeServerSocket() { if (!serverSocketNotifier) return; @@ -3049,7 +3049,7 @@ void QLowEnergyControllerPrivateCommon::closeServerSocket() serverSocketNotifier = nullptr; } -bool QLowEnergyControllerPrivateCommon::isBonded() const +bool QLowEnergyControllerPrivateBluez::isBonded() const { // Pairing does not necessarily imply bonding, but we don't know whether the // bonding flag was set in the original pairing request. @@ -3057,7 +3057,7 @@ bool QLowEnergyControllerPrivateCommon::isBonded() const != QBluetoothLocalDevice::Unpaired; } -QVector QLowEnergyControllerPrivateCommon::gatherClientConfigData() +QVector QLowEnergyControllerPrivateBluez::gatherClientConfigData() { QVector data; foreach (const auto &service, localServices) { @@ -3078,7 +3078,7 @@ QVector QLowEner return data; } -void QLowEnergyControllerPrivateCommon::storeClientConfigurations() +void QLowEnergyControllerPrivateBluez::storeClientConfigurations() { if (!isBonded()) { clientConfigData.remove(remoteDevice.toUInt64()); @@ -3097,7 +3097,7 @@ void QLowEnergyControllerPrivateCommon::storeClientConfigurations() clientConfigData.insert(remoteDevice.toUInt64(), clientConfigs); } -void QLowEnergyControllerPrivateCommon::restoreClientConfigurations() +void QLowEnergyControllerPrivateBluez::restoreClientConfigurations() { const QVector &tempConfigList = gatherClientConfigData(); const QVector &restoredClientConfigs = isBonded() @@ -3131,7 +3131,7 @@ void QLowEnergyControllerPrivateCommon::restoreClientConfigurations() sendNextIndication(); } -void QLowEnergyControllerPrivateCommon::loadSigningDataIfNecessary(SigningKeyType keyType) +void QLowEnergyControllerPrivateBluez::loadSigningDataIfNecessary(SigningKeyType keyType) { const auto signingDataIt = signingData.constFind(remoteDevice.toUInt64()); if (signingDataIt != signingData.constEnd()) @@ -3163,7 +3163,7 @@ void QLowEnergyControllerPrivateCommon::loadSigningDataIfNecessary(SigningKeyTyp signingData.insert(remoteDevice.toUInt64(), SigningData(csrk, counter - 1)); } -void QLowEnergyControllerPrivateCommon::storeSignCounter(SigningKeyType keyType) const +void QLowEnergyControllerPrivateBluez::storeSignCounter(SigningKeyType keyType) const { const auto signingDataIt = signingData.constFind(remoteDevice.toUInt64()); if (signingDataIt == signingData.constEnd()) @@ -3184,12 +3184,12 @@ void QLowEnergyControllerPrivateCommon::storeSignCounter(SigningKeyType keyType) settings.setValue(counterKey, counterValue); } -QString QLowEnergyControllerPrivateCommon::signingKeySettingsGroup(SigningKeyType keyType) const +QString QLowEnergyControllerPrivateBluez::signingKeySettingsGroup(SigningKeyType keyType) const { return QLatin1String(keyType == LocalSigningKey ? "LocalSignatureKey" : "RemoteSignatureKey"); } -QString QLowEnergyControllerPrivateCommon::keySettingsFilePath() const +QString QLowEnergyControllerPrivateBluez::keySettingsFilePath() const { return QString::fromLatin1("/var/lib/bluetooth/%1/%2/info") .arg(localAdapter.toString(), remoteDevice.toString()); @@ -3211,7 +3211,7 @@ static QByteArray uuidToByteArray(const QBluetoothUuid &uuid) return ba; } -void QLowEnergyControllerPrivateCommon::addToGenericAttributeList(const QLowEnergyServiceData &service, +void QLowEnergyControllerPrivateBluez::addToGenericAttributeList(const QLowEnergyServiceData &service, QLowEnergyHandle startHandle) { // Construct generic attribute data for the service with handles as keys. @@ -3321,7 +3321,7 @@ void QLowEnergyControllerPrivateCommon::addToGenericAttributeList(const QLowEner localAttributes[serviceAttribute.handle] = serviceAttribute; } -void QLowEnergyControllerPrivateCommon::ensureUniformAttributes(QVector &attributes, +void QLowEnergyControllerPrivateBluez::ensureUniformAttributes(QVector &attributes, const std::function &getSize) { if (attributes.isEmpty()) @@ -3334,19 +3334,19 @@ void QLowEnergyControllerPrivateCommon::ensureUniformAttributes(QVector &attributes) +void QLowEnergyControllerPrivateBluez::ensureUniformUuidSizes(QVector &attributes) { ensureUniformAttributes(attributes, [](const Attribute &attr) { return getUuidSize(attr.type); }); } -void QLowEnergyControllerPrivateCommon::ensureUniformValueSizes(QVector &attributes) +void QLowEnergyControllerPrivateBluez::ensureUniformValueSizes(QVector &attributes) { ensureUniformAttributes(attributes, [](const Attribute &attr) { return attr.value.count(); }); } -QVector QLowEnergyControllerPrivateCommon::getAttributes(QLowEnergyHandle startHandle, +QVector QLowEnergyControllerPrivateBluez::getAttributes(QLowEnergyHandle startHandle, QLowEnergyHandle endHandle, const AttributePredicate &attributePredicate) { QVector results; @@ -3365,7 +3365,7 @@ QVector QLowEnergyControllerPrivat return results; } -int QLowEnergyControllerPrivateCommon::checkPermissions(const Attribute &attr, +int QLowEnergyControllerPrivateBluez::checkPermissions(const Attribute &attr, QLowEnergyCharacteristic::PropertyType type) { const bool isReadAccess = type == QLowEnergyCharacteristic::Read; @@ -3399,12 +3399,12 @@ int QLowEnergyControllerPrivateCommon::checkPermissions(const Attribute &attr, return 0; } -int QLowEnergyControllerPrivateCommon::checkReadPermissions(const Attribute &attr) +int QLowEnergyControllerPrivateBluez::checkReadPermissions(const Attribute &attr) { return checkPermissions(attr, QLowEnergyCharacteristic::Read); } -int QLowEnergyControllerPrivateCommon::checkReadPermissions(QVector &attributes) +int QLowEnergyControllerPrivateBluez::checkReadPermissions(QVector &attributes) { if (attributes.isEmpty()) return 0; @@ -3424,7 +3424,7 @@ int QLowEnergyControllerPrivateCommon::checkReadPermissions(QVector & return 0; } -bool QLowEnergyControllerPrivateCommon::verifyMac(const QByteArray &message, const quint128 &csrk, +bool QLowEnergyControllerPrivateBluez::verifyMac(const QByteArray &message, const quint128 &csrk, quint32 signCounter, quint64 expectedMac) { if (!cmacCalculator) @@ -3433,4 +3433,55 @@ bool QLowEnergyControllerPrivateCommon::verifyMac(const QByteArray &message, con expectedMac); } +QLowEnergyService *QLowEnergyControllerPrivateBluez::addServiceHelper( + const QLowEnergyServiceData &service) +{ + // Spec says services "should" be grouped by uuid length (16-bit first, then 128-bit). + // Since this is not mandatory, we ignore it here and let the caller take responsibility + // for it. + + const auto servicePrivate = QSharedPointer::create(); + servicePrivate->state = QLowEnergyService::LocalService; + servicePrivate->setController(this); + servicePrivate->uuid = service.uuid(); + servicePrivate->type = service.type() == QLowEnergyServiceData::ServiceTypePrimary + ? QLowEnergyService::PrimaryService : QLowEnergyService::IncludedService; + foreach (QLowEnergyService * const includedService, service.includedServices()) { + servicePrivate->includedServices << includedService->serviceUuid(); + includedService->d_ptr->type |= QLowEnergyService::IncludedService; + } + + // Spec v4.2, Vol 3, Part G, Section 3. + const QLowEnergyHandle oldLastHandle = this->lastLocalHandle; + servicePrivate->startHandle = ++this->lastLocalHandle; // Service declaration. + this->lastLocalHandle += servicePrivate->includedServices.count(); // Include declarations. + foreach (const QLowEnergyCharacteristicData &cd, service.characteristics()) { + const QLowEnergyHandle declHandle = ++this->lastLocalHandle; + QLowEnergyServicePrivate::CharData charData; + charData.valueHandle = ++this->lastLocalHandle; + charData.uuid = cd.uuid(); + charData.properties = cd.properties(); + charData.value = cd.value(); + foreach (const QLowEnergyDescriptorData &dd, cd.descriptors()) { + QLowEnergyServicePrivate::DescData descData; + descData.uuid = dd.uuid(); + descData.value = dd.value(); + charData.descriptorList.insert(++this->lastLocalHandle, descData); + } + servicePrivate->characteristicList.insert(declHandle, charData); + } + servicePrivate->endHandle = this->lastLocalHandle; + const bool handleOverflow = this->lastLocalHandle <= oldLastHandle; + if (handleOverflow) { + qCWarning(QT_BT_BLUEZ) << "Not enough attribute handles left to create this service"; + this->lastLocalHandle = oldLastHandle; + return nullptr; + } + + this->localServices.insert(servicePrivate->uuid, servicePrivate); + this->addToGenericAttributeList(service, servicePrivate->startHandle); + return new QLowEnergyService(servicePrivate); +} + + QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_bluez_p.h b/src/bluetooth/qlowenergycontroller_bluez_p.h new file mode 100644 index 00000000..76d3bb87 --- /dev/null +++ b/src/bluetooth/qlowenergycontroller_bluez_p.h @@ -0,0 +1,360 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QLOWENERGYCONTROLLERBLUEZ_P_H +#define QLOWENERGYCONTROLLERBLUEZ_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include +#include +#include "qlowenergycontroller.h" +#include "qlowenergycontrollerbase_p.h" + +#include +#include + +QT_BEGIN_NAMESPACE + +class QLowEnergyServiceData; +class QTimer; + +class HciManager; +class LeCmacCalculator; +class QSocketNotifier; +class RemoteDeviceManager; + +extern void registerQLowEnergyControllerMetaType(); + +class QLeAdvertiser; + +class QLowEnergyControllerPrivateBluez : public QLowEnergyControllerPrivate +{ + Q_OBJECT +public: + QLowEnergyControllerPrivateBluez(); + ~QLowEnergyControllerPrivateBluez(); + + void init() override; + + void connectToDevice() override; + void disconnectFromDevice() override; + + void discoverServices() override; + void discoverServiceDetails(const QBluetoothUuid &service) override; + + void startAdvertising(const QLowEnergyAdvertisingParameters ¶ms, + const QLowEnergyAdvertisingData &advertisingData, + const QLowEnergyAdvertisingData &scanResponseData) override; + void stopAdvertising() override; + + void requestConnectionUpdate(const QLowEnergyConnectionParameters ¶ms) override; + + // read data + void readCharacteristic(const QSharedPointer service, + const QLowEnergyHandle charHandle) override; + void readDescriptor(const QSharedPointer service, + const QLowEnergyHandle charHandle, + const QLowEnergyHandle descriptorHandle) override; + + // write data + void writeCharacteristic(const QSharedPointer service, + const QLowEnergyHandle charHandle, + const QByteArray &newValue, QLowEnergyService::WriteMode mode) override; + void writeDescriptor(const QSharedPointer service, + const QLowEnergyHandle charHandle, + const QLowEnergyHandle descriptorHandle, + const QByteArray &newValue) override; + + void addToGenericAttributeList(const QLowEnergyServiceData &service, + QLowEnergyHandle startHandle) override; + QLowEnergyService *addServiceHelper(const QLowEnergyServiceData &service) override; + + + struct Attribute { + Attribute() : handle(0) {} + + QLowEnergyHandle handle; + QLowEnergyHandle groupEndHandle; + QLowEnergyCharacteristic::PropertyTypes properties; + QBluetooth::AttAccessConstraints readConstraints; + QBluetooth::AttAccessConstraints writeConstraints; + QBluetoothUuid type; + QByteArray value; + int minLength; + int maxLength; + }; + QVector localAttributes; + QLowEnergyHandle lastLocalHandle; + +private: + quint16 connectionHandle = 0; + QBluetoothSocket *l2cpSocket; + struct Request { + quint8 command; + QByteArray payload; + // TODO reference below is ugly but until we know all commands and their + // requirements this is WIP + QVariant reference; + QVariant reference2; + }; + QQueue openRequests; + + struct WriteRequest { + WriteRequest() {} + WriteRequest(quint16 h, quint16 o, const QByteArray &v) + : handle(h), valueOffset(o), value(v) {} + quint16 handle; + quint16 valueOffset; + QByteArray value; + }; + QVector openPrepareWriteRequests; + + // Invariant: !scheduledIndications.isEmpty => indicationInFlight == true + QVector scheduledIndications; + bool indicationInFlight = false; + + struct TempClientConfigurationData { + TempClientConfigurationData(QLowEnergyServicePrivate::DescData *dd = nullptr, + QLowEnergyHandle chHndl = 0, QLowEnergyHandle coHndl = 0) + : descData(dd), charValueHandle(chHndl), configHandle(coHndl) {} + + QLowEnergyServicePrivate::DescData *descData; + QLowEnergyHandle charValueHandle; + QLowEnergyHandle configHandle; + }; + + struct ClientConfigurationData { + ClientConfigurationData(QLowEnergyHandle chHndl = 0, QLowEnergyHandle coHndl = 0, + quint16 val = 0) + : charValueHandle(chHndl), configHandle(coHndl), configValue(val) {} + + QLowEnergyHandle charValueHandle; + QLowEnergyHandle configHandle; + quint16 configValue; + bool charValueWasUpdated = false; + }; + QHash> clientConfigData; + + struct SigningData { + SigningData() = default; + SigningData(const quint128 &csrk, quint32 signCounter = quint32(-1)) + : key(csrk), counter(signCounter) {} + + quint128 key; + quint32 counter = quint32(-1); + }; + QHash signingData; + LeCmacCalculator *cmacCalculator = nullptr; + + bool requestPending; + quint16 mtuSize; + int securityLevelValue; + bool encryptionChangePending; + bool receivedMtuExchangeRequest = false; + + HciManager *hciManager; + QLeAdvertiser *advertiser; + QSocketNotifier *serverSocketNotifier; + QTimer *requestTimer = nullptr; + RemoteDeviceManager* device1Manager = nullptr; + + /* + Defines the maximum number of milliseconds the implementation will + wait for requests that require a response. + + This addresses the problem that some non-conformant BTLE devices + do not implement the request/response system properly. In such cases + the queue system would hang forever. + + Once timeout has been triggered we gracefully continue with the next request. + Depending on the type of the timed out ATT command we either ignore it + or artifically trigger an error response to ensure the API gives the + appropriate response. Potentially this can cause problems when the + response for the dropped requests arrives very late. That's why a big warning + is printed about the compromised state when a timeout is triggered. + */ + int gattRequestTimeout = 20000; + + void handleConnectionRequest(); + void closeServerSocket(); + + bool isBonded() const; + QVector gatherClientConfigData(); + void storeClientConfigurations(); + void restoreClientConfigurations(); + + enum SigningKeyType { LocalSigningKey, RemoteSigningKey }; + void loadSigningDataIfNecessary(SigningKeyType keyType); + void storeSignCounter(SigningKeyType keyType) const; + QString signingKeySettingsGroup(SigningKeyType keyType) const; + QString keySettingsFilePath() const; + + void sendPacket(const QByteArray &packet); + void sendNextPendingRequest(); + void processReply(const Request &request, const QByteArray &reply); + + void sendReadByGroupRequest(QLowEnergyHandle start, QLowEnergyHandle end, + quint16 type); + void sendReadByTypeRequest(QSharedPointer serviceData, + QLowEnergyHandle nextHandle, quint16 attributeType); + void sendReadValueRequest(QLowEnergyHandle attributeHandle, bool isDescriptor); + void readServiceValues(const QBluetoothUuid &service, + bool readCharacteristics); + void readServiceValuesByOffset(uint handleData, quint16 offset, + bool isLastValue); + + void discoverServiceDescriptors(const QBluetoothUuid &serviceUuid); + void discoverNextDescriptor(QSharedPointer serviceData, + const QList pendingCharHandles, + QLowEnergyHandle startingHandle); + void processUnsolicitedReply(const QByteArray &msg); + void exchangeMTU(); + bool setSecurityLevel(int level); + int securityLevel() const; + void sendExecuteWriteRequest(const QLowEnergyHandle attrHandle, + const QByteArray &newValue, + bool isCancelation); + void sendNextPrepareWriteRequest(const QLowEnergyHandle handle, + const QByteArray &newValue, quint16 offset); + bool increaseEncryptLevelfRequired(quint8 errorCode); + + void resetController(); + + void handleAdvertisingError(); + + bool checkPacketSize(const QByteArray &packet, int minSize, int maxSize = -1); + bool checkHandle(const QByteArray &packet, QLowEnergyHandle handle); + bool checkHandlePair(quint8 request, QLowEnergyHandle startingHandle, + QLowEnergyHandle endingHandle); + + void handleExchangeMtuRequest(const QByteArray &packet); + void handleFindInformationRequest(const QByteArray &packet); + void handleFindByTypeValueRequest(const QByteArray &packet); + void handleReadByTypeRequest(const QByteArray &packet); + void handleReadRequest(const QByteArray &packet); + void handleReadBlobRequest(const QByteArray &packet); + void handleReadMultipleRequest(const QByteArray &packet); + void handleReadByGroupTypeRequest(const QByteArray &packet); + void handleWriteRequestOrCommand(const QByteArray &packet); + void handlePrepareWriteRequest(const QByteArray &packet); + void handleExecuteWriteRequest(const QByteArray &packet); + + void sendErrorResponse(quint8 request, quint16 handle, quint8 code); + + using ElemWriter = std::function; + void sendListResponse(const QByteArray &packetStart, int elemSize, + const QVector &attributes, const ElemWriter &elemWriter); + + void sendNotification(QLowEnergyHandle handle); + void sendIndication(QLowEnergyHandle handle); + void sendNotificationOrIndication(quint8 opCode, QLowEnergyHandle handle); + void sendNextIndication(); + + void ensureUniformAttributes(QVector &attributes, const std::function &getSize); + void ensureUniformUuidSizes(QVector &attributes); + void ensureUniformValueSizes(QVector &attributes); + + using AttributePredicate = std::function; + QVector getAttributes(QLowEnergyHandle startHandle, QLowEnergyHandle endHandle, + const AttributePredicate &attributePredicate = [](const Attribute &) { return true; }); + + int checkPermissions(const Attribute &attr, QLowEnergyCharacteristic::PropertyType type); + int checkReadPermissions(const Attribute &attr); + int checkReadPermissions(QVector &attributes); + + bool verifyMac(const QByteArray &message, const quint128 &csrk, quint32 signCounter, + quint64 expectedMac); + + void updateLocalAttributeValue( + QLowEnergyHandle handle, + const QByteArray &value, + QLowEnergyCharacteristic &characteristic, + QLowEnergyDescriptor &descriptor); + + void writeCharacteristicForPeripheral( + QLowEnergyServicePrivate::CharData &charData, + const QByteArray &newValue); + void writeCharacteristicForCentral(const QSharedPointer &service, + QLowEnergyHandle charHandle, + QLowEnergyHandle valueHandle, + const QByteArray &newValue, + QLowEnergyService::WriteMode mode); + + void writeDescriptorForPeripheral( + const QSharedPointer &service, + const QLowEnergyHandle charHandle, + const QLowEnergyHandle descriptorHandle, + const QByteArray &newValue); + void writeDescriptorForCentral( + const QLowEnergyHandle charHandle, + const QLowEnergyHandle descriptorHandle, + const QByteArray &newValue); + + void restartRequestTimer(); + void establishL2cpClientSocket(); + void createServicesForCentralIfRequired(); + +private slots: + void l2cpConnected(); + void l2cpDisconnected(); + void l2cpErrorChanged(QBluetoothSocket::SocketError); + void l2cpReadyRead(); + void encryptionChangedEvent(const QBluetoothAddress&, bool); + void handleGattRequestTimeout(); + void activeConnectionTerminationDone(); +}; + +Q_DECLARE_TYPEINFO(QLowEnergyControllerPrivateBluez::Attribute, Q_MOVABLE_TYPE); + +QT_END_NAMESPACE + +#endif //QLOWENERGYCONTROLLERBLUEZ_P_H diff --git a/src/bluetooth/qlowenergycontroller_p.cpp b/src/bluetooth/qlowenergycontroller_p.cpp index f75c92e2..3a004b69 100644 --- a/src/bluetooth/qlowenergycontroller_p.cpp +++ b/src/bluetooth/qlowenergycontroller_p.cpp @@ -139,4 +139,11 @@ void QLowEnergyControllerPrivateCommon::addToGenericAttributeList(const QLowEner { } +QLowEnergyService *QLowEnergyControllerPrivateCommon::addServiceHelper( + const QLowEnergyServiceData &/*service*/) +{ + return nullptr; +} + + QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index 0cf62ad7..4b3d43c8 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -77,9 +77,7 @@ QT_END_NAMESPACE #include "qlowenergycontroller.h" #include "qlowenergycontrollerbase_p.h" -#if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) -#include -#elif defined(QT_ANDROID_BLUETOOTH) +#if defined(QT_ANDROID_BLUETOOTH) #include #include "android/lowenergynotificationhub_p.h" #elif defined(QT_WINRT_BLUETOOTH) @@ -94,12 +92,7 @@ QT_BEGIN_NAMESPACE class QLowEnergyServiceData; class QTimer; -#if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) -class HciManager; -class LeCmacCalculator; -class QSocketNotifier; -class RemoteDeviceManager; -#elif defined(QT_ANDROID_BLUETOOTH) +#if defined(QT_ANDROID_BLUETOOTH) class LowEnergyNotificationHub; #elif defined(QT_WINRT_BLUETOOTH) class QWinRTLowEnergyServiceHandler; @@ -107,8 +100,6 @@ class QWinRTLowEnergyServiceHandler; extern void registerQLowEnergyControllerMetaType(); -class QLeAdvertiser; - class QLowEnergyControllerPrivateCommon : public QLowEnergyControllerPrivate { Q_OBJECT @@ -172,223 +163,8 @@ public: QVector localAttributes; private: -#if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) - quint16 connectionHandle = 0; - QBluetoothSocket *l2cpSocket; - struct Request { - quint8 command; - QByteArray payload; - // TODO reference below is ugly but until we know all commands and their - // requirements this is WIP - QVariant reference; - QVariant reference2; - }; - QQueue openRequests; - - struct WriteRequest { - WriteRequest() {} - WriteRequest(quint16 h, quint16 o, const QByteArray &v) - : handle(h), valueOffset(o), value(v) {} - quint16 handle; - quint16 valueOffset; - QByteArray value; - }; - QVector openPrepareWriteRequests; - - // Invariant: !scheduledIndications.isEmpty => indicationInFlight == true - QVector scheduledIndications; - bool indicationInFlight = false; - - struct TempClientConfigurationData { - TempClientConfigurationData(QLowEnergyServicePrivate::DescData *dd = nullptr, - QLowEnergyHandle chHndl = 0, QLowEnergyHandle coHndl = 0) - : descData(dd), charValueHandle(chHndl), configHandle(coHndl) {} - - QLowEnergyServicePrivate::DescData *descData; - QLowEnergyHandle charValueHandle; - QLowEnergyHandle configHandle; - }; - struct ClientConfigurationData { - ClientConfigurationData(QLowEnergyHandle chHndl = 0, QLowEnergyHandle coHndl = 0, - quint16 val = 0) - : charValueHandle(chHndl), configHandle(coHndl), configValue(val) {} - - QLowEnergyHandle charValueHandle; - QLowEnergyHandle configHandle; - quint16 configValue; - bool charValueWasUpdated = false; - }; - QHash> clientConfigData; - - struct SigningData { - SigningData() = default; - SigningData(const quint128 &csrk, quint32 signCounter = quint32(-1)) - : key(csrk), counter(signCounter) {} - - quint128 key; - quint32 counter = quint32(-1); - }; - QHash signingData; - LeCmacCalculator *cmacCalculator = nullptr; - - bool requestPending; - quint16 mtuSize; - int securityLevelValue; - bool encryptionChangePending; - bool receivedMtuExchangeRequest = false; - - HciManager *hciManager; - QLeAdvertiser *advertiser; - QSocketNotifier *serverSocketNotifier; - QTimer *requestTimer = nullptr; - RemoteDeviceManager* device1Manager = nullptr; - - /* - Defines the maximum number of milliseconds the implementation will - wait for requests that require a response. - - This addresses the problem that some non-conformant BTLE devices - do not implement the request/response system properly. In such cases - the queue system would hang forever. - - Once timeout has been triggered we gracefully continue with the next request. - Depending on the type of the timed out ATT command we either ignore it - or artifically trigger an error response to ensure the API gives the - appropriate response. Potentially this can cause problems when the - response for the dropped requests arrives very late. That's why a big warning - is printed about the compromised state when a timeout is triggered. - */ - int gattRequestTimeout = 20000; - - void handleConnectionRequest(); - void closeServerSocket(); - - bool isBonded() const; - QVector gatherClientConfigData(); - void storeClientConfigurations(); - void restoreClientConfigurations(); - - enum SigningKeyType { LocalSigningKey, RemoteSigningKey }; - void loadSigningDataIfNecessary(SigningKeyType keyType); - void storeSignCounter(SigningKeyType keyType) const; - QString signingKeySettingsGroup(SigningKeyType keyType) const; - QString keySettingsFilePath() const; - - void sendPacket(const QByteArray &packet); - void sendNextPendingRequest(); - void processReply(const Request &request, const QByteArray &reply); - - void sendReadByGroupRequest(QLowEnergyHandle start, QLowEnergyHandle end, - quint16 type); - void sendReadByTypeRequest(QSharedPointer serviceData, - QLowEnergyHandle nextHandle, quint16 attributeType); - void sendReadValueRequest(QLowEnergyHandle attributeHandle, bool isDescriptor); - void readServiceValues(const QBluetoothUuid &service, - bool readCharacteristics); - void readServiceValuesByOffset(uint handleData, quint16 offset, - bool isLastValue); - - void discoverServiceDescriptors(const QBluetoothUuid &serviceUuid); - void discoverNextDescriptor(QSharedPointer serviceData, - const QList pendingCharHandles, - QLowEnergyHandle startingHandle); - void processUnsolicitedReply(const QByteArray &msg); - void exchangeMTU(); - bool setSecurityLevel(int level); - int securityLevel() const; - void sendExecuteWriteRequest(const QLowEnergyHandle attrHandle, - const QByteArray &newValue, - bool isCancelation); - void sendNextPrepareWriteRequest(const QLowEnergyHandle handle, - const QByteArray &newValue, quint16 offset); - bool increaseEncryptLevelfRequired(quint8 errorCode); - - void resetController(); - - void handleAdvertisingError(); - - bool checkPacketSize(const QByteArray &packet, int minSize, int maxSize = -1); - bool checkHandle(const QByteArray &packet, QLowEnergyHandle handle); - bool checkHandlePair(quint8 request, QLowEnergyHandle startingHandle, - QLowEnergyHandle endingHandle); - - void handleExchangeMtuRequest(const QByteArray &packet); - void handleFindInformationRequest(const QByteArray &packet); - void handleFindByTypeValueRequest(const QByteArray &packet); - void handleReadByTypeRequest(const QByteArray &packet); - void handleReadRequest(const QByteArray &packet); - void handleReadBlobRequest(const QByteArray &packet); - void handleReadMultipleRequest(const QByteArray &packet); - void handleReadByGroupTypeRequest(const QByteArray &packet); - void handleWriteRequestOrCommand(const QByteArray &packet); - void handlePrepareWriteRequest(const QByteArray &packet); - void handleExecuteWriteRequest(const QByteArray &packet); - - void sendErrorResponse(quint8 request, quint16 handle, quint8 code); - - using ElemWriter = std::function; - void sendListResponse(const QByteArray &packetStart, int elemSize, - const QVector &attributes, const ElemWriter &elemWriter); - - void sendNotification(QLowEnergyHandle handle); - void sendIndication(QLowEnergyHandle handle); - void sendNotificationOrIndication(quint8 opCode, QLowEnergyHandle handle); - void sendNextIndication(); - - void ensureUniformAttributes(QVector &attributes, const std::function &getSize); - void ensureUniformUuidSizes(QVector &attributes); - void ensureUniformValueSizes(QVector &attributes); - - using AttributePredicate = std::function; - QVector getAttributes(QLowEnergyHandle startHandle, QLowEnergyHandle endHandle, - const AttributePredicate &attributePredicate = [](const Attribute &) { return true; }); - - int checkPermissions(const Attribute &attr, QLowEnergyCharacteristic::PropertyType type); - int checkReadPermissions(const Attribute &attr); - int checkReadPermissions(QVector &attributes); - - bool verifyMac(const QByteArray &message, const quint128 &csrk, quint32 signCounter, - quint64 expectedMac); - - void updateLocalAttributeValue( - QLowEnergyHandle handle, - const QByteArray &value, - QLowEnergyCharacteristic &characteristic, - QLowEnergyDescriptor &descriptor); - - void writeCharacteristicForPeripheral( - QLowEnergyServicePrivate::CharData &charData, - const QByteArray &newValue); - void writeCharacteristicForCentral(const QSharedPointer &service, - QLowEnergyHandle charHandle, - QLowEnergyHandle valueHandle, - const QByteArray &newValue, - QLowEnergyService::WriteMode mode); - - void writeDescriptorForPeripheral( - const QSharedPointer &service, - const QLowEnergyHandle charHandle, - const QLowEnergyHandle descriptorHandle, - const QByteArray &newValue); - void writeDescriptorForCentral( - const QLowEnergyHandle charHandle, - const QLowEnergyHandle descriptorHandle, - const QByteArray &newValue); - - void restartRequestTimer(); - void establishL2cpClientSocket(); - void createServicesForCentralIfRequired(); - -private slots: - void l2cpConnected(); - void l2cpDisconnected(); - void l2cpErrorChanged(QBluetoothSocket::SocketError); - void l2cpReadyRead(); - void encryptionChangedEvent(const QBluetoothAddress&, bool); - void handleGattRequestTimeout(); - void activeConnectionTerminationDone(); -#elif defined(QT_ANDROID_BLUETOOTH) +#if defined(QT_ANDROID_BLUETOOTH) LowEnergyNotificationHub *hub; private slots: diff --git a/src/bluetooth/qlowenergycontroller_winrt.cpp b/src/bluetooth/qlowenergycontroller_winrt.cpp index 891f1ea4..f9d31eba 100644 --- a/src/bluetooth/qlowenergycontroller_winrt.cpp +++ b/src/bluetooth/qlowenergycontroller_winrt.cpp @@ -39,6 +39,9 @@ #include "qlowenergycontroller_p.h" +#include +#include + #ifdef CLASSIC_APP_BUILD #define Q_OS_WINRT #endif @@ -1104,6 +1107,56 @@ void QLowEnergyControllerPrivateCommon::characteristicChanged( emit service->characteristicChanged(characteristic, data); } +QLowEnergyService *QLowEnergyControllerPrivateCommon::addServiceHelper( + const QLowEnergyServiceData &service) +{ + // Spec says services "should" be grouped by uuid length (16-bit first, then 128-bit). + // Since this is not mandatory, we ignore it here and let the caller take responsibility + // for it. + + const auto servicePrivate = QSharedPointer::create(); + servicePrivate->state = QLowEnergyService::LocalService; + servicePrivate->setController(this); + servicePrivate->uuid = service.uuid(); + servicePrivate->type = service.type() == QLowEnergyServiceData::ServiceTypePrimary + ? QLowEnergyService::PrimaryService : QLowEnergyService::IncludedService; + foreach (QLowEnergyService * const includedService, service.includedServices()) { + servicePrivate->includedServices << includedService->serviceUuid(); + includedService->d_ptr->type |= QLowEnergyService::IncludedService; + } + + // Spec v4.2, Vol 3, Part G, Section 3. + const QLowEnergyHandle oldLastHandle = this->lastLocalHandle; + servicePrivate->startHandle = ++this->lastLocalHandle; // Service declaration. + this->lastLocalHandle += servicePrivate->includedServices.count(); // Include declarations. + foreach (const QLowEnergyCharacteristicData &cd, service.characteristics()) { + const QLowEnergyHandle declHandle = ++this->lastLocalHandle; + QLowEnergyServicePrivate::CharData charData; + charData.valueHandle = ++this->lastLocalHandle; + charData.uuid = cd.uuid(); + charData.properties = cd.properties(); + charData.value = cd.value(); + foreach (const QLowEnergyDescriptorData &dd, cd.descriptors()) { + QLowEnergyServicePrivate::DescData descData; + descData.uuid = dd.uuid(); + descData.value = dd.value(); + charData.descriptorList.insert(++this->lastLocalHandle, descData); + } + servicePrivate->characteristicList.insert(declHandle, charData); + } + servicePrivate->endHandle = this->lastLocalHandle; + const bool handleOverflow = this->lastLocalHandle <= oldLastHandle; + if (handleOverflow) { + qCWarning(QT_BT_WINRT) << "Not enough attribute handles left to create this service"; + this->lastLocalHandle = oldLastHandle; + return nullptr; + } + + this->localServices.insert(servicePrivate->uuid, servicePrivate); + this->addToGenericAttributeList(service, servicePrivate->startHandle); + return new QLowEnergyService(servicePrivate); +} + QT_END_NAMESPACE #include "qlowenergycontroller_winrt.moc" diff --git a/src/bluetooth/qlowenergydescriptor.h b/src/bluetooth/qlowenergydescriptor.h index b1ed38bd..8060b2f3 100644 --- a/src/bluetooth/qlowenergydescriptor.h +++ b/src/bluetooth/qlowenergydescriptor.h @@ -78,8 +78,9 @@ protected: friend class QLowEnergyCharacteristic; friend class QLowEnergyService; - friend class QLowEnergyControllerPrivateCommon; friend class QLowEnergyControllerPrivate; + friend class QLowEnergyControllerPrivateBluez; + friend class QLowEnergyControllerPrivateCommon; friend class QLowEnergyControllerPrivateOSX; QLowEnergyDescriptorPrivate *data; diff --git a/src/bluetooth/qlowenergyservice.h b/src/bluetooth/qlowenergyservice.h index eb453ad3..aa686413 100644 --- a/src/bluetooth/qlowenergyservice.h +++ b/src/bluetooth/qlowenergyservice.h @@ -134,6 +134,7 @@ private: // QLowEnergyController is the factory for this class friend class QLowEnergyController; + friend class QLowEnergyControllerPrivateBluez; friend class QLowEnergyControllerPrivateCommon; QLowEnergyService(QSharedPointer p, QObject *parent = nullptr); -- cgit v1.2.3 From 202ec439d21456a318ed93c4bd1e6ba6f6460d59 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 26 Oct 2017 16:36:17 +0200 Subject: Provide own header for QLEControllerPrivate on Android Change-Id: I63d107092e3e404f6b2c38f28d5d9b286711db77 Reviewed-by: Oliver Wolff --- src/bluetooth/bluetooth.pro | 3 + src/bluetooth/qlowenergycharacteristic.h | 1 + src/bluetooth/qlowenergycontroller.cpp | 10 ++ src/bluetooth/qlowenergycontroller_android.cpp | 86 ++++++------ src/bluetooth/qlowenergycontroller_android_p.h | 175 +++++++++++++++++++++++++ src/bluetooth/qlowenergycontroller_p.h | 44 +------ src/bluetooth/qlowenergydescriptor.h | 1 + src/bluetooth/qlowenergyservice.h | 1 + 8 files changed, 236 insertions(+), 85 deletions(-) create mode 100644 src/bluetooth/qlowenergycontroller_android_p.h diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index 6b07d890..378a7d00 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -146,6 +146,9 @@ qtConfig(bluez) { qbluetoothserver_android.cpp \ qlowenergycontroller_android.cpp + PRIVATE_HEADERS -= qlowenergycontroller_p.h + PRIVATE_HEADERS += qlowenergycontroller_android_p.h + } else:osx { QT_PRIVATE = concurrent DEFINES += QT_OSX_BLUETOOTH diff --git a/src/bluetooth/qlowenergycharacteristic.h b/src/bluetooth/qlowenergycharacteristic.h index d02e6560..c6d54f8e 100644 --- a/src/bluetooth/qlowenergycharacteristic.h +++ b/src/bluetooth/qlowenergycharacteristic.h @@ -97,6 +97,7 @@ protected: friend class QLowEnergyService; friend class QLowEnergyControllerPrivate; + friend class QLowEnergyControllerPrivateAndroid; friend class QLowEnergyControllerPrivateBluez; friend class QLowEnergyControllerPrivateCommon; friend class QLowEnergyControllerPrivateOSX; diff --git a/src/bluetooth/qlowenergycontroller.cpp b/src/bluetooth/qlowenergycontroller.cpp index e5c726b0..b79c22e5 100644 --- a/src/bluetooth/qlowenergycontroller.cpp +++ b/src/bluetooth/qlowenergycontroller.cpp @@ -52,6 +52,8 @@ #include "bluez/bluez5_helper_p.h" #include "qlowenergycontroller_bluezdbus_p.h" #include "qlowenergycontroller_bluez_p.h" +#elif defined(QT_ANDROID_BLUETOOTH) +#include "qlowenergycontroller_android_p.h" #else #include "qlowenergycontroller_p.h" #endif @@ -308,6 +310,8 @@ QLowEnergyController::QLowEnergyController( d_ptr = new QLowEnergyControllerPrivateBluezDBus(); else d_ptr = new QLowEnergyControllerPrivateBluez(); +#elif defined(QT_ANDROID_BLUETOOTH) + d_ptr = new QLowEnergyControllerPrivateAndroid(); #else d_ptr = new QLowEnergyControllerPrivateCommon(); #endif @@ -345,6 +349,8 @@ QLowEnergyController::QLowEnergyController( d_ptr = new QLowEnergyControllerPrivateBluezDBus(); else d_ptr = new QLowEnergyControllerPrivateBluez(); +#elif defined(QT_ANDROID_BLUETOOTH) + d_ptr = new QLowEnergyControllerPrivateAndroid(); #else d_ptr = new QLowEnergyControllerPrivateCommon(); #endif @@ -385,6 +391,8 @@ QLowEnergyController::QLowEnergyController( d_ptr = new QLowEnergyControllerPrivateBluezDBus(); else d_ptr = new QLowEnergyControllerPrivateBluez(); +#elif defined(QT_ANDROID_BLUETOOTH) + d_ptr = new QLowEnergyControllerPrivateAndroid(); #else d_ptr = new QLowEnergyControllerPrivateCommon(); #endif @@ -437,6 +445,8 @@ QLowEnergyController::QLowEnergyController(QObject *parent) d_ptr = new QLowEnergyControllerPrivateBluezDBus(); else d_ptr = new QLowEnergyControllerPrivateBluez(); +#elif defined(QT_ANDROID_BLUETOOTH) + d_ptr = new QLowEnergyControllerPrivateAndroid(); #else d_ptr = new QLowEnergyControllerPrivateCommon(); #endif diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 5c1a7060..592f6c70 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -37,7 +37,7 @@ ** ****************************************************************************/ -#include "qlowenergycontroller_p.h" +#include "qlowenergycontroller_android_p.h" #include #include #include @@ -69,14 +69,14 @@ static QAndroidJniObject javaUuidfromQtUuid(const QBluetoothUuid& uuid) return javaUuid; } -QLowEnergyControllerPrivateCommon::QLowEnergyControllerPrivateCommon() +QLowEnergyControllerPrivateAndroid::QLowEnergyControllerPrivateAndroid() : QLowEnergyControllerPrivate(), hub(0) { registerQLowEnergyControllerMetaType(); } -QLowEnergyControllerPrivateCommon::~QLowEnergyControllerPrivateCommon() +QLowEnergyControllerPrivateAndroid::~QLowEnergyControllerPrivateAndroid() { if (role == QLowEnergyController::PeripheralRole) { if (hub) @@ -84,7 +84,7 @@ QLowEnergyControllerPrivateCommon::~QLowEnergyControllerPrivateCommon() } } -void QLowEnergyControllerPrivateCommon::init() +void QLowEnergyControllerPrivateAndroid::init() { // Android Central/Client support starts with v18 // Peripheral/Server support requires Android API v21 @@ -104,13 +104,13 @@ void QLowEnergyControllerPrivateCommon::init() // we only connect to the peripheral role specific signals // TODO add connections as they get added later on connect(hub, &LowEnergyNotificationHub::connectionUpdated, - this, &QLowEnergyControllerPrivateCommon::connectionUpdated); + this, &QLowEnergyControllerPrivateAndroid::connectionUpdated); connect(hub, &LowEnergyNotificationHub::advertisementError, - this, &QLowEnergyControllerPrivateCommon::advertisementError); + this, &QLowEnergyControllerPrivateAndroid::advertisementError); connect(hub, &LowEnergyNotificationHub::serverCharacteristicChanged, - this, &QLowEnergyControllerPrivateCommon::serverCharacteristicChanged); + this, &QLowEnergyControllerPrivateAndroid::serverCharacteristicChanged); connect(hub, &LowEnergyNotificationHub::serverDescriptorWritten, - this, &QLowEnergyControllerPrivateCommon::serverDescriptorWritten); + this, &QLowEnergyControllerPrivateAndroid::serverDescriptorWritten); } else { if (version < 18) { qWarning() << "Qt Bluetooth LE Central/Client support not available" @@ -121,25 +121,25 @@ void QLowEnergyControllerPrivateCommon::init() hub = new LowEnergyNotificationHub(remoteDevice, isPeripheral, this); // we only connect to the central role specific signals connect(hub, &LowEnergyNotificationHub::connectionUpdated, - this, &QLowEnergyControllerPrivateCommon::connectionUpdated); + this, &QLowEnergyControllerPrivateAndroid::connectionUpdated); connect(hub, &LowEnergyNotificationHub::servicesDiscovered, - this, &QLowEnergyControllerPrivateCommon::servicesDiscovered); + this, &QLowEnergyControllerPrivateAndroid::servicesDiscovered); connect(hub, &LowEnergyNotificationHub::serviceDetailsDiscoveryFinished, - this, &QLowEnergyControllerPrivateCommon::serviceDetailsDiscoveryFinished); + this, &QLowEnergyControllerPrivateAndroid::serviceDetailsDiscoveryFinished); connect(hub, &LowEnergyNotificationHub::characteristicRead, - this, &QLowEnergyControllerPrivateCommon::characteristicRead); + this, &QLowEnergyControllerPrivateAndroid::characteristicRead); connect(hub, &LowEnergyNotificationHub::descriptorRead, - this, &QLowEnergyControllerPrivateCommon::descriptorRead); + this, &QLowEnergyControllerPrivateAndroid::descriptorRead); connect(hub, &LowEnergyNotificationHub::characteristicWritten, - this, &QLowEnergyControllerPrivateCommon::characteristicWritten); + this, &QLowEnergyControllerPrivateAndroid::characteristicWritten); connect(hub, &LowEnergyNotificationHub::descriptorWritten, - this, &QLowEnergyControllerPrivateCommon::descriptorWritten); + this, &QLowEnergyControllerPrivateAndroid::descriptorWritten); connect(hub, &LowEnergyNotificationHub::characteristicChanged, - this, &QLowEnergyControllerPrivateCommon::characteristicChanged); + this, &QLowEnergyControllerPrivateAndroid::characteristicChanged); } } -void QLowEnergyControllerPrivateCommon::connectToDevice() +void QLowEnergyControllerPrivateAndroid::connectToDevice() { if (!hub) return; // Android version below v18 @@ -168,7 +168,7 @@ void QLowEnergyControllerPrivateCommon::connectToDevice() } } -void QLowEnergyControllerPrivateCommon::disconnectFromDevice() +void QLowEnergyControllerPrivateAndroid::disconnectFromDevice() { /* Catch an Android timeout bug. If the device is connecting but cannot * physically connect it seems to ignore the disconnect call below. @@ -186,7 +186,7 @@ void QLowEnergyControllerPrivateCommon::disconnectFromDevice() setState(QLowEnergyController::UnconnectedState); } -void QLowEnergyControllerPrivateCommon::discoverServices() +void QLowEnergyControllerPrivateAndroid::discoverServices() { if (hub && hub->javaObject().callMethod("discoverServices")) { qCDebug(QT_BT_ANDROID) << "Service discovery initiated"; @@ -197,7 +197,7 @@ void QLowEnergyControllerPrivateCommon::discoverServices() } } -void QLowEnergyControllerPrivateCommon::discoverServiceDetails(const QBluetoothUuid &service) +void QLowEnergyControllerPrivateAndroid::discoverServiceDetails(const QBluetoothUuid &service) { if (!serviceList.contains(service)) { qCWarning(QT_BT_ANDROID) << "Discovery of unknown service" << service.toString() @@ -232,7 +232,7 @@ void QLowEnergyControllerPrivateCommon::discoverServiceDetails(const QBluetoothU qCDebug(QT_BT_ANDROID) << "Discovery of" << service << "started"; } -void QLowEnergyControllerPrivateCommon::writeCharacteristic( +void QLowEnergyControllerPrivateAndroid::writeCharacteristic( const QSharedPointer service, const QLowEnergyHandle charHandle, const QByteArray &newValue, @@ -286,7 +286,7 @@ void QLowEnergyControllerPrivateCommon::writeCharacteristic( service->setError(QLowEnergyService::CharacteristicWriteError); } -void QLowEnergyControllerPrivateCommon::writeDescriptor( +void QLowEnergyControllerPrivateAndroid::writeDescriptor( const QSharedPointer service, const QLowEnergyHandle charHandle, const QLowEnergyHandle descHandle, @@ -337,7 +337,7 @@ void QLowEnergyControllerPrivateCommon::writeDescriptor( service->setError(QLowEnergyService::DescriptorWriteError); } -void QLowEnergyControllerPrivateCommon::readCharacteristic( +void QLowEnergyControllerPrivateAndroid::readCharacteristic( const QSharedPointer service, const QLowEnergyHandle charHandle) { @@ -365,7 +365,7 @@ void QLowEnergyControllerPrivateCommon::readCharacteristic( service->setError(QLowEnergyService::CharacteristicReadError); } -void QLowEnergyControllerPrivateCommon::readDescriptor( +void QLowEnergyControllerPrivateAndroid::readDescriptor( const QSharedPointer service, const QLowEnergyHandle /*charHandle*/, const QLowEnergyHandle descriptorHandle) @@ -391,7 +391,7 @@ void QLowEnergyControllerPrivateCommon::readDescriptor( service->setError(QLowEnergyService::DescriptorReadError); } -void QLowEnergyControllerPrivateCommon::connectionUpdated( +void QLowEnergyControllerPrivateAndroid::connectionUpdated( QLowEnergyController::ControllerState newState, QLowEnergyController::Error errorCode) { @@ -407,7 +407,7 @@ void QLowEnergyControllerPrivateCommon::connectionUpdated( } // called if server/peripheral -void QLowEnergyControllerPrivateCommon::peripheralConnectionUpdated( +void QLowEnergyControllerPrivateAndroid::peripheralConnectionUpdated( QLowEnergyController::ControllerState newState, QLowEnergyController::Error errorCode) { @@ -437,7 +437,7 @@ void QLowEnergyControllerPrivateCommon::peripheralConnectionUpdated( } // called if client/central -void QLowEnergyControllerPrivateCommon::centralConnectionUpdated( +void QLowEnergyControllerPrivateAndroid::centralConnectionUpdated( QLowEnergyController::ControllerState newState, QLowEnergyController::Error errorCode) { @@ -482,7 +482,7 @@ void QLowEnergyControllerPrivateCommon::centralConnectionUpdated( } } -void QLowEnergyControllerPrivateCommon::servicesDiscovered( +void QLowEnergyControllerPrivateAndroid::servicesDiscovered( QLowEnergyController::Error errorCode, const QString &foundServices) { Q_Q(QLowEnergyController); @@ -513,7 +513,7 @@ void QLowEnergyControllerPrivateCommon::servicesDiscovered( } } -void QLowEnergyControllerPrivateCommon::serviceDetailsDiscoveryFinished( +void QLowEnergyControllerPrivateAndroid::serviceDetailsDiscoveryFinished( const QString &serviceUuid, int startHandle, int endHandle) { const QBluetoothUuid service(serviceUuid); @@ -561,7 +561,7 @@ void QLowEnergyControllerPrivateCommon::serviceDetailsDiscoveryFinished( pointer->setState(QLowEnergyService::ServiceDiscovered); } -void QLowEnergyControllerPrivateCommon::characteristicRead( +void QLowEnergyControllerPrivateAndroid::characteristicRead( const QBluetoothUuid &serviceUuid, int handle, const QBluetoothUuid &charUuid, int properties, const QByteArray &data) { @@ -592,7 +592,7 @@ void QLowEnergyControllerPrivateCommon::characteristicRead( } } -void QLowEnergyControllerPrivateCommon::descriptorRead( +void QLowEnergyControllerPrivateAndroid::descriptorRead( const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid, int descHandle, const QBluetoothUuid &descUuid, const QByteArray &data) { @@ -633,7 +633,7 @@ void QLowEnergyControllerPrivateCommon::descriptorRead( } } -void QLowEnergyControllerPrivateCommon::characteristicWritten( +void QLowEnergyControllerPrivateAndroid::characteristicWritten( int charHandle, const QByteArray &data, QLowEnergyService::ServiceError errorCode) { QSharedPointer service = @@ -662,7 +662,7 @@ void QLowEnergyControllerPrivateCommon::characteristicWritten( emit service->characteristicWritten(characteristic, data); } -void QLowEnergyControllerPrivateCommon::descriptorWritten( +void QLowEnergyControllerPrivateAndroid::descriptorWritten( int descHandle, const QByteArray &data, QLowEnergyService::ServiceError errorCode) { QSharedPointer service = @@ -689,7 +689,7 @@ void QLowEnergyControllerPrivateCommon::descriptorWritten( emit service->descriptorWritten(descriptor, data); } -void QLowEnergyControllerPrivateCommon::serverDescriptorWritten( +void QLowEnergyControllerPrivateAndroid::serverDescriptorWritten( const QAndroidJniObject &jniDesc, const QByteArray &newValue) { qCDebug(QT_BT_ANDROID) << "Server descriptor change notification" << newValue.toHex(); @@ -754,7 +754,7 @@ void QLowEnergyControllerPrivateCommon::serverDescriptorWritten( } } -void QLowEnergyControllerPrivateCommon::characteristicChanged( +void QLowEnergyControllerPrivateAndroid::characteristicChanged( int charHandle, const QByteArray &data) { QSharedPointer service = @@ -779,7 +779,7 @@ void QLowEnergyControllerPrivateCommon::characteristicChanged( emit service->characteristicChanged(characteristic, data); } -void QLowEnergyControllerPrivateCommon::serverCharacteristicChanged( +void QLowEnergyControllerPrivateAndroid::serverCharacteristicChanged( const QAndroidJniObject &characteristic, const QByteArray &newValue) { qCDebug(QT_BT_ANDROID) << "Server characteristic change notification" << newValue.toHex(); @@ -828,7 +828,7 @@ void QLowEnergyControllerPrivateCommon::serverCharacteristicChanged( QLowEnergyCharacteristic(servicePrivate, foundHandle), newValue); } -void QLowEnergyControllerPrivateCommon::serviceError( +void QLowEnergyControllerPrivateAndroid::serviceError( int attributeHandle, QLowEnergyService::ServiceError errorCode) { // ignore call if it isn't really an error @@ -844,7 +844,7 @@ void QLowEnergyControllerPrivateCommon::serviceError( service->setError(errorCode); } -void QLowEnergyControllerPrivateCommon::advertisementError(int errorCode) +void QLowEnergyControllerPrivateAndroid::advertisementError(int errorCode) { Q_Q(QLowEnergyController); @@ -995,7 +995,7 @@ static QAndroidJniObject createJavaAdvertiseSettings(const QLowEnergyAdvertising } -void QLowEnergyControllerPrivateCommon::startAdvertising(const QLowEnergyAdvertisingParameters ¶ms, +void QLowEnergyControllerPrivateAndroid::startAdvertising(const QLowEnergyAdvertisingParameters ¶ms, const QLowEnergyAdvertisingData &advertisingData, const QLowEnergyAdvertisingData &scanResponseData) { @@ -1022,13 +1022,13 @@ void QLowEnergyControllerPrivateCommon::startAdvertising(const QLowEnergyAdverti } } -void QLowEnergyControllerPrivateCommon::stopAdvertising() +void QLowEnergyControllerPrivateAndroid::stopAdvertising() { setState(QLowEnergyController::UnconnectedState); hub->javaObject().callMethod("stopAdvertising"); } -void QLowEnergyControllerPrivateCommon::requestConnectionUpdate(const QLowEnergyConnectionParameters ¶ms) +void QLowEnergyControllerPrivateAndroid::requestConnectionUpdate(const QLowEnergyConnectionParameters ¶ms) { // Possible since Android v21 // Android does not permit specification of specific latency or min/max @@ -1167,7 +1167,7 @@ static int setupDescPermissions(const QLowEnergyDescriptorData &descData) return permissions; } -void QLowEnergyControllerPrivateCommon::addToGenericAttributeList(const QLowEnergyServiceData &serviceData, +void QLowEnergyControllerPrivateAndroid::addToGenericAttributeList(const QLowEnergyServiceData &serviceData, QLowEnergyHandle startHandle) { QSharedPointer service = serviceForHandle(startHandle); @@ -1258,7 +1258,7 @@ void QLowEnergyControllerPrivateCommon::addToGenericAttributeList(const QLowEner service->androidService.object()); } -QLowEnergyService *QLowEnergyControllerPrivateCommon::addServiceHelper( +QLowEnergyService *QLowEnergyControllerPrivateAndroid::addServiceHelper( const QLowEnergyServiceData &service) { // Spec says services "should" be grouped by uuid length (16-bit first, then 128-bit). diff --git a/src/bluetooth/qlowenergycontroller_android_p.h b/src/bluetooth/qlowenergycontroller_android_p.h new file mode 100644 index 00000000..ba56ad4c --- /dev/null +++ b/src/bluetooth/qlowenergycontroller_android_p.h @@ -0,0 +1,175 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QLOWENERGYCONTROLLERPRIVATEANDROID_P_H +#define QLOWENERGYCONTROLLERPRIVATEANDROID_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + + +#include +#include +#include +#include +#include +#include "qlowenergycontroller.h" +#include "qlowenergycontrollerbase_p.h" + +#if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) +#include +#elif defined(QT_ANDROID_BLUETOOTH) +#include +#include "android/lowenergynotificationhub_p.h" +#elif defined(QT_WINRT_BLUETOOTH) +#include +#include +#endif + +#include + +QT_BEGIN_NAMESPACE + +class QLowEnergyServiceData; +class QTimer; + +#if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) +class HciManager; +class LeCmacCalculator; +class QSocketNotifier; +class RemoteDeviceManager; +#elif defined(QT_ANDROID_BLUETOOTH) +class LowEnergyNotificationHub; +#elif defined(QT_WINRT_BLUETOOTH) +class QWinRTLowEnergyServiceHandler; +#endif + +extern void registerQLowEnergyControllerMetaType(); + +class QLeAdvertiser; + +class QLowEnergyControllerPrivateAndroid : public QLowEnergyControllerPrivate +{ + Q_OBJECT +public: + QLowEnergyControllerPrivateAndroid(); + ~QLowEnergyControllerPrivateAndroid(); + + void init() override; + + void connectToDevice() override; + void disconnectFromDevice() override; + + void discoverServices() override; + void discoverServiceDetails(const QBluetoothUuid &service) override; + + void startAdvertising(const QLowEnergyAdvertisingParameters ¶ms, + const QLowEnergyAdvertisingData &advertisingData, + const QLowEnergyAdvertisingData &scanResponseData) override; + void stopAdvertising() override; + + void requestConnectionUpdate(const QLowEnergyConnectionParameters ¶ms) override; + + // misc helpers + QLowEnergyService *addServiceHelper(const QLowEnergyServiceData &service) override; + + // read data + void readCharacteristic(const QSharedPointer service, + const QLowEnergyHandle charHandle) override; + void readDescriptor(const QSharedPointer service, + const QLowEnergyHandle charHandle, + const QLowEnergyHandle descriptorHandle) override; + + // write data + void writeCharacteristic(const QSharedPointer service, + const QLowEnergyHandle charHandle, + const QByteArray &newValue, QLowEnergyService::WriteMode mode) override; + void writeDescriptor(const QSharedPointer service, + const QLowEnergyHandle charHandle, + const QLowEnergyHandle descriptorHandle, + const QByteArray &newValue) override; + + void addToGenericAttributeList(const QLowEnergyServiceData &service, + QLowEnergyHandle startHandle) override; + + QLowEnergyHandle lastLocalHandle; +private: + + LowEnergyNotificationHub *hub; + +private slots: + void connectionUpdated(QLowEnergyController::ControllerState newState, + QLowEnergyController::Error errorCode); + void servicesDiscovered(QLowEnergyController::Error errorCode, + const QString &foundServices); + 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); + void characteristicWritten(int charHandle, const QByteArray &data, + QLowEnergyService::ServiceError errorCode); + void descriptorWritten(int descHandle, const QByteArray &data, + QLowEnergyService::ServiceError errorCode); + void serverDescriptorWritten(const QAndroidJniObject &jniDesc, const QByteArray &newValue); + void characteristicChanged(int charHandle, const QByteArray &data); + void serverCharacteristicChanged(const QAndroidJniObject &jniChar, const QByteArray &newValue); + void serviceError(int attributeHandle, QLowEnergyService::ServiceError errorCode); + void advertisementError(int errorCode); + +private: + void peripheralConnectionUpdated(QLowEnergyController::ControllerState newState, + QLowEnergyController::Error errorCode); + void centralConnectionUpdated(QLowEnergyController::ControllerState newState, + QLowEnergyController::Error errorCode); +}; + +QT_END_NAMESPACE + +#endif // QLOWENERGYCONTROLLERPRIVATEANDROID_P_H diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index 4b3d43c8..db34c344 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -77,10 +77,7 @@ QT_END_NAMESPACE #include "qlowenergycontroller.h" #include "qlowenergycontrollerbase_p.h" -#if defined(QT_ANDROID_BLUETOOTH) -#include -#include "android/lowenergynotificationhub_p.h" -#elif defined(QT_WINRT_BLUETOOTH) +#if defined(QT_WINRT_BLUETOOTH) #include #include #endif @@ -92,12 +89,6 @@ QT_BEGIN_NAMESPACE class QLowEnergyServiceData; class QTimer; -#if defined(QT_ANDROID_BLUETOOTH) -class LowEnergyNotificationHub; -#elif defined(QT_WINRT_BLUETOOTH) -class QWinRTLowEnergyServiceHandler; -#endif - extern void registerQLowEnergyControllerMetaType(); class QLowEnergyControllerPrivateCommon : public QLowEnergyControllerPrivate @@ -164,38 +155,7 @@ public: private: -#if defined(QT_ANDROID_BLUETOOTH) - LowEnergyNotificationHub *hub; - -private slots: - void connectionUpdated(QLowEnergyController::ControllerState newState, - QLowEnergyController::Error errorCode); - void servicesDiscovered(QLowEnergyController::Error errorCode, - const QString &foundServices); - 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); - void characteristicWritten(int charHandle, const QByteArray &data, - QLowEnergyService::ServiceError errorCode); - void descriptorWritten(int descHandle, const QByteArray &data, - QLowEnergyService::ServiceError errorCode); - void serverDescriptorWritten(const QAndroidJniObject &jniDesc, const QByteArray &newValue); - void characteristicChanged(int charHandle, const QByteArray &data); - void serverCharacteristicChanged(const QAndroidJniObject &jniChar, const QByteArray &newValue); - void serviceError(int attributeHandle, QLowEnergyService::ServiceError errorCode); - void advertisementError(int errorCode); - -private: - void peripheralConnectionUpdated(QLowEnergyController::ControllerState newState, - QLowEnergyController::Error errorCode); - void centralConnectionUpdated(QLowEnergyController::ControllerState newState, - QLowEnergyController::Error errorCode); - -#elif defined(QT_WINRT_BLUETOOTH) +#if defined(QT_WINRT_BLUETOOTH) private slots: void characteristicChanged(int charHandle, const QByteArray &data); diff --git a/src/bluetooth/qlowenergydescriptor.h b/src/bluetooth/qlowenergydescriptor.h index 8060b2f3..fd37498d 100644 --- a/src/bluetooth/qlowenergydescriptor.h +++ b/src/bluetooth/qlowenergydescriptor.h @@ -79,6 +79,7 @@ protected: friend class QLowEnergyCharacteristic; friend class QLowEnergyService; friend class QLowEnergyControllerPrivate; + friend class QLowEnergyControllerPrivateAndroid; friend class QLowEnergyControllerPrivateBluez; friend class QLowEnergyControllerPrivateCommon; friend class QLowEnergyControllerPrivateOSX; diff --git a/src/bluetooth/qlowenergyservice.h b/src/bluetooth/qlowenergyservice.h index aa686413..233e08b0 100644 --- a/src/bluetooth/qlowenergyservice.h +++ b/src/bluetooth/qlowenergyservice.h @@ -134,6 +134,7 @@ private: // QLowEnergyController is the factory for this class friend class QLowEnergyController; + friend class QLowEnergyControllerPrivateAndroid; friend class QLowEnergyControllerPrivateBluez; friend class QLowEnergyControllerPrivateCommon; QLowEnergyService(QSharedPointer p, -- cgit v1.2.3 From 47c861fd35c284d4e857ece6633992777a45da74 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 27 Oct 2017 12:01:53 +0200 Subject: Provide UWP specific header for QLEControllerPrivate Change-Id: Ic2ee2a76e2da4c236415f1eb3b98ab642ee3d1fc Reviewed-by: Oliver Wolff --- src/bluetooth/bluetooth.pro | 3 + src/bluetooth/qlowenergycharacteristic.h | 1 + src/bluetooth/qlowenergycontroller.cpp | 10 ++ src/bluetooth/qlowenergycontroller_p.h | 38 ------ src/bluetooth/qlowenergycontroller_winrt.cpp | 44 +++---- src/bluetooth/qlowenergycontroller_winrt_p.h | 172 +++++++++++++++++++++++++++ src/bluetooth/qlowenergydescriptor.h | 1 + src/bluetooth/qlowenergyservice.h | 1 + 8 files changed, 210 insertions(+), 60 deletions(-) create mode 100644 src/bluetooth/qlowenergycontroller_winrt_p.h diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index 378a7d00..33dbfc4d 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -229,6 +229,9 @@ qtConfig(bluez) { qbluetoothsocket_winrt.cpp \ qlowenergycontroller_winrt.cpp + PRIVATE_HEADERS -= qlowenergycontroller_p.h + PRIVATE_HEADERS += qlowenergycontroller_winrt_p.h + lessThan(WINDOWS_SDK_VERSION, 14393) { DEFINES += QT_WINRT_LIMITED_SERVICEDISCOVERY DEFINES += QT_UCRTVERSION=$$WINDOWS_SDK_VERSION diff --git a/src/bluetooth/qlowenergycharacteristic.h b/src/bluetooth/qlowenergycharacteristic.h index c6d54f8e..f36de9ff 100644 --- a/src/bluetooth/qlowenergycharacteristic.h +++ b/src/bluetooth/qlowenergycharacteristic.h @@ -101,6 +101,7 @@ protected: friend class QLowEnergyControllerPrivateBluez; friend class QLowEnergyControllerPrivateCommon; friend class QLowEnergyControllerPrivateOSX; + friend class QLowEnergyControllerPrivateWinRT; QLowEnergyCharacteristicPrivate *data; QLowEnergyCharacteristic(QSharedPointer p, QLowEnergyHandle handle); diff --git a/src/bluetooth/qlowenergycontroller.cpp b/src/bluetooth/qlowenergycontroller.cpp index b79c22e5..af6a557d 100644 --- a/src/bluetooth/qlowenergycontroller.cpp +++ b/src/bluetooth/qlowenergycontroller.cpp @@ -54,6 +54,8 @@ #include "qlowenergycontroller_bluez_p.h" #elif defined(QT_ANDROID_BLUETOOTH) #include "qlowenergycontroller_android_p.h" +#elif defined(QT_WINRT_BLUETOOTH) +#include "qlowenergycontroller_winrt_p.h" #else #include "qlowenergycontroller_p.h" #endif @@ -312,6 +314,8 @@ QLowEnergyController::QLowEnergyController( d_ptr = new QLowEnergyControllerPrivateBluez(); #elif defined(QT_ANDROID_BLUETOOTH) d_ptr = new QLowEnergyControllerPrivateAndroid(); +#elif defined(QT_WINRT_BLUETOOTH) + d_ptr = new QLowEnergyControllerPrivateWinRT(); #else d_ptr = new QLowEnergyControllerPrivateCommon(); #endif @@ -351,6 +355,8 @@ QLowEnergyController::QLowEnergyController( d_ptr = new QLowEnergyControllerPrivateBluez(); #elif defined(QT_ANDROID_BLUETOOTH) d_ptr = new QLowEnergyControllerPrivateAndroid(); +#elif defined(QT_WINRT_BLUETOOTH) + d_ptr = new QLowEnergyControllerPrivateWinRT(); #else d_ptr = new QLowEnergyControllerPrivateCommon(); #endif @@ -393,6 +399,8 @@ QLowEnergyController::QLowEnergyController( d_ptr = new QLowEnergyControllerPrivateBluez(); #elif defined(QT_ANDROID_BLUETOOTH) d_ptr = new QLowEnergyControllerPrivateAndroid(); +#elif defined(QT_WINRT_BLUETOOTH) + d_ptr = new QLowEnergyControllerPrivateWinRT(); #else d_ptr = new QLowEnergyControllerPrivateCommon(); #endif @@ -447,6 +455,8 @@ QLowEnergyController::QLowEnergyController(QObject *parent) d_ptr = new QLowEnergyControllerPrivateBluez(); #elif defined(QT_ANDROID_BLUETOOTH) d_ptr = new QLowEnergyControllerPrivateAndroid(); +#elif defined(QT_WINRT_BLUETOOTH) + d_ptr = new QLowEnergyControllerPrivateWinRT(); #else d_ptr = new QLowEnergyControllerPrivateCommon(); #endif diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index db34c344..b02baaee 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -77,11 +77,6 @@ QT_END_NAMESPACE #include "qlowenergycontroller.h" #include "qlowenergycontrollerbase_p.h" -#if defined(QT_WINRT_BLUETOOTH) -#include -#include -#endif - #include QT_BEGIN_NAMESPACE @@ -152,39 +147,6 @@ public: int maxLength; }; QVector localAttributes; - -private: - -#if defined(QT_WINRT_BLUETOOTH) -private slots: - void characteristicChanged(int charHandle, const QByteArray &data); - -private: - Microsoft::WRL::ComPtr mDevice; - EventRegistrationToken mStatusChangedToken; - struct ValueChangedEntry { - ValueChangedEntry() {} - ValueChangedEntry(Microsoft::WRL::ComPtr c, - EventRegistrationToken t) - : characteristic(c) - , token(t) - { - } - - Microsoft::WRL::ComPtr characteristic; - EventRegistrationToken token; - }; - QVector mValueChangedTokens; - - Microsoft::WRL::ComPtr getNativeService(const QBluetoothUuid &serviceUuid); - Microsoft::WRL::ComPtr getNativeCharacteristic(const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid); - - void registerForValueChanges(const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid); - - void obtainIncludedServices(QSharedPointer servicePointer, - Microsoft::WRL::ComPtr nativeService); -#endif - }; Q_DECLARE_TYPEINFO(QLowEnergyControllerPrivateCommon::Attribute, Q_MOVABLE_TYPE); diff --git a/src/bluetooth/qlowenergycontroller_winrt.cpp b/src/bluetooth/qlowenergycontroller_winrt.cpp index f9d31eba..d360f13f 100644 --- a/src/bluetooth/qlowenergycontroller_winrt.cpp +++ b/src/bluetooth/qlowenergycontroller_winrt.cpp @@ -37,7 +37,7 @@ ** ****************************************************************************/ -#include "qlowenergycontroller_p.h" +#include "qlowenergycontroller_winrt_p.h" #include #include @@ -277,7 +277,7 @@ signals: QLowEnergyHandle startHandle, QLowEnergyHandle endHandle); }; -QLowEnergyControllerPrivateCommon::QLowEnergyControllerPrivateCommon() +QLowEnergyControllerPrivateWinRT::QLowEnergyControllerPrivateWinRT() : QLowEnergyControllerPrivate() { qCDebug(QT_BT_WINRT) << __FUNCTION__; @@ -286,7 +286,7 @@ QLowEnergyControllerPrivateCommon::QLowEnergyControllerPrivateCommon() qRegisterMetaType(); } -QLowEnergyControllerPrivateCommon::~QLowEnergyControllerPrivateCommon() +QLowEnergyControllerPrivateWinRT::~QLowEnergyControllerPrivateWinRT() { if (mDevice && mStatusChangedToken.value) mDevice->remove_ConnectionStatusChanged(mStatusChangedToken); @@ -296,11 +296,11 @@ QLowEnergyControllerPrivateCommon::~QLowEnergyControllerPrivateCommon() entry.characteristic->remove_ValueChanged(entry.token); } -void QLowEnergyControllerPrivateCommon::init() +void QLowEnergyControllerPrivateWinRT::init() { } -void QLowEnergyControllerPrivateCommon::connectToDevice() +void QLowEnergyControllerPrivateWinRT::connectToDevice() { qCDebug(QT_BT_WINRT) << __FUNCTION__; Q_Q(QLowEnergyController); @@ -418,7 +418,7 @@ void QLowEnergyControllerPrivateCommon::connectToDevice() } } -void QLowEnergyControllerPrivateCommon::disconnectFromDevice() +void QLowEnergyControllerPrivateWinRT::disconnectFromDevice() { qCDebug(QT_BT_WINRT) << __FUNCTION__; Q_Q(QLowEnergyController); @@ -430,7 +430,7 @@ void QLowEnergyControllerPrivateCommon::disconnectFromDevice() } } -ComPtr QLowEnergyControllerPrivateCommon::getNativeService(const QBluetoothUuid &serviceUuid) +ComPtr QLowEnergyControllerPrivateWinRT::getNativeService(const QBluetoothUuid &serviceUuid) { ComPtr deviceService; HRESULT hr; @@ -440,7 +440,7 @@ ComPtr QLowEnergyControllerPrivateCommon::getNativeService(c return deviceService; } -ComPtr QLowEnergyControllerPrivateCommon::getNativeCharacteristic(const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid) +ComPtr QLowEnergyControllerPrivateWinRT::getNativeCharacteristic(const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid) { ComPtr service = getNativeService(serviceUuid); if (!service) @@ -455,7 +455,7 @@ ComPtr QLowEnergyControllerPrivateCommon::getNativeCharacte return characteristic; } -void QLowEnergyControllerPrivateCommon::registerForValueChanges(const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid) +void QLowEnergyControllerPrivateWinRT::registerForValueChanges(const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid) { qCDebug(QT_BT_WINRT) << "Registering characteristic" << charUuid << "in service" << serviceUuid << "for value changes"; @@ -488,7 +488,7 @@ void QLowEnergyControllerPrivateCommon::registerForValueChanges(const QBluetooth << serviceUuid << "registered for value changes"; } -void QLowEnergyControllerPrivateCommon::obtainIncludedServices(QSharedPointer servicePointer, +void QLowEnergyControllerPrivateWinRT::obtainIncludedServices(QSharedPointer servicePointer, ComPtr service) { Q_Q(QLowEnergyController); @@ -530,7 +530,7 @@ void QLowEnergyControllerPrivateCommon::obtainIncludedServices(QSharedPointerdiscoveryFinished(); } -void QLowEnergyControllerPrivateCommon::discoverServiceDetails(const QBluetoothUuid &service) +void QLowEnergyControllerPrivateWinRT::discoverServiceDetails(const QBluetoothUuid &service) { qCDebug(QT_BT_WINRT) << __FUNCTION__ << service; if (!serviceList.contains(service)) { @@ -657,22 +657,22 @@ void QLowEnergyControllerPrivateCommon::discoverServiceDetails(const QBluetoothU thread->start(); } -void QLowEnergyControllerPrivateCommon::startAdvertising(const QLowEnergyAdvertisingParameters &, const QLowEnergyAdvertisingData &, const QLowEnergyAdvertisingData &) +void QLowEnergyControllerPrivateWinRT::startAdvertising(const QLowEnergyAdvertisingParameters &, const QLowEnergyAdvertisingData &, const QLowEnergyAdvertisingData &) { Q_UNIMPLEMENTED(); } -void QLowEnergyControllerPrivateCommon::stopAdvertising() +void QLowEnergyControllerPrivateWinRT::stopAdvertising() { Q_UNIMPLEMENTED(); } -void QLowEnergyControllerPrivateCommon::requestConnectionUpdate(const QLowEnergyConnectionParameters &) +void QLowEnergyControllerPrivateWinRT::requestConnectionUpdate(const QLowEnergyConnectionParameters &) { Q_UNIMPLEMENTED(); } -void QLowEnergyControllerPrivateCommon::readCharacteristic(const QSharedPointer service, +void QLowEnergyControllerPrivateWinRT::readCharacteristic(const QSharedPointer service, const QLowEnergyHandle charHandle) { qCDebug(QT_BT_WINRT) << __FUNCTION__ << service << charHandle; @@ -730,7 +730,7 @@ void QLowEnergyControllerPrivateCommon::readCharacteristic(const QSharedPointer< Q_ASSERT_SUCCEEDED(hr); } -void QLowEnergyControllerPrivateCommon::readDescriptor(const QSharedPointer service, +void QLowEnergyControllerPrivateWinRT::readDescriptor(const QSharedPointer service, const QLowEnergyHandle charHandle, const QLowEnergyHandle descHandle) { @@ -855,7 +855,7 @@ void QLowEnergyControllerPrivateCommon::readDescriptor(const QSharedPointer service, +void QLowEnergyControllerPrivateWinRT::writeCharacteristic(const QSharedPointer service, const QLowEnergyHandle charHandle, const QByteArray &newValue, QLowEnergyService::WriteMode mode) @@ -938,7 +938,7 @@ void QLowEnergyControllerPrivateCommon::writeCharacteristic(const QSharedPointer Q_ASSERT_SUCCEEDED(hr); } -void QLowEnergyControllerPrivateCommon::writeDescriptor( +void QLowEnergyControllerPrivateWinRT::writeDescriptor( const QSharedPointer service, const QLowEnergyHandle charHandle, const QLowEnergyHandle descHandle, @@ -1077,12 +1077,12 @@ void QLowEnergyControllerPrivateCommon::writeDescriptor( } -void QLowEnergyControllerPrivateCommon::addToGenericAttributeList(const QLowEnergyServiceData &, QLowEnergyHandle) +void QLowEnergyControllerPrivateWinRT::addToGenericAttributeList(const QLowEnergyServiceData &, QLowEnergyHandle) { Q_UNIMPLEMENTED(); } -void QLowEnergyControllerPrivateCommon::characteristicChanged( +void QLowEnergyControllerPrivateWinRT::characteristicChanged( int charHandle, const QByteArray &data) { QSharedPointer service = @@ -1107,7 +1107,7 @@ void QLowEnergyControllerPrivateCommon::characteristicChanged( emit service->characteristicChanged(characteristic, data); } -QLowEnergyService *QLowEnergyControllerPrivateCommon::addServiceHelper( +QLowEnergyService *QLowEnergyControllerPrivateWinRT::addServiceHelper( const QLowEnergyServiceData &service) { // Spec says services "should" be grouped by uuid length (16-bit first, then 128-bit). diff --git a/src/bluetooth/qlowenergycontroller_winrt_p.h b/src/bluetooth/qlowenergycontroller_winrt_p.h new file mode 100644 index 00000000..33e3e3ff --- /dev/null +++ b/src/bluetooth/qlowenergycontroller_winrt_p.h @@ -0,0 +1,172 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QLOWENERGYCONTROLLERPRIVATEWINRT_P_H +#define QLOWENERGYCONTROLLERPRIVATEWINRT_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include +#include +#include +#include +#include "qlowenergycontroller.h" +#include "qlowenergycontrollerbase_p.h" + +#include +#include + +#include + +QT_BEGIN_NAMESPACE + +class QLowEnergyServiceData; +class QTimer; +class QWinRTLowEnergyServiceHandler; + +extern void registerQLowEnergyControllerMetaType(); + +class QLowEnergyControllerPrivateWinRT : public QLowEnergyControllerPrivate +{ + Q_OBJECT +public: + QLowEnergyControllerPrivateWinRT(); + ~QLowEnergyControllerPrivateWinRT(); + + void init() override; + + void connectToDevice() override; + void disconnectFromDevice() override; + + void discoverServices() override; + void discoverServiceDetails(const QBluetoothUuid &service) override; + + void startAdvertising(const QLowEnergyAdvertisingParameters ¶ms, + const QLowEnergyAdvertisingData &advertisingData, + const QLowEnergyAdvertisingData &scanResponseData) override; + void stopAdvertising() override; + + void requestConnectionUpdate(const QLowEnergyConnectionParameters ¶ms) override; + + // misc helpers + QLowEnergyService *addServiceHelper(const QLowEnergyServiceData &service) override; + + // read data + void readCharacteristic(const QSharedPointer service, + const QLowEnergyHandle charHandle) override; + void readDescriptor(const QSharedPointer service, + const QLowEnergyHandle charHandle, + const QLowEnergyHandle descriptorHandle) override; + + // write data + void writeCharacteristic(const QSharedPointer service, + const QLowEnergyHandle charHandle, + const QByteArray &newValue, QLowEnergyService::WriteMode mode) override; + void writeDescriptor(const QSharedPointer service, + const QLowEnergyHandle charHandle, + const QLowEnergyHandle descriptorHandle, + const QByteArray &newValue) override; + + void addToGenericAttributeList(const QLowEnergyServiceData &service, + QLowEnergyHandle startHandle) override; + + + QLowEnergyHandle lastLocalHandle; + + struct Attribute { + Attribute() : handle(0) {} + + QLowEnergyHandle handle; + QLowEnergyHandle groupEndHandle; + QLowEnergyCharacteristic::PropertyTypes properties; + QBluetooth::AttAccessConstraints readConstraints; + QBluetooth::AttAccessConstraints writeConstraints; + QBluetoothUuid type; + QByteArray value; + int minLength; + int maxLength; + }; + QVector localAttributes; + +private slots: + void characteristicChanged(int charHandle, const QByteArray &data); + +private: + Microsoft::WRL::ComPtr mDevice; + EventRegistrationToken mStatusChangedToken; + struct ValueChangedEntry { + ValueChangedEntry() {} + ValueChangedEntry(Microsoft::WRL::ComPtr c, + EventRegistrationToken t) + : characteristic(c) + , token(t) + { + } + + Microsoft::WRL::ComPtr characteristic; + EventRegistrationToken token; + }; + QVector mValueChangedTokens; + + Microsoft::WRL::ComPtr getNativeService(const QBluetoothUuid &serviceUuid); + Microsoft::WRL::ComPtr getNativeCharacteristic(const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid); + + void registerForValueChanges(const QBluetoothUuid &serviceUuid, const QBluetoothUuid &charUuid); + + void obtainIncludedServices(QSharedPointer servicePointer, + Microsoft::WRL::ComPtr nativeService); + +}; + +Q_DECLARE_TYPEINFO(QLowEnergyControllerPrivateWinRT::Attribute, Q_MOVABLE_TYPE); + +QT_END_NAMESPACE + +#endif // QLOWENERGYCONTROLLERPRIVATEWINRT_P_H diff --git a/src/bluetooth/qlowenergydescriptor.h b/src/bluetooth/qlowenergydescriptor.h index fd37498d..aba2ef61 100644 --- a/src/bluetooth/qlowenergydescriptor.h +++ b/src/bluetooth/qlowenergydescriptor.h @@ -83,6 +83,7 @@ protected: friend class QLowEnergyControllerPrivateBluez; friend class QLowEnergyControllerPrivateCommon; friend class QLowEnergyControllerPrivateOSX; + friend class QLowEnergyControllerPrivateWinRT; QLowEnergyDescriptorPrivate *data; QLowEnergyDescriptor(QSharedPointer p, diff --git a/src/bluetooth/qlowenergyservice.h b/src/bluetooth/qlowenergyservice.h index 233e08b0..23545b11 100644 --- a/src/bluetooth/qlowenergyservice.h +++ b/src/bluetooth/qlowenergyservice.h @@ -137,6 +137,7 @@ private: friend class QLowEnergyControllerPrivateAndroid; friend class QLowEnergyControllerPrivateBluez; friend class QLowEnergyControllerPrivateCommon; + friend class QLowEnergyControllerPrivateWinRT; QLowEnergyService(QSharedPointer p, QObject *parent = nullptr); }; -- cgit v1.2.3 From 6772b20c3adb422a1e4557274300bed39e33018b Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 27 Oct 2017 12:25:14 +0200 Subject: Unify meta type registration for QLEDescriptor and QLECharacteristic The QLEControllerPrivate objects use the same function (apart from Apple platforms) and unit tests do not have to register those types at all anymore. Change-Id: I06a4a035f5a8fba9a146a3c05d1157b47c22e056 Reviewed-by: Oliver Wolff --- src/bluetooth/qlowenergycontroller.cpp | 2 ++ src/bluetooth/qlowenergycontroller_osx.mm | 2 ++ src/bluetooth/qlowenergycontroller_winrt.cpp | 3 +-- src/bluetooth/qlowenergyservice.cpp | 2 -- .../test/tst_qlowenergycontroller-gattserver.cpp | 3 --- tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp | 3 --- 6 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller.cpp b/src/bluetooth/qlowenergycontroller.cpp index af6a557d..ddf3c9ec 100644 --- a/src/bluetooth/qlowenergycontroller.cpp +++ b/src/bluetooth/qlowenergycontroller.cpp @@ -286,6 +286,8 @@ void registerQLowEnergyControllerMetaType() qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); initDone = true; } } diff --git a/src/bluetooth/qlowenergycontroller_osx.mm b/src/bluetooth/qlowenergycontroller_osx.mm index 1206ef42..2958e6ed 100644 --- a/src/bluetooth/qlowenergycontroller_osx.mm +++ b/src/bluetooth/qlowenergycontroller_osx.mm @@ -72,6 +72,8 @@ static void registerQLowEnergyControllerMetaType() qRegisterMetaType(); qRegisterMetaType("QLowEnergyHandle"); qRegisterMetaType >(); + qRegisterMetaType(); + qRegisterMetaType(); initDone = true; } } diff --git a/src/bluetooth/qlowenergycontroller_winrt.cpp b/src/bluetooth/qlowenergycontroller_winrt.cpp index d360f13f..741eebf6 100644 --- a/src/bluetooth/qlowenergycontroller_winrt.cpp +++ b/src/bluetooth/qlowenergycontroller_winrt.cpp @@ -282,8 +282,7 @@ QLowEnergyControllerPrivateWinRT::QLowEnergyControllerPrivateWinRT() { qCDebug(QT_BT_WINRT) << __FUNCTION__; - qRegisterMetaType(); - qRegisterMetaType(); + registerQLowEnergyControllerMetaType(); } QLowEnergyControllerPrivateWinRT::~QLowEnergyControllerPrivateWinRT() diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index 35a3a7d0..1c27603a 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -380,8 +380,6 @@ QLowEnergyService::QLowEnergyService(QSharedPointer p, qRegisterMetaType(); qRegisterMetaType(); qRegisterMetaType(); - qRegisterMetaType(); - qRegisterMetaType(); connect(p.data(), SIGNAL(error(QLowEnergyService::ServiceError)), this, SIGNAL(error(QLowEnergyService::ServiceError))); diff --git a/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp b/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp index e01457eb..4f07b067 100644 --- a/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp +++ b/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp @@ -245,9 +245,6 @@ void TestQLowEnergyControllerGattServer::advertisedData() void TestQLowEnergyControllerGattServer::serverCommunication() { - qRegisterMetaType(); - qRegisterMetaType(); - if (m_serverAddress.isNull()) QSKIP("No server address provided"); m_leController.reset(QLowEnergyController::createCentral(m_serverInfo)); diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index aa779f47..58510952 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -95,9 +95,6 @@ private: tst_QLowEnergyController::tst_QLowEnergyController() { - qRegisterMetaType(); - qRegisterMetaType(); - //QLoggingCategory::setFilterRules(QStringLiteral("qt.bluetooth* = true")); #ifndef Q_OS_MAC // Core Bluetooth (OS X and iOS) does not work with addresses, -- cgit v1.2.3 From 37ef963092460be6cf51dda81bffcd068a875165 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 27 Oct 2017 13:16:15 +0200 Subject: Various cleanups following the recent QLEControllerPrivate header splits Change-Id: Ia98a7a16c3e1e478d1c6e30d9e70dc703c1fe091 Reviewed-by: Oliver Wolff --- src/bluetooth/android/lowenergynotificationhub_p.h | 3 ++- src/bluetooth/qlowenergycontroller_p.cpp | 3 +-- src/bluetooth/qlowenergycontroller_p.h | 23 ---------------------- src/bluetooth/qlowenergycontroller_winrt_p.h | 17 ---------------- src/bluetooth/qlowenergyservice.cpp | 2 +- src/bluetooth/qlowenergyserviceprivate.cpp | 2 +- 6 files changed, 5 insertions(+), 45 deletions(-) diff --git a/src/bluetooth/android/lowenergynotificationhub_p.h b/src/bluetooth/android/lowenergynotificationhub_p.h index 4a384a8c..da651e68 100644 --- a/src/bluetooth/android/lowenergynotificationhub_p.h +++ b/src/bluetooth/android/lowenergynotificationhub_p.h @@ -56,10 +56,11 @@ #include #include #include +#include +#include #include #include -#include "qlowenergycontroller_p.h" QT_BEGIN_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_p.cpp b/src/bluetooth/qlowenergycontroller_p.cpp index 3a004b69..3d1ea1e9 100644 --- a/src/bluetooth/qlowenergycontroller_p.cpp +++ b/src/bluetooth/qlowenergycontroller_p.cpp @@ -45,8 +45,7 @@ QT_BEGIN_NAMESPACE QLowEnergyControllerPrivateCommon::QLowEnergyControllerPrivateCommon() - : QLowEnergyControllerPrivate(), - lastLocalHandle(0) + : QLowEnergyControllerPrivate() { #ifndef QT_IOS_BLUETOOTH printDummyWarning(); diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index b02baaee..d7c60149 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -77,12 +77,9 @@ QT_END_NAMESPACE #include "qlowenergycontroller.h" #include "qlowenergycontrollerbase_p.h" -#include - QT_BEGIN_NAMESPACE class QLowEnergyServiceData; -class QTimer; extern void registerQLowEnergyControllerMetaType(); @@ -129,28 +126,8 @@ public: void addToGenericAttributeList(const QLowEnergyServiceData &service, QLowEnergyHandle startHandle) override; - - - QLowEnergyHandle lastLocalHandle; - - struct Attribute { - Attribute() : handle(0) {} - - QLowEnergyHandle handle; - QLowEnergyHandle groupEndHandle; - QLowEnergyCharacteristic::PropertyTypes properties; - QBluetooth::AttAccessConstraints readConstraints; - QBluetooth::AttAccessConstraints writeConstraints; - QBluetoothUuid type; - QByteArray value; - int minLength; - int maxLength; - }; - QVector localAttributes; }; -Q_DECLARE_TYPEINFO(QLowEnergyControllerPrivateCommon::Attribute, Q_MOVABLE_TYPE); - QT_END_NAMESPACE #endif // QT_OSX_BLUETOOTH || QT_IOS_BLUETOOTH diff --git a/src/bluetooth/qlowenergycontroller_winrt_p.h b/src/bluetooth/qlowenergycontroller_winrt_p.h index 33e3e3ff..f0625bcb 100644 --- a/src/bluetooth/qlowenergycontroller_winrt_p.h +++ b/src/bluetooth/qlowenergycontroller_winrt_p.h @@ -120,21 +120,6 @@ public: QLowEnergyHandle lastLocalHandle; - struct Attribute { - Attribute() : handle(0) {} - - QLowEnergyHandle handle; - QLowEnergyHandle groupEndHandle; - QLowEnergyCharacteristic::PropertyTypes properties; - QBluetooth::AttAccessConstraints readConstraints; - QBluetooth::AttAccessConstraints writeConstraints; - QBluetoothUuid type; - QByteArray value; - int minLength; - int maxLength; - }; - QVector localAttributes; - private slots: void characteristicChanged(int charHandle, const QByteArray &data); @@ -165,8 +150,6 @@ private: }; -Q_DECLARE_TYPEINFO(QLowEnergyControllerPrivateWinRT::Attribute, Q_MOVABLE_TYPE); - QT_END_NAMESPACE #endif // QLOWENERGYCONTROLLERPRIVATEWINRT_P_H diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index 1c27603a..7e419e17 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -44,7 +44,7 @@ #include -#include "qlowenergycontroller_p.h" +#include "qlowenergycontrollerbase_p.h" #include "qlowenergyserviceprivate_p.h" QT_BEGIN_NAMESPACE diff --git a/src/bluetooth/qlowenergyserviceprivate.cpp b/src/bluetooth/qlowenergyserviceprivate.cpp index 83724d4e..0b8d8be0 100644 --- a/src/bluetooth/qlowenergyserviceprivate.cpp +++ b/src/bluetooth/qlowenergyserviceprivate.cpp @@ -39,7 +39,7 @@ #include "qlowenergyserviceprivate_p.h" -#include "qlowenergycontroller_p.h" +#include "qlowenergycontrollerbase_p.h" QT_BEGIN_NAMESPACE -- cgit v1.2.3 From 40214a8c8d35bb15cbe6874cc33d90344f4c533c Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 27 Oct 2017 13:28:14 +0200 Subject: Reorder the qlowenergycontroller_p.h includes qlowenergycontroller_p.cpp and qlowenergycontroller_p.h are no longer universally included by all builds. The project includes the universal qlowenergycontroller* files across all platforms. To accomplish this the macOS/iOS specific QLowEnergyControllerPrivate interface moved to the common qlownergycontrollerbase_p.h. From this point onwards qlowenergycontroller_p.[cpp|h] contains the dummy backend only. Change-Id: If2893a32adfb14f47cf85622e943d5f683ad38da Reviewed-by: Oliver Wolff --- src/bluetooth/bluetooth.pro | 14 ++++---------- src/bluetooth/qlowenergycontroller_osx_p.h | 2 +- src/bluetooth/qlowenergycontroller_p.cpp | 4 ---- src/bluetooth/qlowenergycontroller_p.h | 20 -------------------- src/bluetooth/qlowenergycontrollerbase_p.h | 19 +++++++++++++++++++ 5 files changed, 24 insertions(+), 35 deletions(-) diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index 33dbfc4d..adba1aab 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -46,7 +46,6 @@ PRIVATE_HEADERS += \ qbluetoothtransferrequest_p.h \ qprivatelinearbuffer_p.h \ qbluetoothlocaldevice_p.h \ - qlowenergycontroller_p.h \ qlowenergycontrollerbase_p.h \ qlowenergyserviceprivate_p.h \ qleadvertiser_p.h \ @@ -115,14 +114,14 @@ qtConfig(bluez) { PRIVATE_HEADERS += qlowenergycontroller_bluezdbus_p.h \ qlowenergycontroller_bluez_p.h - PRIVATE_HEADERS -= qlowenergycontroller_p.h - qtConfig(linux_crypto_api): DEFINES += CONFIG_LINUX_CRYPTO_API } else { DEFINES += QT_BLUEZ_NO_BTLE include(dummy/dummy.pri) SOURCES += \ qlowenergycontroller_p.cpp + + PRIVATE_HEADERS += qlowenergycontroller_p.h } } else:android:!android-embedded { @@ -146,7 +145,6 @@ qtConfig(bluez) { qbluetoothserver_android.cpp \ qlowenergycontroller_android.cpp - PRIVATE_HEADERS -= qlowenergycontroller_p.h PRIVATE_HEADERS += qlowenergycontroller_android_p.h } else:osx { @@ -172,8 +170,6 @@ qtConfig(bluez) { qbluetoothtransferreply_osx_p.h \ qlowenergycontroller_osx_p.h - PRIVATE_HEADERS -= qlowenergycontrollerbase_p.h - SOURCES -= qbluetoothdevicediscoveryagent.cpp SOURCES -= qbluetoothserviceinfo.cpp SOURCES -= qbluetoothservicediscoveryagent.cpp @@ -182,7 +178,6 @@ qtConfig(bluez) { SOURCES -= qlowenergyservice_p.cpp SOURCES -= qlowenergyservice.cpp SOURCES -= qlowenergycontroller.cpp - SOURCES -= qlowenergycontroller_p.cpp SOURCES -= qlowenergycontrollerbase.cpp } else:ios|tvos { DEFINES += QT_IOS_BLUETOOTH @@ -196,8 +191,6 @@ qtConfig(bluez) { PRIVATE_HEADERS += \ qlowenergycontroller_osx_p.h - PRIVATE_HEADERS -= qlowenergycontrollerbase_p.h - include(osx/osxbt.pri) SOURCES += \ qbluetoothlocaldevice_p.cpp \ @@ -229,7 +222,6 @@ qtConfig(bluez) { qbluetoothsocket_winrt.cpp \ qlowenergycontroller_winrt.cpp - PRIVATE_HEADERS -= qlowenergycontroller_p.h PRIVATE_HEADERS += qlowenergycontroller_winrt_p.h lessThan(WINDOWS_SDK_VERSION, 14393) { @@ -248,6 +240,8 @@ qtConfig(bluez) { qbluetoothsocket_p.cpp \ qbluetoothserver_p.cpp \ qlowenergycontroller_p.cpp + + PRIVATE_HEADERS += qlowenergycontroller_p.h } winrt-*-msvc2015 { diff --git a/src/bluetooth/qlowenergycontroller_osx_p.h b/src/bluetooth/qlowenergycontroller_osx_p.h index 5cceb9e6..24b7c6e9 100644 --- a/src/bluetooth/qlowenergycontroller_osx_p.h +++ b/src/bluetooth/qlowenergycontroller_osx_p.h @@ -54,7 +54,7 @@ #include "osx/osxbtperipheralmanager_p.h" #include "qlowenergyserviceprivate_p.h" #include "osx/osxbtcentralmanager_p.h" -#include "qlowenergycontroller_p.h" +#include "qlowenergycontrollerbase_p.h" #include "qlowenergycontroller.h" #include "osx/osxbtnotifier_p.h" #include "osx/osxbtutility_p.h" diff --git a/src/bluetooth/qlowenergycontroller_p.cpp b/src/bluetooth/qlowenergycontroller_p.cpp index 3d1ea1e9..b9f825af 100644 --- a/src/bluetooth/qlowenergycontroller_p.cpp +++ b/src/bluetooth/qlowenergycontroller_p.cpp @@ -38,18 +38,14 @@ ****************************************************************************/ #include "qlowenergycontroller_p.h" -#ifndef QT_IOS_BLUETOOTH #include "dummy/dummy_helper_p.h" -#endif QT_BEGIN_NAMESPACE QLowEnergyControllerPrivateCommon::QLowEnergyControllerPrivateCommon() : QLowEnergyControllerPrivate() { -#ifndef QT_IOS_BLUETOOTH printDummyWarning(); -#endif registerQLowEnergyControllerMetaType(); } diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index d7c60149..01e9420a 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -51,24 +51,6 @@ // We mean it. // -#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 @@ -130,6 +112,4 @@ public: QT_END_NAMESPACE -#endif // QT_OSX_BLUETOOTH || QT_IOS_BLUETOOTH - #endif // QLOWENERGYCONTROLLERPRIVATE_P_H diff --git a/src/bluetooth/qlowenergycontrollerbase_p.h b/src/bluetooth/qlowenergycontrollerbase_p.h index 27ab47ec..54f306ff 100644 --- a/src/bluetooth/qlowenergycontrollerbase_p.h +++ b/src/bluetooth/qlowenergycontrollerbase_p.h @@ -51,6 +51,23 @@ // We mean it. // +#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 @@ -163,4 +180,6 @@ protected: QT_END_NAMESPACE +#endif //defined(QT_OSX_BLUETOOTH) || defined(QT_IOS_BLUETOOTH) + #endif // QLOWENERGYCONTROLLERPRIVATEBASE_P_H -- cgit v1.2.3 From 284da0e67a59879c71691a893c65da0f581a023d Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 1 Nov 2017 13:43:02 +0100 Subject: Consolidate the QLEControllerPrivate instanciations This patch removes repeated code patterns. Change-Id: Ica931958b1d4072429ed197d5e44ad77670c3485 Reviewed-by: Oliver Wolff --- src/bluetooth/qlowenergycontroller.cpp | 72 +++++++++++----------------------- 1 file changed, 23 insertions(+), 49 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller.cpp b/src/bluetooth/qlowenergycontroller.cpp index ddf3c9ec..cdb16939 100644 --- a/src/bluetooth/qlowenergycontroller.cpp +++ b/src/bluetooth/qlowenergycontroller.cpp @@ -292,6 +292,25 @@ void registerQLowEnergyControllerMetaType() } } +static QLowEnergyControllerPrivate *privateController() +{ +#if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) + if (isBluez5DbusGatt()) { + qCWarning(QT_BT) << "Using BlueZ DBus API"; + return new QLowEnergyControllerPrivateBluezDBus(); + } else { + qCWarning(QT_BT) << "Using BlueZ kernel ATT interface"; + return new QLowEnergyControllerPrivateBluez(); + } +#elif defined(QT_ANDROID_BLUETOOTH) + return new QLowEnergyControllerPrivateAndroid(); +#elif defined(QT_WINRT_BLUETOOTH) + return new QLowEnergyControllerPrivateWinRT(); +#else + return new QLowEnergyControllerPrivateCommon(); +#endif +} + /*! Constructs a new instance of this class with \a parent. @@ -309,21 +328,9 @@ QLowEnergyController::QLowEnergyController( QObject *parent) : QObject(parent) { -#if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) - if (isBluez5DbusGatt()) - d_ptr = new QLowEnergyControllerPrivateBluezDBus(); - else - d_ptr = new QLowEnergyControllerPrivateBluez(); -#elif defined(QT_ANDROID_BLUETOOTH) - d_ptr = new QLowEnergyControllerPrivateAndroid(); -#elif defined(QT_WINRT_BLUETOOTH) - d_ptr = new QLowEnergyControllerPrivateWinRT(); -#else - d_ptr = new QLowEnergyControllerPrivateCommon(); -#endif + d_ptr = privateController(); Q_D(QLowEnergyController); - d->q_ptr = this; d->role = CentralRole; d->remoteDevice = remoteDevice; @@ -350,18 +357,7 @@ QLowEnergyController::QLowEnergyController( QObject *parent) : QObject(parent) { -#if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) - if (isBluez5DbusGatt()) - d_ptr = new QLowEnergyControllerPrivateBluezDBus(); - else - d_ptr = new QLowEnergyControllerPrivateBluez(); -#elif defined(QT_ANDROID_BLUETOOTH) - d_ptr = new QLowEnergyControllerPrivateAndroid(); -#elif defined(QT_WINRT_BLUETOOTH) - d_ptr = new QLowEnergyControllerPrivateWinRT(); -#else - d_ptr = new QLowEnergyControllerPrivateCommon(); -#endif + d_ptr = privateController(); Q_D(QLowEnergyController); d->q_ptr = this; @@ -394,18 +390,7 @@ QLowEnergyController::QLowEnergyController( QObject *parent) : QObject(parent) { -#if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) - if (isBluez5DbusGatt()) - d_ptr = new QLowEnergyControllerPrivateBluezDBus(); - else - d_ptr = new QLowEnergyControllerPrivateBluez(); -#elif defined(QT_ANDROID_BLUETOOTH) - d_ptr = new QLowEnergyControllerPrivateAndroid(); -#elif defined(QT_WINRT_BLUETOOTH) - d_ptr = new QLowEnergyControllerPrivateWinRT(); -#else - d_ptr = new QLowEnergyControllerPrivateCommon(); -#endif + d_ptr = privateController(); Q_D(QLowEnergyController); d->q_ptr = this; @@ -450,18 +435,7 @@ QLowEnergyController *QLowEnergyController::createPeripheral(QObject *parent) QLowEnergyController::QLowEnergyController(QObject *parent) : QObject(parent) { -#if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) - if (isBluez5DbusGatt()) - d_ptr = new QLowEnergyControllerPrivateBluezDBus(); - else - d_ptr = new QLowEnergyControllerPrivateBluez(); -#elif defined(QT_ANDROID_BLUETOOTH) - d_ptr = new QLowEnergyControllerPrivateAndroid(); -#elif defined(QT_WINRT_BLUETOOTH) - d_ptr = new QLowEnergyControllerPrivateWinRT(); -#else - d_ptr = new QLowEnergyControllerPrivateCommon(); -#endif + d_ptr = privateController(); Q_D(QLowEnergyController); d->q_ptr = this; -- cgit v1.2.3 From 770c06092a493417ddf2a3e5555e06fe0f788bc0 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 2 Nov 2017 16:25:17 +0100 Subject: Merge all QLEConrollerPrivate::addServiceHelper() implementation Change-Id: Id346f2f98e63c5c7ea9e2cd3fb7e68e4573ac1e5 Reviewed-by: Oliver Wolff --- src/bluetooth/qlowenergycontroller_android.cpp | 51 ----------------------- src/bluetooth/qlowenergycontroller_android_p.h | 4 -- src/bluetooth/qlowenergycontroller_bluez.cpp | 52 ------------------------ src/bluetooth/qlowenergycontroller_bluez_p.h | 3 -- src/bluetooth/qlowenergycontroller_p.cpp | 7 ---- src/bluetooth/qlowenergycontroller_p.h | 3 -- src/bluetooth/qlowenergycontroller_winrt.cpp | 50 ----------------------- src/bluetooth/qlowenergycontroller_winrt_p.h | 6 --- src/bluetooth/qlowenergycontrollerbase.cpp | 56 ++++++++++++++++++++++++++ src/bluetooth/qlowenergycontrollerbase_p.h | 3 +- src/bluetooth/qlowenergyservice.h | 5 +-- 11 files changed, 60 insertions(+), 180 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 592f6c70..8dccb859 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -1258,55 +1258,4 @@ void QLowEnergyControllerPrivateAndroid::addToGenericAttributeList(const QLowEne service->androidService.object()); } -QLowEnergyService *QLowEnergyControllerPrivateAndroid::addServiceHelper( - const QLowEnergyServiceData &service) -{ - // Spec says services "should" be grouped by uuid length (16-bit first, then 128-bit). - // Since this is not mandatory, we ignore it here and let the caller take responsibility - // for it. - - const auto servicePrivate = QSharedPointer::create(); - servicePrivate->state = QLowEnergyService::LocalService; - servicePrivate->setController(this); - servicePrivate->uuid = service.uuid(); - servicePrivate->type = service.type() == QLowEnergyServiceData::ServiceTypePrimary - ? QLowEnergyService::PrimaryService : QLowEnergyService::IncludedService; - foreach (QLowEnergyService * const includedService, service.includedServices()) { - servicePrivate->includedServices << includedService->serviceUuid(); - includedService->d_ptr->type |= QLowEnergyService::IncludedService; - } - - // Spec v4.2, Vol 3, Part G, Section 3. - const QLowEnergyHandle oldLastHandle = this->lastLocalHandle; - servicePrivate->startHandle = ++this->lastLocalHandle; // Service declaration. - this->lastLocalHandle += servicePrivate->includedServices.count(); // Include declarations. - foreach (const QLowEnergyCharacteristicData &cd, service.characteristics()) { - const QLowEnergyHandle declHandle = ++this->lastLocalHandle; - QLowEnergyServicePrivate::CharData charData; - charData.valueHandle = ++this->lastLocalHandle; - charData.uuid = cd.uuid(); - charData.properties = cd.properties(); - charData.value = cd.value(); - foreach (const QLowEnergyDescriptorData &dd, cd.descriptors()) { - QLowEnergyServicePrivate::DescData descData; - descData.uuid = dd.uuid(); - descData.value = dd.value(); - charData.descriptorList.insert(++this->lastLocalHandle, descData); - } - servicePrivate->characteristicList.insert(declHandle, charData); - } - servicePrivate->endHandle = this->lastLocalHandle; - const bool handleOverflow = this->lastLocalHandle <= oldLastHandle; - if (handleOverflow) { - qCWarning(QT_BT_ANDROID) << "Not enough attribute handles left to create this service"; - this->lastLocalHandle = oldLastHandle; - return nullptr; - } - - this->localServices.insert(servicePrivate->uuid, servicePrivate); - this->addToGenericAttributeList(service, servicePrivate->startHandle); - return new QLowEnergyService(servicePrivate); -} - - QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_android_p.h b/src/bluetooth/qlowenergycontroller_android_p.h index ba56ad4c..e575d96e 100644 --- a/src/bluetooth/qlowenergycontroller_android_p.h +++ b/src/bluetooth/qlowenergycontroller_android_p.h @@ -114,9 +114,6 @@ public: void requestConnectionUpdate(const QLowEnergyConnectionParameters ¶ms) override; - // misc helpers - QLowEnergyService *addServiceHelper(const QLowEnergyServiceData &service) override; - // read data void readCharacteristic(const QSharedPointer service, const QLowEnergyHandle charHandle) override; @@ -136,7 +133,6 @@ public: void addToGenericAttributeList(const QLowEnergyServiceData &service, QLowEnergyHandle startHandle) override; - QLowEnergyHandle lastLocalHandle; private: LowEnergyNotificationHub *hub; diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index 0aac1fda..7a1cd0df 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -265,7 +265,6 @@ template<> void putDataAndIncrement(const QByteArray &value, char *&dst) QLowEnergyControllerPrivateBluez::QLowEnergyControllerPrivateBluez() : QLowEnergyControllerPrivate(), - lastLocalHandle(0), l2cpSocket(0), requestPending(false), mtuSize(ATT_DEFAULT_LE_MTU), securityLevelValue(-1), @@ -3433,55 +3432,4 @@ bool QLowEnergyControllerPrivateBluez::verifyMac(const QByteArray &message, cons expectedMac); } -QLowEnergyService *QLowEnergyControllerPrivateBluez::addServiceHelper( - const QLowEnergyServiceData &service) -{ - // Spec says services "should" be grouped by uuid length (16-bit first, then 128-bit). - // Since this is not mandatory, we ignore it here and let the caller take responsibility - // for it. - - const auto servicePrivate = QSharedPointer::create(); - servicePrivate->state = QLowEnergyService::LocalService; - servicePrivate->setController(this); - servicePrivate->uuid = service.uuid(); - servicePrivate->type = service.type() == QLowEnergyServiceData::ServiceTypePrimary - ? QLowEnergyService::PrimaryService : QLowEnergyService::IncludedService; - foreach (QLowEnergyService * const includedService, service.includedServices()) { - servicePrivate->includedServices << includedService->serviceUuid(); - includedService->d_ptr->type |= QLowEnergyService::IncludedService; - } - - // Spec v4.2, Vol 3, Part G, Section 3. - const QLowEnergyHandle oldLastHandle = this->lastLocalHandle; - servicePrivate->startHandle = ++this->lastLocalHandle; // Service declaration. - this->lastLocalHandle += servicePrivate->includedServices.count(); // Include declarations. - foreach (const QLowEnergyCharacteristicData &cd, service.characteristics()) { - const QLowEnergyHandle declHandle = ++this->lastLocalHandle; - QLowEnergyServicePrivate::CharData charData; - charData.valueHandle = ++this->lastLocalHandle; - charData.uuid = cd.uuid(); - charData.properties = cd.properties(); - charData.value = cd.value(); - foreach (const QLowEnergyDescriptorData &dd, cd.descriptors()) { - QLowEnergyServicePrivate::DescData descData; - descData.uuid = dd.uuid(); - descData.value = dd.value(); - charData.descriptorList.insert(++this->lastLocalHandle, descData); - } - servicePrivate->characteristicList.insert(declHandle, charData); - } - servicePrivate->endHandle = this->lastLocalHandle; - const bool handleOverflow = this->lastLocalHandle <= oldLastHandle; - if (handleOverflow) { - qCWarning(QT_BT_BLUEZ) << "Not enough attribute handles left to create this service"; - this->lastLocalHandle = oldLastHandle; - return nullptr; - } - - this->localServices.insert(servicePrivate->uuid, servicePrivate); - this->addToGenericAttributeList(service, servicePrivate->startHandle); - return new QLowEnergyService(servicePrivate); -} - - QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_bluez_p.h b/src/bluetooth/qlowenergycontroller_bluez_p.h index 76d3bb87..55a8a482 100644 --- a/src/bluetooth/qlowenergycontroller_bluez_p.h +++ b/src/bluetooth/qlowenergycontroller_bluez_p.h @@ -116,8 +116,6 @@ public: void addToGenericAttributeList(const QLowEnergyServiceData &service, QLowEnergyHandle startHandle) override; - QLowEnergyService *addServiceHelper(const QLowEnergyServiceData &service) override; - struct Attribute { Attribute() : handle(0) {} @@ -133,7 +131,6 @@ public: int maxLength; }; QVector localAttributes; - QLowEnergyHandle lastLocalHandle; private: quint16 connectionHandle = 0; diff --git a/src/bluetooth/qlowenergycontroller_p.cpp b/src/bluetooth/qlowenergycontroller_p.cpp index b9f825af..c3605f05 100644 --- a/src/bluetooth/qlowenergycontroller_p.cpp +++ b/src/bluetooth/qlowenergycontroller_p.cpp @@ -134,11 +134,4 @@ void QLowEnergyControllerPrivateCommon::addToGenericAttributeList(const QLowEner { } -QLowEnergyService *QLowEnergyControllerPrivateCommon::addServiceHelper( - const QLowEnergyServiceData &/*service*/) -{ - return nullptr; -} - - QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index 01e9420a..623c71a2 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -87,9 +87,6 @@ public: void requestConnectionUpdate(const QLowEnergyConnectionParameters ¶ms) override; - // misc helpers - QLowEnergyService *addServiceHelper(const QLowEnergyServiceData &service) override; - // read data void readCharacteristic(const QSharedPointer service, const QLowEnergyHandle charHandle) override; diff --git a/src/bluetooth/qlowenergycontroller_winrt.cpp b/src/bluetooth/qlowenergycontroller_winrt.cpp index 741eebf6..13cb3eab 100644 --- a/src/bluetooth/qlowenergycontroller_winrt.cpp +++ b/src/bluetooth/qlowenergycontroller_winrt.cpp @@ -1106,56 +1106,6 @@ void QLowEnergyControllerPrivateWinRT::characteristicChanged( emit service->characteristicChanged(characteristic, data); } -QLowEnergyService *QLowEnergyControllerPrivateWinRT::addServiceHelper( - const QLowEnergyServiceData &service) -{ - // Spec says services "should" be grouped by uuid length (16-bit first, then 128-bit). - // Since this is not mandatory, we ignore it here and let the caller take responsibility - // for it. - - const auto servicePrivate = QSharedPointer::create(); - servicePrivate->state = QLowEnergyService::LocalService; - servicePrivate->setController(this); - servicePrivate->uuid = service.uuid(); - servicePrivate->type = service.type() == QLowEnergyServiceData::ServiceTypePrimary - ? QLowEnergyService::PrimaryService : QLowEnergyService::IncludedService; - foreach (QLowEnergyService * const includedService, service.includedServices()) { - servicePrivate->includedServices << includedService->serviceUuid(); - includedService->d_ptr->type |= QLowEnergyService::IncludedService; - } - - // Spec v4.2, Vol 3, Part G, Section 3. - const QLowEnergyHandle oldLastHandle = this->lastLocalHandle; - servicePrivate->startHandle = ++this->lastLocalHandle; // Service declaration. - this->lastLocalHandle += servicePrivate->includedServices.count(); // Include declarations. - foreach (const QLowEnergyCharacteristicData &cd, service.characteristics()) { - const QLowEnergyHandle declHandle = ++this->lastLocalHandle; - QLowEnergyServicePrivate::CharData charData; - charData.valueHandle = ++this->lastLocalHandle; - charData.uuid = cd.uuid(); - charData.properties = cd.properties(); - charData.value = cd.value(); - foreach (const QLowEnergyDescriptorData &dd, cd.descriptors()) { - QLowEnergyServicePrivate::DescData descData; - descData.uuid = dd.uuid(); - descData.value = dd.value(); - charData.descriptorList.insert(++this->lastLocalHandle, descData); - } - servicePrivate->characteristicList.insert(declHandle, charData); - } - servicePrivate->endHandle = this->lastLocalHandle; - const bool handleOverflow = this->lastLocalHandle <= oldLastHandle; - if (handleOverflow) { - qCWarning(QT_BT_WINRT) << "Not enough attribute handles left to create this service"; - this->lastLocalHandle = oldLastHandle; - return nullptr; - } - - this->localServices.insert(servicePrivate->uuid, servicePrivate); - this->addToGenericAttributeList(service, servicePrivate->startHandle); - return new QLowEnergyService(servicePrivate); -} - QT_END_NAMESPACE #include "qlowenergycontroller_winrt.moc" diff --git a/src/bluetooth/qlowenergycontroller_winrt_p.h b/src/bluetooth/qlowenergycontroller_winrt_p.h index f0625bcb..7edc4702 100644 --- a/src/bluetooth/qlowenergycontroller_winrt_p.h +++ b/src/bluetooth/qlowenergycontroller_winrt_p.h @@ -95,9 +95,6 @@ public: void requestConnectionUpdate(const QLowEnergyConnectionParameters ¶ms) override; - // misc helpers - QLowEnergyService *addServiceHelper(const QLowEnergyServiceData &service) override; - // read data void readCharacteristic(const QSharedPointer service, const QLowEnergyHandle charHandle) override; @@ -117,9 +114,6 @@ public: void addToGenericAttributeList(const QLowEnergyServiceData &service, QLowEnergyHandle startHandle) override; - - QLowEnergyHandle lastLocalHandle; - private slots: void characteristicChanged(int charHandle, const QByteArray &data); diff --git a/src/bluetooth/qlowenergycontrollerbase.cpp b/src/bluetooth/qlowenergycontrollerbase.cpp index 22fdd52b..687f5b9e 100644 --- a/src/bluetooth/qlowenergycontrollerbase.cpp +++ b/src/bluetooth/qlowenergycontrollerbase.cpp @@ -39,11 +39,17 @@ #include "qlowenergycontrollerbase_p.h" +#include + #include +#include +#include #include QT_BEGIN_NAMESPACE +Q_DECLARE_LOGGING_CATEGORY(QT_BT) + QLowEnergyControllerPrivate::QLowEnergyControllerPrivate() : QObject() { @@ -257,4 +263,54 @@ void QLowEnergyControllerPrivate::invalidateServices() serviceList.clear(); } +QLowEnergyService *QLowEnergyControllerPrivate::addServiceHelper( + const QLowEnergyServiceData &service) +{ + // Spec says services "should" be grouped by uuid length (16-bit first, then 128-bit). + // Since this is not mandatory, we ignore it here and let the caller take responsibility + // for it. + + const auto servicePrivate = QSharedPointer::create(); + servicePrivate->state = QLowEnergyService::LocalService; + servicePrivate->setController(this); + servicePrivate->uuid = service.uuid(); + servicePrivate->type = service.type() == QLowEnergyServiceData::ServiceTypePrimary + ? QLowEnergyService::PrimaryService : QLowEnergyService::IncludedService; + foreach (QLowEnergyService * const includedService, service.includedServices()) { + servicePrivate->includedServices << includedService->serviceUuid(); + includedService->d_ptr->type |= QLowEnergyService::IncludedService; + } + + // Spec v4.2, Vol 3, Part G, Section 3. + const QLowEnergyHandle oldLastHandle = this->lastLocalHandle; + servicePrivate->startHandle = ++this->lastLocalHandle; // Service declaration. + this->lastLocalHandle += servicePrivate->includedServices.count(); // Include declarations. + foreach (const QLowEnergyCharacteristicData &cd, service.characteristics()) { + const QLowEnergyHandle declHandle = ++this->lastLocalHandle; + QLowEnergyServicePrivate::CharData charData; + charData.valueHandle = ++this->lastLocalHandle; + charData.uuid = cd.uuid(); + charData.properties = cd.properties(); + charData.value = cd.value(); + foreach (const QLowEnergyDescriptorData &dd, cd.descriptors()) { + QLowEnergyServicePrivate::DescData descData; + descData.uuid = dd.uuid(); + descData.value = dd.value(); + charData.descriptorList.insert(++this->lastLocalHandle, descData); + } + servicePrivate->characteristicList.insert(declHandle, charData); + } + servicePrivate->endHandle = this->lastLocalHandle; + const bool handleOverflow = this->lastLocalHandle <= oldLastHandle; + if (handleOverflow) { + qCWarning(QT_BT) << "Not enough attribute handles left to create this service"; + this->lastLocalHandle = oldLastHandle; + return nullptr; + } + + this->localServices.insert(servicePrivate->uuid, servicePrivate); + this->addToGenericAttributeList(service, servicePrivate->startHandle); + return new QLowEnergyService(servicePrivate); +} + QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergycontrollerbase_p.h b/src/bluetooth/qlowenergycontrollerbase_p.h index 54f306ff..a8d1c676 100644 --- a/src/bluetooth/qlowenergycontrollerbase_p.h +++ b/src/bluetooth/qlowenergycontrollerbase_p.h @@ -133,7 +133,7 @@ public: virtual QLowEnergyService *addServiceHelper( - const QLowEnergyServiceData &service) = 0; + const QLowEnergyServiceData &service); // common backend methods @@ -171,6 +171,7 @@ protected: QBluetoothAddress remoteDevice; QBluetoothAddress localAdapter; + QLowEnergyHandle lastLocalHandle{}; QString remoteName; // device name of the remote diff --git a/src/bluetooth/qlowenergyservice.h b/src/bluetooth/qlowenergyservice.h index 23545b11..f413e7f7 100644 --- a/src/bluetooth/qlowenergyservice.h +++ b/src/bluetooth/qlowenergyservice.h @@ -134,10 +134,9 @@ private: // QLowEnergyController is the factory for this class friend class QLowEnergyController; - friend class QLowEnergyControllerPrivateAndroid; + friend class QLowEnergyControllerPrivate; friend class QLowEnergyControllerPrivateBluez; - friend class QLowEnergyControllerPrivateCommon; - friend class QLowEnergyControllerPrivateWinRT; + friend class QLowEnergyControllerPrivateAndroid; QLowEnergyService(QSharedPointer p, QObject *parent = nullptr); }; -- cgit v1.2.3 From ca6b84af1612440a925b4a8223cbed4beb9ac33e Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Fri, 3 Nov 2017 13:04:31 +0100 Subject: winrt: Do not assert when registering a service without a local BT adapter If no bluetooth adapter is present in the system IRfCommServiceProvider::CreateAsync will result in "device not available". In this case we should not assert, but just handle that as a failed attempt to register the service. Task-number: QTBUG-64118 Change-Id: I73591a1f2dbedc798824e5afef53a9e2d793e73e Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothserviceinfo_winrt.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/bluetooth/qbluetoothserviceinfo_winrt.cpp b/src/bluetooth/qbluetoothserviceinfo_winrt.cpp index d72056b7..d1a97b6d 100644 --- a/src/bluetooth/qbluetoothserviceinfo_winrt.cpp +++ b/src/bluetooth/qbluetoothserviceinfo_winrt.cpp @@ -337,7 +337,12 @@ bool QBluetoothServiceInfoPrivate::registerService(const QBluetoothAddress &loca hr = providerStatics->CreateAsync(serviceId.Get(), &op); Q_ASSERT_SUCCEEDED(hr); hr = QWinRTFunctions::await(op, serviceProvider.GetAddressOf()); - Q_ASSERT_SUCCEEDED(hr); + if (hr == HRESULT_FROM_WIN32(ERROR_DEVICE_NOT_AVAILABLE)) { + qCWarning(QT_BT_WINRT) << Q_FUNC_INFO << "No bluetooth adapter available."; + return false; + } else { + Q_ASSERT_SUCCEEDED(hr); + } ComPtr listener = sPriv->listener(); if (!listener) { -- cgit v1.2.3 From b94c803740c69ab32e7800e82380edc235339314 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 3 Nov 2017 09:37:47 +0100 Subject: Normalize Q_ARG arguments (const modifier removed) Change-Id: Ia65a879221d565af9b89083c6145c097472567a5 Reviewed-by: Timur Pocheptsov --- src/nfc/qnearfieldtarget_android.cpp | 28 ++++++++++++++-------------- src/nfc/qnearfieldtarget_neard_p.h | 8 ++++---- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/nfc/qnearfieldtarget_android.cpp b/src/nfc/qnearfieldtarget_android.cpp index 50c5c1b3..42c17bce 100644 --- a/src/nfc/qnearfieldtarget_android.cpp +++ b/src/nfc/qnearfieldtarget_android.cpp @@ -149,7 +149,7 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages() if (!m_intent.isValid()) { QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError), - Q_ARG(const QNearFieldTarget::RequestId&, requestId)); + Q_ARG(QNearFieldTarget::RequestId&, requestId)); return requestId; } @@ -157,7 +157,7 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages() if (!setTagTechnology({NDEFTECHNOLOGY})) { QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnsupportedError), - Q_ARG(const QNearFieldTarget::RequestId&, requestId)); + Q_ARG(QNearFieldTarget::RequestId&, requestId)); return requestId; } @@ -165,7 +165,7 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages() if (!connect()) { QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError), - Q_ARG(const QNearFieldTarget::RequestId&, requestId)); + Q_ARG(QNearFieldTarget::RequestId&, requestId)); return requestId; } @@ -176,7 +176,7 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages() if (!ndefMessage.isValid()) { QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::NdefReadError), - Q_ARG(const QNearFieldTarget::RequestId&, requestId)); + Q_ARG(QNearFieldTarget::RequestId&, requestId)); return requestId; } @@ -192,12 +192,12 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages() // Sending QNdefMessage, requestCompleted and exit. QNdefMessage qNdefMessage = QNdefMessage::fromByteArray(ndefMessageQBA); QMetaObject::invokeMethod(this, "ndefMessageRead", Qt::QueuedConnection, - Q_ARG(const QNdefMessage&, qNdefMessage)); + Q_ARG(QNdefMessage&, qNdefMessage)); QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, - Q_ARG(const QNearFieldTarget::RequestId&, requestId)); + Q_ARG(QNearFieldTarget::RequestId&, requestId)); QMetaObject::invokeMethod(this, "ndefMessageRead", Qt::QueuedConnection, - Q_ARG(const QNdefMessage&, qNdefMessage), - Q_ARG(const QNearFieldTarget::RequestId&, requestId)); + Q_ARG(QNdefMessage&, qNdefMessage), + Q_ARG(QNearFieldTarget::RequestId&, requestId)); return requestId; } @@ -247,7 +247,7 @@ QNearFieldTarget::RequestId NearFieldTarget::sendCommand(const QByteArray &comma if (!connect()) { QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError), - Q_ARG(const QNearFieldTarget::RequestId&, requestId)); + Q_ARG(QNearFieldTarget::RequestId&, requestId)); return requestId; } @@ -261,7 +261,7 @@ QNearFieldTarget::RequestId NearFieldTarget::sendCommand(const QByteArray &comma if (catchJavaExceptions()) { QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::CommandError), - Q_ARG(const QNearFieldTarget::RequestId&, requestId)); + Q_ARG(QNearFieldTarget::RequestId&, requestId)); return requestId; } QByteArray result = jbyteArrayToQByteArray(myNewVal.object()); @@ -274,7 +274,7 @@ QNearFieldTarget::RequestId NearFieldTarget::sendCommand(const QByteArray &comma disconnect(); // IOException at this point does not matter anymore. } QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, - Q_ARG(const QNearFieldTarget::RequestId&, requestId)); + Q_ARG(QNearFieldTarget::RequestId&, requestId)); return requestId; } @@ -313,7 +313,7 @@ QNearFieldTarget::RequestId NearFieldTarget::writeNdefMessages(const QList Date: Fri, 3 Nov 2017 10:08:22 +0100 Subject: Do not return from void functions/expressions This was pointed out by clazy. Change-Id: I6f888e2cd667c05d0f9747fd0b2ef2bcbfe95a28 Reviewed-by: Christian Kandeler --- src/nfc/qndefnfcsmartposterrecord.cpp | 2 +- src/nfc/qnearfieldsharemanager.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/nfc/qndefnfcsmartposterrecord.cpp b/src/nfc/qndefnfcsmartposterrecord.cpp index 73f2cd21..bc7acfab 100644 --- a/src/nfc/qndefnfcsmartposterrecord.cpp +++ b/src/nfc/qndefnfcsmartposterrecord.cpp @@ -566,7 +566,7 @@ void QNdefNfcSmartPosterRecord::addIcon(const QByteArray &type, const QByteArray rec.setType(type); rec.setData(data); - return addIcon(rec); + addIcon(rec); } /*! diff --git a/src/nfc/qnearfieldsharemanager.cpp b/src/nfc/qnearfieldsharemanager.cpp index 515a9d62..0709f60e 100644 --- a/src/nfc/qnearfieldsharemanager.cpp +++ b/src/nfc/qnearfieldsharemanager.cpp @@ -149,7 +149,7 @@ QNearFieldShareManager::~QNearFieldShareManager() void QNearFieldShareManager::setShareModes(ShareModes mode) { Q_D(QNearFieldShareManager); - return d->setShareModes(mode); + d->setShareModes(mode); } /*! -- cgit v1.2.3 From a8a4fae732dba2e3783236f4486acde60d03d997 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 3 Nov 2017 09:58:55 +0100 Subject: Use QStringLiteral where needed to avoid QString allocations Change-Id: I9edc229e43f5e09ca45ede5032aacb4d54fa76af Reviewed-by: Oliver Wolff --- src/bluetooth/qbluetoothserviceinfo.cpp | 2 +- src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bluetooth/qbluetoothserviceinfo.cpp b/src/bluetooth/qbluetoothserviceinfo.cpp index e4e5d1ed..385e9463 100644 --- a/src/bluetooth/qbluetoothserviceinfo.cpp +++ b/src/bluetooth/qbluetoothserviceinfo.cpp @@ -625,7 +625,7 @@ QDebug operator<<(QDebug dbg, const QBluetoothServiceInfo &info) QDebugStateSaver saver(dbg); dbg.noquote() << "\n"; foreach (quint16 id, info.attributes()) { - dumpAttributeVariant(dbg, info.attribute(id), QString::fromLatin1("(%1)\t").arg(id)); + dumpAttributeVariant(dbg, info.attribute(id), QStringLiteral("(%1)\t").arg(id)); } return dbg; } diff --git a/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp b/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp index f2486e81..ee78fbdb 100644 --- a/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp +++ b/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp @@ -148,7 +148,7 @@ QDeclarativeBluetoothDiscoveryModel::QDeclarativeBluetoothDiscoveryModel(QObject connect(d->m_deviceAgent, SIGNAL(canceled()), this, SLOT(finishedDiscovery())); connect(d->m_deviceAgent, SIGNAL(error(QBluetoothDeviceDiscoveryAgent::Error)), this, SLOT(errorDeviceDiscovery(QBluetoothDeviceDiscoveryAgent::Error))); - d->m_deviceAgent->setObjectName("DeviceDiscoveryAgent"); + d->m_deviceAgent->setObjectName(QStringLiteral("DeviceDiscoveryAgent")); d->m_serviceAgent = new QBluetoothServiceDiscoveryAgent(this); connect(d->m_serviceAgent, SIGNAL(serviceDiscovered(QBluetoothServiceInfo)), @@ -157,7 +157,7 @@ QDeclarativeBluetoothDiscoveryModel::QDeclarativeBluetoothDiscoveryModel(QObject connect(d->m_serviceAgent, SIGNAL(canceled()), this, SLOT(finishedDiscovery())); connect(d->m_serviceAgent, SIGNAL(error(QBluetoothServiceDiscoveryAgent::Error)), this, SLOT(errorDiscovery(QBluetoothServiceDiscoveryAgent::Error))); - d->m_serviceAgent->setObjectName("ServiceDiscoveryAgent"); + d->m_serviceAgent->setObjectName(QStringLiteral("ServiceDiscoveryAgent")); QHash roleNames; roleNames = QAbstractItemModel::roleNames(); -- cgit v1.2.3 From 475d1bad05c14bfb06eb4472c2ba7b0f95bfa051 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 2 Nov 2017 12:44:43 +0200 Subject: Add changes file for Qt 5.9.3 Task-number: QTBUG-64191 Change-Id: I37f68aa25b828a90c4efaead2a2e1bc80e270182 Reviewed-by: Oliver Wolff --- dist/changes-5.9.3 | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 dist/changes-5.9.3 diff --git a/dist/changes-5.9.3 b/dist/changes-5.9.3 new file mode 100644 index 00000000..ea702da2 --- /dev/null +++ b/dist/changes-5.9.3 @@ -0,0 +1,37 @@ +Qt 5.9.3 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.9.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/index.html + +The Qt version 5.9 series is binary compatible with the 5.8.x series. +Applications compiled for 5.8 will continue to run with 5.9. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.9.3 Changes * +**************************************************************************** + +QtBluetooth +----------- + + - Updated FDL and BSD license headers throughout the module + - [QTBUG-63630] Added warning about incorrect thread/runloop usage on Apple + platforms. The IOBluetooth framework used by QtBluetooth requires CFRunLoops + - [QTBUG-63210] Fixed build using -no-pch on Windows + +QtNfc +----- + + - Updated FDL and BSD license headers throughout the module + - [QTBUG-62858] Fixed writing of NDefMessages on Android + -- cgit v1.2.3 From 32623c4686d069305c8f7e046038cfcc5817052a Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 3 Nov 2017 12:24:31 +0100 Subject: Convert most old-style QObject::connect() to pointer syntax The remaining cases (e.g. in QBluetoothServiceDiscoveryAgent) are connected to Q_PRIVATE_SLOT usage which requires a redesign. Change-Id: I9227b5459b81228a7aa2660193d5b984c036b74f Reviewed-by: Oliver Wolff --- src/bluetooth/qbluetoothsocket.cpp | 6 ++-- src/bluetooth/qlowenergyservice.cpp | 28 +++++++++---------- .../qdeclarativebluetoothdiscoverymodel.cpp | 32 ++++++++++++++-------- .../bluetooth/qdeclarativebluetoothservice.cpp | 3 +- .../bluetooth/qdeclarativebluetoothsocket.cpp | 30 +++++++++++++------- 5 files changed, 60 insertions(+), 39 deletions(-) diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index a35863b4..6c14cffc 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -662,8 +662,10 @@ void QBluetoothSocket::doDeviceDiscovery(const QBluetoothServiceInfo &service, O //qDebug() << "Got agent"; - connect(d->discoveryAgent, SIGNAL(serviceDiscovered(QBluetoothServiceInfo)), this, SLOT(serviceDiscovered(QBluetoothServiceInfo))); - connect(d->discoveryAgent, SIGNAL(finished()), this, SLOT(discoveryFinished())); + connect(d->discoveryAgent, &QBluetoothServiceDiscoveryAgent::serviceDiscovered, + this, &QBluetoothSocket::serviceDiscovered); + connect(d->discoveryAgent, &QBluetoothServiceDiscoveryAgent::finished, + this, &QBluetoothSocket::discoveryFinished); d->openMode = openMode; diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index 7e419e17..39de9d01 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -381,20 +381,20 @@ QLowEnergyService::QLowEnergyService(QSharedPointer p, qRegisterMetaType(); qRegisterMetaType(); - connect(p.data(), SIGNAL(error(QLowEnergyService::ServiceError)), - this, SIGNAL(error(QLowEnergyService::ServiceError))); - connect(p.data(), SIGNAL(stateChanged(QLowEnergyService::ServiceState)), - this, SIGNAL(stateChanged(QLowEnergyService::ServiceState))); - connect(p.data(), SIGNAL(characteristicChanged(QLowEnergyCharacteristic,QByteArray)), - this, SIGNAL(characteristicChanged(QLowEnergyCharacteristic,QByteArray))); - connect(p.data(), SIGNAL(characteristicWritten(QLowEnergyCharacteristic,QByteArray)), - 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))); + connect(p.data(), &QLowEnergyServicePrivate::error, + this, QOverload::of(&QLowEnergyService::error)); + connect(p.data(), &QLowEnergyServicePrivate::stateChanged, + this, &QLowEnergyService::stateChanged); + connect(p.data(), &QLowEnergyServicePrivate::characteristicChanged, + this, &QLowEnergyService::characteristicChanged); + connect(p.data(), &QLowEnergyServicePrivate::characteristicWritten, + this, &QLowEnergyService::characteristicWritten); + connect(p.data(), &QLowEnergyServicePrivate::descriptorWritten, + this, &QLowEnergyService::descriptorWritten); + connect(p.data(), &QLowEnergyServicePrivate::characteristicRead, + this, &QLowEnergyService::characteristicRead); + connect(p.data(), &QLowEnergyServicePrivate::descriptorRead, + this, &QLowEnergyService::descriptorRead); } /*! diff --git a/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp b/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp index ee78fbdb..fc1accbd 100644 --- a/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp +++ b/src/imports/bluetooth/qdeclarativebluetoothdiscoverymodel.cpp @@ -142,21 +142,29 @@ QDeclarativeBluetoothDiscoveryModel::QDeclarativeBluetoothDiscoveryModel(QObject d(new QDeclarativeBluetoothDiscoveryModelPrivate) { d->m_deviceAgent = new QBluetoothDeviceDiscoveryAgent(this); - connect(d->m_deviceAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)), - this, SLOT(deviceDiscovered(QBluetoothDeviceInfo))); - connect(d->m_deviceAgent, SIGNAL(finished()), this, SLOT(finishedDiscovery())); - connect(d->m_deviceAgent, SIGNAL(canceled()), this, SLOT(finishedDiscovery())); - connect(d->m_deviceAgent, SIGNAL(error(QBluetoothDeviceDiscoveryAgent::Error)), - this, SLOT(errorDeviceDiscovery(QBluetoothDeviceDiscoveryAgent::Error))); + connect(d->m_deviceAgent, &QBluetoothDeviceDiscoveryAgent::deviceDiscovered, + this, QOverload::of(&QDeclarativeBluetoothDiscoveryModel::deviceDiscovered)); + connect(d->m_deviceAgent, &QBluetoothDeviceDiscoveryAgent::finished, + this, &QDeclarativeBluetoothDiscoveryModel::finishedDiscovery); + connect(d->m_deviceAgent, &QBluetoothDeviceDiscoveryAgent::canceled, + this, &QDeclarativeBluetoothDiscoveryModel::finishedDiscovery); + connect(d->m_deviceAgent, + QOverload::of(&QBluetoothDeviceDiscoveryAgent::error), + this, + &QDeclarativeBluetoothDiscoveryModel::errorDeviceDiscovery); d->m_deviceAgent->setObjectName(QStringLiteral("DeviceDiscoveryAgent")); d->m_serviceAgent = new QBluetoothServiceDiscoveryAgent(this); - connect(d->m_serviceAgent, SIGNAL(serviceDiscovered(QBluetoothServiceInfo)), - this, SLOT(serviceDiscovered(QBluetoothServiceInfo))); - connect(d->m_serviceAgent, SIGNAL(finished()), this, SLOT(finishedDiscovery())); - connect(d->m_serviceAgent, SIGNAL(canceled()), this, SLOT(finishedDiscovery())); - connect(d->m_serviceAgent, SIGNAL(error(QBluetoothServiceDiscoveryAgent::Error)), - this, SLOT(errorDiscovery(QBluetoothServiceDiscoveryAgent::Error))); + connect(d->m_serviceAgent, &QBluetoothServiceDiscoveryAgent::serviceDiscovered, + this, QOverload::of(&QDeclarativeBluetoothDiscoveryModel::serviceDiscovered)); + connect(d->m_serviceAgent, &QBluetoothServiceDiscoveryAgent::finished, + this, &QDeclarativeBluetoothDiscoveryModel::finishedDiscovery); + connect(d->m_serviceAgent, &QBluetoothServiceDiscoveryAgent::canceled, + this, &QDeclarativeBluetoothDiscoveryModel::finishedDiscovery); + connect(d->m_serviceAgent, + QOverload::of(&QBluetoothServiceDiscoveryAgent::error), + this, + &QDeclarativeBluetoothDiscoveryModel::errorDiscovery); d->m_serviceAgent->setObjectName(QStringLiteral("ServiceDiscoveryAgent")); QHash roleNames; diff --git a/src/imports/bluetooth/qdeclarativebluetoothservice.cpp b/src/imports/bluetooth/qdeclarativebluetoothservice.cpp index efbf217b..48c9da9a 100644 --- a/src/imports/bluetooth/qdeclarativebluetoothservice.cpp +++ b/src/imports/bluetooth/qdeclarativebluetoothservice.cpp @@ -297,7 +297,8 @@ void QDeclarativeBluetoothService::setRegistered(bool registered) } d->m_server = server; - connect(d->m_server, SIGNAL(newConnection()), this, SLOT(new_connection())); + connect(d->m_server, &QBluetoothServer::newConnection, + this, &QDeclarativeBluetoothService::new_connection); d->m_service->setAttribute(QBluetoothServiceInfo::ServiceRecordHandle, (uint)0x00010010); diff --git a/src/imports/bluetooth/qdeclarativebluetoothsocket.cpp b/src/imports/bluetooth/qdeclarativebluetoothsocket.cpp index 0d5a5eae..07de35bc 100644 --- a/src/imports/bluetooth/qdeclarativebluetoothsocket.cpp +++ b/src/imports/bluetooth/qdeclarativebluetoothsocket.cpp @@ -112,11 +112,16 @@ public: m_socket = new QBluetoothSocket(socketProtocol); m_socket->connectToService(*m_service->serviceInfo()); - QObject::connect(m_socket, SIGNAL(connected()), m_dbs, SLOT(socket_connected())); - QObject::connect(m_socket, SIGNAL(disconnected()), m_dbs, SLOT(socket_disconnected())); - QObject::connect(m_socket, SIGNAL(error(QBluetoothSocket::SocketError)), m_dbs, SLOT(socket_error(QBluetoothSocket::SocketError))); - QObject::connect(m_socket, SIGNAL(stateChanged(QBluetoothSocket::SocketState)), m_dbs, SLOT(socket_state(QBluetoothSocket::SocketState))); - QObject::connect(m_socket, SIGNAL(readyRead()), m_dbs, SLOT(socket_readyRead())); + QObject::connect(m_socket, &QBluetoothSocket::connected, + m_dbs, &QDeclarativeBluetoothSocket::socket_connected); + QObject::connect(m_socket, &QBluetoothSocket::disconnected, + m_dbs, &QDeclarativeBluetoothSocket::socket_disconnected); + QObject::connect(m_socket, QOverload::of(&QBluetoothSocket::error), + m_dbs, &QDeclarativeBluetoothSocket::socket_error); + QObject::connect(m_socket, &QBluetoothSocket::stateChanged, + m_dbs, &QDeclarativeBluetoothSocket::socket_state); + QObject::connect(m_socket, &QIODevice::readyRead, + m_dbs, &QDeclarativeBluetoothSocket::socket_readyRead); } QDeclarativeBluetoothSocket *m_dbs; @@ -363,11 +368,16 @@ void QDeclarativeBluetoothSocket::newSocket(QBluetoothSocket *socket, QDeclarati d->m_componentCompleted = true; d->m_error = NoError; - QObject::connect(socket, SIGNAL(connected()), this, SLOT(socket_connected())); - QObject::connect(socket, SIGNAL(disconnected()), this, SLOT(socket_disconnected())); - QObject::connect(socket, SIGNAL(error(QBluetoothSocket::SocketError)), this, SLOT(socket_error(QBluetoothSocket::SocketError))); - QObject::connect(socket, SIGNAL(stateChanged(QBluetoothSocket::SocketState)), this, SLOT(socket_state(QBluetoothSocket::SocketState))); - QObject::connect(socket, SIGNAL(readyRead()), this, SLOT(socket_readyRead())); + QObject::connect(socket, &QBluetoothSocket::connected, + this, &QDeclarativeBluetoothSocket::socket_connected); + QObject::connect(socket, &QBluetoothSocket::disconnected, + this, &QDeclarativeBluetoothSocket::socket_disconnected); + QObject::connect(socket, QOverload::of(&QBluetoothSocket::error), + this, &QDeclarativeBluetoothSocket::socket_error); + QObject::connect(socket, &QBluetoothSocket::stateChanged, + this, &QDeclarativeBluetoothSocket::socket_state); + QObject::connect(socket, &QIODevice::readyRead, + this, &QDeclarativeBluetoothSocket::socket_readyRead); socket_state(socket->state()); -- cgit v1.2.3 From 7f0e5cb092574355f356777a3f2997c54e02139b Mon Sep 17 00:00:00 2001 From: Maurice Kalinowski Date: Wed, 8 Nov 2017 13:52:30 +0100 Subject: winrt: Early return instead of assert is case of error Some devices report access denied for various reasons (group policy, disabled, etc.). Hence, do return and stop the discovery instead of asserting. Change-Id: I22fe9cc375fd3b3580deaf72c614bf62600cbf32 Reviewed-by: Oliver Wolff --- src/bluetooth/qlowenergycontroller_winrt.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_winrt.cpp b/src/bluetooth/qlowenergycontroller_winrt.cpp index 8517a942..ed36790b 100644 --- a/src/bluetooth/qlowenergycontroller_winrt.cpp +++ b/src/bluetooth/qlowenergycontroller_winrt.cpp @@ -489,7 +489,9 @@ void QLowEnergyControllerPrivate::obtainIncludedServices(QSharedPointer> includedServices; hr = service2->GetAllIncludedServices(&includedServices); - Q_ASSERT_SUCCEEDED(hr); + // Some devices return ERROR_ACCESS_DISABLED_BY_POLICY + if (FAILED(hr)) + return; uint count; hr = includedServices->get_Size(&count); @@ -588,7 +590,12 @@ void QLowEnergyControllerPrivate::discoverServiceDetails(const QBluetoothUuid &s Q_ASSERT_SUCCEEDED(hr); ComPtr> deviceServices; hr = deviceService2->GetAllIncludedServices(&deviceServices); - Q_ASSERT_SUCCEEDED(hr); + if (FAILED(hr)) { // ERROR_ACCESS_DISABLED_BY_POLICY + qCDebug(QT_BT_WINRT) << "Could not obtain included services list for" << service; + pointer->setError(QLowEnergyService::UnknownError); + pointer->setState(QLowEnergyService::InvalidService); + return; + } uint serviceCount; hr = deviceServices->get_Size(&serviceCount); Q_ASSERT_SUCCEEDED(hr); -- cgit v1.2.3 From e54779075b936c224b7647599edf8368fc2bbd52 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 8 Nov 2017 09:54:39 +0200 Subject: Add changes file for Qt 5.10.0 Change-Id: I3015244ee9cbbd8e68b48051b6319a4aef7f84c7 Reviewed-by: Oliver Wolff --- dist/changes-5.10.0 | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 dist/changes-5.10.0 diff --git a/dist/changes-5.10.0 b/dist/changes-5.10.0 new file mode 100644 index 00000000..68310e3e --- /dev/null +++ b/dist/changes-5.10.0 @@ -0,0 +1,78 @@ +Qt 5.10 introduces many new features and improvements as well as bugfixes +over the 5.9.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.10 series is binary compatible with the 5.9.x series. +Applications compiled for 5.9 will continue to run with 5.10. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.10.0 Changes * +**************************************************************************** + +QtBluetooth +----------- + + - Register QLowEnergyCharacteristic and QLowEnergyDescriptor as meta + types. It is therefore necessary to declare them as meta types in the + header files. This commit will cause conflicts with existing meta type + declarations in applications using Qt. Those declarations need to be + removed. + + - Renamed qbluetoothglobal.h to qtbluetoothglobal.h. + + - QBluetoothSocket: + * Added QBluetoothSocket::RemoteHostClosedError. + + - QLowEnergyController: + * Added QLowEnergyController::RemoteHostClosedError. + + - Windows: + * [QTBUG-61566] Enabled UWP backend for desktop Windows versions that + support the API. + +QtNfc +----- + + - Renamed qnfcglobal.h tp qtnfcglobal.h. + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +Android +------- + + - Improved handling of "connection reset by remote device" use cases for + QLowEnergyController. + +iOS/macOS +--------- + + - Fixed compilation issues related to macOS 10.13 SDK changes. + +Linux/BlueZ +----------- + + - Improved detection of Bluetooth device type (classic vs. low energy) based + on service uuids being offered by the device. + + - [QTBUG-61554] Enabled default BTLE peripheral services even when + QLowEnergyController is running as central role. + + - [QTBUG-57575] Added option to allow more targeted discovery of Bluetooth + devices based on type. + +WinRT +----- + + - Fixed -no-pch build of QtBluetooth. -- cgit v1.2.3 From 22d20e81d866b79e1e9fefe3f24f93aeb687a450 Mon Sep 17 00:00:00 2001 From: Peter Seiderer Date: Sat, 18 Nov 2017 21:07:44 +0100 Subject: Example heartrate-server needs only core and bluetooth module Fixes compile with disabled gui module. Task-number: QTBUG-64597 Change-Id: I376dede3db987e524f97070344cc119e0ee1d187 Reviewed-by: Alex Blasche --- examples/bluetooth/heartrate-server/heartrate-server.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/bluetooth/heartrate-server/heartrate-server.pro b/examples/bluetooth/heartrate-server/heartrate-server.pro index 4ccf486c..edd011b9 100644 --- a/examples/bluetooth/heartrate-server/heartrate-server.pro +++ b/examples/bluetooth/heartrate-server/heartrate-server.pro @@ -1,7 +1,7 @@ TEMPLATE = app TARGET = heartrate-server -QT += bluetooth +QT = core bluetooth CONFIG += c++11 SOURCES += main.cpp -- cgit v1.2.3 From 7262bf89d3a67eb624e850a30bd40b3f4e257bac Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 17 Nov 2017 13:43:01 +0100 Subject: BlueZ: Prevent hanging of QLEController job queue due to comm timeout When an ATT READ_REQUEST times out the ATT stack stops spinning the event queue. This is particularly bad during the initial service discovery when a lot of read requests are scheduled in one go. The consequence was that the QLEService instance was stuck in the ServiceDiscovering state. Subsequently the service object is unusable. The patch ensures that the ATT event loop continues after the timeout happens. If multiple char or descriptor reads (on the same service) have this problem the service discovery can still take a very long time. The user can adjust this via the BLUETOOTH_GATT_TIMEOUT env variable. [ChangeLog][Platform Specific Behavior][BlueZ] Fixed hanging service discovery state when remote device does not respond to ATT read requests. Task-number: QTBUG-64669 Change-Id: I8d22c13b825a921b140213b8b67e59e2310c362c Reviewed-by: Oliver Wolff Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller_bluez.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index d80389da..3359edf0 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -346,8 +346,8 @@ void QLowEnergyControllerPrivate::handleGattRequestTimeout() } if (!openRequests.isEmpty() && requestPending) { - requestPending = false; // reset pending flag const Request currentRequest = openRequests.dequeue(); + requestPending = false; // reset pending flag qCWarning(QT_BT_BLUEZ).nospace() << "****** Request type 0x" << hex << currentRequest.command << " to server/peripheral timed out"; @@ -372,7 +372,6 @@ void QLowEnergyControllerPrivate::handleGattRequestTimeout() case ATT_OP_EXCHANGE_MTU_REQUEST: // MTU change request // never received reply to MTU request // it is safe to skip and go to next request - sendNextPendingRequest(); break; case ATT_OP_READ_BY_GROUP_REQUEST: // primary or secondary service discovery case ATT_OP_READ_BY_TYPE_REQUEST: // characteristic or included service discovery @@ -406,8 +405,13 @@ void QLowEnergyControllerPrivate::handleGattRequestTimeout() break; default: // not a command used by central role implementation - return; + qCWarning(QT_BT_BLUEZ) << "Missing response for ATT peripheral command: " + << hex << command; + break; } + + // spin openRequest queue further + sendNextPendingRequest(); } } -- cgit v1.2.3 From a3473b5c4fc7c610d2f0195133911e2746e3331c Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 12 Dec 2017 09:54:24 +0100 Subject: Bump version Change-Id: Ia5c39a0db946a649c1992e32d8b05dc455f4283f --- .qmake.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.qmake.conf b/.qmake.conf index 2108ac6f..4f571fb5 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,3 +1,3 @@ load(qt_build_config) -MODULE_VERSION = 5.9.3 +MODULE_VERSION = 5.9.4 -- cgit v1.2.3 From 61cc3be31d750ecf32506ee585a4957e2c81dfe7 Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Mon, 11 Dec 2017 10:52:37 +0100 Subject: winrt: Add bluetooth capabilities for msvc2017 as well As msvc2013 was dropped we can add the capabilities independent of the msvc version for winrt. Change-Id: I14aea0da9226a5de6ffa2cf7c69a4ae5a69e8256 Reviewed-by: Alex Blasche Reviewed-by: Miguel Costa Reviewed-by: Maurice Kalinowski --- src/bluetooth/bluetooth.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index 40b14a84..5c87834d 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -223,7 +223,7 @@ qtConfig(bluez) { qlowenergycontroller_p.cpp } -winrt-*-msvc2015 { +winrt { MODULE_WINRT_CAPABILITIES_DEVICE += \ bluetooth.genericAttributeProfile \ bluetooth.rfcomm -- cgit v1.2.3 From e46cde935ee76eaa00e78af968121502e2406347 Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Mon, 11 Dec 2017 11:01:24 +0100 Subject: winrt: Do not crash when trying to an unreachable paired LE device As device discovery returns every paired device on winrt, it is possible that we try to connect to a device, that is paired but not available. When doing so the application should not crash but state that there was an error connecting to the device. Task-number: QTBUG-64480 Change-Id: I8d79f6da1de2b0bda7a51a7cfd068bb4a6057257 Reviewed-by: Alex Blasche Reviewed-by: Miguel Costa Reviewed-by: Maurice Kalinowski --- src/bluetooth/qlowenergycontroller_winrt.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/bluetooth/qlowenergycontroller_winrt.cpp b/src/bluetooth/qlowenergycontroller_winrt.cpp index ed36790b..1e06dedb 100644 --- a/src/bluetooth/qlowenergycontroller_winrt.cpp +++ b/src/bluetooth/qlowenergycontroller_winrt.cpp @@ -400,7 +400,17 @@ void QLowEnergyControllerPrivate::connectToDevice() Q_ASSERT_SUCCEEDED(hr); ComPtr result; hr = QWinRTFunctions::await(op, result.GetAddressOf()); - Q_ASSERT_SUCCEEDED(hr); + if (hr == E_INVALIDARG) { + // E_INVALIDARG happens when user tries to connect to a device that was paired + // before but is not available. + qCDebug(QT_BT_WINRT) << "Could not obtain characteristic read result that triggers" + "device connection. Is the device reachable?"; + setError(QLowEnergyController::ConnectionError); + setState(QLowEnergyController::UnconnectedState); + return; + } else { + Q_ASSERT_SUCCEEDED(hr); + } ComPtr buffer; hr = result->get_Value(&buffer); Q_ASSERT_SUCCEEDED(hr); -- cgit v1.2.3 From 37a3b8104588605f9055ea93e59112e48a114dc1 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 2 Nov 2017 09:49:31 +0100 Subject: Implement bluetoothd version test This patch adds the ability to detect the underlying version of bluetoothd. The bluetoothd version provides the means to decide whether the DBUS LE API is sufficient to fullfil the QLEController requirements. Bluez DBus LE API is usable since Bluez 5.42. Prior versions only had experimental DBus LE APIs. Task-number: QTBUG-46819 Change-Id: Ic047fba27c01ee40571abb0c4eb45828f4a64475 Reviewed-by: Oliver Wolff --- src/bluetooth/bluetooth.pro | 3 + src/bluetooth/bluez/bluez5_helper.cpp | 181 ++++++++++++++++++++++++++++++++- src/bluetooth/bluez/bluez5_helper_p.h | 2 +- src/bluetooth/bluez/bluez_data_p.h | 4 + src/bluetooth/bluez/hcimanager.cpp | 4 - src/bluetooth/qlowenergycontroller.cpp | 5 +- 6 files changed, 189 insertions(+), 10 deletions(-) diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index adba1aab..f675b0d9 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -88,6 +88,9 @@ qtConfig(bluez) { QT_PRIVATE = concurrent QT_FOR_PRIVATE += dbus + # do not link against QtNetwork but use inline qt_safe_* functions + INCLUDEPATH += $$QT.network_private.includes + include(bluez/bluez.pri) PRIVATE_HEADERS += \ diff --git a/src/bluetooth/bluez/bluez5_helper.cpp b/src/bluetooth/bluez/bluez5_helper.cpp index ffe9a58d..1691bd34 100644 --- a/src/bluetooth/bluez/bluez5_helper.cpp +++ b/src/bluetooth/bluez/bluez5_helper.cpp @@ -40,7 +40,10 @@ #include #include #include +#include +#include #include "bluez5_helper_p.h" +#include "bluez_data_p.h" #include "objectmanager_p.h" #include "properties_p.h" #include "adapter1_bluez5_p.h" @@ -59,6 +62,7 @@ typedef enum Bluez5TestResultType } Bluez5TestResult; Q_GLOBAL_STATIC_WITH_ARGS(Bluez5TestResult, bluezVersion, (BluezVersionUnknown)); +Q_GLOBAL_STATIC_WITH_ARGS(QVersionNumber, bluezDaemonVersion, (QVersionNumber())); bool isBluez5() { @@ -97,10 +101,181 @@ bool isBluez5() return (*bluezVersion() == BluezVersion5); } -bool isBluez5DbusGatt() +/* + Checks that the mandatory Bluetooth HCI ioctls are offered + by Linux kernel. Returns \c true if the ictls are available; otherwise \c false. + + Mandatory ioctls: + - HCIGETCONNLIST + - HCIGETDEVINFO + - HCIGETDEVLIST + */ +bool mandatoryHciIoctlsAvailable() +{ + // open hci socket + int hciSocket = ::qt_safe_socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); + if (hciSocket < 0) { + qCWarning(QT_BT_BLUEZ) << "Cannot open HCI socket:" << qt_error_string(errno); + return false; + } + + // check HCIGETDEVLIST & HCIGETDEVLIST + struct hci_dev_req *devRequest = 0; + struct hci_dev_list_req *devRequestList = 0; + struct hci_dev_info devInfo; + const int devListSize = sizeof(struct hci_dev_list_req) + + HCI_MAX_DEV * sizeof(struct hci_dev_req); + + devRequestList = (hci_dev_list_req *) malloc(devListSize); + if (!devRequestList) { + qt_safe_close(hciSocket); + return false; // if we cannot malloc nothing will help anyway + } + + QScopedPointer pDevList(devRequestList); + memset(pDevList.data(), 0, devListSize); + pDevList->dev_num = HCI_MAX_DEV; + devRequest = pDevList->dev_req; + + if (qt_safe_ioctl(hciSocket, HCIGETDEVLIST, devRequestList) < 0) { + qt_safe_close(hciSocket); + qCWarning(QT_BT_BLUEZ) << "HCI icotl HCIGETDEVLIST:" << qt_error_string(errno); + return false; + } + + if (devRequestList->dev_num > 0) { + devInfo.dev_id = devRequest->dev_id; + if (qt_safe_ioctl(hciSocket, HCIGETDEVINFO, &devInfo) < 0) { + qt_safe_close(hciSocket); + qCWarning(QT_BT_BLUEZ) << "HCI icotl HCIGETDEVINFO:" << qt_error_string(errno); + return false; + } + } + + // check HCIGETCONNLIST + const int maxNoOfConnections = 20; + hci_conn_list_req *infoList = nullptr; + infoList = (hci_conn_list_req *) + malloc(sizeof(hci_conn_list_req) + maxNoOfConnections * sizeof(hci_conn_info)); + + if (!infoList) { + qt_safe_close(hciSocket); + return false; + } + + QScopedPointer pInfoList(infoList); + pInfoList->conn_num = maxNoOfConnections; + pInfoList->dev_id = devInfo.dev_id; + + if (qt_safe_ioctl(hciSocket, HCIGETCONNLIST, (void *) infoList) < 0) { + qCWarning(QT_BT_BLUEZ) << "HCI icotl HCIGETCONNLIST:" << qt_error_string(errno); + qt_safe_close(hciSocket); + return false; + } + + qt_safe_close(hciSocket); + return true; +} + +/*! + * This function returns the version of bluetoothd in use on the system. + * This is required to determine which QLEControllerPrivate implementation + * is required. The following version tags are of significance: + * + * Version < 4.0 -> QLEControllerPrivateCommon + * Version < 5.42 -> QLEControllerPrivateBluez + * Version >= 5.42 -> QLEControllerPrivateBluezDBus + * + * This function utilizes a singleton pattern. It always returns a cached + * version tag which is determined on first call. This is necessary to + * avoid continuesly running the somewhat expensive tests. + * + * The function must never return a null QVersionNumber. + */ +QVersionNumber bluetoothdVersion() { - //TODO implement - return false; + if (bluezDaemonVersion()->isNull()) { + qCDebug(QT_BT_BLUEZ) << "Detecting bluetoothd version"; + //Order of matching + // 1. Pick whatever the user decides via BLUETOOTH_BLUEZ_DBUS_LE + const QString version = qEnvironmentVariable("BLUETOOTH_USE_BLUEZ_DBUS_LE"); + if (!version.isNull()) { + const QVersionNumber vn = QVersionNumber::fromString(version); + if (!vn.isNull()) { + *bluezDaemonVersion() = vn; + qCDebug(QT_BT_BLUEZ) << "Forcing Bluez LE API selection:" + << bluezDaemonVersion()->toString(); + } + } + + // 2. Find bluetoothd binary and check "bluetoothd --version" + if (bluezDaemonVersion()->isNull() && qt_haveLinuxProcfs()) { + QDBusConnection session = QDBusConnection::systemBus(); + qint64 pid = session.interface()->servicePid(QStringLiteral("org.bluez")).value(); + QByteArray buffer; + + auto determineBinaryVersion = [](const QString &binary) -> QVersionNumber { + QProcess process; + process.start(binary, {QStringLiteral("--version")}); + process.waitForFinished(); + + const QString version = QString::fromLocal8Bit(process.readAll()); + const QVersionNumber vn = QVersionNumber::fromString(version); + if (!vn.isNull()) + qCDebug(QT_BT_BLUEZ) << "Detected bluetoothd version" << vn; + return vn; + }; + + //try reading /proc//exe first -> requires process owner + qCDebug(QT_BT_BLUEZ) << "Using /proc//exe"; + const QString procExe = QStringLiteral("/proc/%1/exe").arg(pid); + const QVersionNumber vn = determineBinaryVersion(procExe); + if (!vn.isNull()) + *bluezDaemonVersion() = vn; + + if (bluezDaemonVersion()->isNull()) { + qCDebug(QT_BT_BLUEZ) << "Using /proc//cmdline"; + //try to reading /proc//cmdline (does not require additional process rights) + QFile procFile(QStringLiteral("/proc/%1/cmdline").arg(pid)); + if (procFile.open(QIODevice::ReadOnly|QIODevice::Text)) { + buffer = procFile.readAll(); + procFile.close(); + + // cmdline params separated by character \0 -> first is bluetoothd binary + const QString binary = QString::fromLocal8Bit(buffer.split('\0').at(0)); + QFileInfo info(binary); + if (info.isExecutable()) + *bluezDaemonVersion() = determineBinaryVersion(binary); + else + qCDebug(QT_BT_BLUEZ) << "Cannot determine bluetoothd version via cmdline:" + << binary; + } + } + } + + // 3. Fall back to custom ATT backend, if possible? + if (bluezDaemonVersion()->isNull()) { + // Check mandatory HCI ioctls are available + if (mandatoryHciIoctlsAvailable()) { + // default 4.0 for now -> implies custom (G)ATT implementation + *bluezDaemonVersion() = QVersionNumber(4, 0); + } + } + + // 4. Ultimate fallback -> enable dummy backend + if (bluezDaemonVersion()->isNull()) { + // version 3 represents disabled BTLE + // bluezDaemonVersion should not be null to avoid repeated version tests + *bluezDaemonVersion() = QVersionNumber(3, 0); + qCWarning(QT_BT_BLUEZ) << "Cannot determine bluetoothd version and required Bluetooth HCI ioctols"; + qCWarning(QT_BT_BLUEZ) << "Disabling Qt Bluetooth LE feature"; + } + + qCDebug(QT_BT_BLUEZ) << "Bluetoothd:" << bluezDaemonVersion()->toString(); + } + + Q_ASSERT(!bluezDaemonVersion()->isNull()); + return *bluezDaemonVersion(); } struct AdapterData diff --git a/src/bluetooth/bluez/bluez5_helper_p.h b/src/bluetooth/bluez/bluez5_helper_p.h index 6aeed11d..1deecfc9 100644 --- a/src/bluetooth/bluez/bluez5_helper_p.h +++ b/src/bluetooth/bluez/bluez5_helper_p.h @@ -66,7 +66,7 @@ Q_DECLARE_METATYPE(ManagedObjectList) QT_BEGIN_NAMESPACE bool isBluez5(); -bool isBluez5DbusGatt(); +QVersionNumber bluetoothdVersion(); QString sanitizeNameForDBus(const QString& text); diff --git a/src/bluetooth/bluez/bluez_data_p.h b/src/bluetooth/bluez/bluez_data_p.h index 684cd5b8..2a2e597c 100644 --- a/src/bluetooth/bluez/bluez_data_p.h +++ b/src/bluetooth/bluez/bluez_data_p.h @@ -123,6 +123,10 @@ struct bt_security { #error "Unknown byte order" #endif +#define HCIGETCONNLIST _IOR('H', 212, int) +#define HCIGETDEVINFO _IOR('H', 211, int) +#define HCIGETDEVLIST _IOR('H', 210, int) + // Bluetooth address typedef struct { quint8 b[6]; diff --git a/src/bluetooth/bluez/hcimanager.cpp b/src/bluetooth/bluez/hcimanager.cpp index c524117c..be62c881 100644 --- a/src/bluetooth/bluez/hcimanager.cpp +++ b/src/bluetooth/bluez/hcimanager.cpp @@ -53,10 +53,6 @@ #include #include -#define HCIGETCONNLIST _IOR('H', 212, int) -#define HCIGETDEVINFO _IOR('H', 211, int) -#define HCIGETDEVLIST _IOR('H', 210, int) - QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(QT_BT_BLUEZ) diff --git a/src/bluetooth/qlowenergycontroller.cpp b/src/bluetooth/qlowenergycontroller.cpp index cdb16939..3be1aed3 100644 --- a/src/bluetooth/qlowenergycontroller.cpp +++ b/src/bluetooth/qlowenergycontroller.cpp @@ -295,8 +295,9 @@ void registerQLowEnergyControllerMetaType() static QLowEnergyControllerPrivate *privateController() { #if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) - if (isBluez5DbusGatt()) { - qCWarning(QT_BT) << "Using BlueZ DBus API"; + // for now Bluez DBus disabled + if (false && bluetoothdVersion() >= QVersionNumber(5, 42)) { + qCWarning(QT_BT) << "Using BlueZ LE DBus API"; return new QLowEnergyControllerPrivateBluezDBus(); } else { qCWarning(QT_BT) << "Using BlueZ kernel ATT interface"; -- cgit v1.2.3 From 0ef470335d541b6be7b941081ed248a68e2fbf8c Mon Sep 17 00:00:00 2001 From: Milla Pohjanheimo Date: Tue, 12 Dec 2017 12:03:01 +0200 Subject: Add binary compatibility files for QtConnectivity for 5.10 Binary compatibility files added for 5.10.0 Change-Id: I027491568fb9fa8017a0bc234027522b41f755c2 Reviewed-by: Alex Blasche --- .../data/QtBluetooth.5.10.0.linux-gcc-amd64.txt | 4988 ++++++++++++++++++++ .../auto/bic/data/QtNfc.5.10.0.linux-gcc-amd64.txt | 4754 +++++++++++++++++++ 2 files changed, 9742 insertions(+) create mode 100644 tests/auto/bic/data/QtBluetooth.5.10.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtNfc.5.10.0.linux-gcc-amd64.txt diff --git a/tests/auto/bic/data/QtBluetooth.5.10.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtBluetooth.5.10.0.linux-gcc-amd64.txt new file mode 100644 index 00000000..d8b43124 --- /dev/null +++ b/tests/auto/bic/data/QtBluetooth.5.10.0.linux-gcc-amd64.txt @@ -0,0 +1,4988 @@ +Class std::__failure_type + size=1 align=1 + base size=0 base align=1 +std::__failure_type (0x0x7f0c00290240) 0 empty + +Class std::__do_is_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_destructible_impl (0x0x7f0c002d89c0) 0 empty + +Class std::__do_is_nt_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nt_destructible_impl (0x0x7f0c002d8c00) 0 empty + +Class std::__do_is_default_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_default_constructible_impl (0x0x7f0c002d8e40) 0 empty + +Class std::__do_is_static_castable_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_static_castable_impl (0x0x7f0bfdf050c0) 0 empty + +Class std::__do_is_direct_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_direct_constructible_impl (0x0x7f0bfdf05240) 0 empty + +Class std::__do_is_nary_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nary_constructible_impl (0x0x7f0bfdf05600) 0 empty + +Class std::__do_common_type_impl + size=1 align=1 + base size=0 base align=1 +std::__do_common_type_impl (0x0x7f0bfdf8fd80) 0 empty + +Class std::__do_member_type_wrapper + size=1 align=1 + base size=0 base align=1 +std::__do_member_type_wrapper (0x0x7f0bfdf8fe40) 0 empty + +Class std::__result_of_memfun_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_ref_impl (0x0x7f0bfdfc31e0) 0 empty + +Class std::__result_of_memfun_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_deref_impl (0x0x7f0bfdfc32a0) 0 empty + +Class std::__result_of_memobj_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_ref_impl (0x0x7f0bfdfc3360) 0 empty + +Class std::__result_of_memobj_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_deref_impl (0x0x7f0bfdfc3420) 0 empty + +Class std::__result_of_other_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_other_impl (0x0x7f0bfdfc36c0) 0 empty + +Class std::piecewise_construct_t + size=1 align=1 + base size=0 base align=1 +std::piecewise_construct_t (0x0x7f0bfdfc38a0) 0 empty + +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7f0bfdfc3d20) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7f0bfdfc3d80) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7f0bfe076a20) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7f0bfe076a80) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7f0bfdf67af8) 0 empty + std::input_iterator_tag (0x0x7f0bfe076ae0) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7f0bfdf67b60) 0 empty + std::forward_iterator_tag (0x0x7f0bfdf67bc8) 0 empty + std::input_iterator_tag (0x0x7f0bfe076b40) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7f0bfdf67c30) 0 empty + std::bidirectional_iterator_tag (0x0x7f0bfdf67c98) 0 empty + std::forward_iterator_tag (0x0x7f0bfdf67d00) 0 empty + std::input_iterator_tag (0x0x7f0bfe076ba0) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_iter (0x0x7f0bfe0b4840) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_val (0x0x7f0bfe0b48a0) 0 empty + +Class __gnu_cxx::__ops::_Val_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Val_less_iter (0x0x7f0bfe0b4900) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_iter (0x0x7f0bfe0b4960) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_val (0x0x7f0bfe0b49c0) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7f0bfdd914e0) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7f0bfdd91720) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7f0bfdd917e0) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7f0bfdd91840) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7f0bfdd91900) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7f0bfdd91960) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7f0bfdd91de0) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7f0bfdd91e40) 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 (0x0x7f0bfdd91ea0) 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 (0x0x7f0bfe0ce270) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7f0bfdd91f00) 0 nearly-empty + primary-for std::bad_exception (0x0x7f0bfe0ce270) + +Class std::__exception_ptr::exception_ptr + size=8 align=8 + base size=8 base align=8 +std::__exception_ptr::exception_ptr (0x0x7f0bfdd91f60) 0 + +Vtable for std::nested_exception +std::nested_exception::_ZTVSt16nested_exception: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16nested_exception) +16 (int (*)(...))std::nested_exception::~nested_exception +24 (int (*)(...))std::nested_exception::~nested_exception + +Class std::nested_exception + size=16 align=8 + base size=16 base align=8 +std::nested_exception (0x0x7f0bfdee8000) 0 + vptr=((& std::nested_exception::_ZTVSt16nested_exception) + 16u) + +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 (0x0x7f0bfe0ce478) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7f0bfdee8420) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f0bfe0ce478) + +Vtable for std::bad_array_new_length +std::bad_array_new_length::_ZTVSt20bad_array_new_length: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt20bad_array_new_length) +16 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +24 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +32 (int (*)(...))std::bad_array_new_length::what + +Class std::bad_array_new_length + size=8 align=8 + base size=8 base align=8 +std::bad_array_new_length (0x0x7f0bfe0ce4e0) 0 nearly-empty + vptr=((& std::bad_array_new_length::_ZTVSt20bad_array_new_length) + 16u) + std::bad_alloc (0x0x7f0bfe0ce548) 0 nearly-empty + primary-for std::bad_array_new_length (0x0x7f0bfe0ce4e0) + std::exception (0x0x7f0bfdee8480) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f0bfe0ce548) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7f0bfdee84e0) 0 empty + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7f0bfdba3120) 0 + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7f0bfdba3de0) 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 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7f0bfdba3e40) 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 (0x0x7f0bfd9e7d20) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7f0bfd9e7d80) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7f0bfd9e7e40) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7f0bfd9e7ea0) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7f0bfd9e7f00) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7f0bfd9e7f60) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7f0bfda930c0) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7f0bfda93120) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7f0bfda93540) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7f0bfda935a0) 0 + +Class std::_Hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Hash_impl (0x0x7f0bfd8b7d80) 0 empty + +Class std::_Fnv_hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Fnv_hash_impl (0x0x7f0bfd8b7de0) 0 empty + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7f0bfd579d80) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7f0bfd320ba0) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7f0bfd318138) 0 + std::iterator (0x0x7f0bfd320c60) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7f0bfd3181a0) 0 + std::_Bit_iterator_base (0x0x7f0bfd318208) 0 + std::iterator (0x0x7f0bfd320cc0) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7f0bfd318270) 0 + std::_Bit_iterator_base (0x0x7f0bfd3182d8) 0 + std::iterator (0x0x7f0bfd320d20) 0 empty + +Class std::random_device + size=5000 align=8 + base size=5000 base align=8 +std::random_device (0x0x7f0bfd106b40) 0 + +Class std::bernoulli_distribution::param_type + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution::param_type (0x0x7f0bfd235900) 0 + +Class std::bernoulli_distribution + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution (0x0x7f0bfd2358a0) 0 + +Class std::seed_seq + size=24 align=8 + base size=24 base align=8 +std::seed_seq (0x0x7f0bfcfd48a0) 0 + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7f0bfbb913c0) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7f0bfbb91420) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7f0bfbc36ea0) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7f0bfbc36f00) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7f0bfbc36f60) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7f0bfbc94000) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7f0bfbc942a0) 0 + +Class std::__atomic_flag_base + size=1 align=1 + base size=1 base align=1 +std::__atomic_flag_base (0x0x7f0bfbc947e0) 0 + +Class std::atomic_flag + size=1 align=1 + base size=1 base align=1 +std::atomic_flag (0x0x7f0bfbcaf1a0) 0 + std::__atomic_flag_base (0x0x7f0bfbc94840) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7f0bfbcaf8f0) 0 + QAtomicInteger (0x0x7f0bfbcaf958) 0 + QBasicAtomicInteger (0x0x7f0bfba1ef60) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7f0bfb2fd540) 0 empty + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7f0bfb0f15a0) 0 + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7f0bfb0f16c0) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7f0bfb0ee3a8) 0 + QGenericArgument (0x0x7f0bfb0f1720) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7f0bfb0f18a0) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7f0bfb0f1960) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7f0bfb1da9c0) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7f0bfb1daa20) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7f0bfb1dacc0) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7f0bfb1dad20) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7f0bfaefe0c0) 0 empty + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7f0bfaefe120) 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 (0x0x7f0bfaefe180) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7f0bfaefe1e0) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7f0bfaefe240) 0 + +Class std::__cow_string + size=8 align=8 + base size=8 base align=8 +std::__cow_string (0x0x7f0bfaefe600) 0 + +Vtable for std::logic_error +std::logic_error::_ZTVSt11logic_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11logic_error) +16 (int (*)(...))std::logic_error::~logic_error +24 (int (*)(...))std::logic_error::~logic_error +32 (int (*)(...))std::logic_error::what + +Class std::logic_error + size=16 align=8 + base size=16 base align=8 +std::logic_error (0x0x7f0bfaef19c0) 0 + vptr=((& std::logic_error::_ZTVSt11logic_error) + 16u) + std::exception (0x0x7f0bfaefe6c0) 0 nearly-empty + primary-for std::logic_error (0x0x7f0bfaef19c0) + +Vtable for std::domain_error +std::domain_error::_ZTVSt12domain_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12domain_error) +16 (int (*)(...))std::domain_error::~domain_error +24 (int (*)(...))std::domain_error::~domain_error +32 (int (*)(...))std::logic_error::what + +Class std::domain_error + size=16 align=8 + base size=16 base align=8 +std::domain_error (0x0x7f0bfaef1a28) 0 + vptr=((& std::domain_error::_ZTVSt12domain_error) + 16u) + std::logic_error (0x0x7f0bfaef1a90) 0 + primary-for std::domain_error (0x0x7f0bfaef1a28) + std::exception (0x0x7f0bfaefe720) 0 nearly-empty + primary-for std::logic_error (0x0x7f0bfaef1a90) + +Vtable for std::invalid_argument +std::invalid_argument::_ZTVSt16invalid_argument: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16invalid_argument) +16 (int (*)(...))std::invalid_argument::~invalid_argument +24 (int (*)(...))std::invalid_argument::~invalid_argument +32 (int (*)(...))std::logic_error::what + +Class std::invalid_argument + size=16 align=8 + base size=16 base align=8 +std::invalid_argument (0x0x7f0bfaef1af8) 0 + vptr=((& std::invalid_argument::_ZTVSt16invalid_argument) + 16u) + std::logic_error (0x0x7f0bfaef1b60) 0 + primary-for std::invalid_argument (0x0x7f0bfaef1af8) + std::exception (0x0x7f0bfaefe780) 0 nearly-empty + primary-for std::logic_error (0x0x7f0bfaef1b60) + +Vtable for std::length_error +std::length_error::_ZTVSt12length_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12length_error) +16 (int (*)(...))std::length_error::~length_error +24 (int (*)(...))std::length_error::~length_error +32 (int (*)(...))std::logic_error::what + +Class std::length_error + size=16 align=8 + base size=16 base align=8 +std::length_error (0x0x7f0bfaef1bc8) 0 + vptr=((& std::length_error::_ZTVSt12length_error) + 16u) + std::logic_error (0x0x7f0bfaef1c30) 0 + primary-for std::length_error (0x0x7f0bfaef1bc8) + std::exception (0x0x7f0bfaefe7e0) 0 nearly-empty + primary-for std::logic_error (0x0x7f0bfaef1c30) + +Vtable for std::out_of_range +std::out_of_range::_ZTVSt12out_of_range: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12out_of_range) +16 (int (*)(...))std::out_of_range::~out_of_range +24 (int (*)(...))std::out_of_range::~out_of_range +32 (int (*)(...))std::logic_error::what + +Class std::out_of_range + size=16 align=8 + base size=16 base align=8 +std::out_of_range (0x0x7f0bfaef1c98) 0 + vptr=((& std::out_of_range::_ZTVSt12out_of_range) + 16u) + std::logic_error (0x0x7f0bfaef1d00) 0 + primary-for std::out_of_range (0x0x7f0bfaef1c98) + std::exception (0x0x7f0bfaefe840) 0 nearly-empty + primary-for std::logic_error (0x0x7f0bfaef1d00) + +Vtable for std::runtime_error +std::runtime_error::_ZTVSt13runtime_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13runtime_error) +16 (int (*)(...))std::runtime_error::~runtime_error +24 (int (*)(...))std::runtime_error::~runtime_error +32 (int (*)(...))std::runtime_error::what + +Class std::runtime_error + size=16 align=8 + base size=16 base align=8 +std::runtime_error (0x0x7f0bfaef1d68) 0 + vptr=((& std::runtime_error::_ZTVSt13runtime_error) + 16u) + std::exception (0x0x7f0bfaefe8a0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f0bfaef1d68) + +Vtable for std::range_error +std::range_error::_ZTVSt11range_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11range_error) +16 (int (*)(...))std::range_error::~range_error +24 (int (*)(...))std::range_error::~range_error +32 (int (*)(...))std::runtime_error::what + +Class std::range_error + size=16 align=8 + base size=16 base align=8 +std::range_error (0x0x7f0bfaef1dd0) 0 + vptr=((& std::range_error::_ZTVSt11range_error) + 16u) + std::runtime_error (0x0x7f0bfaef1e38) 0 + primary-for std::range_error (0x0x7f0bfaef1dd0) + std::exception (0x0x7f0bfaefe900) 0 nearly-empty + primary-for std::runtime_error (0x0x7f0bfaef1e38) + +Vtable for std::overflow_error +std::overflow_error::_ZTVSt14overflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt14overflow_error) +16 (int (*)(...))std::overflow_error::~overflow_error +24 (int (*)(...))std::overflow_error::~overflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::overflow_error + size=16 align=8 + base size=16 base align=8 +std::overflow_error (0x0x7f0bfaef1ea0) 0 + vptr=((& std::overflow_error::_ZTVSt14overflow_error) + 16u) + std::runtime_error (0x0x7f0bfaef1f08) 0 + primary-for std::overflow_error (0x0x7f0bfaef1ea0) + std::exception (0x0x7f0bfaefe960) 0 nearly-empty + primary-for std::runtime_error (0x0x7f0bfaef1f08) + +Vtable for std::underflow_error +std::underflow_error::_ZTVSt15underflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt15underflow_error) +16 (int (*)(...))std::underflow_error::~underflow_error +24 (int (*)(...))std::underflow_error::~underflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::underflow_error + size=16 align=8 + base size=16 base align=8 +std::underflow_error (0x0x7f0bfaef1f70) 0 + vptr=((& std::underflow_error::_ZTVSt15underflow_error) + 16u) + std::runtime_error (0x0x7f0bfaef16e8) 0 + primary-for std::underflow_error (0x0x7f0bfaef1f70) + std::exception (0x0x7f0bfaefe9c0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f0bfaef16e8) + +Vtable for std::_V2::error_category +std::_V2::error_category::_ZTVNSt3_V214error_categoryE: 10u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt3_V214error_categoryE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))std::_V2::error_category::_M_message +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))std::_V2::error_category::default_error_condition +64 (int (*)(...))std::_V2::error_category::equivalent +72 (int (*)(...))std::_V2::error_category::equivalent + +Class std::_V2::error_category + size=8 align=8 + base size=8 base align=8 +std::_V2::error_category (0x0x7f0bfaefeb40) 0 nearly-empty + vptr=((& std::_V2::error_category::_ZTVNSt3_V214error_categoryE) + 16u) + +Class std::error_code + size=16 align=8 + base size=16 base align=8 +std::error_code (0x0x7f0bfaefed80) 0 + +Class std::error_condition + size=16 align=8 + base size=16 base align=8 +std::error_condition (0x0x7f0bfaefef00) 0 + +Vtable for std::system_error +std::system_error::_ZTVSt12system_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12system_error) +16 (int (*)(...))std::system_error::~system_error +24 (int (*)(...))std::system_error::~system_error +32 (int (*)(...))std::runtime_error::what + +Class std::system_error + size=32 align=8 + base size=32 base align=8 +std::system_error (0x0x7f0bfafb3410) 0 + vptr=((& std::system_error::_ZTVSt12system_error) + 16u) + std::runtime_error (0x0x7f0bfafb3478) 0 + primary-for std::system_error (0x0x7f0bfafb3410) + std::exception (0x0x7f0bfaff0180) 0 nearly-empty + primary-for std::runtime_error (0x0x7f0bfafb3478) + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureB5cxx11E) +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=32 align=8 + base size=32 base align=8 +std::ios_base::failure (0x0x7f0bfb03f068) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E) + 16u) + std::system_error (0x0x7f0bfb03f0d0) 0 + primary-for std::ios_base::failure (0x0x7f0bfb03f068) + std::runtime_error (0x0x7f0bfb03f138) 0 + primary-for std::system_error (0x0x7f0bfb03f0d0) + std::exception (0x0x7f0bfaff0480) 0 nearly-empty + primary-for std::runtime_error (0x0x7f0bfb03f138) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7f0bfaff04e0) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7f0bfaff0540) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7f0bfaff05a0) 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 (0x0x7f0bfaff0420) 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 (0x0x7f0bfaff0d20) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7f0bfad6f420) 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 (0x0x7f0bfac91b60 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7f0bfac91c30 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 0u +72 0u + +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 (0x0x7f0bfac910d0 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 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7f0bfac91208 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 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 0u +72 0u + +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 QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7f0bfab04c60) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7f0bfab04cc0) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7f0bfaa62060) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7f0bfaa623c0) 0 + +Class QStringView + size=16 align=8 + base size=16 base align=8 +QStringView (0x0x7f0bfaa62840) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7f0bfa7626c0) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7f0bfa762d20) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7f0bfa762cc0) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7f0bfa565de0) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7f0bfa66fa20) 0 + +Class QtPrivate::QHashCombine + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombine (0x0x7f0bfa3a3660) 0 empty + +Class QtPrivate::QHashCombineCommutative + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombineCommutative (0x0x7f0bfa3a36c0) 0 empty + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7f0bfa3a3720) 0 + +Class QListData::NotArrayCompatibleLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotArrayCompatibleLayout (0x0x7f0bfa3a3ae0) 0 empty + +Class QListData::NotIndirectLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotIndirectLayout (0x0x7f0bfa3a3b40) 0 empty + +Class QListData::ArrayCompatibleLayout + size=1 align=1 + base size=1 base align=1 +QListData::ArrayCompatibleLayout (0x0x7f0bfa38c958) 0 empty + QListData::NotIndirectLayout (0x0x7f0bfa3a3ba0) 0 empty + +Class QListData::InlineWithPaddingLayout + size=1 align=1 + base size=1 base align=1 +QListData::InlineWithPaddingLayout (0x0x7f0bfa1b88c0) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f0bfa3a3c00) 0 empty + QListData::NotIndirectLayout (0x0x7f0bfa3a3c60) 0 empty + +Class QListData::IndirectLayout + size=1 align=1 + base size=1 base align=1 +QListData::IndirectLayout (0x0x7f0bfa38c9c0) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f0bfa3a3cc0) 0 empty + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7f0bfa3a3d20) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7f0bfa3a3a80) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7f0bfa29b1e0) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7f0bf9f6f420) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7f0bf9f6f3c0) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7f0bf9f70410) 0 + QList (0x0x7f0bf9f70478) 0 + QListSpecialMethods (0x0x7f0bf9f6f600) 0 empty + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7f0bf9f6fa20) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7f0bfa06e540) 0 + +Class std::allocator_arg_t + size=1 align=1 + base size=0 base align=1 +std::allocator_arg_t (0x0x7f0bfa06eba0) 0 empty + +Class std::__uses_alloc_base + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc_base (0x0x7f0bfa06ed20) 0 empty + +Class std::__uses_alloc0::_Sink + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc0::_Sink (0x0x7f0bfa06ede0) 0 empty + +Class std::__uses_alloc0 + size=1 align=1 + base size=1 base align=1 +std::__uses_alloc0 (0x0x7f0bf9f70d68) 0 + std::__uses_alloc_base (0x0x7f0bfa06ed80) 0 empty + +Class std::_Swallow_assign + size=1 align=1 + base size=0 base align=1 +std::_Swallow_assign (0x0x7f0bf9e21e40) 0 empty + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7f0bf9b6c0c0) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7f0bf9b6c180) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7f0bf9b6c2a0) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7f0bf9b6c420) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7f0bf9b6c840) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7f0bf9b6c960) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7f0bf9cda300) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7f0bf9cda720) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7f0bf9cdaa20) 0 + +Class std::chrono::_V2::system_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::system_clock (0x0x7f0bf976a2a0) 0 empty + +Class std::chrono::_V2::steady_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::steady_clock (0x0x7f0bf98b3120) 0 empty + +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 (0x0x7f0bf98b3180) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7f0bf98b3360) 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 (0x0x7f0bf98b3300) 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 (0x0x7f0bf9590600) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7f0bf9590660) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7f0bf9590720) 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 0u +48 0u +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 (0x0x7f0bf9548680) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7f0bf95906c0) 0 + primary-for QAbstractAnimation (0x0x7f0bf9548680) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7f0bf95907e0) 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 (0x0x7f0bf95d2000) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7f0bf9590780) 0 + primary-for QAnimationDriver (0x0x7f0bf95d2000) + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7f0bf95908a0) 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 (0x0x7f0bf95d2068) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7f0bf9590840) 0 + primary-for QEventLoop (0x0x7f0bf95d2068) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7f0bf9590a80) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7f0bf9590b40) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7f0bf9590ba0) 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 0u +48 0u +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 (0x0x7f0bf95d21a0) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7f0bf9590ae0) 0 + primary-for QAbstractEventDispatcher (0x0x7f0bf95d21a0) + +Vtable for std::type_info +std::type_info::_ZTVSt9type_info: 8u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9type_info) +16 (int (*)(...))std::type_info::~type_info +24 (int (*)(...))std::type_info::~type_info +32 (int (*)(...))std::type_info::__is_pointer_p +40 (int (*)(...))std::type_info::__is_function_p +48 (int (*)(...))std::type_info::__do_catch +56 (int (*)(...))std::type_info::__do_upcast + +Class std::type_info + size=16 align=8 + base size=16 base align=8 +std::type_info (0x0x7f0bf9590e40) 0 + vptr=((& std::type_info::_ZTVSt9type_info) + 16u) + +Vtable for std::bad_cast +std::bad_cast::_ZTVSt8bad_cast: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8bad_cast) +16 (int (*)(...))std::bad_cast::~bad_cast +24 (int (*)(...))std::bad_cast::~bad_cast +32 (int (*)(...))std::bad_cast::what + +Class std::bad_cast + size=8 align=8 + base size=8 base align=8 +std::bad_cast (0x0x7f0bf95d23a8) 0 nearly-empty + vptr=((& std::bad_cast::_ZTVSt8bad_cast) + 16u) + std::exception (0x0x7f0bf9590ea0) 0 nearly-empty + primary-for std::bad_cast (0x0x7f0bf95d23a8) + +Vtable for std::bad_typeid +std::bad_typeid::_ZTVSt10bad_typeid: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt10bad_typeid) +16 (int (*)(...))std::bad_typeid::~bad_typeid +24 (int (*)(...))std::bad_typeid::~bad_typeid +32 (int (*)(...))std::bad_typeid::what + +Class std::bad_typeid + size=8 align=8 + base size=8 base align=8 +std::bad_typeid (0x0x7f0bf95d2410) 0 nearly-empty + vptr=((& std::bad_typeid::_ZTVSt10bad_typeid) + 16u) + std::exception (0x0x7f0bf9590f00) 0 nearly-empty + primary-for std::bad_typeid (0x0x7f0bf95d2410) + +Vtable for std::bad_function_call +std::bad_function_call::_ZTVSt17bad_function_call: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt17bad_function_call) +16 (int (*)(...))std::bad_function_call::~bad_function_call +24 (int (*)(...))std::bad_function_call::~bad_function_call +32 (int (*)(...))std::bad_function_call::what + +Class std::bad_function_call + size=8 align=8 + base size=8 base align=8 +std::bad_function_call (0x0x7f0bf9351680) 0 nearly-empty + vptr=((& std::bad_function_call::_ZTVSt17bad_function_call) + 16u) + std::exception (0x0x7f0bf93da000) 0 nearly-empty + primary-for std::bad_function_call (0x0x7f0bf9351680) + +Class std::_Nocopy_types + size=16 align=8 + base size=16 base align=8 +std::_Nocopy_types (0x0x7f0bf93da0c0) 0 + +Class std::_Any_data + size=16 align=8 + base size=16 base align=8 +std::_Any_data (0x0x7f0bf93da120) 0 + +Class std::_Function_base + size=24 align=8 + base size=24 base align=8 +std::_Function_base (0x0x7f0bf93da240) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7f0bf93da720) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7f0bf93dac60) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7f0bf9175060) 0 + +Class QHashData + size=48 align=8 + base size=44 base align=8 +QHashData (0x0x7f0bf9175000) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7f0bf91750c0) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7f0bf9175960) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7f0bf9175a20) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7f0bf91759c0) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7f0bf9175a80) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7f0bf9175900) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7f0bf8fca5a0) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7f0bf8fcac00) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7f0bf8fcaba0) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7f0bf8fcacc0) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7f0bf8fcac60) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7f0bf8e17000) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7f0bf8e176c0) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7f0bf8ac2de0) 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 0u +48 0u +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 (0x0x7f0bf8ade410) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7f0bf8ac2d80) 0 + primary-for QAbstractItemModel (0x0x7f0bf8ade410) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7f0bf8b4d180) 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 0u +48 0u +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 (*)(...))QAbstractTableModel::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 (0x0x7f0bf8ade618) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7f0bf8ade680) 0 + primary-for QAbstractTableModel (0x0x7f0bf8ade618) + QObject (0x0x7f0bf8b4d120) 0 + primary-for QAbstractItemModel (0x0x7f0bf8ade680) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7f0bf8b4d240) 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 0u +48 0u +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 (*)(...))QAbstractListModel::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 (0x0x7f0bf8ade6e8) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7f0bf8ade750) 0 + primary-for QAbstractListModel (0x0x7f0bf8ade6e8) + QObject (0x0x7f0bf8b4d1e0) 0 + primary-for QAbstractItemModel (0x0x7f0bf8ade750) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7f0bf8b4d4e0) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7f0bf8b4d5a0) 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 0u +48 0u +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 (0x0x7f0bf8ade888) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7f0bf8ade8f0) 0 + primary-for QAbstractProxyModel (0x0x7f0bf8ade888) + QObject (0x0x7f0bf8b4d540) 0 + primary-for QAbstractItemModel (0x0x7f0bf8ade8f0) + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7f0bf8b4d660) 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 0u +48 0u +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 (0x0x7f0bf8ade958) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7f0bf8b4d600) 0 + primary-for QAbstractState (0x0x7f0bf8ade958) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7f0bf8b4d720) 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 0u +48 0u +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 (0x0x7f0bf8ade9c0) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7f0bf8b4d6c0) 0 + primary-for QAbstractTransition (0x0x7f0bf8ade9c0) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7f0bf8b4d7e0) 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 0u +48 0u +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 (0x0x7f0bf8adea28) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7f0bf8adea90) 0 + primary-for QAnimationGroup (0x0x7f0bf8adea28) + QObject (0x0x7f0bf8b4d780) 0 + primary-for QAbstractAnimation (0x0x7f0bf8adea90) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7f0bf8c5f540) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7f0bf8c5f7e0) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7f0bf8c5f8a0) 0 + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7f0bf8c5fba0) 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 0u +48 0u +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 (0x0x7f0bf88e6138) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7f0bf8c5fb40) 0 + primary-for QIODevice (0x0x7f0bf88e6138) + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7f0bf8c5fde0) 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 (0x0x7f0bf88e6270) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7f0bf88e62d8) 0 + primary-for QBuffer (0x0x7f0bf88e6270) + QObject (0x0x7f0bf8c5fd80) 0 + primary-for QIODevice (0x0x7f0bf88e62d8) + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7f0bf8c5fea0) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7f0bf8c5fe40) 0 + +Class QStaticByteArrayMatcherBase::Skiptable + size=256 align=1 + base size=256 base align=1 +QStaticByteArrayMatcherBase::Skiptable (0x0x7f0bf8957000) 0 + +Class QStaticByteArrayMatcherBase + size=256 align=16 + base size=256 base align=16 +QStaticByteArrayMatcherBase (0x0x7f0bf8c5ff60) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7f0bf89571e0) 0 + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7f0bf89573c0) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7f0bf89579c0) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7f0bf8957a80) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7f0bf86eaa80) 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 (0x0x7f0bf86eaf00) 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 (0x0x7f0bf86f47b8) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7f0bf86eaf60) 0 + primary-for QTimerEvent (0x0x7f0bf86f47b8) + +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 (0x0x7f0bf86f4820) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7f0bf8769000) 0 + primary-for QChildEvent (0x0x7f0bf86f4820) + +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 (0x0x7f0bf86f4d68) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7f0bf87694e0) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7f0bf86f4d68) + +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 (0x0x7f0bf86f4dd0) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7f0bf8769540) 0 + primary-for QDeferredDeleteEvent (0x0x7f0bf86f4dd0) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7f0bf8769600) 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 (0x0x7f0bf86f4e38) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7f0bf87695a0) 0 + primary-for QCoreApplication (0x0x7f0bf86f4e38) + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7f0bf8769660) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7f0bf87696c0) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7f0bf8769cc0) 0 + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7f0bf8769d20) 0 + +Class QtPrivate::StreamStateSaver + size=16 align=8 + base size=12 base align=8 +QtPrivate::StreamStateSaver (0x0x7f0bf8769de0) 0 + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7f0bf8848300) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7f0bf88485a0) 0 + +Class QDateTime::ShortData + size=8 align=8 + base size=8 base align=8 +QDateTime::ShortData (0x0x7f0bf8848d20) 0 + +Class QDateTime::Data + size=8 align=8 + base size=8 base align=8 +QDateTime::Data (0x0x7f0bf8848d80) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7f0bf8848cc0) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7f0bf8557ea0) 0 + +Class QDeadlineTimer + size=16 align=8 + base size=16 base align=8 +QDeadlineTimer (0x0x7f0bf85943c0) 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 (0x0x7f0bf82c1360) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7f0bf82c1600) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7f0bf82c1840) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7f0bf82c19c0) 0 + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7f0bf82c1f00) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7f0bf82c1ea0) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7f0bf814b420) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7f0bf814b4e0) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7f0bf8209660) 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 (0x0x7f0bf8201068) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7f0bf8201410) 0 + primary-for QFileDevice (0x0x7f0bf8201068) + QObject (0x0x7f0bf8209600) 0 + primary-for QIODevice (0x0x7f0bf8201410) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7f0bf82098a0) 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 (0x0x7f0bf8201750) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7f0bf82018f0) 0 + primary-for QFile (0x0x7f0bf8201750) + QIODevice (0x0x7f0bf8201af8) 0 + primary-for QFileDevice (0x0x7f0bf82018f0) + QObject (0x0x7f0bf8209840) 0 + primary-for QIODevice (0x0x7f0bf8201af8) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7f0bf8209a80) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7f0bf8209ea0) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7f0bf7ef78a0) 0 + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7f0bf7ef7ae0) 0 + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7f0bf801df00) 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 (0x0x7f0bf8032208) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7f0bf8032270) 0 + primary-for QEventTransition (0x0x7f0bf8032208) + QObject (0x0x7f0bf801dea0) 0 + primary-for QAbstractTransition (0x0x7f0bf8032270) + +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 (0x0x7f0bf80322d8) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7f0bf801df60) 0 nearly-empty + primary-for QException (0x0x7f0bf80322d8) + +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 (0x0x7f0bf8032340) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7f0bf80323a8) 0 nearly-empty + primary-for QUnhandledException (0x0x7f0bf8032340) + std::exception (0x0x7f0bf7c85000) 0 nearly-empty + primary-for QException (0x0x7f0bf80323a8) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7f0bf7c85060) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7f0bf7c85120) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7f0bf7c85180) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7f0bf7c852a0) 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 (0x0x7f0bf8032410) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7f0bf7c85240) 0 + primary-for QFileSelector (0x0x7f0bf8032410) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7f0bf7c85360) 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 (0x0x7f0bf8032478) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7f0bf7c85300) 0 + primary-for QFileSystemWatcher (0x0x7f0bf8032478) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7f0bf7c85420) 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 (0x0x7f0bf80324e0) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7f0bf8032548) 0 + primary-for QFinalState (0x0x7f0bf80324e0) + QObject (0x0x7f0bf7c853c0) 0 + primary-for QAbstractState (0x0x7f0bf8032548) + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7f0bf7c85480) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7f0bf7c854e0) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7f0bf8032680) 0 + QBasicMutex (0x0x7f0bf7c856c0) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7f0bf7c85720) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7f0bf7c85780) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7f0bf7c857e0) 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 (0x0x7f0bf7c85900) 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 (0x0x7f0bf7dbe180) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7f0bf7dbe960) 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 0u +48 0u +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 (0x0x7f0bf7dd57b8) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7f0bf7dbe900) 0 + primary-for QFutureWatcherBase (0x0x7f0bf7dd57b8) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7f0bf7dbef60) 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 (0x0x7f0bf7a9c0d0) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7f0bf7a9c138) 0 + primary-for QHistoryState (0x0x7f0bf7a9c0d0) + QObject (0x0x7f0bf7dbef00) 0 + primary-for QAbstractState (0x0x7f0bf7a9c138) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7f0bf7ab4060) 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 (0x0x7f0bf7a9c1a0) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7f0bf7a9c208) 0 + primary-for QIdentityProxyModel (0x0x7f0bf7a9c1a0) + QAbstractItemModel (0x0x7f0bf7a9c270) 0 + primary-for QAbstractProxyModel (0x0x7f0bf7a9c208) + QObject (0x0x7f0bf7ab4000) 0 + primary-for QAbstractItemModel (0x0x7f0bf7a9c270) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7f0bf7ab40c0) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7f0bf7ab4780) 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 (0x0x7f0bf7a9ca90) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7f0bf7ab4720) 0 + primary-for QItemSelectionModel (0x0x7f0bf7a9ca90) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7f0bf7a9cc98) 0 + QList (0x0x7f0bf7a9cd00) 0 + QListSpecialMethods (0x0x7f0bf7ab4a80) 0 empty + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7f0bf7ab4f60) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7f0bf79056c0) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7f0bf7905c00) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7f0bf7905c60) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7f0bf7905e40) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7f0bf7905ea0) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7f0bf7905de0) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7f0bf7651120) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7f0bf7651180) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7f0bf76517e0) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7f0bf7651840) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7f0bf7651780) 0 + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7f0bf7728ae0) 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 (0x0x7f0bf7765068) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7f0bf7728a80) 0 + primary-for QLibrary (0x0x7f0bf7765068) + +Class QVersionNumber::SegmentStorage + size=8 align=8 + base size=8 base align=8 +QVersionNumber::SegmentStorage (0x0x7f0bf77b31e0) 0 + +Class QVersionNumber + size=8 align=8 + base size=8 base align=8 +QVersionNumber (0x0x7f0bf7728cc0) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7f0bf77b36c0) 0 empty + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7f0bf77b3720) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7f0bf77b39c0) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7f0bf77b3c60) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7f0bf74a5600) 0 + +Class QLinkedListData + size=32 align=8 + base size=25 base align=8 +QLinkedListData (0x0x7f0bf74a5f60) 0 + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7f0bf753d300) 0 + +Class QLoggingCategory::AtomicBools + size=4 align=1 + base size=4 base align=1 +QLoggingCategory::AtomicBools (0x0x7f0bf753d480) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7f0bf753d420) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7f0bf753d600) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7f0bf753d8a0) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7f0bf753df00) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7f0bf753df60) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7f0bf730b5a0) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7f0bf730b8a0) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7f0bf730b900) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7f0bf730bc00) 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 (0x0x7f0bf73272d8) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7f0bf730bba0) 0 + primary-for QMimeData (0x0x7f0bf73272d8) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7f0bf730bc60) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7f0bf730bf60) 0 + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7f0bf7377060) 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 (0x0x7f0bf73274e0) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7f0bf7377000) 0 + primary-for QObjectCleanupHandler (0x0x7f0bf73274e0) + +Class QOperatingSystemVersion + size=16 align=4 + base size=16 base align=4 +QOperatingSystemVersion (0x0x7f0bf73770c0) 0 + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7f0bf7377840) 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 (0x0x7f0bf7327c30) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7f0bf7327c98) 0 + primary-for QParallelAnimationGroup (0x0x7f0bf7327c30) + QAbstractAnimation (0x0x7f0bf7327d00) 0 + primary-for QAnimationGroup (0x0x7f0bf7327c98) + QObject (0x0x7f0bf73777e0) 0 + primary-for QAbstractAnimation (0x0x7f0bf7327d00) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7f0bf7377900) 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 (0x0x7f0bf7327d68) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7f0bf7327dd0) 0 + primary-for QPauseAnimation (0x0x7f0bf7327d68) + QObject (0x0x7f0bf73778a0) 0 + primary-for QAbstractAnimation (0x0x7f0bf7327dd0) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7f0bf7377ae0) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7f0bf7377de0) 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 (0x0x7f0bf7327548) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7f0bf7377d80) 0 + primary-for QPluginLoader (0x0x7f0bf7327548) + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7f0bf7377e40) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7f0bf7419540) 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 (0x0x7f0bf741a618) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7f0bf741a680) 0 + primary-for QProcess (0x0x7f0bf741a618) + QObject (0x0x7f0bf74194e0) 0 + primary-for QIODevice (0x0x7f0bf741a680) + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7f0bf7419600) 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 (0x0x7f0bf741a6e8) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7f0bf741a750) 0 + primary-for QVariantAnimation (0x0x7f0bf741a6e8) + QObject (0x0x7f0bf74195a0) 0 + primary-for QAbstractAnimation (0x0x7f0bf741a750) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7f0bf74196c0) 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 (0x0x7f0bf741a820) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7f0bf741a888) 0 + primary-for QPropertyAnimation (0x0x7f0bf741a820) + QAbstractAnimation (0x0x7f0bf741a8f0) 0 + primary-for QVariantAnimation (0x0x7f0bf741a888) + QObject (0x0x7f0bf7419660) 0 + primary-for QAbstractAnimation (0x0x7f0bf741a8f0) + +Class QRandomGenerator::Storage + size=2504 align=8 + base size=2504 base align=8 +QRandomGenerator::Storage (0x0x7f0bf74197e0) 0 + +Class QRandomGenerator + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator (0x0x7f0bf7419780) 0 + +Class QRandomGenerator64 + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator64 (0x0x7f0bf70f8bc8) 0 + QRandomGenerator (0x0x7f0bf7102780) 0 + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7f0bf7102840) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7f0bf7102ae0) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7f0bf7102ba0) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7f0bf7102c60) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7f0bf7102f00) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7f0bf721c1e0) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7f0bf721c480) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7f0bf721c720) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7f0bf721cd20) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7f0bf7003060) 0 + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7f0bf7003360) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7f0bf70034e0) 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 (0x0x7f0bf7206dd0) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7f0bf7206e38) 0 + primary-for QSaveFile (0x0x7f0bf7206dd0) + QIODevice (0x0x7f0bf7206ea0) 0 + primary-for QFileDevice (0x0x7f0bf7206e38) + QObject (0x0x7f0bf7003480) 0 + primary-for QIODevice (0x0x7f0bf7206ea0) + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7f0bf70035a0) 0 + +Class QSemaphoreReleaser + size=16 align=8 + base size=12 base align=8 +QSemaphoreReleaser (0x0x7f0bf7003600) 0 + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7f0bf6d1cc00) 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 (0x0x7f0bf6d336e8) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7f0bf6d33750) 0 + primary-for QSequentialAnimationGroup (0x0x7f0bf6d336e8) + QAbstractAnimation (0x0x7f0bf6d337b8) 0 + primary-for QAnimationGroup (0x0x7f0bf6d33750) + QObject (0x0x7f0bf6d1cba0) 0 + primary-for QAbstractAnimation (0x0x7f0bf6d337b8) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7f0bf6d1ccc0) 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 (0x0x7f0bf6d33820) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7f0bf6d1cc60) 0 + primary-for QSettings (0x0x7f0bf6d33820) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7f0bf6d1cd80) 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 (0x0x7f0bf6d33888) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7f0bf6d1cd20) 0 + primary-for QSharedMemory (0x0x7f0bf6d33888) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7f0bf6d1ce40) 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 (0x0x7f0bf6d338f0) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7f0bf6d1cde0) 0 + primary-for QSignalMapper (0x0x7f0bf6d338f0) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7f0bf6d1cf00) 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 (0x0x7f0bf6d33958) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7f0bf6d339c0) 0 + primary-for QSignalTransition (0x0x7f0bf6d33958) + QObject (0x0x7f0bf6d1cea0) 0 + primary-for QAbstractTransition (0x0x7f0bf6d339c0) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7f0bf6dac000) 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 (0x0x7f0bf6d33a28) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7f0bf6d1cf60) 0 + primary-for QSocketNotifier (0x0x7f0bf6d33a28) + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7f0bf6dac0c0) 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 (0x0x7f0bf6d33a90) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7f0bf6d33af8) 0 + primary-for QSortFilterProxyModel (0x0x7f0bf6d33a90) + QAbstractItemModel (0x0x7f0bf6d33b60) 0 + primary-for QAbstractProxyModel (0x0x7f0bf6d33af8) + QObject (0x0x7f0bf6dac060) 0 + primary-for QAbstractItemModel (0x0x7f0bf6d33b60) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7f0bf6dac180) 0 empty + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7f0bf6dac3c0) 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 (0x0x7f0bf6d33d00) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7f0bf6d33d68) 0 + primary-for QState (0x0x7f0bf6d33d00) + QObject (0x0x7f0bf6dac360) 0 + primary-for QAbstractState (0x0x7f0bf6d33d68) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7f0bf6dac4e0) 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 (0x0x7f0bf6d33f08) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7f0bf6dac540) 0 + primary-for QStateMachine::SignalEvent (0x0x7f0bf6d33f08) + +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 (0x0x7f0bf6d33f70) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7f0bf6dac5a0) 0 + primary-for QStateMachine::WrappedEvent (0x0x7f0bf6d33f70) + +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 (0x0x7f0bf6d33dd0) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7f0bf6d33e38) 0 + primary-for QStateMachine (0x0x7f0bf6d33dd0) + QAbstractState (0x0x7f0bf6d33ea0) 0 + primary-for QState (0x0x7f0bf6d33e38) + QObject (0x0x7f0bf6dac480) 0 + primary-for QAbstractState (0x0x7f0bf6d33ea0) + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7f0bf6dac600) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7f0bf6a9e540) 0 empty + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7f0bf6b2e060) 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 (0x0x7f0bf6b02478) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7f0bf6b024e0) 0 + primary-for QStringListModel (0x0x7f0bf6b02478) + QAbstractItemModel (0x0x7f0bf6b02548) 0 + primary-for QAbstractListModel (0x0x7f0bf6b024e0) + QObject (0x0x7f0bf6b2e000) 0 + primary-for QAbstractItemModel (0x0x7f0bf6b02548) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7f0bf6b2e0c0) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7f0bf6b2e180) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7f0bf6b2e2a0) 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 (0x0x7f0bf6b025b0) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7f0bf6b02618) 0 + primary-for QTemporaryFile (0x0x7f0bf6b025b0) + QFileDevice (0x0x7f0bf6b02680) 0 + primary-for QFile (0x0x7f0bf6b02618) + QIODevice (0x0x7f0bf6b026e8) 0 + primary-for QFileDevice (0x0x7f0bf6b02680) + QObject (0x0x7f0bf6b2e240) 0 + primary-for QIODevice (0x0x7f0bf6b026e8) + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7f0bf6b2e300) 0 + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7f0bf6b2e540) 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 0u +64 0u + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7f0bf6b2e4e0) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7f0bf6b2e720) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7f0bf6b2e780) 0 + +Class std::__mutex_base + size=40 align=8 + base size=40 base align=8 +std::__mutex_base (0x0x7f0bf6b2e7e0) 0 + +Class std::__recursive_mutex_base + size=40 align=8 + base size=40 base align=8 +std::__recursive_mutex_base (0x0x7f0bf6b2e840) 0 + +Class std::mutex + size=40 align=8 + base size=40 base align=8 +std::mutex (0x0x7f0bf6b028f0) 0 + std::__mutex_base (0x0x7f0bf6b2e8a0) 0 + +Class std::recursive_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_mutex (0x0x7f0bf6b02958) 0 + std::__recursive_mutex_base (0x0x7f0bf6b2e900) 0 + +Class std::timed_mutex + size=40 align=8 + base size=40 base align=8 +std::timed_mutex (0x0x7f0bf6c13700) 0 + std::__mutex_base (0x0x7f0bf6b2ea20) 0 + std::__timed_mutex_impl (0x0x7f0bf6b2ea80) 0 empty + +Class std::recursive_timed_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_timed_mutex (0x0x7f0bf6c2d380) 0 + std::__recursive_mutex_base (0x0x7f0bf6b2eb40) 0 + std::__timed_mutex_impl (0x0x7f0bf6b2eba0) 0 empty + +Class std::defer_lock_t + size=1 align=1 + base size=0 base align=1 +std::defer_lock_t (0x0x7f0bf6b2ec00) 0 empty + +Class std::try_to_lock_t + size=1 align=1 + base size=0 base align=1 +std::try_to_lock_t (0x0x7f0bf6b2ec60) 0 empty + +Class std::adopt_lock_t + size=1 align=1 + base size=0 base align=1 +std::adopt_lock_t (0x0x7f0bf6b2ecc0) 0 empty + +Class std::once_flag + size=4 align=4 + base size=4 base align=4 +std::once_flag (0x0x7f0bf6b2ef00) 0 + +Vtable for __gnu_cxx::__concurrence_lock_error +__gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_lock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +24 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +32 (int (*)(...))__gnu_cxx::__concurrence_lock_error::what + +Class __gnu_cxx::__concurrence_lock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_lock_error (0x0x7f0bf6b02a90) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE) + 16u) + std::exception (0x0x7f0bf6881000) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_lock_error (0x0x7f0bf6b02a90) + +Vtable for __gnu_cxx::__concurrence_unlock_error +__gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx26__concurrence_unlock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +24 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +32 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::what + +Class __gnu_cxx::__concurrence_unlock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_unlock_error (0x0x7f0bf6b02af8) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE) + 16u) + std::exception (0x0x7f0bf68810c0) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_unlock_error (0x0x7f0bf6b02af8) + +Vtable for __gnu_cxx::__concurrence_broadcast_error +__gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx29__concurrence_broadcast_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +24 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +32 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::what + +Class __gnu_cxx::__concurrence_broadcast_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_broadcast_error (0x0x7f0bf6b02b60) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE) + 16u) + std::exception (0x0x7f0bf6881180) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_broadcast_error (0x0x7f0bf6b02b60) + +Vtable for __gnu_cxx::__concurrence_wait_error +__gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_wait_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +24 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +32 (int (*)(...))__gnu_cxx::__concurrence_wait_error::what + +Class __gnu_cxx::__concurrence_wait_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_wait_error (0x0x7f0bf6b02c30) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE) + 16u) + std::exception (0x0x7f0bf6881240) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_wait_error (0x0x7f0bf6b02c30) + +Class __gnu_cxx::__mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__mutex (0x0x7f0bf6881300) 0 + +Class __gnu_cxx::__recursive_mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__recursive_mutex (0x0x7f0bf6881360) 0 + +Class __gnu_cxx::__scoped_lock + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__scoped_lock (0x0x7f0bf68813c0) 0 + +Class __gnu_cxx::__cond + size=48 align=8 + base size=48 base align=8 +__gnu_cxx::__cond (0x0x7f0bf6881420) 0 + +Vtable for std::bad_weak_ptr +std::bad_weak_ptr::_ZTVSt12bad_weak_ptr: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12bad_weak_ptr) +16 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +24 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +32 (int (*)(...))std::bad_weak_ptr::what + +Class std::bad_weak_ptr + size=8 align=8 + base size=8 base align=8 +std::bad_weak_ptr (0x0x7f0bf6b02f08) 0 nearly-empty + vptr=((& std::bad_weak_ptr::_ZTVSt12bad_weak_ptr) + 16u) + std::exception (0x0x7f0bf6881780) 0 nearly-empty + primary-for std::bad_weak_ptr (0x0x7f0bf6b02f08) + +Class std::_Sp_make_shared_tag + size=1 align=1 + base size=0 base align=1 +std::_Sp_make_shared_tag (0x0x7f0bf69b8000) 0 empty + +Class std::_Sp_locker + size=2 align=1 + base size=2 base align=1 +std::_Sp_locker (0x0x7f0bf69b87e0) 0 + +Class std::thread::id + size=8 align=8 + base size=8 base align=8 +std::thread::id (0x0x7f0bf69b89c0) 0 + +Vtable for std::thread::_Impl_base +std::thread::_Impl_base::_ZTVNSt6thread10_Impl_baseE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6thread10_Impl_baseE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class std::thread::_Impl_base + size=24 align=8 + base size=24 base align=8 +std::thread::_Impl_base (0x0x7f0bf69b8a20) 0 + vptr=((& std::thread::_Impl_base::_ZTVNSt6thread10_Impl_baseE) + 16u) + +Class std::thread + size=8 align=8 + base size=8 base align=8 +std::thread (0x0x7f0bf69b8960) 0 + +Class std::condition_variable + size=48 align=8 + base size=48 base align=8 +std::condition_variable (0x0x7f0bf6733660) 0 + +Class std::__at_thread_exit_elt + size=16 align=8 + base size=16 base align=8 +std::__at_thread_exit_elt (0x0x7f0bf6733720) 0 + +Class std::_V2::condition_variable_any + size=64 align=8 + base size=64 base align=8 +std::_V2::condition_variable_any (0x0x7f0bf6733780) 0 + +Class std::__atomic_futex_unsigned_base + size=1 align=1 + base size=0 base align=1 +std::__atomic_futex_unsigned_base (0x0x7f0bf63bede0) 0 empty + +Vtable for std::future_error +std::future_error::_ZTVSt12future_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12future_error) +16 (int (*)(...))std::future_error::~future_error +24 (int (*)(...))std::future_error::~future_error +32 (int (*)(...))std::future_error::what + +Class std::future_error + size=32 align=8 + base size=32 base align=8 +std::future_error (0x0x7f0bf6439270) 0 + vptr=((& std::future_error::_ZTVSt12future_error) + 16u) + std::logic_error (0x0x7f0bf64392d8) 0 + primary-for std::future_error (0x0x7f0bf6439270) + std::exception (0x0x7f0bf63bef00) 0 nearly-empty + primary-for std::logic_error (0x0x7f0bf64392d8) + +Class std::__future_base::_Result_base::_Deleter + size=1 align=1 + base size=0 base align=1 +std::__future_base::_Result_base::_Deleter (0x0x7f0bf6474060) 0 empty + +Vtable for std::__future_base::_Result_base +std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base12_Result_baseE) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class std::__future_base::_Result_base + size=16 align=8 + base size=16 base align=8 +std::__future_base::_Result_base (0x0x7f0bf6474000) 0 + vptr=((& std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE) + 16u) + +Class std::__future_base::_State_baseV2::__exception_ptr_tag + size=1 align=1 + base size=0 base align=1 +std::__future_base::_State_baseV2::__exception_ptr_tag (0x0x7f0bf61705a0) 0 empty + +Class std::__future_base::_State_baseV2::_Make_ready + size=32 align=8 + base size=32 base align=8 +std::__future_base::_State_baseV2::_Make_ready (0x0x7f0bf6167888) 0 + std::__at_thread_exit_elt (0x0x7f0bf6170660) 0 + +Vtable for std::__future_base::_State_baseV2 +std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base13_State_baseV2E) +16 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +24 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +32 (int (*)(...))std::__future_base::_State_baseV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_State_baseV2 + size=32 align=8 + base size=28 base align=8 +std::__future_base::_State_baseV2 (0x0x7f0bf64741e0) 0 + vptr=((& std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E) + 16u) + +Class std::__future_base + size=1 align=1 + base size=0 base align=1 +std::__future_base (0x0x7f0bf63bef60) 0 empty + +Vtable for std::__future_base::_Async_state_commonV2 +std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base21_Async_state_commonV2E) +16 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +24 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +32 (int (*)(...))std::__future_base::_Async_state_commonV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_Async_state_commonV2 + size=48 align=8 + base size=44 base align=8 +std::__future_base::_Async_state_commonV2 (0x0x7f0bf5ed0478) 0 + vptr=((& std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E) + 16u) + std::__future_base::_State_baseV2 (0x0x7f0bf5ec9540) 0 + primary-for std::__future_base::_Async_state_commonV2 (0x0x7f0bf5ed0478) + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7f0bf5ec9c60) 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 (0x0x7f0bf5ed0f08) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7f0bf5ec9c00) 0 + primary-for QThread (0x0x7f0bf5ed0f08) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7f0bf5ec9d80) 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 (0x0x7f0bf5ed0f70) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7f0bf5ec9d20) 0 + primary-for QThreadPool (0x0x7f0bf5ed0f70) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7f0bf5ec9de0) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7f0bf5ec9f00) 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 (0x0x7f0bf5b87000) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7f0bf5ec9ea0) 0 + primary-for QTimeLine (0x0x7f0bf5b87000) + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7f0bf5ba3000) 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 (0x0x7f0bf5b87068) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7f0bf5ec9f60) 0 + primary-for QTimer (0x0x7f0bf5b87068) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7f0bf5ba36c0) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7f0bf5ba3660) 0 + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7f0bf5ba3c60) 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 (0x0x7f0bf5b87af8) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7f0bf5ba3c00) 0 + primary-for QTranslator (0x0x7f0bf5b87af8) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7f0bf5ba3d80) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7f0bf5d2a480) 0 + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7f0bf5d2aae0) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7f0bf59e8120) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7f0bf59e8180) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7f0bf59e8480) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7f0bf5a295b0) 0 + QVector (0x0x7f0bf59e8840) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7f0bf59e88a0) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7f0bf59e8b40) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7f0bf59e8de0) 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 (0x0x7f0bf5b010c0) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7f0bf5b01120) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7f0bf5b01b40) 0 + +Class QBluetoothAddress + size=8 align=8 + base size=8 base align=8 +QBluetoothAddress (0x0x7f0bf5b01f60) 0 + +Class QBluetoothDeviceInfo + size=8 align=8 + base size=8 base align=8 +QBluetoothDeviceInfo (0x0x7f0bf57df120) 0 + +Class QBluetoothDeviceDiscoveryAgent::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothDeviceDiscoveryAgent::QPrivateSignal (0x0x7f0bf57df600) 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 (0x0x7f0bf572e9c0) 0 + vptr=((& QBluetoothDeviceDiscoveryAgent::_ZTV30QBluetoothDeviceDiscoveryAgent) + 16u) + QObject (0x0x7f0bf57df5a0) 0 + primary-for QBluetoothDeviceDiscoveryAgent (0x0x7f0bf572e9c0) + +Class QBluetoothHostInfo + size=8 align=8 + base size=8 base align=8 +QBluetoothHostInfo (0x0x7f0bf57df7e0) 0 + +Class QBluetoothLocalDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothLocalDevice::QPrivateSignal (0x0x7f0bf57df9c0) 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 (0x0x7f0bf572eaf8) 0 + vptr=((& QBluetoothLocalDevice::_ZTV21QBluetoothLocalDevice) + 16u) + QObject (0x0x7f0bf57df960) 0 + primary-for QBluetoothLocalDevice (0x0x7f0bf572eaf8) + +Class quint128 + size=16 align=1 + base size=16 base align=1 +quint128 (0x0x7f0bf57dfd80) 0 + +Class QBluetoothUuid + size=16 align=4 + base size=16 base align=4 +QBluetoothUuid (0x0x7f0bf572eb60) 0 + QUuid (0x0x7f0bf57dfde0) 0 + +Class QBluetoothServiceInfo::Sequence + size=8 align=8 + base size=8 base align=8 +QBluetoothServiceInfo::Sequence (0x0x7f0bf572ebc8) 0 + QList (0x0x7f0bf572ec30) 0 + QListSpecialMethods (0x0x7f0bf59220c0) 0 empty + +Class QBluetoothServiceInfo::Alternative + size=8 align=8 + base size=8 base align=8 +QBluetoothServiceInfo::Alternative (0x0x7f0bf572ec98) 0 + QList (0x0x7f0bf572ed00) 0 + QListSpecialMethods (0x0x7f0bf5922120) 0 empty + +Class QBluetoothServiceInfo + size=16 align=8 + base size=16 base align=8 +QBluetoothServiceInfo (0x0x7f0bf5922060) 0 + +Class QAbstractSocket::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractSocket::QPrivateSignal (0x0x7f0bf59225a0) 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 (0x0x7f0bf572ef70) 0 + vptr=((& QAbstractSocket::_ZTV15QAbstractSocket) + 16u) + QIODevice (0x0x7f0bf5598000) 0 + primary-for QAbstractSocket (0x0x7f0bf572ef70) + QObject (0x0x7f0bf5922540) 0 + primary-for QIODevice (0x0x7f0bf5598000) + +Class QBluetoothSocket::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothSocket::QPrivateSignal (0x0x7f0bf5922ba0) 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 (0x0x7f0bf5598208) 0 + vptr=((& QBluetoothSocket::_ZTV16QBluetoothSocket) + 16u) + QIODevice (0x0x7f0bf5598270) 0 + primary-for QBluetoothSocket (0x0x7f0bf5598208) + QObject (0x0x7f0bf5922b40) 0 + primary-for QIODevice (0x0x7f0bf5598270) + +Class QBluetoothServer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothServer::QPrivateSignal (0x0x7f0bf5922c60) 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 (0x0x7f0bf55982d8) 0 + vptr=((& QBluetoothServer::_ZTV16QBluetoothServer) + 16u) + QObject (0x0x7f0bf5922c00) 0 + primary-for QBluetoothServer (0x0x7f0bf55982d8) + +Class QBluetoothServiceDiscoveryAgent::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothServiceDiscoveryAgent::QPrivateSignal (0x0x7f0bf5922d20) 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 (0x0x7f0bf5598340) 0 + vptr=((& QBluetoothServiceDiscoveryAgent::_ZTV31QBluetoothServiceDiscoveryAgent) + 16u) + QObject (0x0x7f0bf5922cc0) 0 + primary-for QBluetoothServiceDiscoveryAgent (0x0x7f0bf5598340) + +Class QBluetoothTransferManager::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothTransferManager::QPrivateSignal (0x0x7f0bf5922de0) 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 (0x0x7f0bf55983a8) 0 + vptr=((& QBluetoothTransferManager::_ZTV25QBluetoothTransferManager) + 16u) + QObject (0x0x7f0bf5922d80) 0 + primary-for QBluetoothTransferManager (0x0x7f0bf55983a8) + +Class QBluetoothTransferRequest + size=8 align=8 + base size=8 base align=8 +QBluetoothTransferRequest (0x0x7f0bf5922e40) 0 + +Class QBluetoothTransferReply::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothTransferReply::QPrivateSignal (0x0x7f0bf5922f00) 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 0u +48 0u +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 (0x0x7f0bf5598410) 0 + vptr=((& QBluetoothTransferReply::_ZTV23QBluetoothTransferReply) + 16u) + QObject (0x0x7f0bf5922ea0) 0 + primary-for QBluetoothTransferReply (0x0x7f0bf5598410) + +Class QLowEnergyAdvertisingData + size=8 align=8 + base size=8 base align=8 +QLowEnergyAdvertisingData (0x0x7f0bf56b60c0) 0 + +Class QLowEnergyDescriptor + size=24 align=8 + base size=24 base align=8 +QLowEnergyDescriptor (0x0x7f0bf56b6720) 0 + +Class QLowEnergyCharacteristic + size=24 align=8 + base size=24 base align=8 +QLowEnergyCharacteristic (0x0x7f0bf56b6900) 0 + +Class QLowEnergyService::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLowEnergyService::QPrivateSignal (0x0x7f0bf56b6c60) 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 (0x0x7f0bf5598b60) 0 + vptr=((& QLowEnergyService::_ZTV17QLowEnergyService) + 16u) + QObject (0x0x7f0bf56b6c00) 0 + primary-for QLowEnergyService (0x0x7f0bf5598b60) + +Class QLowEnergyController::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLowEnergyController::QPrivateSignal (0x0x7f0bf53af360) 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 (0x0x7f0bf5598c98) 0 + vptr=((& QLowEnergyController::_ZTV20QLowEnergyController) + 16u) + QObject (0x0x7f0bf53af300) 0 + primary-for QLowEnergyController (0x0x7f0bf5598c98) + +Class QLowEnergyAdvertisingParameters::AddressInfo + size=16 align=8 + base size=12 base align=8 +QLowEnergyAdvertisingParameters::AddressInfo (0x0x7f0bf53af8a0) 0 + +Class QLowEnergyAdvertisingParameters + size=8 align=8 + base size=8 base align=8 +QLowEnergyAdvertisingParameters (0x0x7f0bf53af840) 0 + +Class QLowEnergyCharacteristicData + size=8 align=8 + base size=8 base align=8 +QLowEnergyCharacteristicData (0x0x7f0bf543d840) 0 + +Class QLowEnergyConnectionParameters + size=8 align=8 + base size=8 base align=8 +QLowEnergyConnectionParameters (0x0x7f0bf543dea0) 0 + +Class QLowEnergyDescriptorData + size=8 align=8 + base size=8 base align=8 +QLowEnergyDescriptorData (0x0x7f0bf5492660) 0 + +Class QLowEnergyServiceData + size=8 align=8 + base size=8 base align=8 +QLowEnergyServiceData (0x0x7f0bf5492cc0) 0 + diff --git a/tests/auto/bic/data/QtNfc.5.10.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtNfc.5.10.0.linux-gcc-amd64.txt new file mode 100644 index 00000000..c9a39b66 --- /dev/null +++ b/tests/auto/bic/data/QtNfc.5.10.0.linux-gcc-amd64.txt @@ -0,0 +1,4754 @@ +Class std::__failure_type + size=1 align=1 + base size=0 base align=1 +std::__failure_type (0x0x7ffb4a1ffb40) 0 empty + +Class std::__do_is_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_destructible_impl (0x0x7ffb4a2ca300) 0 empty + +Class std::__do_is_nt_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nt_destructible_impl (0x0x7ffb4a2ca540) 0 empty + +Class std::__do_is_default_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_default_constructible_impl (0x0x7ffb4a2ca780) 0 empty + +Class std::__do_is_static_castable_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_static_castable_impl (0x0x7ffb4a2ca9c0) 0 empty + +Class std::__do_is_direct_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_direct_constructible_impl (0x0x7ffb4a2cab40) 0 empty + +Class std::__do_is_nary_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nary_constructible_impl (0x0x7ffb4a2caf00) 0 empty + +Class std::__do_common_type_impl + size=1 align=1 + base size=0 base align=1 +std::__do_common_type_impl (0x0x7ffb47f866c0) 0 empty + +Class std::__do_member_type_wrapper + size=1 align=1 + base size=0 base align=1 +std::__do_member_type_wrapper (0x0x7ffb47f86780) 0 empty + +Class std::__result_of_memfun_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_ref_impl (0x0x7ffb47f86ae0) 0 empty + +Class std::__result_of_memfun_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_deref_impl (0x0x7ffb47f86ba0) 0 empty + +Class std::__result_of_memobj_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_ref_impl (0x0x7ffb47f86c60) 0 empty + +Class std::__result_of_memobj_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_deref_impl (0x0x7ffb47f86d20) 0 empty + +Class std::__result_of_other_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_other_impl (0x0x7ffb47fc2000) 0 empty + +Class std::piecewise_construct_t + size=1 align=1 + base size=0 base align=1 +std::piecewise_construct_t (0x0x7ffb47fc21e0) 0 empty + +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7ffb47fc2660) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7ffb47fc26c0) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7ffb48066360) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7ffb480663c0) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7ffb47f72888) 0 empty + std::input_iterator_tag (0x0x7ffb48066420) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7ffb47f728f0) 0 empty + std::forward_iterator_tag (0x0x7ffb47f72958) 0 empty + std::input_iterator_tag (0x0x7ffb48066480) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7ffb47f729c0) 0 empty + std::bidirectional_iterator_tag (0x0x7ffb47f72a28) 0 empty + std::forward_iterator_tag (0x0x7ffb47f72a90) 0 empty + std::input_iterator_tag (0x0x7ffb480664e0) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_iter (0x0x7ffb480d0180) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_val (0x0x7ffb480d01e0) 0 empty + +Class __gnu_cxx::__ops::_Val_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Val_less_iter (0x0x7ffb480d0240) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_iter (0x0x7ffb480d02a0) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_val (0x0x7ffb480d0300) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7ffb480d0de0) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7ffb47dd0060) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7ffb47dd0120) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7ffb47dd0180) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7ffb47dd0240) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7ffb47dd02a0) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7ffb47dd0720) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7ffb47dd0780) 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 (0x0x7ffb47dd07e0) 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 (0x0x7ffb47ead000) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7ffb47dd0840) 0 nearly-empty + primary-for std::bad_exception (0x0x7ffb47ead000) + +Class std::__exception_ptr::exception_ptr + size=8 align=8 + base size=8 base align=8 +std::__exception_ptr::exception_ptr (0x0x7ffb47dd08a0) 0 + +Vtable for std::nested_exception +std::nested_exception::_ZTVSt16nested_exception: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16nested_exception) +16 (int (*)(...))std::nested_exception::~nested_exception +24 (int (*)(...))std::nested_exception::~nested_exception + +Class std::nested_exception + size=16 align=8 + base size=16 base align=8 +std::nested_exception (0x0x7ffb47dd0900) 0 + vptr=((& std::nested_exception::_ZTVSt16nested_exception) + 16u) + +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 (0x0x7ffb47ead208) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7ffb47dd0d20) 0 nearly-empty + primary-for std::bad_alloc (0x0x7ffb47ead208) + +Vtable for std::bad_array_new_length +std::bad_array_new_length::_ZTVSt20bad_array_new_length: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt20bad_array_new_length) +16 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +24 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +32 (int (*)(...))std::bad_array_new_length::what + +Class std::bad_array_new_length + size=8 align=8 + base size=8 base align=8 +std::bad_array_new_length (0x0x7ffb47ead270) 0 nearly-empty + vptr=((& std::bad_array_new_length::_ZTVSt20bad_array_new_length) + 16u) + std::bad_alloc (0x0x7ffb47ead2d8) 0 nearly-empty + primary-for std::bad_array_new_length (0x0x7ffb47ead270) + std::exception (0x0x7ffb47dd0d80) 0 nearly-empty + primary-for std::bad_alloc (0x0x7ffb47ead2d8) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7ffb47dd0de0) 0 empty + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7ffb47b09a20) 0 + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7ffb47938720) 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 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7ffb47938780) 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 (0x0x7ffb479e6660) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7ffb479e66c0) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7ffb479e6780) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7ffb479e67e0) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7ffb479e6840) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7ffb479e68a0) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7ffb479e69c0) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7ffb479e6a20) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7ffb479e6e40) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7ffb479e6ea0) 0 + +Class std::_Hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Hash_impl (0x0x7ffb475376c0) 0 empty + +Class std::_Fnv_hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Fnv_hash_impl (0x0x7ffb47537720) 0 empty + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7ffb4758e6c0) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7ffb473834e0) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7ffb47538888) 0 + std::iterator (0x0x7ffb473835a0) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7ffb47538b60) 0 + std::_Bit_iterator_base (0x0x7ffb47538bc8) 0 + std::iterator (0x0x7ffb47383600) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7ffb47472000) 0 + std::_Bit_iterator_base (0x0x7ffb47472068) 0 + std::iterator (0x0x7ffb47383660) 0 empty + +Class std::random_device + size=5000 align=8 + base size=5000 base align=8 +std::random_device (0x0x7ffb47193480) 0 + +Class std::bernoulli_distribution::param_type + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution::param_type (0x0x7ffb472bc240) 0 + +Class std::bernoulli_distribution + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution (0x0x7ffb472bc1e0) 0 + +Class std::seed_seq + size=24 align=8 + base size=24 base align=8 +std::seed_seq (0x0x7ffb470881e0) 0 + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7ffb45eddcc0) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7ffb45eddd20) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7ffb45c287e0) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7ffb45c28840) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7ffb45c288a0) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7ffb45c28900) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7ffb45c28ba0) 0 + +Class std::__atomic_flag_base + size=1 align=1 + base size=1 base align=1 +std::__atomic_flag_base (0x0x7ffb45caa120) 0 + +Class std::atomic_flag + size=1 align=1 + base size=1 base align=1 +std::atomic_flag (0x0x7ffb45c10f08) 0 + std::__atomic_flag_base (0x0x7ffb45caa180) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7ffb459fc680) 0 + QAtomicInteger (0x0x7ffb459fc6e8) 0 + QBasicAtomicInteger (0x0x7ffb4572d8a0) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7ffb45653e40) 0 empty + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7ffb45498ea0) 0 + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7ffb45104000) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7ffb450fc138) 0 + QGenericArgument (0x0x7ffb45104060) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7ffb451041e0) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7ffb451042a0) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7ffb451c2300) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7ffb451c2360) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7ffb451c2600) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7ffb451c2660) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7ffb451c29c0) 0 empty + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7ffb451c2a20) 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 (0x0x7ffb451c2a80) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7ffb451c2ae0) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7ffb451c2b40) 0 + +Class std::__cow_string + size=8 align=8 + base size=8 base align=8 +std::__cow_string (0x0x7ffb451c2f00) 0 + +Vtable for std::logic_error +std::logic_error::_ZTVSt11logic_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11logic_error) +16 (int (*)(...))std::logic_error::~logic_error +24 (int (*)(...))std::logic_error::~logic_error +32 (int (*)(...))std::logic_error::what + +Class std::logic_error + size=16 align=8 + base size=16 base align=8 +std::logic_error (0x0x7ffb452d5750) 0 + vptr=((& std::logic_error::_ZTVSt11logic_error) + 16u) + std::exception (0x0x7ffb44f6c000) 0 nearly-empty + primary-for std::logic_error (0x0x7ffb452d5750) + +Vtable for std::domain_error +std::domain_error::_ZTVSt12domain_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12domain_error) +16 (int (*)(...))std::domain_error::~domain_error +24 (int (*)(...))std::domain_error::~domain_error +32 (int (*)(...))std::logic_error::what + +Class std::domain_error + size=16 align=8 + base size=16 base align=8 +std::domain_error (0x0x7ffb452d57b8) 0 + vptr=((& std::domain_error::_ZTVSt12domain_error) + 16u) + std::logic_error (0x0x7ffb452d5820) 0 + primary-for std::domain_error (0x0x7ffb452d57b8) + std::exception (0x0x7ffb44f6c060) 0 nearly-empty + primary-for std::logic_error (0x0x7ffb452d5820) + +Vtable for std::invalid_argument +std::invalid_argument::_ZTVSt16invalid_argument: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16invalid_argument) +16 (int (*)(...))std::invalid_argument::~invalid_argument +24 (int (*)(...))std::invalid_argument::~invalid_argument +32 (int (*)(...))std::logic_error::what + +Class std::invalid_argument + size=16 align=8 + base size=16 base align=8 +std::invalid_argument (0x0x7ffb452d5888) 0 + vptr=((& std::invalid_argument::_ZTVSt16invalid_argument) + 16u) + std::logic_error (0x0x7ffb452d58f0) 0 + primary-for std::invalid_argument (0x0x7ffb452d5888) + std::exception (0x0x7ffb44f6c0c0) 0 nearly-empty + primary-for std::logic_error (0x0x7ffb452d58f0) + +Vtable for std::length_error +std::length_error::_ZTVSt12length_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12length_error) +16 (int (*)(...))std::length_error::~length_error +24 (int (*)(...))std::length_error::~length_error +32 (int (*)(...))std::logic_error::what + +Class std::length_error + size=16 align=8 + base size=16 base align=8 +std::length_error (0x0x7ffb452d5958) 0 + vptr=((& std::length_error::_ZTVSt12length_error) + 16u) + std::logic_error (0x0x7ffb452d59c0) 0 + primary-for std::length_error (0x0x7ffb452d5958) + std::exception (0x0x7ffb44f6c120) 0 nearly-empty + primary-for std::logic_error (0x0x7ffb452d59c0) + +Vtable for std::out_of_range +std::out_of_range::_ZTVSt12out_of_range: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12out_of_range) +16 (int (*)(...))std::out_of_range::~out_of_range +24 (int (*)(...))std::out_of_range::~out_of_range +32 (int (*)(...))std::logic_error::what + +Class std::out_of_range + size=16 align=8 + base size=16 base align=8 +std::out_of_range (0x0x7ffb452d5a28) 0 + vptr=((& std::out_of_range::_ZTVSt12out_of_range) + 16u) + std::logic_error (0x0x7ffb452d5a90) 0 + primary-for std::out_of_range (0x0x7ffb452d5a28) + std::exception (0x0x7ffb44f6c180) 0 nearly-empty + primary-for std::logic_error (0x0x7ffb452d5a90) + +Vtable for std::runtime_error +std::runtime_error::_ZTVSt13runtime_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13runtime_error) +16 (int (*)(...))std::runtime_error::~runtime_error +24 (int (*)(...))std::runtime_error::~runtime_error +32 (int (*)(...))std::runtime_error::what + +Class std::runtime_error + size=16 align=8 + base size=16 base align=8 +std::runtime_error (0x0x7ffb452d5af8) 0 + vptr=((& std::runtime_error::_ZTVSt13runtime_error) + 16u) + std::exception (0x0x7ffb44f6c1e0) 0 nearly-empty + primary-for std::runtime_error (0x0x7ffb452d5af8) + +Vtable for std::range_error +std::range_error::_ZTVSt11range_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11range_error) +16 (int (*)(...))std::range_error::~range_error +24 (int (*)(...))std::range_error::~range_error +32 (int (*)(...))std::runtime_error::what + +Class std::range_error + size=16 align=8 + base size=16 base align=8 +std::range_error (0x0x7ffb452d5b60) 0 + vptr=((& std::range_error::_ZTVSt11range_error) + 16u) + std::runtime_error (0x0x7ffb452d5bc8) 0 + primary-for std::range_error (0x0x7ffb452d5b60) + std::exception (0x0x7ffb44f6c240) 0 nearly-empty + primary-for std::runtime_error (0x0x7ffb452d5bc8) + +Vtable for std::overflow_error +std::overflow_error::_ZTVSt14overflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt14overflow_error) +16 (int (*)(...))std::overflow_error::~overflow_error +24 (int (*)(...))std::overflow_error::~overflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::overflow_error + size=16 align=8 + base size=16 base align=8 +std::overflow_error (0x0x7ffb452d5c30) 0 + vptr=((& std::overflow_error::_ZTVSt14overflow_error) + 16u) + std::runtime_error (0x0x7ffb452d5c98) 0 + primary-for std::overflow_error (0x0x7ffb452d5c30) + std::exception (0x0x7ffb44f6c2a0) 0 nearly-empty + primary-for std::runtime_error (0x0x7ffb452d5c98) + +Vtable for std::underflow_error +std::underflow_error::_ZTVSt15underflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt15underflow_error) +16 (int (*)(...))std::underflow_error::~underflow_error +24 (int (*)(...))std::underflow_error::~underflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::underflow_error + size=16 align=8 + base size=16 base align=8 +std::underflow_error (0x0x7ffb452d5d00) 0 + vptr=((& std::underflow_error::_ZTVSt15underflow_error) + 16u) + std::runtime_error (0x0x7ffb452d5d68) 0 + primary-for std::underflow_error (0x0x7ffb452d5d00) + std::exception (0x0x7ffb44f6c300) 0 nearly-empty + primary-for std::runtime_error (0x0x7ffb452d5d68) + +Vtable for std::_V2::error_category +std::_V2::error_category::_ZTVNSt3_V214error_categoryE: 10u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt3_V214error_categoryE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))std::_V2::error_category::_M_message +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))std::_V2::error_category::default_error_condition +64 (int (*)(...))std::_V2::error_category::equivalent +72 (int (*)(...))std::_V2::error_category::equivalent + +Class std::_V2::error_category + size=8 align=8 + base size=8 base align=8 +std::_V2::error_category (0x0x7ffb44f6c480) 0 nearly-empty + vptr=((& std::_V2::error_category::_ZTVNSt3_V214error_categoryE) + 16u) + +Class std::error_code + size=16 align=8 + base size=16 base align=8 +std::error_code (0x0x7ffb44f6c6c0) 0 + +Class std::error_condition + size=16 align=8 + base size=16 base align=8 +std::error_condition (0x0x7ffb44f6c840) 0 + +Vtable for std::system_error +std::system_error::_ZTVSt12system_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12system_error) +16 (int (*)(...))std::system_error::~system_error +24 (int (*)(...))std::system_error::~system_error +32 (int (*)(...))std::runtime_error::what + +Class std::system_error + size=32 align=8 + base size=32 base align=8 +std::system_error (0x0x7ffb44fcf1a0) 0 + vptr=((& std::system_error::_ZTVSt12system_error) + 16u) + std::runtime_error (0x0x7ffb44fcf208) 0 + primary-for std::system_error (0x0x7ffb44fcf1a0) + std::exception (0x0x7ffb44f6ca80) 0 nearly-empty + primary-for std::runtime_error (0x0x7ffb44fcf208) + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureB5cxx11E) +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=32 align=8 + base size=32 base align=8 +std::ios_base::failure (0x0x7ffb44fcfdd0) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E) + 16u) + std::system_error (0x0x7ffb44fcfe38) 0 + primary-for std::ios_base::failure (0x0x7ffb44fcfdd0) + std::runtime_error (0x0x7ffb44fcfea0) 0 + primary-for std::system_error (0x0x7ffb44fcfe38) + std::exception (0x0x7ffb44f6cd80) 0 nearly-empty + primary-for std::runtime_error (0x0x7ffb44fcfea0) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7ffb44f6cde0) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7ffb44f6ce40) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7ffb44f6cea0) 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 (0x0x7ffb44f6cd20) 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 (0x0x7ffb450a3660) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7ffb450a3d20) 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 (0x0x7ffb44c857b8 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7ffb44c85888 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 0u +72 0u + +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 (0x0x7ffb44c85c30 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 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7ffb44c85d00 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 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 0u +72 0u + +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 QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7ffb44c555a0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7ffb44c55600) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7ffb449f6960) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7ffb449f6cc0) 0 + +Class QStringView + size=16 align=8 + base size=16 base align=8 +QStringView (0x0x7ffb44aec180) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7ffb44788000) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7ffb44788660) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7ffb44788600) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7ffb44550720) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7ffb446e6360) 0 + +Class QtPrivate::QHashCombine + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombine (0x0x7ffb446e6f60) 0 empty + +Class QtPrivate::QHashCombineCommutative + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombineCommutative (0x0x7ffb444e9000) 0 empty + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7ffb444e9060) 0 + +Class QListData::NotArrayCompatibleLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotArrayCompatibleLayout (0x0x7ffb444e9420) 0 empty + +Class QListData::NotIndirectLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotIndirectLayout (0x0x7ffb444e9480) 0 empty + +Class QListData::ArrayCompatibleLayout + size=1 align=1 + base size=1 base align=1 +QListData::ArrayCompatibleLayout (0x0x7ffb444a86e8) 0 empty + QListData::NotIndirectLayout (0x0x7ffb444e94e0) 0 empty + +Class QListData::InlineWithPaddingLayout + size=1 align=1 + base size=1 base align=1 +QListData::InlineWithPaddingLayout (0x0x7ffb44199620) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7ffb444e9540) 0 empty + QListData::NotIndirectLayout (0x0x7ffb444e95a0) 0 empty + +Class QListData::IndirectLayout + size=1 align=1 + base size=1 base align=1 +QListData::IndirectLayout (0x0x7ffb444a8750) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7ffb444e9600) 0 empty + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7ffb444e9660) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7ffb444e93c0) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7ffb444e9ae0) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7ffb43f3fd20) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7ffb43f3fcc0) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7ffb43f561a0) 0 + QList (0x0x7ffb43f56208) 0 + QListSpecialMethods (0x0x7ffb43f3ff00) 0 empty + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7ffb43fa9360) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7ffb43fa9e40) 0 + +Class std::allocator_arg_t + size=1 align=1 + base size=0 base align=1 +std::allocator_arg_t (0x0x7ffb440a44e0) 0 empty + +Class std::__uses_alloc_base + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc_base (0x0x7ffb440a4660) 0 empty + +Class std::__uses_alloc0::_Sink + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc0::_Sink (0x0x7ffb440a4720) 0 empty + +Class std::__uses_alloc0 + size=1 align=1 + base size=1 base align=1 +std::__uses_alloc0 (0x0x7ffb43f56af8) 0 + std::__uses_alloc_base (0x0x7ffb440a46c0) 0 empty + +Class std::_Swallow_assign + size=1 align=1 + base size=0 base align=1 +std::_Swallow_assign (0x0x7ffb43eb7780) 0 empty + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7ffb43eb79c0) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7ffb43eb7a80) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7ffb43eb7ba0) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7ffb43eb7d20) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7ffb43c16180) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7ffb43c162a0) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7ffb43c16c00) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7ffb438e4060) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7ffb438e4360) 0 + +Class std::chrono::_V2::system_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::system_clock (0x0x7ffb43707ba0) 0 empty + +Class std::chrono::_V2::steady_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::steady_clock (0x0x7ffb43879a20) 0 empty + +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 (0x0x7ffb43879a80) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7ffb43879c60) 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 (0x0x7ffb43879c00) 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 (0x0x7ffb43513f00) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7ffb43513f60) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7ffb43596060) 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 0u +48 0u +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 (0x0x7ffb43546ea0) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7ffb43596000) 0 + primary-for QAbstractAnimation (0x0x7ffb43546ea0) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7ffb43596120) 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 (0x0x7ffb43546f08) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7ffb435960c0) 0 + primary-for QAnimationDriver (0x0x7ffb43546f08) + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7ffb435961e0) 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 (0x0x7ffb43546f70) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7ffb43596180) 0 + primary-for QEventLoop (0x0x7ffb43546f70) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7ffb435963c0) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7ffb43596480) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7ffb435964e0) 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 0u +48 0u +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 (0x0x7ffb435462d8) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7ffb43596420) 0 + primary-for QAbstractEventDispatcher (0x0x7ffb435462d8) + +Vtable for std::type_info +std::type_info::_ZTVSt9type_info: 8u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9type_info) +16 (int (*)(...))std::type_info::~type_info +24 (int (*)(...))std::type_info::~type_info +32 (int (*)(...))std::type_info::__is_pointer_p +40 (int (*)(...))std::type_info::__is_function_p +48 (int (*)(...))std::type_info::__do_catch +56 (int (*)(...))std::type_info::__do_upcast + +Class std::type_info + size=16 align=8 + base size=16 base align=8 +std::type_info (0x0x7ffb43596780) 0 + vptr=((& std::type_info::_ZTVSt9type_info) + 16u) + +Vtable for std::bad_cast +std::bad_cast::_ZTVSt8bad_cast: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8bad_cast) +16 (int (*)(...))std::bad_cast::~bad_cast +24 (int (*)(...))std::bad_cast::~bad_cast +32 (int (*)(...))std::bad_cast::what + +Class std::bad_cast + size=8 align=8 + base size=8 base align=8 +std::bad_cast (0x0x7ffb43616138) 0 nearly-empty + vptr=((& std::bad_cast::_ZTVSt8bad_cast) + 16u) + std::exception (0x0x7ffb435967e0) 0 nearly-empty + primary-for std::bad_cast (0x0x7ffb43616138) + +Vtable for std::bad_typeid +std::bad_typeid::_ZTVSt10bad_typeid: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt10bad_typeid) +16 (int (*)(...))std::bad_typeid::~bad_typeid +24 (int (*)(...))std::bad_typeid::~bad_typeid +32 (int (*)(...))std::bad_typeid::what + +Class std::bad_typeid + size=8 align=8 + base size=8 base align=8 +std::bad_typeid (0x0x7ffb436161a0) 0 nearly-empty + vptr=((& std::bad_typeid::_ZTVSt10bad_typeid) + 16u) + std::exception (0x0x7ffb43596840) 0 nearly-empty + primary-for std::bad_typeid (0x0x7ffb436161a0) + +Vtable for std::bad_function_call +std::bad_function_call::_ZTVSt17bad_function_call: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt17bad_function_call) +16 (int (*)(...))std::bad_function_call::~bad_function_call +24 (int (*)(...))std::bad_function_call::~bad_function_call +32 (int (*)(...))std::bad_function_call::what + +Class std::bad_function_call + size=8 align=8 + base size=8 base align=8 +std::bad_function_call (0x0x7ffb43392410) 0 nearly-empty + vptr=((& std::bad_function_call::_ZTVSt17bad_function_call) + 16u) + std::exception (0x0x7ffb43344900) 0 nearly-empty + primary-for std::bad_function_call (0x0x7ffb43392410) + +Class std::_Nocopy_types + size=16 align=8 + base size=16 base align=8 +std::_Nocopy_types (0x0x7ffb433449c0) 0 + +Class std::_Any_data + size=16 align=8 + base size=16 base align=8 +std::_Any_data (0x0x7ffb43344a20) 0 + +Class std::_Function_base + size=24 align=8 + base size=24 base align=8 +std::_Function_base (0x0x7ffb43344b40) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7ffb4340c060) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7ffb4340c5a0) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7ffb4340c960) 0 + +Class QHashData + size=48 align=8 + base size=44 base align=8 +QHashData (0x0x7ffb4340c900) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7ffb4340c9c0) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7ffb432242a0) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7ffb43224360) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7ffb43224300) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7ffb432243c0) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7ffb43224240) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7ffb42f17ea0) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7ffb42fc3540) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7ffb42fc34e0) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7ffb42fc3600) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7ffb42fc35a0) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7ffb42cdf900) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7ffb42e25000) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7ffb42eb4720) 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 0u +48 0u +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 (0x0x7ffb42ebe1a0) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7ffb42eb46c0) 0 + primary-for QAbstractItemModel (0x0x7ffb42ebe1a0) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7ffb42eb4a80) 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 0u +48 0u +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 (*)(...))QAbstractTableModel::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 (0x0x7ffb42ebe3a8) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7ffb42ebe410) 0 + primary-for QAbstractTableModel (0x0x7ffb42ebe3a8) + QObject (0x0x7ffb42eb4a20) 0 + primary-for QAbstractItemModel (0x0x7ffb42ebe410) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7ffb42eb4b40) 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 0u +48 0u +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 (*)(...))QAbstractListModel::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 (0x0x7ffb42ebe478) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7ffb42ebe4e0) 0 + primary-for QAbstractListModel (0x0x7ffb42ebe478) + QObject (0x0x7ffb42eb4ae0) 0 + primary-for QAbstractItemModel (0x0x7ffb42ebe4e0) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7ffb42eb4de0) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7ffb42eb4ea0) 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 0u +48 0u +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 (0x0x7ffb42ebe618) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7ffb42ebe680) 0 + primary-for QAbstractProxyModel (0x0x7ffb42ebe618) + QObject (0x0x7ffb42eb4e40) 0 + primary-for QAbstractItemModel (0x0x7ffb42ebe680) + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7ffb42eb4f60) 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 0u +48 0u +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 (0x0x7ffb42ebe6e8) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7ffb42eb4f00) 0 + primary-for QAbstractState (0x0x7ffb42ebe6e8) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7ffb42bee060) 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 0u +48 0u +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 (0x0x7ffb42ebe750) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7ffb42bee000) 0 + primary-for QAbstractTransition (0x0x7ffb42ebe750) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7ffb42bee120) 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 0u +48 0u +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 (0x0x7ffb42ebe7b8) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7ffb42ebe820) 0 + primary-for QAnimationGroup (0x0x7ffb42ebe7b8) + QObject (0x0x7ffb42bee0c0) 0 + primary-for QAbstractAnimation (0x0x7ffb42ebe820) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7ffb42c2ce40) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7ffb42c73120) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7ffb42c731e0) 0 + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7ffb42c734e0) 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 0u +48 0u +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 (0x0x7ffb42ebeea0) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7ffb42c73480) 0 + primary-for QIODevice (0x0x7ffb42ebeea0) + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7ffb42c73720) 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 (0x0x7ffb42914000) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7ffb42914068) 0 + primary-for QBuffer (0x0x7ffb42914000) + QObject (0x0x7ffb42c736c0) 0 + primary-for QIODevice (0x0x7ffb42914068) + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7ffb42c737e0) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7ffb42c73780) 0 + +Class QStaticByteArrayMatcherBase::Skiptable + size=256 align=1 + base size=256 base align=1 +QStaticByteArrayMatcherBase::Skiptable (0x0x7ffb42c73900) 0 + +Class QStaticByteArrayMatcherBase + size=256 align=16 + base size=256 base align=16 +QStaticByteArrayMatcherBase (0x0x7ffb42c738a0) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7ffb42c73ae0) 0 + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7ffb42c73cc0) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7ffb42a51300) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7ffb42a513c0) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7ffb426d63c0) 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 (0x0x7ffb426d6840) 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 (0x0x7ffb426db548) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7ffb426d68a0) 0 + primary-for QTimerEvent (0x0x7ffb426db548) + +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 (0x0x7ffb426db5b0) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7ffb426d6900) 0 + primary-for QChildEvent (0x0x7ffb426db5b0) + +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 (0x0x7ffb426dbaf8) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7ffb426d6de0) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7ffb426dbaf8) + +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 (0x0x7ffb426dbb60) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7ffb426d6e40) 0 + primary-for QDeferredDeleteEvent (0x0x7ffb426dbb60) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7ffb426d6f00) 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 (0x0x7ffb426dbbc8) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7ffb426d6ea0) 0 + primary-for QCoreApplication (0x0x7ffb426dbbc8) + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7ffb426d6f60) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7ffb42797000) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7ffb42797600) 0 + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7ffb42797660) 0 + +Class QtPrivate::StreamStateSaver + size=16 align=8 + base size=12 base align=8 +QtPrivate::StreamStateSaver (0x0x7ffb42797720) 0 + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7ffb42797c00) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7ffb42797ea0) 0 + +Class QDateTime::ShortData + size=8 align=8 + base size=8 base align=8 +QDateTime::ShortData (0x0x7ffb42494660) 0 + +Class QDateTime::Data + size=8 align=8 + base size=8 base align=8 +QDateTime::Data (0x0x7ffb424946c0) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7ffb42494600) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7ffb425467e0) 0 + +Class QDeadlineTimer + size=16 align=8 + base size=16 base align=8 +QDeadlineTimer (0x0x7ffb42546cc0) 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 (0x0x7ffb42667c60) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7ffb42667f00) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7ffb42330180) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7ffb42330300) 0 + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7ffb42330840) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7ffb423307e0) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7ffb42109d20) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7ffb42109de0) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7ffb421d1f60) 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 (0x0x7ffb421ead00) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7ffb421ead68) 0 + primary-for QFileDevice (0x0x7ffb421ead00) + QObject (0x0x7ffb421d1f00) 0 + primary-for QIODevice (0x0x7ffb421ead68) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7ffb422251e0) 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 (0x0x7ffb421eaea0) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7ffb421eaf08) 0 + primary-for QFile (0x0x7ffb421eaea0) + QIODevice (0x0x7ffb421eaf70) 0 + primary-for QFileDevice (0x0x7ffb421eaf08) + QObject (0x0x7ffb42225180) 0 + primary-for QIODevice (0x0x7ffb421eaf70) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7ffb422253c0) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7ffb422257e0) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7ffb41f201e0) 0 + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7ffb41f20420) 0 + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7ffb42005840) 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 (0x0x7ffb41ffef70) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7ffb42050000) 0 + primary-for QEventTransition (0x0x7ffb41ffef70) + QObject (0x0x7ffb420057e0) 0 + primary-for QAbstractTransition (0x0x7ffb42050000) + +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 (0x0x7ffb42050068) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7ffb420058a0) 0 nearly-empty + primary-for QException (0x0x7ffb42050068) + +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 (0x0x7ffb420500d0) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7ffb42050138) 0 nearly-empty + primary-for QUnhandledException (0x0x7ffb420500d0) + std::exception (0x0x7ffb42005900) 0 nearly-empty + primary-for QException (0x0x7ffb42050138) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7ffb42005960) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7ffb42005a20) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7ffb42005a80) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7ffb42005ba0) 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 (0x0x7ffb420501a0) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7ffb42005b40) 0 + primary-for QFileSelector (0x0x7ffb420501a0) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7ffb42005c60) 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 (0x0x7ffb42050208) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7ffb42005c00) 0 + primary-for QFileSystemWatcher (0x0x7ffb42050208) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7ffb42005d20) 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 (0x0x7ffb42050270) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7ffb420502d8) 0 + primary-for QFinalState (0x0x7ffb42050270) + QObject (0x0x7ffb42005cc0) 0 + primary-for QAbstractState (0x0x7ffb420502d8) + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7ffb42005d80) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7ffb42005de0) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7ffb42050410) 0 + QBasicMutex (0x0x7ffb41d2b000) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7ffb41d2b060) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7ffb41d2b0c0) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7ffb41d2b120) 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 (0x0x7ffb41d2b240) 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 (0x0x7ffb41d2ba80) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7ffb41e1c2a0) 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 0u +48 0u +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 (0x0x7ffb41dc9548) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7ffb41e1c240) 0 + primary-for QFutureWatcherBase (0x0x7ffb41dc9548) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7ffb41e1c8a0) 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 (0x0x7ffb41dc9e38) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7ffb41dc9ea0) 0 + primary-for QHistoryState (0x0x7ffb41dc9e38) + QObject (0x0x7ffb41e1c840) 0 + primary-for QAbstractState (0x0x7ffb41dc9ea0) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7ffb41e1c960) 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 (0x0x7ffb41dc9f08) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7ffb41dc9f70) 0 + primary-for QIdentityProxyModel (0x0x7ffb41dc9f08) + QAbstractItemModel (0x0x7ffb41a91000) 0 + primary-for QAbstractProxyModel (0x0x7ffb41dc9f70) + QObject (0x0x7ffb41e1c900) 0 + primary-for QAbstractItemModel (0x0x7ffb41a91000) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7ffb41e1c9c0) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7ffb41af30c0) 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 (0x0x7ffb41a91820) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7ffb41af3060) 0 + primary-for QItemSelectionModel (0x0x7ffb41a91820) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7ffb41a91a28) 0 + QList (0x0x7ffb41a91a90) 0 + QListSpecialMethods (0x0x7ffb41af33c0) 0 empty + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7ffb41af38a0) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7ffb4190d000) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7ffb4190d540) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7ffb4190d5a0) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7ffb4190d780) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7ffb4190d7e0) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7ffb4190d720) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7ffb419ffa20) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7ffb419ffa80) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7ffb41a77120) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7ffb41a77180) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7ffb41a770c0) 0 + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7ffb4170f420) 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 (0x0x7ffb41700dd0) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7ffb4170f3c0) 0 + primary-for QLibrary (0x0x7ffb41700dd0) + +Class QVersionNumber::SegmentStorage + size=8 align=8 + base size=8 base align=8 +QVersionNumber::SegmentStorage (0x0x7ffb4170fae0) 0 + +Class QVersionNumber + size=8 align=8 + base size=8 base align=8 +QVersionNumber (0x0x7ffb4170f600) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7ffb41805000) 0 empty + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7ffb41805060) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7ffb41805300) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7ffb418055a0) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7ffb41805f00) 0 + +Class QLinkedListData + size=32 align=8 + base size=25 base align=8 +QLinkedListData (0x0x7ffb414d48a0) 0 + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7ffb414d4c00) 0 + +Class QLoggingCategory::AtomicBools + size=4 align=1 + base size=4 base align=1 +QLoggingCategory::AtomicBools (0x0x7ffb414d4d80) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7ffb414d4d20) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7ffb414d4f00) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7ffb4161f1e0) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7ffb4161f840) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7ffb4161f8a0) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7ffb4161fea0) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7ffb413031e0) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7ffb41303240) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7ffb41303540) 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 (0x0x7ffb4131c068) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7ffb413034e0) 0 + primary-for QMimeData (0x0x7ffb4131c068) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7ffb413035a0) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7ffb413038a0) 0 + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7ffb41303960) 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 (0x0x7ffb4131c270) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7ffb41303900) 0 + primary-for QObjectCleanupHandler (0x0x7ffb4131c270) + +Class QOperatingSystemVersion + size=16 align=4 + base size=16 base align=4 +QOperatingSystemVersion (0x0x7ffb413039c0) 0 + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7ffb41390180) 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 (0x0x7ffb4131c9c0) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7ffb4131ca28) 0 + primary-for QParallelAnimationGroup (0x0x7ffb4131c9c0) + QAbstractAnimation (0x0x7ffb4131ca90) 0 + primary-for QAnimationGroup (0x0x7ffb4131ca28) + QObject (0x0x7ffb41390120) 0 + primary-for QAbstractAnimation (0x0x7ffb4131ca90) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7ffb41390240) 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 (0x0x7ffb4131caf8) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7ffb4131cb60) 0 + primary-for QPauseAnimation (0x0x7ffb4131caf8) + QObject (0x0x7ffb413901e0) 0 + primary-for QAbstractAnimation (0x0x7ffb4131cb60) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7ffb41390420) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7ffb41390720) 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 (0x0x7ffb4131cd68) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7ffb413906c0) 0 + primary-for QPluginLoader (0x0x7ffb4131cd68) + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7ffb41390780) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7ffb41390e40) 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 (0x0x7ffb413f93a8) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7ffb413f9410) 0 + primary-for QProcess (0x0x7ffb413f93a8) + QObject (0x0x7ffb41390de0) 0 + primary-for QIODevice (0x0x7ffb413f9410) + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7ffb41390f00) 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 (0x0x7ffb413f9478) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7ffb413f94e0) 0 + primary-for QVariantAnimation (0x0x7ffb413f9478) + QObject (0x0x7ffb41390ea0) 0 + primary-for QAbstractAnimation (0x0x7ffb413f94e0) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7ffb4105a000) 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 (0x0x7ffb413f95b0) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7ffb413f9618) 0 + primary-for QPropertyAnimation (0x0x7ffb413f95b0) + QAbstractAnimation (0x0x7ffb413f9680) 0 + primary-for QVariantAnimation (0x0x7ffb413f9618) + QObject (0x0x7ffb41390f60) 0 + primary-for QAbstractAnimation (0x0x7ffb413f9680) + +Class QRandomGenerator::Storage + size=2504 align=8 + base size=2504 base align=8 +QRandomGenerator::Storage (0x0x7ffb4105a120) 0 + +Class QRandomGenerator + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator (0x0x7ffb4105a0c0) 0 + +Class QRandomGenerator64 + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator64 (0x0x7ffb410db958) 0 + QRandomGenerator (0x0x7ffb410f90c0) 0 + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7ffb410f9180) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7ffb410f9420) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7ffb410f94e0) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7ffb410f95a0) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7ffb410f9840) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7ffb410f9ae0) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7ffb410f9d80) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7ffb40ee7060) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7ffb40ee7660) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7ffb40ee7960) 0 + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7ffb40ee7c60) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7ffb40ee7de0) 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 (0x0x7ffb41226b60) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7ffb41226bc8) 0 + primary-for QSaveFile (0x0x7ffb41226b60) + QIODevice (0x0x7ffb41226c30) 0 + primary-for QFileDevice (0x0x7ffb41226bc8) + QObject (0x0x7ffb40ee7d80) 0 + primary-for QIODevice (0x0x7ffb41226c30) + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7ffb40ee7ea0) 0 + +Class QSemaphoreReleaser + size=16 align=8 + base size=12 base align=8 +QSemaphoreReleaser (0x0x7ffb40ee7f00) 0 + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7ffb40d14540) 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 (0x0x7ffb40d18478) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7ffb40d184e0) 0 + primary-for QSequentialAnimationGroup (0x0x7ffb40d18478) + QAbstractAnimation (0x0x7ffb40d18548) 0 + primary-for QAnimationGroup (0x0x7ffb40d184e0) + QObject (0x0x7ffb40d144e0) 0 + primary-for QAbstractAnimation (0x0x7ffb40d18548) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7ffb40d14600) 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 (0x0x7ffb40d185b0) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7ffb40d145a0) 0 + primary-for QSettings (0x0x7ffb40d185b0) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7ffb40d146c0) 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 (0x0x7ffb40d18618) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7ffb40d14660) 0 + primary-for QSharedMemory (0x0x7ffb40d18618) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7ffb40d14780) 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 (0x0x7ffb40d18680) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7ffb40d14720) 0 + primary-for QSignalMapper (0x0x7ffb40d18680) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7ffb40d14840) 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 (0x0x7ffb40d186e8) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7ffb40d18750) 0 + primary-for QSignalTransition (0x0x7ffb40d186e8) + QObject (0x0x7ffb40d147e0) 0 + primary-for QAbstractTransition (0x0x7ffb40d18750) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7ffb40d14900) 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 (0x0x7ffb40d187b8) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7ffb40d148a0) 0 + primary-for QSocketNotifier (0x0x7ffb40d187b8) + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7ffb40d149c0) 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 (0x0x7ffb40d18820) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7ffb40d18888) 0 + primary-for QSortFilterProxyModel (0x0x7ffb40d18820) + QAbstractItemModel (0x0x7ffb40d188f0) 0 + primary-for QAbstractProxyModel (0x0x7ffb40d18888) + QObject (0x0x7ffb40d14960) 0 + primary-for QAbstractItemModel (0x0x7ffb40d188f0) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7ffb40d14a80) 0 empty + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7ffb40d14cc0) 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 (0x0x7ffb40d18a90) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7ffb40d18af8) 0 + primary-for QState (0x0x7ffb40d18a90) + QObject (0x0x7ffb40d14c60) 0 + primary-for QAbstractState (0x0x7ffb40d18af8) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7ffb40d14de0) 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 (0x0x7ffb40d18c98) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7ffb40d14e40) 0 + primary-for QStateMachine::SignalEvent (0x0x7ffb40d18c98) + +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 (0x0x7ffb40d18d00) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7ffb40d14ea0) 0 + primary-for QStateMachine::WrappedEvent (0x0x7ffb40d18d00) + +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 (0x0x7ffb40d18b60) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7ffb40d18bc8) 0 + primary-for QStateMachine (0x0x7ffb40d18b60) + QAbstractState (0x0x7ffb40d18c30) 0 + primary-for QState (0x0x7ffb40d18bc8) + QObject (0x0x7ffb40d14d80) 0 + primary-for QAbstractState (0x0x7ffb40d18c30) + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7ffb40d14f00) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7ffb40a5ee40) 0 empty + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7ffb40a9c960) 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 (0x0x7ffb40af5208) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7ffb40af5270) 0 + primary-for QStringListModel (0x0x7ffb40af5208) + QAbstractItemModel (0x0x7ffb40af52d8) 0 + primary-for QAbstractListModel (0x0x7ffb40af5270) + QObject (0x0x7ffb40a9c900) 0 + primary-for QAbstractItemModel (0x0x7ffb40af52d8) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7ffb40a9c9c0) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7ffb40a9ca80) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7ffb40a9cba0) 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 (0x0x7ffb40af5340) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7ffb40af53a8) 0 + primary-for QTemporaryFile (0x0x7ffb40af5340) + QFileDevice (0x0x7ffb40af5410) 0 + primary-for QFile (0x0x7ffb40af53a8) + QIODevice (0x0x7ffb40af5478) 0 + primary-for QFileDevice (0x0x7ffb40af5410) + QObject (0x0x7ffb40a9cb40) 0 + primary-for QIODevice (0x0x7ffb40af5478) + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7ffb40a9cc00) 0 + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7ffb40a9ce40) 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 0u +64 0u + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7ffb40a9cde0) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7ffb40b9a060) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7ffb40b9a0c0) 0 + +Class std::__mutex_base + size=40 align=8 + base size=40 base align=8 +std::__mutex_base (0x0x7ffb40b9a120) 0 + +Class std::__recursive_mutex_base + size=40 align=8 + base size=40 base align=8 +std::__recursive_mutex_base (0x0x7ffb40b9a180) 0 + +Class std::mutex + size=40 align=8 + base size=40 base align=8 +std::mutex (0x0x7ffb40af5680) 0 + std::__mutex_base (0x0x7ffb40b9a1e0) 0 + +Class std::recursive_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_mutex (0x0x7ffb40af56e8) 0 + std::__recursive_mutex_base (0x0x7ffb40b9a240) 0 + +Class std::timed_mutex + size=40 align=8 + base size=40 base align=8 +std::timed_mutex (0x0x7ffb40bf6460) 0 + std::__mutex_base (0x0x7ffb40b9a360) 0 + std::__timed_mutex_impl (0x0x7ffb40b9a3c0) 0 empty + +Class std::recursive_timed_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_timed_mutex (0x0x7ffb40c0e0e0) 0 + std::__recursive_mutex_base (0x0x7ffb40b9a480) 0 + std::__timed_mutex_impl (0x0x7ffb40b9a4e0) 0 empty + +Class std::defer_lock_t + size=1 align=1 + base size=0 base align=1 +std::defer_lock_t (0x0x7ffb40b9a540) 0 empty + +Class std::try_to_lock_t + size=1 align=1 + base size=0 base align=1 +std::try_to_lock_t (0x0x7ffb40b9a5a0) 0 empty + +Class std::adopt_lock_t + size=1 align=1 + base size=0 base align=1 +std::adopt_lock_t (0x0x7ffb40b9a600) 0 empty + +Class std::once_flag + size=4 align=4 + base size=4 base align=4 +std::once_flag (0x0x7ffb40b9a840) 0 + +Vtable for __gnu_cxx::__concurrence_lock_error +__gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_lock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +24 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +32 (int (*)(...))__gnu_cxx::__concurrence_lock_error::what + +Class __gnu_cxx::__concurrence_lock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_lock_error (0x0x7ffb40af5820) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE) + 16u) + std::exception (0x0x7ffb40b9a900) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_lock_error (0x0x7ffb40af5820) + +Vtable for __gnu_cxx::__concurrence_unlock_error +__gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx26__concurrence_unlock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +24 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +32 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::what + +Class __gnu_cxx::__concurrence_unlock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_unlock_error (0x0x7ffb40af5888) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE) + 16u) + std::exception (0x0x7ffb40b9a9c0) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_unlock_error (0x0x7ffb40af5888) + +Vtable for __gnu_cxx::__concurrence_broadcast_error +__gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx29__concurrence_broadcast_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +24 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +32 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::what + +Class __gnu_cxx::__concurrence_broadcast_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_broadcast_error (0x0x7ffb40af58f0) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE) + 16u) + std::exception (0x0x7ffb40b9aa80) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_broadcast_error (0x0x7ffb40af58f0) + +Vtable for __gnu_cxx::__concurrence_wait_error +__gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_wait_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +24 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +32 (int (*)(...))__gnu_cxx::__concurrence_wait_error::what + +Class __gnu_cxx::__concurrence_wait_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_wait_error (0x0x7ffb40af59c0) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE) + 16u) + std::exception (0x0x7ffb40b9ab40) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_wait_error (0x0x7ffb40af59c0) + +Class __gnu_cxx::__mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__mutex (0x0x7ffb40b9ac00) 0 + +Class __gnu_cxx::__recursive_mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__recursive_mutex (0x0x7ffb40b9ac60) 0 + +Class __gnu_cxx::__scoped_lock + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__scoped_lock (0x0x7ffb40b9acc0) 0 + +Class __gnu_cxx::__cond + size=48 align=8 + base size=48 base align=8 +__gnu_cxx::__cond (0x0x7ffb40b9ad20) 0 + +Vtable for std::bad_weak_ptr +std::bad_weak_ptr::_ZTVSt12bad_weak_ptr: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12bad_weak_ptr) +16 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +24 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +32 (int (*)(...))std::bad_weak_ptr::what + +Class std::bad_weak_ptr + size=8 align=8 + base size=8 base align=8 +std::bad_weak_ptr (0x0x7ffb40af5c98) 0 nearly-empty + vptr=((& std::bad_weak_ptr::_ZTVSt12bad_weak_ptr) + 16u) + std::exception (0x0x7ffb409190c0) 0 nearly-empty + primary-for std::bad_weak_ptr (0x0x7ffb40af5c98) + +Class std::_Sp_make_shared_tag + size=1 align=1 + base size=0 base align=1 +std::_Sp_make_shared_tag (0x0x7ffb40919900) 0 empty + +Class std::_Sp_locker + size=2 align=1 + base size=2 base align=1 +std::_Sp_locker (0x0x7ffb40589120) 0 + +Class std::thread::id + size=8 align=8 + base size=8 base align=8 +std::thread::id (0x0x7ffb40589300) 0 + +Vtable for std::thread::_Impl_base +std::thread::_Impl_base::_ZTVNSt6thread10_Impl_baseE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6thread10_Impl_baseE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class std::thread::_Impl_base + size=24 align=8 + base size=24 base align=8 +std::thread::_Impl_base (0x0x7ffb40589360) 0 + vptr=((& std::thread::_Impl_base::_ZTVNSt6thread10_Impl_baseE) + 16u) + +Class std::thread + size=8 align=8 + base size=8 base align=8 +std::thread (0x0x7ffb405892a0) 0 + +Class std::condition_variable + size=48 align=8 + base size=48 base align=8 +std::condition_variable (0x0x7ffb40702f60) 0 + +Class std::__at_thread_exit_elt + size=16 align=8 + base size=16 base align=8 +std::__at_thread_exit_elt (0x0x7ffb40356060) 0 + +Class std::_V2::condition_variable_any + size=64 align=8 + base size=64 base align=8 +std::_V2::condition_variable_any (0x0x7ffb403560c0) 0 + +Class std::__atomic_futex_unsigned_base + size=1 align=1 + base size=0 base align=1 +std::__atomic_futex_unsigned_base (0x0x7ffb403f0720) 0 empty + +Vtable for std::future_error +std::future_error::_ZTVSt12future_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12future_error) +16 (int (*)(...))std::future_error::~future_error +24 (int (*)(...))std::future_error::~future_error +32 (int (*)(...))std::future_error::what + +Class std::future_error + size=32 align=8 + base size=32 base align=8 +std::future_error (0x0x7ffb40441000) 0 + vptr=((& std::future_error::_ZTVSt12future_error) + 16u) + std::logic_error (0x0x7ffb40441068) 0 + primary-for std::future_error (0x0x7ffb40441000) + std::exception (0x0x7ffb403f0840) 0 nearly-empty + primary-for std::logic_error (0x0x7ffb40441068) + +Class std::__future_base::_Result_base::_Deleter + size=1 align=1 + base size=0 base align=1 +std::__future_base::_Result_base::_Deleter (0x0x7ffb403f0960) 0 empty + +Vtable for std::__future_base::_Result_base +std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base12_Result_baseE) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class std::__future_base::_Result_base + size=16 align=8 + base size=16 base align=8 +std::__future_base::_Result_base (0x0x7ffb403f0900) 0 + vptr=((& std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE) + 16u) + +Class std::__future_base::_State_baseV2::__exception_ptr_tag + size=1 align=1 + base size=0 base align=1 +std::__future_base::_State_baseV2::__exception_ptr_tag (0x0x7ffb404c8ea0) 0 empty + +Class std::__future_base::_State_baseV2::_Make_ready + size=32 align=8 + base size=32 base align=8 +std::__future_base::_State_baseV2::_Make_ready (0x0x7ffb4014d618) 0 + std::__at_thread_exit_elt (0x0x7ffb404c8f60) 0 + +Vtable for std::__future_base::_State_baseV2 +std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base13_State_baseV2E) +16 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +24 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +32 (int (*)(...))std::__future_base::_State_baseV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_State_baseV2 + size=32 align=8 + base size=28 base align=8 +std::__future_base::_State_baseV2 (0x0x7ffb403f0ae0) 0 + vptr=((& std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E) + 16u) + +Class std::__future_base + size=1 align=1 + base size=0 base align=1 +std::__future_base (0x0x7ffb403f08a0) 0 empty + +Vtable for std::__future_base::_Async_state_commonV2 +std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base21_Async_state_commonV2E) +16 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +24 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +32 (int (*)(...))std::__future_base::_Async_state_commonV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_Async_state_commonV2 + size=48 align=8 + base size=44 base align=8 +std::__future_base::_Async_state_commonV2 (0x0x7ffb3fee4208) 0 + vptr=((& std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E) + 16u) + std::__future_base::_State_baseV2 (0x0x7ffb3fe8fe40) 0 + primary-for std::__future_base::_Async_state_commonV2 (0x0x7ffb3fee4208) + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7ffb3fef65a0) 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 (0x0x7ffb3fee4c98) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7ffb3fef6540) 0 + primary-for QThread (0x0x7ffb3fee4c98) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7ffb3fef66c0) 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 (0x0x7ffb3fee4d00) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7ffb3fef6660) 0 + primary-for QThreadPool (0x0x7ffb3fee4d00) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7ffb3fef6720) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7ffb3fef6840) 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 (0x0x7ffb3fee4d68) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7ffb3fef67e0) 0 + primary-for QTimeLine (0x0x7ffb3fee4d68) + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7ffb3fef6900) 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 (0x0x7ffb3fee4dd0) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7ffb3fef68a0) 0 + primary-for QTimer (0x0x7ffb3fee4dd0) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7ffb3fbc3000) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7ffb3fef6f60) 0 + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7ffb3fbc35a0) 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 (0x0x7ffb3fba9820) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7ffb3fbc3540) 0 + primary-for QTranslator (0x0x7ffb3fba9820) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7ffb3fbc36c0) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7ffb3fcf0d80) 0 + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7ffb3f993420) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7ffb3f993a20) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7ffb3f993a80) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7ffb3f993d80) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7ffb3fa1c2d8) 0 + QVector (0x0x7ffb3fa39180) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7ffb3fa391e0) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7ffb3fa39480) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7ffb3fa39720) 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 (0x0x7ffb3fa399c0) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7ffb3fa39a20) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7ffb3fb31480) 0 + +Class QNdefRecord + size=8 align=8 + base size=8 base align=8 +QNdefRecord (0x0x7ffb3fb315a0) 0 + +Class QNdefFilter::Record + size=24 align=8 + base size=24 base align=8 +QNdefFilter::Record (0x0x7ffb3fb316c0) 0 + +Class QNdefFilter + size=8 align=8 + base size=8 base align=8 +QNdefFilter (0x0x7ffb3fb31660) 0 + +Class QNdefMessage + size=8 align=8 + base size=8 base align=8 +QNdefMessage (0x0x7ffb3fb344e0) 0 + QList (0x0x7ffb3fb34548) 0 + QListSpecialMethods (0x0x7ffb3fb318a0) 0 empty + +Class QNdefNfcTextRecord + size=8 align=8 + base size=8 base align=8 +QNdefNfcTextRecord (0x0x7ffb3fb345b0) 0 + QNdefRecord (0x0x7ffb3fb31a80) 0 + +Class QNdefNfcUriRecord + size=8 align=8 + base size=8 base align=8 +QNdefNfcUriRecord (0x0x7ffb3fb34af8) 0 + QNdefRecord (0x0x7ffb3fb31f60) 0 + +Class QNdefNfcIconRecord + size=8 align=8 + base size=8 base align=8 +QNdefNfcIconRecord (0x0x7ffb3fb34b60) 0 + QNdefRecord (0x0x7ffb3f7f7000) 0 + +Class QNdefNfcSmartPosterRecord + size=16 align=8 + base size=16 base align=8 +QNdefNfcSmartPosterRecord (0x0x7ffb3fb34bc8) 0 + QNdefRecord (0x0x7ffb3f7f7060) 0 + +Class QNearFieldTarget::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldTarget::QPrivateSignal (0x0x7ffb3f7f7180) 0 empty + +Class QNearFieldTarget::RequestId + size=8 align=8 + base size=8 base align=8 +QNearFieldTarget::RequestId (0x0x7ffb3f7f71e0) 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 0u +48 0u +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 (0x0x7ffb3fb34c30) 0 + vptr=((& QNearFieldTarget::_ZTV16QNearFieldTarget) + 16u) + QObject (0x0x7ffb3f7f7120) 0 + primary-for QNearFieldTarget (0x0x7ffb3fb34c30) + +Class QNearFieldManager::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldManager::QPrivateSignal (0x0x7ffb3f7f75a0) 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 (0x0x7ffb3fb34d68) 0 + vptr=((& QNearFieldManager::_ZTV17QNearFieldManager) + 16u) + QObject (0x0x7ffb3f7f7540) 0 + primary-for QNearFieldManager (0x0x7ffb3fb34d68) + +Class QNearFieldShareManager::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldShareManager::QPrivateSignal (0x0x7ffb3f7f77e0) 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 (0x0x7ffb3fb34f08) 0 + vptr=((& QNearFieldShareManager::_ZTV22QNearFieldShareManager) + 16u) + QObject (0x0x7ffb3f7f7780) 0 + primary-for QNearFieldShareManager (0x0x7ffb3fb34f08) + +Class QNearFieldShareTarget::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldShareTarget::QPrivateSignal (0x0x7ffb3f7f7ae0) 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 (0x0x7ffb3f8f5068) 0 + vptr=((& QNearFieldShareTarget::_ZTV21QNearFieldShareTarget) + 16u) + QObject (0x0x7ffb3f7f7a80) 0 + primary-for QNearFieldShareTarget (0x0x7ffb3f8f5068) + +Class QQmlNdefRecord::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QQmlNdefRecord::QPrivateSignal (0x0x7ffb3f7f7ba0) 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 (0x0x7ffb3f8f50d0) 0 + vptr=((& QQmlNdefRecord::_ZTV14QQmlNdefRecord) + 16u) + QObject (0x0x7ffb3f7f7b40) 0 + primary-for QQmlNdefRecord (0x0x7ffb3f8f50d0) + -- cgit v1.2.3 From 1d8ba3610ae36dd62fda88dcf7c81baa5fe1fc51 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 7 Dec 2017 15:56:34 +0100 Subject: Update QML versions for QtBluetooth and QtNfc in step with Qt version Change-Id: I00ac4bbb56bd809784f94812221130365f06218d Reviewed-by: J-P Nurmi --- src/imports/bluetooth/plugin.cpp | 6 ++---- src/imports/bluetooth/plugins.qmltypes | 8 ++++---- src/imports/nfc/plugin.cpp | 5 ++--- src/imports/nfc/plugins.qmltypes | 7 +++---- 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/imports/bluetooth/plugin.cpp b/src/imports/bluetooth/plugin.cpp index 2a152e32..07654ca9 100644 --- a/src/imports/bluetooth/plugin.cpp +++ b/src/imports/bluetooth/plugin.cpp @@ -81,10 +81,8 @@ public: qmlRegisterType(uri, major, minor, "BluetoothService"); qmlRegisterType(uri, major, minor, "BluetoothSocket"); - // Register the 5.9 types - // introduces 5.9 version, other existing 5.2 exports become automatically available under 5.2-5.8 - minor = 9; - qmlRegisterType(uri, major, minor, "BluetoothDiscoveryModel"); + // Register the latest Qt version as QML type version + qmlRegisterModule(uri, QT_VERSION_MAJOR, QT_VERSION_MINOR); } }; diff --git a/src/imports/bluetooth/plugins.qmltypes b/src/imports/bluetooth/plugins.qmltypes index e23f8740..a00b0324 100644 --- a/src/imports/bluetooth/plugins.qmltypes +++ b/src/imports/bluetooth/plugins.qmltypes @@ -4,7 +4,7 @@ import QtQuick.tooling 1.2 // It is used for QML tooling purposes only. // // This file was auto-generated by: -// 'qmlplugindump -nonrelocatable QtBluetooth 5.9' +// 'qmlplugindump -nonrelocatable QtBluetooth 5.10' Module { dependencies: ["QtQuick 2.8"] @@ -13,10 +13,9 @@ Module { prototype: "QAbstractListModel" exports: [ "QtBluetooth/BluetoothDiscoveryModel 5.0", - "QtBluetooth/BluetoothDiscoveryModel 5.2", - "QtBluetooth/BluetoothDiscoveryModel 5.9" + "QtBluetooth/BluetoothDiscoveryModel 5.2" ] - exportMetaObjectRevisions: [0, 0, 0] + exportMetaObjectRevisions: [0, 0] Enum { name: "DiscoveryMode" values: { @@ -93,6 +92,7 @@ Module { values: { "NoError": -2, "UnknownSocketError": -1, + "RemoteHostClosedError": 1, "HostNotFoundError": 2, "ServiceNotFoundError": 9, "NetworkError": 7, diff --git a/src/imports/nfc/plugin.cpp b/src/imports/nfc/plugin.cpp index 53febda2..749e03d7 100644 --- a/src/imports/nfc/plugin.cpp +++ b/src/imports/nfc/plugin.cpp @@ -98,10 +98,9 @@ public: minor = 5; qmlRegisterType(uri, major, minor, "NearField"); - // Register the 5.6 - 5.9 types - minor = 9; - qmlRegisterType(uri, major, minor, "NearField"); + // Register the latest Qt version as QML type version + qmlRegisterModule(uri, QT_VERSION_MAJOR, QT_VERSION_MINOR); } }; diff --git a/src/imports/nfc/plugins.qmltypes b/src/imports/nfc/plugins.qmltypes index 45cf53b8..e6e98c24 100644 --- a/src/imports/nfc/plugins.qmltypes +++ b/src/imports/nfc/plugins.qmltypes @@ -4,7 +4,7 @@ import QtQuick.tooling 1.2 // It is used for QML tooling purposes only. // // This file was auto-generated by: -// 'qmlplugindump -nonrelocatable QtNfc 5.9' +// 'qmlplugindump -nonrelocatable QtNfc 5.10' Module { dependencies: ["QtQuick 2.8"] @@ -57,10 +57,9 @@ Module { "QtNfc/NearField 5.0", "QtNfc/NearField 5.2", "QtNfc/NearField 5.4", - "QtNfc/NearField 5.5", - "QtNfc/NearField 5.9" + "QtNfc/NearField 5.5" ] - exportMetaObjectRevisions: [0, 0, 0, 1, 1] + 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" } -- cgit v1.2.3 From ad1d575d493ad5e955bee476a7e2d56e67a0ba7c Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Wed, 20 Dec 2017 12:06:08 +0100 Subject: Bump version Change-Id: I6fba22db3302d3a847ce913d21ad2eafdf9c5280 --- .qmake.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.qmake.conf b/.qmake.conf index 138038d5..0338efe0 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,3 +1,3 @@ load(qt_build_config) -MODULE_VERSION = 5.10.0 +MODULE_VERSION = 5.10.1 -- cgit v1.2.3 From 4838c20bdbf1ef8094a635eb964b0ff9cde7b9bb Mon Sep 17 00:00:00 2001 From: Sami Nurmenniemi Date: Fri, 29 Dec 2017 09:22:50 +0200 Subject: Expect failure for cmac tests on qemu tests Qemu-user can't hande socket option SOL_ALG, this change detects that situation for boot2qt targets and expects failure. Task-number: QTBUG-63152 Change-Id: I4ac0c9b619caa789daf71c1567332749e5bbcd1e Reviewed-by: Christian Kandeler Reviewed-by: Alex Blasche --- .../qlowenergycontroller-gattserver/test/test.pro | 3 ++ .../test/tst_qlowenergycontroller-gattserver.cpp | 49 ++++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/tests/auto/qlowenergycontroller-gattserver/test/test.pro b/tests/auto/qlowenergycontroller-gattserver/test/test.pro index fc9c7a18..5f80e660 100644 --- a/tests/auto/qlowenergycontroller-gattserver/test/test.pro +++ b/tests/auto/qlowenergycontroller-gattserver/test/test.pro @@ -7,3 +7,6 @@ qtConfig(linux_crypto_api): DEFINES += CONFIG_LINUX_CRYPTO_API qtConfig(bluez_le): DEFINES += CONFIG_BLUEZ_LE SOURCES += tst_qlowenergycontroller-gattserver.cpp + +# qemu doesn't support all the needed socket operations +boot2qt: DEFINES += CHECK_CMAC_SUPPORT diff --git a/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp b/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp index e01457eb..81dfd286 100644 --- a/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp +++ b/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp @@ -76,6 +76,10 @@ private: QBluetoothAddress m_serverAddress; QBluetoothDeviceInfo m_serverInfo; QScopedPointer m_leController; + +#if defined(CHECK_CMAC_SUPPORT) + bool checkCmacSupport(const quint128& csrkMsb); +#endif }; @@ -169,6 +173,13 @@ void TestQLowEnergyControllerGattServer::cmacVerifier() }; QFETCH(QByteArray, message); QFETCH(quint64, expectedMac); + +#if defined(CHECK_CMAC_SUPPORT) + if (!checkCmacSupport(csrk)) { + QSKIP("Needed socket options not available. Running qemu?"); + } +#endif + const bool success = LeCmacCalculator().verify(message, csrk, expectedMac); QVERIFY(success); #else // CONFIG_LINUX_CRYPTO_API @@ -177,6 +188,44 @@ void TestQLowEnergyControllerGattServer::cmacVerifier() #endif // Q_OS_LINUX } +#if defined(CHECK_CMAC_SUPPORT) +#include +#include +#include + +bool TestQLowEnergyControllerGattServer::checkCmacSupport(const quint128& csrk) +{ + bool retval = false; +#if defined(CONFIG_LINUX_CRYPTO_API) && defined(QT_BUILD_INTERNAL) && defined(CONFIG_BLUEZ_LE) + quint128 csrkMsb; + std::reverse_copy(std::begin(csrk.data), std::end(csrk.data), std::begin(csrkMsb.data)); + + int testSocket = socket(AF_ALG, SOCK_SEQPACKET, 0); + if (testSocket != -1) { + sockaddr_alg sa; + using namespace std; + memset(&sa, 0, sizeof sa); + sa.salg_family = AF_ALG; + strcpy(reinterpret_cast(sa.salg_type), "hash"); + strcpy(reinterpret_cast(sa.salg_name), "cmac(aes)"); + if (::bind(testSocket, reinterpret_cast(&sa), sizeof sa) != -1) { + if (setsockopt(testSocket, 279 /* SOL_ALG */, ALG_SET_KEY, csrkMsb.data, sizeof csrkMsb) != -1) { + retval = true; + } else { + QWARN("Needed socket options (SOL_ALG) not available"); + } + } else { + QWARN("bind() failed for crypto socket:"); + } + close(testSocket); + } else { + QWARN("Unable to create test socket"); + } +#endif + return retval; +} +#endif + void TestQLowEnergyControllerGattServer::cmacVerifier_data() { QTest::addColumn("message"); -- cgit v1.2.3 From e8d9bd63b05b33b22ff5d19fb31ad55b1e409256 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 3 Jan 2018 13:34:48 +0100 Subject: Improve documentation about missing iOS support in QtBluetooth Task-number: QTBUG-65547 Change-Id: I472b354621db89a921eec01b1459d46dbaa15ac0 Reviewed-by: Timur Pocheptsov --- src/bluetooth/qbluetoothlocaldevice.cpp | 3 +++ src/bluetooth/qbluetoothserver.cpp | 3 +++ src/bluetooth/qbluetoothservicediscoveryagent.cpp | 3 +++ src/bluetooth/qbluetoothserviceinfo.cpp | 2 ++ src/bluetooth/qbluetoothsocket.cpp | 3 +++ 5 files changed, 14 insertions(+) diff --git a/src/bluetooth/qbluetoothlocaldevice.cpp b/src/bluetooth/qbluetoothlocaldevice.cpp index e2378460..40d86ae3 100644 --- a/src/bluetooth/qbluetoothlocaldevice.cpp +++ b/src/bluetooth/qbluetoothlocaldevice.cpp @@ -55,6 +55,9 @@ QT_BEGIN_NAMESPACE QBluetoothLocalDevice provides functions for getting and setting the state of local Bluetooth devices. + + On iOS, this class cannot be used because the platform does not expose + any data or API which may provide information on the local Bluetooth device. */ /*! diff --git a/src/bluetooth/qbluetoothserver.cpp b/src/bluetooth/qbluetoothserver.cpp index 99d3b53a..90c3ff19 100644 --- a/src/bluetooth/qbluetoothserver.cpp +++ b/src/bluetooth/qbluetoothserver.cpp @@ -66,6 +66,9 @@ QT_BEGIN_NAMESPACE If the \l QBluetoothServiceInfo::Protocol is not supported by a platform, \l listen() will return \c false. Android and WinRT only support RFCOMM for example. + On iOS, this class cannot be used because the platform does not expose + an API which may permit access to QBluetoothServer related features. + \sa QBluetoothServiceInfo, QBluetoothSocket */ diff --git a/src/bluetooth/qbluetoothservicediscoveryagent.cpp b/src/bluetooth/qbluetoothservicediscoveryagent.cpp index d6163f0e..05d62ab1 100644 --- a/src/bluetooth/qbluetoothservicediscoveryagent.cpp +++ b/src/bluetooth/qbluetoothservicediscoveryagent.cpp @@ -85,6 +85,9 @@ QT_BEGIN_NAMESPACE Energy services, it is likely to not advertise them via SDP. The \l QLowEnergyController class should be utilized to perform the service discovery on Low Energy devices. + On iOS, this class cannot be used because the platform does not expose + an API which may permit access to QBluetoothServiceDiscoveryAgent related features. + \sa QBluetoothDeviceDiscoveryAgent, QLowEnergyController */ diff --git a/src/bluetooth/qbluetoothserviceinfo.cpp b/src/bluetooth/qbluetoothserviceinfo.cpp index e4e5d1ed..9e350cd7 100644 --- a/src/bluetooth/qbluetoothserviceinfo.cpp +++ b/src/bluetooth/qbluetoothserviceinfo.cpp @@ -105,6 +105,8 @@ QT_BEGIN_NAMESPACE service info object share the same data as they do not detach upon changing them. This ensures that two copies can (de)register the same Bluetooth service. + On iOS, this class cannot be used because the platform does not expose + an API which may permit access to QBluetoothServiceInfo related features. */ /*! diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index a35863b4..06b0668c 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -81,6 +81,9 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT) \note QBluetoothSocket does not support synchronous read and write operations. Functions such as \l waitForReadyRead() and \l waitForBytesWritten() are not implemented. I/O operations should be performed using \l readyRead(), \l read() and \l write(). + + On iOS, this class cannot be used because the platform does not expose + an API which may permit access to QBluetoothSocket related features. */ /*! -- cgit v1.2.3 From 5a67821b9615b5fc17cab405566a81cc7f554ad4 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Thu, 4 Jan 2018 14:37:52 +0100 Subject: QtBluetooth: Fix heartrate-game for QT_PLATFORM_UIKIT QBluetoothLocalDevice::isValid() returns false for iOS/tvOS/watchOS (because Apple does not provide any public API/Framework to implement QBluetoothLocalDevice correctly). Make ConnectionHandler::alive return true for QT_PLATFORM_UIKIT. Task-number: QTBUG-65547 Change-Id: I219fbeadc752b815f8369d332c10a24e70150abb Reviewed-by: Alex Blasche --- examples/bluetooth/heartrate-game/connectionhandler.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/bluetooth/heartrate-game/connectionhandler.cpp b/examples/bluetooth/heartrate-game/connectionhandler.cpp index 5ab85c85..3388c0a8 100644 --- a/examples/bluetooth/heartrate-game/connectionhandler.cpp +++ b/examples/bluetooth/heartrate-game/connectionhandler.cpp @@ -51,6 +51,7 @@ #include "heartrate-global.h" #include "connectionhandler.h" #include +#include ConnectionHandler::ConnectionHandler(QObject *parent) : QObject(parent) { @@ -60,7 +61,7 @@ ConnectionHandler::ConnectionHandler(QObject *parent) : QObject(parent) bool ConnectionHandler::alive() const { -#ifdef SIMULATOR +#if defined(SIMULATOR) || defined(QT_PLATFORM_UIKIT) return true; #else return m_localDevice.isValid() && m_localDevice.hostMode() != QBluetoothLocalDevice::HostPoweredOff; -- cgit v1.2.3 From da7a013dd2aa7bed9f4a6b5122b8f9dadcb252ab Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 29 Nov 2017 15:15:51 +0100 Subject: BTLE DBus: Add ability to connect/disconnect to remote device The patch uses the Device1 DBus API to connect and disconnect to a remote BTLE device. In addition, status and error condition tracking is added to adapt to various error cases. Task-number: QTBUG-46819 Change-Id: I0671df5596882c89aeead89c05ddcc855f8ba375 Reviewed-by: Oliver Wolff --- src/bluetooth/qlowenergycontroller_bluezdbus.cpp | 244 ++++++++++++++++++++++- src/bluetooth/qlowenergycontroller_bluezdbus_p.h | 28 ++- 2 files changed, 268 insertions(+), 4 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp index 95721e0c..1829f153 100644 --- a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp +++ b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp @@ -38,10 +38,17 @@ ****************************************************************************/ #include "qlowenergycontroller_bluezdbus_p.h" +#include "bluez/adapter1_bluez5_p.h" +#include "bluez/bluez5_helper_p.h" +#include "bluez/device1_bluez5_p.h" +#include "bluez/objectmanager_p.h" +#include "bluez/properties_p.h" QT_BEGIN_NAMESPACE +Q_DECLARE_LOGGING_CATEGORY(QT_BT_BLUEZ) + QLowEnergyControllerPrivateBluezDBus::QLowEnergyControllerPrivateBluezDBus() : QLowEnergyControllerPrivate() { @@ -55,15 +62,248 @@ void QLowEnergyControllerPrivateBluezDBus::init() { } +void QLowEnergyControllerPrivateBluezDBus::devicePropertiesChanged( + const QString &interface, const QVariantMap &changedProperties, + const QStringList &/*removedProperties*/) +{ + if (interface == QStringLiteral("org.bluez.Device1")) { + qCDebug(QT_BT_BLUEZ) << "######" << interface << changedProperties; + if (changedProperties.contains(QStringLiteral("ServicesResolved"))) { + //we could check for Connected property as well, but we choose to wait + //for ServicesResolved being true + + if (pendingConnect) { + bool isResolved = changedProperties.value(QStringLiteral("ServicesResolved")).toBool(); + if (isResolved) { + setState(QLowEnergyController::ConnectedState); + pendingConnect = false; + disconnectSignalRequired = true; + Q_Q(QLowEnergyController); + emit q->connected(); + } + } + } + + if (changedProperties.contains(QStringLiteral("Connected"))) { + bool isConnected = changedProperties.value(QStringLiteral("Connected")).toBool(); + if (!isConnected) { + switch (state) { + case QLowEnergyController::ConnectingState: + case QLowEnergyController::ConnectedState: + case QLowEnergyController::DiscoveringState: + case QLowEnergyController::DiscoveredState: + case QLowEnergyController::ClosingState: + { + bool emitDisconnect = disconnectSignalRequired; + bool emitError = pendingConnect; + + resetController(); + + if (emitError) + setError(QLowEnergyController::ConnectionError); + setState(QLowEnergyController::UnconnectedState); + + if (emitDisconnect) { + Q_Q(QLowEnergyController); + emit q->disconnected(); + } + } + break; + case QLowEnergyController::AdvertisingState: + case QLowEnergyController::UnconnectedState: + //ignore + break; + } + } + } + } +} + +void QLowEnergyControllerPrivateBluezDBus::interfacesRemoved( + const QDBusObjectPath &objectPath, const QStringList &/*interfaces*/) +{ + if (objectPath.path() == device->path()) { + resetController(); + setError(QLowEnergyController::UnknownRemoteDeviceError); + qCWarning(QT_BT_BLUEZ) << "DBus Device1 was removed"; + setState(QLowEnergyController::UnconnectedState); + } else if (objectPath.path() == adapter->path()) { + resetController(); + setError(QLowEnergyController::InvalidBluetoothAdapterError); + qCWarning(QT_BT_BLUEZ) << "DBus Adapter was removed"; + setState(QLowEnergyController::UnconnectedState); + } +} + +void QLowEnergyControllerPrivateBluezDBus::resetController() +{ + if (managerBluez) { + delete managerBluez; + managerBluez = nullptr; + } + + if (adapter) { + delete adapter; + adapter = nullptr; + } + + if (device) { + delete device; + device = nullptr; + } + + if (deviceMonitor) { + delete deviceMonitor; + deviceMonitor = nullptr; + } + + pendingConnect = pendingDisconnect = disconnectSignalRequired = false; +} + +void QLowEnergyControllerPrivateBluezDBus::connectToDeviceHelper() +{ + resetController(); + + bool ok = false; + const QString hostAdapterPath = findAdapterForAddress(localAdapter, &ok); + if (!ok || hostAdapterPath.isEmpty()) { + qCWarning(QT_BT_BLUEZ) << "Cannot find suitable bluetooth adapter"; + setError(QLowEnergyController::InvalidBluetoothAdapterError); + return; + } + + QScopedPointer manager( + new OrgFreedesktopDBusObjectManagerInterface( + QStringLiteral("org.bluez"), QStringLiteral("/"), + QDBusConnection::systemBus())); + + QDBusPendingReply reply = manager->GetManagedObjects(); + reply.waitForFinished(); + if (reply.isError()) { + qCWarning(QT_BT_BLUEZ) << "Cannot enumerate Bluetooth devices for GATT connect"; + setError(QLowEnergyController::ConnectionError); + return; + } + + QString devicePath; + ManagedObjectList managedObjectList = reply.value(); + for (ManagedObjectList::const_iterator it = managedObjectList.constBegin(); it != managedObjectList.constEnd(); ++it) { + const InterfaceList &ifaceList = it.value(); + + for (InterfaceList::const_iterator jt = ifaceList.constBegin(); jt != ifaceList.constEnd(); ++jt) { + const QString &iface = jt.key(); + const QVariantMap &ifaceValues = jt.value(); + + if (iface == QStringLiteral("org.bluez.Device1")) { + if (remoteDevice.toString() == ifaceValues.value(QStringLiteral("Address")).toString()) { + devicePath = it.key().path(); + break; + } + } + } + + if (!devicePath.isEmpty()) + break; + } + + if (devicePath.isEmpty()) { + qCDebug(QT_BT_BLUEZ) << "Cannot find targeted remote device. " + "Re-running device discovery might help"; + setError(QLowEnergyController::UnknownRemoteDeviceError); + return; + } + + managerBluez = manager.take(); + connect(managerBluez, &OrgFreedesktopDBusObjectManagerInterface::InterfacesRemoved, + this, &QLowEnergyControllerPrivateBluezDBus::interfacesRemoved); + adapter = new OrgBluezAdapter1Interface( + QStringLiteral("org.bluez"), hostAdapterPath, + QDBusConnection::systemBus(), this); + device = new OrgBluezDevice1Interface( + QStringLiteral("org.bluez"), devicePath, + QDBusConnection::systemBus(), this); + deviceMonitor = new OrgFreedesktopDBusPropertiesInterface( + QStringLiteral("org.bluez"), devicePath, + QDBusConnection::systemBus(), this); + connect(deviceMonitor, &OrgFreedesktopDBusPropertiesInterface::PropertiesChanged, + this, &QLowEnergyControllerPrivateBluezDBus::devicePropertiesChanged); +} + void QLowEnergyControllerPrivateBluezDBus::connectToDevice() { - qWarning() << "QLowEnergyControllerPrivateBluezDBus::connectToDevice(): Not implemented"; - //setError(QLowEnergyController::UnknownError); + qCDebug(QT_BT_BLUEZ) << "QLowEnergyControllerPrivateBluezDBus::connectToDevice()"; + + connectToDeviceHelper(); + + if (!adapter || !device) + return; + + if (!adapter->powered()) { + qCWarning(QT_BT_BLUEZ) << "Error: Local adapter is powered off"; + setError(QLowEnergyController::ConnectionError); + return; + } + + setState(QLowEnergyController::ConnectingState); + + //Bluez interface is shared among all platform processes + //and hence we might be connected already + if (device->connected() && device->servicesResolved()) { + //connectToDevice is noop + disconnectSignalRequired = true; + setState(QLowEnergyController::ConnectedState); + return; + } + + pendingConnect = true; + + QDBusPendingReply<> reply = device->Connect(); + QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(reply, this); + connect(watcher, &QDBusPendingCallWatcher::finished, this, + [=](QDBusPendingCallWatcher* call) { + QDBusPendingReply<> reply = *call; + if (reply.isError()) { + qCDebug(QT_BT_BLUEZ) << "BTLE_DBUS::connect() failed" + << reply.reply().errorName() + << reply.reply().errorMessage(); + bool emitDisconnect = disconnectSignalRequired; + resetController(); + setError(QLowEnergyController::UnknownError); + setState(QLowEnergyController::UnconnectedState); + if (emitDisconnect) { + Q_Q(QLowEnergyController); + emit q->disconnected(); + } + } // else -> connected when Connected property is set to true (see devicePropertiesChanged()) + call->deleteLater(); + }); } void QLowEnergyControllerPrivateBluezDBus::disconnectFromDevice() { + setState(QLowEnergyController::ClosingState); + + pendingDisconnect = true; + QDBusPendingReply<> reply = device->Disconnect(); + QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(reply, this); + connect(watcher, &QDBusPendingCallWatcher::finished, this, + [=](QDBusPendingCallWatcher* call) { + QDBusPendingReply<> reply = *call; + if (reply.isError()) { + qCDebug(QT_BT_BLUEZ) << "BTLE_DBUS::disconnect() failed" + << reply.reply().errorName() + << reply.reply().errorMessage(); + bool emitDisconnect = disconnectSignalRequired; + resetController(); + setState(QLowEnergyController::UnconnectedState); + if (emitDisconnect) { + Q_Q(QLowEnergyController); + emit q->disconnected(); + } + } + call->deleteLater(); + }); } void QLowEnergyControllerPrivateBluezDBus::discoverServices() diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h index b10199f5..c4589381 100644 --- a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h +++ b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h @@ -55,6 +55,13 @@ #include "qlowenergycontroller.h" #include "qlowenergycontrollerbase_p.h" +#include + +class OrgBluezAdapter1Interface; +class OrgBluezDevice1Interface; +class OrgFreedesktopDBusObjectManagerInterface; +class OrgFreedesktopDBusPropertiesInterface; + QT_BEGIN_NAMESPACE class QLowEnergyControllerPrivateBluezDBus : public QLowEnergyControllerPrivate @@ -104,8 +111,25 @@ public: QLowEnergyService *addServiceHelper(const QLowEnergyServiceData &service) override; - QLowEnergyController::ControllerState state; - QLowEnergyController::Error error; + +private: + void connectToDeviceHelper(); + void resetController(); + +private slots: + void devicePropertiesChanged(const QString &interface, const QVariantMap &changedProperties, + const QStringList &/*invalidatedProperties*/); + void interfacesRemoved(const QDBusObjectPath &objectPath, const QStringList &interfaces); + +private: + OrgBluezAdapter1Interface* adapter{}; + OrgBluezDevice1Interface* device{}; + OrgFreedesktopDBusObjectManagerInterface* managerBluez{}; + OrgFreedesktopDBusPropertiesInterface* deviceMonitor{}; + + bool pendingConnect = false; + bool pendingDisconnect = false; + bool disconnectSignalRequired = false; }; QT_END_NAMESPACE -- cgit v1.2.3 From 4a008da8dd7acec3ef45392e024e31552dbc3c49 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 8 Dec 2017 16:25:28 +0100 Subject: Support service discovery for BlueZ DBus backend At the same time a typo in a comment is fixed. Task-number: QTBUG-46819 Change-Id: Ic017df4d2d52cf0d226b6e083a9ec5f28657dee0 Reviewed-by: Oliver Wolff --- src/bluetooth/bluez/bluez5_helper.cpp | 2 +- src/bluetooth/qlowenergycontroller_bluezdbus.cpp | 48 ++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/src/bluetooth/bluez/bluez5_helper.cpp b/src/bluetooth/bluez/bluez5_helper.cpp index 1691bd34..90b7e5e0 100644 --- a/src/bluetooth/bluez/bluez5_helper.cpp +++ b/src/bluetooth/bluez/bluez5_helper.cpp @@ -197,7 +197,7 @@ QVersionNumber bluetoothdVersion() if (bluezDaemonVersion()->isNull()) { qCDebug(QT_BT_BLUEZ) << "Detecting bluetoothd version"; //Order of matching - // 1. Pick whatever the user decides via BLUETOOTH_BLUEZ_DBUS_LE + // 1. Pick whatever the user decides via BLUETOOTH_USE_BLUEZ_DBUS_LE const QString version = qEnvironmentVariable("BLUETOOTH_USE_BLUEZ_DBUS_LE"); if (!version.isNull()) { const QVersionNumber vn = QVersionNumber::fromString(version); diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp index 1829f153..1464561c 100644 --- a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp +++ b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp @@ -41,6 +41,7 @@ #include "bluez/adapter1_bluez5_p.h" #include "bluez/bluez5_helper_p.h" #include "bluez/device1_bluez5_p.h" +#include "bluez/gattservice1_p.h" #include "bluez/objectmanager_p.h" #include "bluez/properties_p.h" @@ -308,7 +309,54 @@ void QLowEnergyControllerPrivateBluezDBus::disconnectFromDevice() void QLowEnergyControllerPrivateBluezDBus::discoverServices() { + QDBusPendingReply reply = managerBluez->GetManagedObjects(); + reply.waitForFinished(); + if (reply.isError()) { + qCWarning(QT_BT_BLUEZ) << "Cannot discover services"; + setError(QLowEnergyController::UnknownError); + setState(QLowEnergyController::DiscoveredState); + return; + } + + Q_Q(QLowEnergyController); + + const ManagedObjectList managedObjectList = reply.value(); + const QString servicePathPrefix = device->path().append(QStringLiteral("/service")); + for (ManagedObjectList::const_iterator it = managedObjectList.constBegin(); it != managedObjectList.constEnd(); ++it) { + const InterfaceList &ifaceList = it.value(); + if (!it.key().path().startsWith(servicePathPrefix)) + continue; + + for (InterfaceList::const_iterator jt = ifaceList.constBegin(); jt != ifaceList.constEnd(); ++jt) { + const QString &iface = jt.key(); + + if (iface == QStringLiteral("org.bluez.GattService1")) { + QScopedPointer service(new OrgBluezGattService1Interface( + QStringLiteral("org.bluez"),it.key().path(), + QDBusConnection::systemBus(), this)); + + QSharedPointer priv = QSharedPointer::create(); + priv->uuid = QBluetoothUuid(service->uUID()); + + //no handles available + //priv->startHandle = start; + //priv->endHandle = end; + service->primary() + ? priv->type = QLowEnergyService::PrimaryService + : priv->type = QLowEnergyService::IncludedService; + priv->setController(this); + + serviceList.insert(priv->uuid, priv); + //TODO enable once discoverServiceDetails() is implemented + //foundServices.insert(priv->uuid, service); + + emit q->serviceDiscovered(priv->uuid); + } + } + } + setState(QLowEnergyController::DiscoveredState); + emit q->discoveryFinished(); } void QLowEnergyControllerPrivateBluezDBus::discoverServiceDetails(const QBluetoothUuid &/*service*/) -- cgit v1.2.3 From 4462750a68cb93b5d363b6efdbe1d6a6f0e5811f Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 14 Dec 2017 14:29:53 +0100 Subject: Implement QLEService::discoverDetails for DBus Bluez This includes support for reading of characteristics and descriptors. Task-number: QTBUG-46819 Change-Id: I8ac1ef3bcd5bc475941f1a9f889d0742eb8def35 Reviewed-by: Oliver Wolff --- src/bluetooth/qlowenergycharacteristic.h | 1 + src/bluetooth/qlowenergycontroller_bluezdbus.cpp | 364 ++++++++++++++++++++++- src/bluetooth/qlowenergycontroller_bluezdbus_p.h | 46 +++ src/bluetooth/qlowenergydescriptor.h | 1 + 4 files changed, 405 insertions(+), 7 deletions(-) diff --git a/src/bluetooth/qlowenergycharacteristic.h b/src/bluetooth/qlowenergycharacteristic.h index f36de9ff..f870a582 100644 --- a/src/bluetooth/qlowenergycharacteristic.h +++ b/src/bluetooth/qlowenergycharacteristic.h @@ -99,6 +99,7 @@ protected: friend class QLowEnergyControllerPrivate; friend class QLowEnergyControllerPrivateAndroid; friend class QLowEnergyControllerPrivateBluez; + friend class QLowEnergyControllerPrivateBluezDBus; friend class QLowEnergyControllerPrivateCommon; friend class QLowEnergyControllerPrivateOSX; friend class QLowEnergyControllerPrivateWinRT; diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp index 1464561c..b398def7 100644 --- a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp +++ b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp @@ -42,6 +42,9 @@ #include "bluez/bluez5_helper_p.h" #include "bluez/device1_bluez5_p.h" #include "bluez/gattservice1_p.h" + +#include "bluez/gattchar1_p.h" +#include "bluez/gattdesc1_p.h" #include "bluez/objectmanager_p.h" #include "bluez/properties_p.h" @@ -158,7 +161,12 @@ void QLowEnergyControllerPrivateBluezDBus::resetController() deviceMonitor = nullptr; } + dbusServices.clear(); + jobs.clear(); + invalidateServices(); + pendingConnect = pendingDisconnect = disconnectSignalRequired = false; + jobPending = false; } void QLowEnergyControllerPrivateBluezDBus::connectToDeviceHelper() @@ -337,18 +345,16 @@ void QLowEnergyControllerPrivateBluezDBus::discoverServices() QSharedPointer priv = QSharedPointer::create(); priv->uuid = QBluetoothUuid(service->uUID()); - - //no handles available - //priv->startHandle = start; - //priv->endHandle = end; service->primary() ? priv->type = QLowEnergyService::PrimaryService : priv->type = QLowEnergyService::IncludedService; priv->setController(this); + GattService serviceContainer; + serviceContainer.servicePath = it.key().path(); + serviceList.insert(priv->uuid, priv); - //TODO enable once discoverServiceDetails() is implemented - //foundServices.insert(priv->uuid, service); + dbusServices.insert(priv->uuid, serviceContainer); emit q->serviceDiscovered(priv->uuid); } @@ -359,9 +365,353 @@ void QLowEnergyControllerPrivateBluezDBus::discoverServices() emit q->discoveryFinished(); } -void QLowEnergyControllerPrivateBluezDBus::discoverServiceDetails(const QBluetoothUuid &/*service*/) +void QLowEnergyControllerPrivateBluezDBus::discoverServiceDetails(const QBluetoothUuid &service) +{ + if (!serviceList.contains(service) || !dbusServices.contains(service)) { + qCWarning(QT_BT_BLUEZ) << "Discovery of unknown service" << service.toString() + << "not possible"; + return; + } + + //clear existing service data and run new discovery + QSharedPointer serviceData = serviceList.value(service); + serviceData->characteristicList.clear(); + + GattService &dbusData = dbusServices[service]; + dbusData.characteristics.clear(); + + QDBusPendingReply reply = managerBluez->GetManagedObjects(); + reply.waitForFinished(); + if (reply.isError()) { + qCWarning(QT_BT_BLUEZ) << "Cannot discover services"; + setError(QLowEnergyController::UnknownError); + setState(QLowEnergyController::DiscoveredState); + return; + } + + QStringList descriptorPaths; + const ManagedObjectList managedObjectList = reply.value(); + for (ManagedObjectList::const_iterator it = managedObjectList.constBegin(); it != managedObjectList.constEnd(); ++it) { + const InterfaceList &ifaceList = it.value(); + if (!it.key().path().startsWith(dbusData.servicePath)) + continue; + + for (InterfaceList::const_iterator jt = ifaceList.constBegin(); jt != ifaceList.constEnd(); ++jt) { + const QString &iface = jt.key(); + if (iface == QStringLiteral("org.bluez.GattCharacteristic1")) { + auto charInterface = QSharedPointer::create( + QStringLiteral("org.bluez"), it.key().path(), + QDBusConnection::systemBus()); + GattCharacteristic dbusCharData; + dbusCharData.characteristic = charInterface; + dbusData.characteristics.append(dbusCharData); + } else if (iface == QStringLiteral("org.bluez.GattDescriptor1")) { + auto descInterface = QSharedPointer::create( + QStringLiteral("org.bluez"), it.key().path(), + QDBusConnection::systemBus()); + bool found = false; + for (GattCharacteristic &dbusCharData : dbusData.characteristics) { + if (!descInterface->path().startsWith( + dbusCharData.characteristic->path())) + continue; + + found = true; + dbusCharData.descriptors.append(descInterface); + break; + } + + Q_ASSERT(found); + if (!found) + qCWarning(QT_BT_BLUEZ) << "Descriptor discovery error"; + } + } + } + + //populate servicePrivate based on dbus data + serviceData->startHandle = runningHandle++; + for (const GattCharacteristic &dbusChar : qAsConst(dbusData.characteristics)) { + const QLowEnergyHandle indexHandle = runningHandle++; + QLowEnergyServicePrivate::CharData charData; + + // characteristic data + charData.valueHandle = runningHandle++; + const QStringList properties = dbusChar.characteristic->flags(); + + for (const auto &entry : properties) { + if (entry == QStringLiteral("broadcast")) + charData.properties.setFlag(QLowEnergyCharacteristic::Broadcasting, true); + else if (entry == QStringLiteral("read")) + charData.properties.setFlag(QLowEnergyCharacteristic::Read, true); + else if (entry == QStringLiteral("write-without-response")) + charData.properties.setFlag(QLowEnergyCharacteristic::WriteNoResponse, true); + else if (entry == QStringLiteral("write")) + charData.properties.setFlag(QLowEnergyCharacteristic::Write, true); + else if (entry == QStringLiteral("notify")) + charData.properties.setFlag(QLowEnergyCharacteristic::Notify, true); + else if (entry == QStringLiteral("indicate")) + charData.properties.setFlag(QLowEnergyCharacteristic::Indicate, true); + else if (entry == QStringLiteral("authenticated-signed-writes")) + charData.properties.setFlag(QLowEnergyCharacteristic::WriteSigned, true); + else if (entry == QStringLiteral("reliable-write")) + charData.properties.setFlag(QLowEnergyCharacteristic::ExtendedProperty, true); + else if (entry == QStringLiteral("writable-auxiliaries")) + charData.properties.setFlag(QLowEnergyCharacteristic::ExtendedProperty, true); + //all others ignored - not relevant for this API + } + + charData.uuid = QBluetoothUuid(dbusChar.characteristic->uUID()); + + // schedule read for initial char value + if (charData.properties.testFlag(QLowEnergyCharacteristic::Read)) { + GattJob job; + job.flags = GattJob::JobFlags({GattJob::CharRead, GattJob::ServiceDiscovery}); + job.service = serviceData; + job.handle = indexHandle; + jobs.append(job); + } + + // descriptor data + for (const auto &descEntry : qAsConst(dbusChar.descriptors)) { + const QLowEnergyHandle descriptorHandle = runningHandle++; + QLowEnergyServicePrivate::DescData descData; + descData.uuid = QBluetoothUuid(descEntry->uUID()); + charData.descriptorList.insert(descriptorHandle, descData); + + // schedule read for initial descriptor value + GattJob job; + job.flags = GattJob::JobFlags({GattJob::DescRead, GattJob::ServiceDiscovery}); + job.service = serviceData; + job.handle = descriptorHandle; + jobs.append(job); + } + + serviceData->characteristicList[indexHandle] = charData; + } + + serviceData->endHandle = runningHandle++; + + // last job is last step of service discovery + GattJob &lastJob = jobs.last(); + lastJob.flags.setFlag(GattJob::LastServiceDiscovery, true); + + scheduleNextJob(); +} + +void QLowEnergyControllerPrivateBluezDBus::prepareNextJob() +{ + jobs.takeFirst(); // finish last job + jobPending = false; + + scheduleNextJob(); // continue with next job - if available +} + +void QLowEnergyControllerPrivateBluezDBus::onCharReadFinished(QDBusPendingCallWatcher *call) { + Q_ASSERT(jobPending); + Q_ASSERT(!jobs.isEmpty()); + + const GattJob nextJob = jobs.constFirst(); + Q_ASSERT(nextJob.flags.testFlag(GattJob::CharRead)); + QSharedPointer service = serviceForHandle(nextJob.handle); + if (service.isNull() || !dbusServices.contains(service->uuid)) { + qCWarning(QT_BT_BLUEZ) << "onCharReadFinished: Invalid GATT job. Skipping."; + call->deleteLater(); + prepareNextJob(); + return; + } + const QLowEnergyServicePrivate::CharData &charData = + service->characteristicList.value(nextJob.handle); + + bool isServiceDiscovery = nextJob.flags.testFlag(GattJob::ServiceDiscovery); + QDBusPendingReply reply = *call; + if (reply.isError()) { + qCWarning(QT_BT_BLUEZ) << "Cannot initiate reading of" << charData.uuid + << "of service" << service->uuid + << reply.error().name() << reply.error().message(); + if (!isServiceDiscovery) + service->setError(QLowEnergyService::CharacteristicReadError); + } else { + qCDebug(QT_BT_BLUEZ) << "Read Char:" << charData.uuid << reply.value().toHex(); + updateValueOfCharacteristic(nextJob.handle, reply.value(), false); + + if (isServiceDiscovery) { + if (nextJob.flags.testFlag(GattJob::LastServiceDiscovery)) + service->setState(QLowEnergyService::ServiceDiscovered); + } else { + QLowEnergyCharacteristic ch(service, nextJob.handle); + emit service->characteristicRead(ch, reply.value()); + } + } + + call->deleteLater(); + prepareNextJob(); +} + + +void QLowEnergyControllerPrivateBluezDBus::onDescReadFinished(QDBusPendingCallWatcher *call) +{ + Q_ASSERT(jobPending); + Q_ASSERT(!jobs.isEmpty()); + + const GattJob nextJob = jobs.constFirst(); + Q_ASSERT(nextJob.flags.testFlag(GattJob::DescRead)); + + QSharedPointer service = serviceForHandle(nextJob.handle); + if (service.isNull() || !dbusServices.contains(service->uuid)) { + qCWarning(QT_BT_BLUEZ) << "onDescReadFinished: Invalid GATT job. Skipping."; + call->deleteLater(); + prepareNextJob(); + return; + } + + QLowEnergyCharacteristic ch = characteristicForHandle(nextJob.handle); + if (!ch.isValid()) { + qCWarning(QT_BT_BLUEZ) << "Cannot find char for desc read (onDescReadFinished 1)."; + call->deleteLater(); + prepareNextJob(); + return; + } + + const QLowEnergyServicePrivate::CharData &charData = + service->characteristicList.value(ch.attributeHandle()); + + if (!charData.descriptorList.contains(nextJob.handle)) { + qCWarning(QT_BT_BLUEZ) << "Cannot find descriptor (onDescReadFinished 2)."; + call->deleteLater(); + prepareNextJob(); + return; + } + + bool isServiceDiscovery = nextJob.flags.testFlag(GattJob::ServiceDiscovery); + const QBluetoothUuid descUuid = charData.descriptorList[nextJob.handle].uuid; + + QDBusPendingReply reply = *call; + if (reply.isError()) { + qCWarning(QT_BT_BLUEZ) << "Cannot read descriptor (onDescReadFinished 3): " + << charData.descriptorList[nextJob.handle].uuid + << charData.uuid + << reply.error().name() << reply.error().message(); + if (!isServiceDiscovery) + service->setError(QLowEnergyService::DescriptorReadError); + } else { + qCDebug(QT_BT_BLUEZ) << "Read Desc:" << reply.value(); + updateValueOfDescriptor(ch.attributeHandle(), nextJob.handle, reply.value(), false); + + if (isServiceDiscovery) { + if (nextJob.flags.testFlag(GattJob::LastServiceDiscovery)) + service->setState(QLowEnergyService::ServiceDiscovered); + } else { + QLowEnergyDescriptor desc(service, ch.attributeHandle(), nextJob.handle); + emit service->descriptorRead(desc, reply.value()); + } + } + + call->deleteLater(); + prepareNextJob(); +} + +void QLowEnergyControllerPrivateBluezDBus::scheduleNextJob() +{ + if (jobPending || jobs.isEmpty()) + return; + + jobPending = true; + + const GattJob nextJob = jobs.constFirst(); + QSharedPointer service = serviceForHandle(nextJob.handle); + if (service.isNull() || !dbusServices.contains(service->uuid)) { + qCWarning(QT_BT_BLUEZ) << "Invalid GATT job (scheduleReadChar). Skipping."; + prepareNextJob(); + return; + } + + const GattService &dbusServiceData = dbusServices[service->uuid]; + + if (nextJob.flags.testFlag(GattJob::CharRead)) { + // characteristic reading *************************************** + if (!service->characteristicList.contains(nextJob.handle)) { + qCWarning(QT_BT_BLUEZ) << "Invalid Char handle when reading. Skipping."; + prepareNextJob(); + return; + } + + const QLowEnergyServicePrivate::CharData &charData = + service->characteristicList.value(nextJob.handle); + bool foundChar = false; + for (const auto &gattChar : qAsConst(dbusServiceData.characteristics)) { + if (charData.uuid != QBluetoothUuid(gattChar.characteristic->uUID())) + continue; + + QDBusPendingReply reply = gattChar.characteristic->ReadValue(QVariantMap()); + QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(reply, this); + connect(watcher, &QDBusPendingCallWatcher::finished, + this, &QLowEnergyControllerPrivateBluezDBus::onCharReadFinished); + + foundChar = true; + break; + } + + if (!foundChar) { + qCWarning(QT_BT_BLUEZ) << "Cannot find char for reading. Skipping."; + prepareNextJob(); + return; + } + } else if (nextJob.flags.testFlag(GattJob::CharWrite)) { + //TODO implement CharWrite *************************************** + } else if (nextJob.flags.testFlag(GattJob::DescRead)) { + // descriptor reading *************************************** + QLowEnergyCharacteristic ch = characteristicForHandle(nextJob.handle); + if (!ch.isValid()) { + qCWarning(QT_BT_BLUEZ) << "Invalid GATT job (scheduleReadDesc 1). Skipping."; + prepareNextJob(); + return; + } + + const QLowEnergyServicePrivate::CharData &charData = + service->characteristicList.value(ch.attributeHandle()); + qCDebug(QT_BT_BLUEZ) << "###########" << ch.handle() << nextJob.handle + << charData.descriptorList.keys() + << service->characteristicList.keys(); + if (!charData.descriptorList.contains(nextJob.handle)) { + qCWarning(QT_BT_BLUEZ) << "Invalid GATT job (scheduleReadDesc 2). Skipping."; + prepareNextJob(); + return; + } + + const QBluetoothUuid descUuid = charData.descriptorList[nextJob.handle].uuid; + bool foundDesc = false; + for (const auto &gattChar : qAsConst(dbusServiceData.characteristics)) { + if (charData.uuid != QBluetoothUuid(gattChar.characteristic->uUID())) + continue; + + for (const auto &gattDesc : qAsConst(gattChar.descriptors)) { + if (descUuid != QBluetoothUuid(gattDesc->uUID())) + continue; + + QDBusPendingReply reply = gattDesc->ReadValue(QVariantMap()); + QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(reply, this); + connect(watcher, &QDBusPendingCallWatcher::finished, + this, &QLowEnergyControllerPrivateBluezDBus::onDescReadFinished); + foundDesc = true; + break; + } + + if (foundDesc) + break; + } + + if (!foundDesc) { + qCWarning(QT_BT_BLUEZ) << "Cannot find descriptor for reading. Skipping."; + prepareNextJob(); + return; + } + } else if (nextJob.flags.testFlag(GattJob::DescWrite)) { + //TODO implement DescWrite *************************************** + } else { + qCWarning(QT_BT_BLUEZ) << "Unknown gatt job type. Skipping."; + prepareNextJob(); + } } void QLowEnergyControllerPrivateBluezDBus::readCharacteristic( diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h index c4589381..84326e48 100644 --- a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h +++ b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h @@ -59,11 +59,16 @@ class OrgBluezAdapter1Interface; class OrgBluezDevice1Interface; +class OrgBluezGattCharacteristic1Interface; +class OrgBluezGattDescriptor1Interface; +class OrgBluezGattService1Interface; class OrgFreedesktopDBusObjectManagerInterface; class OrgFreedesktopDBusPropertiesInterface; QT_BEGIN_NAMESPACE +class QDBusPendingCallWatcher; + class QLowEnergyControllerPrivateBluezDBus : public QLowEnergyControllerPrivate { Q_OBJECT @@ -116,11 +121,15 @@ private: void connectToDeviceHelper(); void resetController(); + void scheduleNextJob(); + private slots: void devicePropertiesChanged(const QString &interface, const QVariantMap &changedProperties, const QStringList &/*invalidatedProperties*/); void interfacesRemoved(const QDBusObjectPath &objectPath, const QStringList &interfaces); + void onCharReadFinished(QDBusPendingCallWatcher *call); + void onDescReadFinished(QDBusPendingCallWatcher *call); private: OrgBluezAdapter1Interface* adapter{}; OrgBluezDevice1Interface* device{}; @@ -130,6 +139,43 @@ private: bool pendingConnect = false; bool pendingDisconnect = false; bool disconnectSignalRequired = false; + + struct GattCharacteristic + { + QSharedPointer characteristic; + QVector> descriptors; + }; + + struct GattService + { + QString servicePath; + QVector characteristics; + }; + + QHash dbusServices; + QLowEnergyHandle runningHandle = 1; + + struct GattJob { + enum JobFlag { + Unset = 0x00, + CharRead = 0x01, + CharWrite = 0x02, + DescRead = 0x04, + DescWrite = 0x08, + ServiceDiscovery = 0x10, + LastServiceDiscovery = 0x20 + }; + Q_DECLARE_FLAGS(JobFlags, JobFlag) + + JobFlags flags = GattJob::Unset; + QLowEnergyHandle handle; + QSharedPointer service; + }; + + QVector jobs; + bool jobPending = false; + + void prepareNextJob(); }; QT_END_NAMESPACE diff --git a/src/bluetooth/qlowenergydescriptor.h b/src/bluetooth/qlowenergydescriptor.h index aba2ef61..fca1be76 100644 --- a/src/bluetooth/qlowenergydescriptor.h +++ b/src/bluetooth/qlowenergydescriptor.h @@ -81,6 +81,7 @@ protected: friend class QLowEnergyControllerPrivate; friend class QLowEnergyControllerPrivateAndroid; friend class QLowEnergyControllerPrivateBluez; + friend class QLowEnergyControllerPrivateBluezDBus; friend class QLowEnergyControllerPrivateCommon; friend class QLowEnergyControllerPrivateOSX; friend class QLowEnergyControllerPrivateWinRT; -- cgit v1.2.3 From caad6365b291cc5066ff5aaacdc1b6e02818bc10 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 5 Jan 2018 14:25:26 +0100 Subject: BlueZ: Fix inconsistent QLEService error state Emitting just the signal does not change the error state. setError() ensures that the error state/member and the error signal are emitted. Change-Id: Idc044b8b97d4025b0f3a4d172c11c6b3a4e81ecb Reviewed-by: Christian Kandeler --- src/bluetooth/qlowenergycontroller_bluez.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index 3359edf0..9435d479 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -1244,9 +1244,9 @@ void QLowEnergyControllerPrivate::processReply( } else if (!isServiceDiscoveryRun) { // not encryption problem -> abort readCharacteristic()/readDescriptor() run if (!descriptorHandle) - emit service->error(QLowEnergyService::CharacteristicReadError); + service->setError(QLowEnergyService::CharacteristicReadError); else - emit service->error(QLowEnergyService::DescriptorReadError); + service->setError(QLowEnergyService::DescriptorReadError); } } else { if (!descriptorHandle) -- cgit v1.2.3 From 6eba2055ba2cf29ab8c2cbc8de10a1533b6404cc Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 4 Jan 2018 12:33:52 +0200 Subject: Add changes file for Qt 5.9.4 Change-Id: I20e1659b47f11733907f836782ac1a717891b35a Reviewed-by: Frederik Gladhorn --- dist/changes-5.9.4 | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 dist/changes-5.9.4 diff --git a/dist/changes-5.9.4 b/dist/changes-5.9.4 new file mode 100644 index 00000000..746c43dd --- /dev/null +++ b/dist/changes-5.9.4 @@ -0,0 +1,31 @@ +Qt 5.9.4 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.9.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/index.html + +The Qt version 5.9 series is binary compatible with the 5.8.x series. +Applications compiled for 5.8 will continue to run with 5.9. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.9.4 Changes * +**************************************************************************** + +QtBLuetooth +----------- + + - [QTBUG-64669] Fixed hanging service discovery state when remote device + does not respond to ATT read requests. + - [QTBUG-64597] Fixed compilation of heartrate server example with disabled + gui module. + - Added minor improvements to Windows UWP builds. -- cgit v1.2.3 From e0ef4fbc2e70622c25692262972b0dc2396af4ef Mon Sep 17 00:00:00 2001 From: Rainer Keller Date: Fri, 12 Jan 2018 13:25:37 +0100 Subject: qtlite: Skip building examples when configured with no-feature-itemviews Task-number: QTBUG-53141 Change-Id: Id256f00349d8bee8e4176005eea3bcba595899a2 Reviewed-by: Alex Blasche --- examples/bluetooth/btchat/btchat.pro | 1 + examples/bluetooth/btfiletransfer/btfiletransfer.pro | 1 + examples/bluetooth/btscanner/btscanner.pro | 1 + examples/nfc/ndefeditor/ndefeditor.pro | 1 + 4 files changed, 4 insertions(+) diff --git a/examples/bluetooth/btchat/btchat.pro b/examples/bluetooth/btchat/btchat.pro index 6ecae4c7..9c37dfcf 100644 --- a/examples/bluetooth/btchat/btchat.pro +++ b/examples/bluetooth/btchat/btchat.pro @@ -2,6 +2,7 @@ TEMPLATE = app TARGET = btchat QT = core bluetooth widgets +requires(qtConfig(listwidget)) android: QT += androidextras SOURCES = \ diff --git a/examples/bluetooth/btfiletransfer/btfiletransfer.pro b/examples/bluetooth/btfiletransfer/btfiletransfer.pro index e5d47302..92b81bef 100644 --- a/examples/bluetooth/btfiletransfer/btfiletransfer.pro +++ b/examples/bluetooth/btfiletransfer/btfiletransfer.pro @@ -2,6 +2,7 @@ TEMPLATE = app TARGET = btfiletransfer QT = core bluetooth widgets +requires(qtConfig(filedialog)) SOURCES = \ main.cpp \ diff --git a/examples/bluetooth/btscanner/btscanner.pro b/examples/bluetooth/btscanner/btscanner.pro index f1254629..904ea5a8 100644 --- a/examples/bluetooth/btscanner/btscanner.pro +++ b/examples/bluetooth/btscanner/btscanner.pro @@ -1,6 +1,7 @@ TARGET = btscanner QT = core bluetooth widgets +requires(qtConfig(listwidget)) TEMPLATE = app SOURCES = \ diff --git a/examples/nfc/ndefeditor/ndefeditor.pro b/examples/nfc/ndefeditor/ndefeditor.pro index 43ab47fa..4b81c17c 100644 --- a/examples/nfc/ndefeditor/ndefeditor.pro +++ b/examples/nfc/ndefeditor/ndefeditor.pro @@ -1,4 +1,5 @@ QT += nfc widgets +requires(qtConfig(filedialog)) TARGET = ndefeditor TEMPLATE = app -- cgit v1.2.3 From 20d21839e26b2d517e8e5d3dab9d86c5d338d414 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 16 Jan 2018 07:50:30 +0100 Subject: Disable compiler flag using proper qmake comment style Change-Id: I041606473b333500da29c821d7dc089313856f65 Reviewed-by: Oliver Wolff --- src/bluetooth/osx/osxbt.pri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bluetooth/osx/osxbt.pri b/src/bluetooth/osx/osxbt.pri index 13187e4f..0f293107 100644 --- a/src/bluetooth/osx/osxbt.pri +++ b/src/bluetooth/osx/osxbt.pri @@ -1,6 +1,6 @@ SOURCES += osx/uistrings.cpp osx/osxbtnotifier.cpp PRIVATE_HEADERS += osx/uistrings_p.h -//QMAKE_CXXFLAGS_WARN_ON += -Wno-nullability-completeness +#QMAKE_CXXFLAGS_WARN_ON += -Wno-nullability-completeness CONFIG(osx) { PRIVATE_HEADERS += osx/osxbtutility_p.h \ -- cgit v1.2.3 From b5e90f9e554997254fb54255339578e92234d5bb Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Fri, 19 Jan 2018 09:19:44 +0100 Subject: winrt: Finish classic BT device discovery if no device is found Task-number: QTBUG-65801 Change-Id: I32be0262165d963ba5fb933c73414451431b2242 Reviewed-by: Maurice Kalinowski --- .../qbluetoothdevicediscoveryagent_winrt.cpp | 25 +++++++++++++++------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_winrt.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_winrt.cpp index 17726660..ab01f14f 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_winrt.cpp +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_winrt.cpp @@ -88,7 +88,7 @@ private: QBluetoothDeviceDiscoveryAgent::DiscoveryMethod mode); void gatherDeviceInformation(IDeviceInformation *deviceInfo, QBluetoothDeviceDiscoveryAgent::DiscoveryMethod mode); - void gatherMultipleDeviceInformation(IVectorView *devices, + void gatherMultipleDeviceInformation(quint32 deviceCount, IVectorView *devices, QBluetoothDeviceDiscoveryAgent::DiscoveryMethod mode); void setupLEDeviceWatcher(); void classicBluetoothInfoFromDeviceIdAsync(HSTRING deviceId); @@ -197,7 +197,20 @@ void QWinRTBluetoothDeviceDiscoveryWorker::onDeviceDiscoveryFinished(IAsyncOpera HRESULT hr; hr = op->GetResults(&devices); Q_ASSERT_SUCCEEDED(hr); - gatherMultipleDeviceInformation(devices.Get(), mode); + quint32 deviceCount; + hr = devices->get_Size(&deviceCount); + Q_ASSERT_SUCCEEDED(hr); + + // For classic discovery only paired devices will be found. If we only do classic disovery and + // no device is found, the scan is finished. + if (requestedModes == QBluetoothDeviceDiscoveryAgent::ClassicMethod && + deviceCount == 0) { + finishDiscovery(); + return; + } + + m_pendingPairedDevices += deviceCount; + gatherMultipleDeviceInformation(deviceCount, devices.Get(), mode); } void QWinRTBluetoothDeviceDiscoveryWorker::gatherDeviceInformation(IDeviceInformation *deviceInfo, QBluetoothDeviceDiscoveryAgent::DiscoveryMethod mode) @@ -212,15 +225,11 @@ void QWinRTBluetoothDeviceDiscoveryWorker::gatherDeviceInformation(IDeviceInform classicBluetoothInfoFromDeviceIdAsync(deviceId.Get()); } -void QWinRTBluetoothDeviceDiscoveryWorker::gatherMultipleDeviceInformation(IVectorView *devices, QBluetoothDeviceDiscoveryAgent::DiscoveryMethod mode) +void QWinRTBluetoothDeviceDiscoveryWorker::gatherMultipleDeviceInformation(quint32 deviceCount, IVectorView *devices, QBluetoothDeviceDiscoveryAgent::DiscoveryMethod mode) { - quint32 deviceCount; - HRESULT hr = devices->get_Size(&deviceCount); - Q_ASSERT_SUCCEEDED(hr); - m_pendingPairedDevices += deviceCount; for (quint32 i = 0; i < deviceCount; ++i) { ComPtr device; - hr = devices->GetAt(i, &device); + HRESULT hr = devices->GetAt(i, &device); Q_ASSERT_SUCCEEDED(hr); gatherDeviceInformation(device.Get(), mode); } -- cgit v1.2.3 From dd2e19ca327a3f7a49c40b61c483ec60dcaafa90 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Wed, 24 Jan 2018 10:41:46 +0100 Subject: Initialize the discoveryAgent variable to 0 Change-Id: Ief783e899cde02ae033be8cd3af61ab5572d81a5 Reviewed-by: Oliver Wolff --- src/bluetooth/qbluetoothsocket_p.cpp | 1 + src/bluetooth/qbluetoothsocket_winrt.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/bluetooth/qbluetoothsocket_p.cpp b/src/bluetooth/qbluetoothsocket_p.cpp index 39d483d6..4c716005 100644 --- a/src/bluetooth/qbluetoothsocket_p.cpp +++ b/src/bluetooth/qbluetoothsocket_p.cpp @@ -50,6 +50,7 @@ QBluetoothSocketPrivate::QBluetoothSocketPrivate() socketType(QBluetoothServiceInfo::UnknownProtocol), state(QBluetoothSocket::UnconnectedState), socketError(QBluetoothSocket::NoSocketError), + discoveryAgent(0), secFlags(QBluetooth::NoSecurity) { #ifndef QT_IOS_BLUETOOTH diff --git a/src/bluetooth/qbluetoothsocket_winrt.cpp b/src/bluetooth/qbluetoothsocket_winrt.cpp index 501ffd74..17eeb195 100644 --- a/src/bluetooth/qbluetoothsocket_winrt.cpp +++ b/src/bluetooth/qbluetoothsocket_winrt.cpp @@ -309,6 +309,7 @@ QBluetoothSocketPrivate::QBluetoothSocketPrivate() socketType(QBluetoothServiceInfo::UnknownProtocol), state(QBluetoothSocket::UnconnectedState), socketError(QBluetoothSocket::NoSocketError), + discoveryAgent(0), secFlags(QBluetooth::NoSecurity), m_worker(new SocketWorker()) { -- cgit v1.2.3 From da4273723f42bb53827124101d91afa97d14b984 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 24 Jan 2018 14:04:03 +0100 Subject: Avoid wrong implicit cast leading to wrong connectToService() call Prior to this change passing a QBluetoothUuid::ServiceClassUuid to connectToService() caused the port overload to be called rather than the QBluetoothUuid version. This patch introduces a ServiceClassUuid overload that avoids relying on implicit type conversion. There is a remote chance that this patch breaks existing code if the remote port was in the same range as the ServiceClassUuid range. In general the Bluetooth ports are below 100 though. Task-number: QTBUG-65831 Change-Id: I6574291ae6fee284466d84ecb91f21e3be89f6b2 Reviewed-by: Simon Hausmann Reviewed-by: Karsten Heimrich --- src/bluetooth/qbluetoothsocket.cpp | 8 ++++++++ src/bluetooth/qbluetoothsocket.h | 5 +++++ src/bluetooth/qbluetoothuuid.h | 1 + 3 files changed, 14 insertions(+) diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index 18567f34..ddc6469f 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -386,6 +386,14 @@ void QBluetoothSocket::connectToService(const QBluetoothServiceInfo &service, Op #endif } +/*! + \fn void QBluetoothSocket::connectToService(const QBluetoothAddress &address, QBluetoothUuid::ServiceClassUuid uuid, OpenMode openMode = ReadWrite) + + \internal + + Exists to avoid QTBUG-65831. +*/ + /*! Attempts to make a connection to the service identified by \a uuid on the device with address \a address. diff --git a/src/bluetooth/qbluetoothsocket.h b/src/bluetooth/qbluetoothsocket.h index 4524e458..db8562ed 100644 --- a/src/bluetooth/qbluetoothsocket.h +++ b/src/bluetooth/qbluetoothsocket.h @@ -106,6 +106,11 @@ public: void connectToService(const QBluetoothServiceInfo &service, OpenMode openMode = ReadWrite); void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, OpenMode openMode = ReadWrite); void connectToService(const QBluetoothAddress &address, quint16 port, OpenMode openMode = ReadWrite); + inline void connectToService(const QBluetoothAddress &address, QBluetoothUuid::ServiceClassUuid uuid, + OpenMode openMode = ReadWrite) + { + connectToService(address, QBluetoothUuid(uuid), openMode); + } void disconnectFromService(); //bool flush(); diff --git a/src/bluetooth/qbluetoothuuid.h b/src/bluetooth/qbluetoothuuid.h index 27e26a67..25c7896c 100644 --- a/src/bluetooth/qbluetoothuuid.h +++ b/src/bluetooth/qbluetoothuuid.h @@ -58,6 +58,7 @@ struct quint128 class Q_BLUETOOTH_EXPORT QBluetoothUuid : public QUuid { public: + //TODO Qt 6: Convert enums to scoped enums (see QTBUG-65831) enum ProtocolUuid { Sdp = 0x0001, Udp = 0x0002, -- cgit v1.2.3 From 1e03015803549e2865b2772fe5be43d7bec8ccc1 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 4 Jan 2018 13:08:29 +0100 Subject: Implement Char read & write for dbus Gatt Read/write is limited to central role support. Peripheral role support will follow at a later stage. Task-number: QTBUG-46819 Change-Id: Idc27ea31cf0629470dc46490235c57f64b51498d Reviewed-by: Oliver Wolff --- src/bluetooth/qlowenergycontroller_bluezdbus.cpp | 122 +++++++++++++++++++++-- src/bluetooth/qlowenergycontroller_bluezdbus_p.h | 3 + 2 files changed, 117 insertions(+), 8 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp index b398def7..3f3bcbaa 100644 --- a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp +++ b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp @@ -611,6 +611,43 @@ void QLowEnergyControllerPrivateBluezDBus::onDescReadFinished(QDBusPendingCallWa prepareNextJob(); } +void QLowEnergyControllerPrivateBluezDBus::onCharWriteFinished(QDBusPendingCallWatcher *call) +{ + Q_ASSERT(jobPending); + Q_ASSERT(!jobs.isEmpty()); + + const GattJob nextJob = jobs.constFirst(); + Q_ASSERT(nextJob.flags.testFlag(GattJob::CharWrite)); + + QSharedPointer service = nextJob.service; + if (!dbusServices.contains(service->uuid)) { + qCWarning(QT_BT_BLUEZ) << "onCharWriteFinished: Invalid GATT job. Skipping."; + call->deleteLater(); + prepareNextJob(); + return; + } + + const QLowEnergyServicePrivate::CharData &charData = + service->characteristicList.value(nextJob.handle); + + QDBusPendingReply<> reply = *call; + if (reply.isError()) { + qCWarning(QT_BT_BLUEZ) << "Cannot initiate writing of" << charData.uuid + << "of service" << service->uuid + << reply.error().name() << reply.error().message(); + service->setError(QLowEnergyService::CharacteristicWriteError); + } else { + qCDebug(QT_BT_BLUEZ) << "Write Char:" << charData.uuid << nextJob.value.toHex(); + updateValueOfCharacteristic(nextJob.handle, nextJob.value, false); + + QLowEnergyCharacteristic ch(service, nextJob.handle); + emit service->characteristicWritten(ch, nextJob.value); + } + + call->deleteLater(); + prepareNextJob(); +} + void QLowEnergyControllerPrivateBluezDBus::scheduleNextJob() { if (jobPending || jobs.isEmpty()) @@ -658,7 +695,34 @@ void QLowEnergyControllerPrivateBluezDBus::scheduleNextJob() return; } } else if (nextJob.flags.testFlag(GattJob::CharWrite)) { - //TODO implement CharWrite *************************************** + // characteristic writing *************************************** + if (!service->characteristicList.contains(nextJob.handle)) { + qCWarning(QT_BT_BLUEZ) << "Invalid Char handle when writing. Skipping."; + prepareNextJob(); + return; + } + + const QLowEnergyServicePrivate::CharData &charData = + service->characteristicList.value(nextJob.handle); + bool foundChar = false; + for (const auto &gattChar : qAsConst(dbusServiceData.characteristics)) { + if (charData.uuid != QBluetoothUuid(gattChar.characteristic->uUID())) + continue; + + QDBusPendingReply<> reply = gattChar.characteristic->WriteValue(nextJob.value, QVariantMap()); + QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(reply, this); + connect(watcher, &QDBusPendingCallWatcher::finished, + this, &QLowEnergyControllerPrivateBluezDBus::onCharWriteFinished); + + foundChar = true; + break; + } + + if (!foundChar) { + qCWarning(QT_BT_BLUEZ) << "Cannot find char for writing. Skipping."; + prepareNextJob(); + return; + } } else if (nextJob.flags.testFlag(GattJob::DescRead)) { // descriptor reading *************************************** QLowEnergyCharacteristic ch = characteristicForHandle(nextJob.handle); @@ -715,10 +779,32 @@ void QLowEnergyControllerPrivateBluezDBus::scheduleNextJob() } void QLowEnergyControllerPrivateBluezDBus::readCharacteristic( - const QSharedPointer /*service*/, - const QLowEnergyHandle /*charHandle*/) + const QSharedPointer service, + const QLowEnergyHandle charHandle) { + Q_ASSERT(!service.isNull()); + if (!service->characteristicList.contains(charHandle)) { + qCWarning(QT_BT_BLUEZ) << "Read characteristic does not belong to service" + << service->uuid; + 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; + } + + GattJob job; + job.flags = GattJob::JobFlags({GattJob::CharRead}); + job.service = service; + job.handle = charHandle; + jobs.append(job); + scheduleNextJob(); } void QLowEnergyControllerPrivateBluezDBus::readDescriptor( @@ -730,12 +816,32 @@ void QLowEnergyControllerPrivateBluezDBus::readDescriptor( } void QLowEnergyControllerPrivateBluezDBus::writeCharacteristic( - const QSharedPointer /*service*/, - const QLowEnergyHandle /*charHandle*/, - const QByteArray &/*newValue*/, - QLowEnergyService::WriteMode /*writeMode*/) - { + const QSharedPointer service, + const QLowEnergyHandle charHandle, + const QByteArray &newValue, + QLowEnergyService::WriteMode writeMode) +{ + Q_ASSERT(!service.isNull()); + if (!service->characteristicList.contains(charHandle)) { + qCWarning(QT_BT_BLUEZ) << "Write characteristic does not belong to service" + << service->uuid; + return; + } + if (role == QLowEnergyController::CentralRole) { + GattJob job; + job.flags = GattJob::JobFlags({GattJob::CharWrite}); + job.service = service; + job.handle = charHandle; + job.value = newValue; + job.writeMode = writeMode; + jobs.append(job); + + scheduleNextJob(); + } else { + qWarning(QT_BT_BLUEZ) << "writeCharacteristic() not implemented for DBus Bluez GATT"; + service->setError(QLowEnergyService::CharacteristicWriteError); + } } void QLowEnergyControllerPrivateBluezDBus::writeDescriptor( diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h index 84326e48..c4845fc1 100644 --- a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h +++ b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h @@ -130,6 +130,7 @@ private slots: void onCharReadFinished(QDBusPendingCallWatcher *call); void onDescReadFinished(QDBusPendingCallWatcher *call); + void onCharWriteFinished(QDBusPendingCallWatcher *call); private: OrgBluezAdapter1Interface* adapter{}; OrgBluezDevice1Interface* device{}; @@ -169,6 +170,8 @@ private: JobFlags flags = GattJob::Unset; QLowEnergyHandle handle; + QByteArray value; + QLowEnergyService::WriteMode writeMode = QLowEnergyService::WriteWithResponse; QSharedPointer service; }; -- cgit v1.2.3 From 45ea69635f08f967b31660e2bcd33d3bb8187497 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 10 Jan 2018 10:31:41 +0100 Subject: Implement read-/writeDescriptor() for DBus GATT In addition there is a minor debug cleanup in the reading of descriptor code. Task-number: QTBUG-46819 Change-Id: I3f65c7d113b306b5b4892fa5df189476c06df0e9 Reviewed-by: Oliver Wolff --- src/bluetooth/qlowenergycontroller_bluezdbus.cpp | 137 +++++++++++++++++++++-- src/bluetooth/qlowenergycontroller_bluezdbus_p.h | 1 + 2 files changed, 126 insertions(+), 12 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp index 3f3bcbaa..6cbe67bb 100644 --- a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp +++ b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp @@ -548,7 +548,6 @@ void QLowEnergyControllerPrivateBluezDBus::onCharReadFinished(QDBusPendingCallWa prepareNextJob(); } - void QLowEnergyControllerPrivateBluezDBus::onDescReadFinished(QDBusPendingCallWatcher *call) { Q_ASSERT(jobPending); @@ -648,6 +647,50 @@ void QLowEnergyControllerPrivateBluezDBus::onCharWriteFinished(QDBusPendingCallW prepareNextJob(); } +void QLowEnergyControllerPrivateBluezDBus::onDescWriteFinished(QDBusPendingCallWatcher *call) +{ + Q_ASSERT(jobPending); + Q_ASSERT(!jobs.isEmpty()); + + const GattJob nextJob = jobs.constFirst(); + Q_ASSERT(nextJob.flags.testFlag(GattJob::DescWrite)); + + QSharedPointer service = nextJob.service; + if (!dbusServices.contains(service->uuid)) { + qCWarning(QT_BT_BLUEZ) << "onDescWriteFinished: Invalid GATT job. Skipping."; + call->deleteLater(); + prepareNextJob(); + return; + } + + const QLowEnergyCharacteristic associatedChar = characteristicForHandle(nextJob.handle); + const QLowEnergyDescriptor descriptor = descriptorForHandle(nextJob.handle); + if (!associatedChar.isValid() || !descriptor.isValid()) { + qCWarning(QT_BT_BLUEZ) << "onDescWriteFinished: Cannot find associated char/desc: " + << associatedChar.isValid(); + call->deleteLater(); + prepareNextJob(); + return; + } + + QDBusPendingReply<> reply = *call; + if (reply.isError()) { + qCWarning(QT_BT_BLUEZ) << "Cannot initiate writing of" << descriptor.uuid() + << "of char" << associatedChar.uuid() + << "of service" << service->uuid + << reply.error().name() << reply.error().message(); + service->setError(QLowEnergyService::DescriptorWriteError); + } else { + qCDebug(QT_BT_BLUEZ) << "Write Desc:" << descriptor.uuid() << nextJob.value.toHex(); + updateValueOfDescriptor(associatedChar.attributeHandle(), nextJob.handle, + nextJob.value, false); + emit service->descriptorWritten(descriptor, nextJob.value); + } + + call->deleteLater(); + prepareNextJob(); +} + void QLowEnergyControllerPrivateBluezDBus::scheduleNextJob() { if (jobPending || jobs.isEmpty()) @@ -734,9 +777,6 @@ void QLowEnergyControllerPrivateBluezDBus::scheduleNextJob() const QLowEnergyServicePrivate::CharData &charData = service->characteristicList.value(ch.attributeHandle()); - qCDebug(QT_BT_BLUEZ) << "###########" << ch.handle() << nextJob.handle - << charData.descriptorList.keys() - << service->characteristicList.keys(); if (!charData.descriptorList.contains(nextJob.handle)) { qCWarning(QT_BT_BLUEZ) << "Invalid GATT job (scheduleReadDesc 2). Skipping."; prepareNextJob(); @@ -771,7 +811,49 @@ void QLowEnergyControllerPrivateBluezDBus::scheduleNextJob() return; } } else if (nextJob.flags.testFlag(GattJob::DescWrite)) { - //TODO implement DescWrite *************************************** + // descriptor writing *************************************** + const QLowEnergyCharacteristic ch = characteristicForHandle(nextJob.handle); + if (!ch.isValid()) { + qCWarning(QT_BT_BLUEZ) << "Invalid GATT job (scheduleWriteDesc 1). Skipping."; + prepareNextJob(); + return; + } + + const QLowEnergyServicePrivate::CharData &charData = + service->characteristicList.value(ch.attributeHandle()); + if (!charData.descriptorList.contains(nextJob.handle)) { + qCWarning(QT_BT_BLUEZ) << "Invalid GATT job (scheduleWriteDesc 2). Skipping."; + prepareNextJob(); + return; + } + + const QBluetoothUuid descUuid = charData.descriptorList[nextJob.handle].uuid; + bool foundDesc = false; + for (const auto &gattChar : qAsConst(dbusServiceData.characteristics)) { + if (charData.uuid != QBluetoothUuid(gattChar.characteristic->uUID())) + continue; + + for (const auto &gattDesc : qAsConst(gattChar.descriptors)) { + if (descUuid != QBluetoothUuid(gattDesc->uUID())) + continue; + + QDBusPendingReply<> reply = gattDesc->WriteValue(nextJob.value, QVariantMap()); + QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(reply, this); + connect(watcher, &QDBusPendingCallWatcher::finished, + this, &QLowEnergyControllerPrivateBluezDBus::onDescWriteFinished); + foundDesc = true; + break; + } + + if (foundDesc) + break; + } + + if (!foundDesc) { + qCWarning(QT_BT_BLUEZ) << "Cannot find descriptor for writing. Skipping."; + prepareNextJob(); + return; + } } else { qCWarning(QT_BT_BLUEZ) << "Unknown gatt job type. Skipping."; prepareNextJob(); @@ -808,11 +890,26 @@ void QLowEnergyControllerPrivateBluezDBus::readCharacteristic( } void QLowEnergyControllerPrivateBluezDBus::readDescriptor( - const QSharedPointer /*service*/, - const QLowEnergyHandle /*charHandle*/, - const QLowEnergyHandle /*descriptorHandle*/) + 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; + + GattJob job; + job.flags = GattJob::JobFlags({GattJob::DescRead}); + job.service = service; + job.handle = descriptorHandle; + jobs.append(job); + + scheduleNextJob(); } void QLowEnergyControllerPrivateBluezDBus::writeCharacteristic( @@ -845,12 +942,28 @@ void QLowEnergyControllerPrivateBluezDBus::writeCharacteristic( } void QLowEnergyControllerPrivateBluezDBus::writeDescriptor( - const QSharedPointer /*service*/, - const QLowEnergyHandle /*charHandle*/, - const QLowEnergyHandle /*descriptorHandle*/, - const QByteArray &/*newValue*/) + const QSharedPointer service, + const QLowEnergyHandle charHandle, + const QLowEnergyHandle descriptorHandle, + const QByteArray &newValue) { + Q_ASSERT(!service.isNull()); + if (!service->characteristicList.contains(charHandle)) + return; + if (role == QLowEnergyController::CentralRole) { + GattJob job; + job.flags = GattJob::JobFlags({GattJob::DescWrite}); + job.service = service; + job.handle = descriptorHandle; + job.value = newValue; + jobs.append(job); + + scheduleNextJob(); + } else { + qWarning(QT_BT_BLUEZ) << "writeDescriptor() peripheral not implemented for DBus Bluez GATT"; + service->setError(QLowEnergyService::CharacteristicWriteError); + } } void QLowEnergyControllerPrivateBluezDBus::startAdvertising( diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h index c4845fc1..7195bfbf 100644 --- a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h +++ b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h @@ -131,6 +131,7 @@ private slots: void onCharReadFinished(QDBusPendingCallWatcher *call); void onDescReadFinished(QDBusPendingCallWatcher *call); void onCharWriteFinished(QDBusPendingCallWatcher *call); + void onDescWriteFinished(QDBusPendingCallWatcher *call); private: OrgBluezAdapter1Interface* adapter{}; OrgBluezDevice1Interface* device{}; -- cgit v1.2.3 From e55981842b702dced8ed0301ff9550e7d98e8a14 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 22 Jan 2018 12:24:01 +0100 Subject: BlueZ: Implements characteristicChanged() notifications This feature depends on ClientCharacteristicConfiguration descriptor types which determine whether changed signals are sent or not. The patch also ensures that cached char values are not updated/cached when the char is not readable. Task-number: QTBUG-46819 Change-Id: I841bcaaca60c588eae7d4067b6ead6af28f957e3 Reviewed-by: Oliver Wolff --- src/bluetooth/qlowenergycontroller_bluezdbus.cpp | 88 +++++++++++++++++++++--- src/bluetooth/qlowenergycontroller_bluezdbus_p.h | 4 ++ 2 files changed, 83 insertions(+), 9 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp index 6cbe67bb..e9087642 100644 --- a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp +++ b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp @@ -123,6 +123,35 @@ void QLowEnergyControllerPrivateBluezDBus::devicePropertiesChanged( } } +void QLowEnergyControllerPrivateBluezDBus::characteristicPropertiesChanged( + QLowEnergyHandle charHandle, const QString &interface, + const QVariantMap &changedProperties, + const QStringList &/*removedProperties*/) +{ + //qCDebug(QT_BT_BLUEZ) << "$$$$$$$$$$$$$$$$$$ char monitor" + // << interface << changedProperties << charHandle; + if (interface != QStringLiteral("org.bluez.GattCharacteristic1")) + return; + + if (!changedProperties.contains(QStringLiteral("Value"))) + return; + + const QLowEnergyCharacteristic changedChar = characteristicForHandle(charHandle); + const QLowEnergyDescriptor ccnDescriptor = changedChar.descriptor( + QBluetoothUuid::ClientCharacteristicConfiguration); + if (!ccnDescriptor.isValid()) + return; + + const QByteArray newValue = changedProperties.value(QStringLiteral("Value")).toByteArray(); + if (changedChar.properties() & QLowEnergyCharacteristic::Read) + updateValueOfCharacteristic(charHandle, newValue, false); //TODO upgrade to NEW_VALUE/APPEND_VALUE + + auto service = serviceForHandle(charHandle); + + if (!service.isNull()) + emit service->characteristicChanged(changedChar, newValue); +} + void QLowEnergyControllerPrivateBluezDBus::interfacesRemoved( const QDBusObjectPath &objectPath, const QStringList &/*interfaces*/) { @@ -429,7 +458,7 @@ void QLowEnergyControllerPrivateBluezDBus::discoverServiceDetails(const QBluetoo //populate servicePrivate based on dbus data serviceData->startHandle = runningHandle++; - for (const GattCharacteristic &dbusChar : qAsConst(dbusData.characteristics)) { + for (GattCharacteristic &dbusChar : dbusData.characteristics) { const QLowEnergyHandle indexHandle = runningHandle++; QLowEnergyServicePrivate::CharData charData; @@ -477,6 +506,23 @@ void QLowEnergyControllerPrivateBluezDBus::discoverServiceDetails(const QBluetoo descData.uuid = QBluetoothUuid(descEntry->uUID()); charData.descriptorList.insert(descriptorHandle, descData); + + // every ClientCharacteristicConfiguration needs to track property changes + if (descData.uuid + == QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)) { + dbusChar.charMonitor = QSharedPointer::create( + QStringLiteral("org.bluez"), + dbusChar.characteristic->path(), + QDBusConnection::systemBus(), this); + connect(dbusChar.charMonitor.data(), &OrgFreedesktopDBusPropertiesInterface::PropertiesChanged, + this, [this, indexHandle](const QString &interface, const QVariantMap &changedProperties, + const QStringList &removedProperties) { + + characteristicPropertiesChanged(indexHandle, interface, + changedProperties, removedProperties); + }); + } + // schedule read for initial descriptor value GattJob job; job.flags = GattJob::JobFlags({GattJob::DescRead, GattJob::ServiceDiscovery}); @@ -533,7 +579,8 @@ void QLowEnergyControllerPrivateBluezDBus::onCharReadFinished(QDBusPendingCallWa service->setError(QLowEnergyService::CharacteristicReadError); } else { qCDebug(QT_BT_BLUEZ) << "Read Char:" << charData.uuid << reply.value().toHex(); - updateValueOfCharacteristic(nextJob.handle, reply.value(), false); + if (charData.properties.testFlag(QLowEnergyCharacteristic::Read)) + updateValueOfCharacteristic(nextJob.handle, reply.value(), false); if (isServiceDiscovery) { if (nextJob.flags.testFlag(GattJob::LastServiceDiscovery)) @@ -636,11 +683,15 @@ void QLowEnergyControllerPrivateBluezDBus::onCharWriteFinished(QDBusPendingCallW << reply.error().name() << reply.error().message(); service->setError(QLowEnergyService::CharacteristicWriteError); } else { - qCDebug(QT_BT_BLUEZ) << "Write Char:" << charData.uuid << nextJob.value.toHex(); - updateValueOfCharacteristic(nextJob.handle, nextJob.value, false); + if (charData.properties.testFlag(QLowEnergyCharacteristic::Read)) + updateValueOfCharacteristic(nextJob.handle, nextJob.value, false); QLowEnergyCharacteristic ch(service, nextJob.handle); - emit service->characteristicWritten(ch, nextJob.value); + // write without respone implies zero feedback + if (nextJob.writeMode == QLowEnergyService::WriteWithResponse) { + qCDebug(QT_BT_BLUEZ) << "Written Char:" << charData.uuid << nextJob.value.toHex(); + emit service->characteristicWritten(ch, nextJob.value); + } } call->deleteLater(); @@ -837,10 +888,29 @@ void QLowEnergyControllerPrivateBluezDBus::scheduleNextJob() if (descUuid != QBluetoothUuid(gattDesc->uUID())) continue; - QDBusPendingReply<> reply = gattDesc->WriteValue(nextJob.value, QVariantMap()); - QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(reply, this); - connect(watcher, &QDBusPendingCallWatcher::finished, - this, &QLowEnergyControllerPrivateBluezDBus::onDescWriteFinished); + //notifications enabled via characteristics Start/StopNotify() functions + //otherwise regular WriteValue() calls on descriptor interface + if (descUuid == QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)) { + const QByteArray value = nextJob.value; + + QDBusPendingReply<> reply; + qCDebug(QT_BT_BLUEZ) << "Init CCC change to" << value.toHex() + << charData.uuid << service->uuid; + if (value == QByteArray::fromHex("0100") || value == QByteArray::fromHex("0200")) + reply = gattChar.characteristic->StartNotify(); + else + reply = gattChar.characteristic->StopNotify(); + QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(reply, this); + connect(watcher, &QDBusPendingCallWatcher::finished, + this, &QLowEnergyControllerPrivateBluezDBus::onDescWriteFinished); + } else { + QDBusPendingReply<> reply = gattDesc->WriteValue(nextJob.value, QVariantMap()); + QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(reply, this); + connect(watcher, &QDBusPendingCallWatcher::finished, + this, &QLowEnergyControllerPrivateBluezDBus::onDescWriteFinished); + + } + foundDesc = true; break; } diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h index 7195bfbf..7ac1808f 100644 --- a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h +++ b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h @@ -126,6 +126,9 @@ private: private slots: void devicePropertiesChanged(const QString &interface, const QVariantMap &changedProperties, const QStringList &/*invalidatedProperties*/); + void characteristicPropertiesChanged(QLowEnergyHandle charHandle, const QString &interface, + const QVariantMap &changedProperties, + const QStringList &invalidatedProperties); void interfacesRemoved(const QDBusObjectPath &objectPath, const QStringList &interfaces); void onCharReadFinished(QDBusPendingCallWatcher *call); @@ -145,6 +148,7 @@ private: struct GattCharacteristic { QSharedPointer characteristic; + QSharedPointer charMonitor; QVector> descriptors; }; -- cgit v1.2.3 From 39a7ba2d666c52c3dd732483619cadf6b7a49d60 Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Thu, 25 Jan 2018 10:14:16 +0100 Subject: Windows: Do not assert due to insufficient access If the device does not give access to obtain the list of services, then it should not throw an assert as the connection still succeeded, but the device cannot be used. Change-Id: I650eaba085f30c3cdc9980dd53de63482c7e7531 Reviewed-by: Oliver Wolff --- .../qbluetoothdevicediscoveryagent_winrt.cpp | 51 ++++++++++++---------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_winrt.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_winrt.cpp index 6786ac54..c97325cc 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_winrt.cpp +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_winrt.cpp @@ -374,34 +374,39 @@ HRESULT QWinRTBluetoothDeviceDiscoveryWorker::onPairedClassicBluetoothDeviceFoun Q_ASSERT_SUCCEEDED(hr); IVectorView *deviceServices; hr = device->get_RfcommServices(&deviceServices); - Q_ASSERT_SUCCEEDED(hr); - uint serviceCount; - hr = deviceServices->get_Size(&serviceCount); - Q_ASSERT_SUCCEEDED(hr); - QList uuids; - for (uint i = 0; i < serviceCount; ++i) { - ComPtr service; - hr = deviceServices->GetAt(i, &service); + if (hr == E_ACCESSDENIED) { + qCWarning(QT_BT_WINRT) << "Could not obtain device services. Please check you have " + "permission to access the device."; + } else { Q_ASSERT_SUCCEEDED(hr); - ComPtr id; - hr = service->get_ServiceId(&id); + uint serviceCount; + hr = deviceServices->get_Size(&serviceCount); Q_ASSERT_SUCCEEDED(hr); - GUID uuid; - hr = id->get_Uuid(&uuid); - Q_ASSERT_SUCCEEDED(hr); - uuids.append(QBluetoothUuid(uuid)); - } + QList uuids; + for (uint i = 0; i < serviceCount; ++i) { + ComPtr service; + hr = deviceServices->GetAt(i, &service); + Q_ASSERT_SUCCEEDED(hr); + ComPtr id; + hr = service->get_ServiceId(&id); + Q_ASSERT_SUCCEEDED(hr); + GUID uuid; + hr = id->get_Uuid(&uuid); + Q_ASSERT_SUCCEEDED(hr); + uuids.append(QBluetoothUuid(uuid)); + } - qCDebug(QT_BT_WINRT) << "Discovered BT device: " << QString::number(address) << btName - << "Num UUIDs" << uuids.count(); + qCDebug(QT_BT_WINRT) << "Discovered BT device: " << QString::number(address) << btName + << "Num UUIDs" << uuids.count(); - QBluetoothDeviceInfo info(QBluetoothAddress(address), btName, classOfDeviceInt); - info.setCoreConfigurations(QBluetoothDeviceInfo::BaseRateCoreConfiguration); - info.setServiceUuids(uuids, QBluetoothDeviceInfo::DataIncomplete); - info.setCached(true); + QBluetoothDeviceInfo info(QBluetoothAddress(address), btName, classOfDeviceInt); + info.setCoreConfigurations(QBluetoothDeviceInfo::BaseRateCoreConfiguration); + info.setServiceUuids(uuids, QBluetoothDeviceInfo::DataIncomplete); + info.setCached(true); - QMetaObject::invokeMethod(this, "deviceFound", Qt::AutoConnection, - Q_ARG(QBluetoothDeviceInfo, info)); + QMetaObject::invokeMethod(this, "deviceFound", Qt::AutoConnection, + Q_ARG(QBluetoothDeviceInfo, info)); + } if (!m_pendingPairedDevices && !(requestedModes & QBluetoothDeviceDiscoveryAgent::LowEnergyMethod)) finishDiscovery(); return S_OK; -- cgit v1.2.3 From 6c1fe38977a3a22a195166818145a5649782c44d Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 4 Jan 2018 10:12:55 +0100 Subject: Make tst_lowenergycontroller pass on DBUS Bluez backend In addition the patch adds a few improvements making the tests somewhat more reliable. 1.) The 0x1800 BTLE Generic Access service is not exposed by BlueZ's API. That's a deliberate decision by the devs. The patch removes the service from the list of to-be-checked services. 2.) QTBUG-42519 is a limitation of the non-DBus BTLE implementation and cannot be fixed. The new DBus API does permit concurrent QLowEnergyController instances. However the instances share a platform wide singleton which means that if one instance is connected then the other instances connects as well. Other platforms separate the connectivity between instances. Therefore tst_concurrentDiscovery() has to offer three different behavior patterns 3.) Consecutive calls to writeDescriptor() in tst_readWriteDescriptor() cause a crash of bluetoothd (version 5.47 or below) and a premature disconnect from the BLE device in version BlueZ 5.48. To avoid the problem qWait calls were introduced to delay the time between individual calls. 4.) Improves the robustness of the tst_writeCharacteristicNoResponse() test which relied on notifications being enabled for two of its characteristics. So far the notifications for one characteristic were enabled but not for the other. For some magical reason this happened to be the case on all platforms but the new DBUS BTLE implementation. 5.) Swapped out some QVERIFY statements in favor of QCOMPARE. This provides better error visibility when a test fails. 6.) The patch adds a time limitation of BTLE discovery which reduces the time the entire test run takes. This is API that was recently added. Change-Id: Ib633a87614af9cbccdb0253ba47fd059a2013358 Reviewed-by: Oliver Wolff --- src/bluetooth/bluez/bluez5_helper_p.h | 5 +- src/bluetooth/qtbluetoothglobal_p.h | 6 ++ .../tst_qlowenergycontroller.cpp | 120 +++++++++++++++++---- 3 files changed, 108 insertions(+), 23 deletions(-) diff --git a/src/bluetooth/bluez/bluez5_helper_p.h b/src/bluetooth/bluez/bluez5_helper_p.h index 1deecfc9..1747f249 100644 --- a/src/bluetooth/bluez/bluez5_helper_p.h +++ b/src/bluetooth/bluez/bluez5_helper_p.h @@ -54,6 +54,7 @@ #include #include #include +#include typedef QMap InterfaceList; typedef QMap ManagedObjectList; @@ -66,7 +67,9 @@ Q_DECLARE_METATYPE(ManagedObjectList) QT_BEGIN_NAMESPACE bool isBluez5(); -QVersionNumber bluetoothdVersion(); + +// exported for unit test purposes +Q_BLUETOOTH_PRIVATE_EXPORT QVersionNumber bluetoothdVersion(); QString sanitizeNameForDBus(const QString& text); diff --git a/src/bluetooth/qtbluetoothglobal_p.h b/src/bluetooth/qtbluetoothglobal_p.h index ffbfc4fe..59944593 100644 --- a/src/bluetooth/qtbluetoothglobal_p.h +++ b/src/bluetooth/qtbluetoothglobal_p.h @@ -56,4 +56,10 @@ #include #include +QT_BEGIN_NAMESPACE + +#define Q_BLUETOOTH_PRIVATE_EXPORT Q_BLUETOOTH_EXPORT + +QT_END_NAMESPACE + #endif // QTBLUETOOTHGLOBAL_P_H diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index 58510952..1d1997e0 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -29,6 +29,9 @@ #include #include +#if QT_CONFIG(bluez) +#include +#endif #include #include #include @@ -58,7 +61,10 @@ QT_USE_NAMESPACE #endif #ifdef HANDLES_PROVIDED_BY_PLATFORM -#define HANDLE_COMPARE(actual,expected) QCOMPARE(actual,expected) +#define HANDLE_COMPARE(actual,expected) \ + if (!isBluezDbusLE) {\ + QCOMPARE(actual, expected);\ + }; #else #define HANDLE_COMPARE(actual,expected) #endif @@ -91,6 +97,7 @@ private: QBluetoothAddress remoteDevice; QBluetoothDeviceInfo remoteDeviceInfo; QList foundServices; + bool isBluezDbusLE = false; }; tst_QLowEnergyController::tst_QLowEnergyController() @@ -107,6 +114,12 @@ tst_QLowEnergyController::tst_QLowEnergyController() qWarning() << "Not using any remote device for testing. Set BT_TEST_DEVICE env to run manual tests involving a remote device"; } #endif + +#if QT_CONFIG(bluez) + // This debug is needed to determine runtime configuration in the Qt CI. + isBluezDbusLE = (bluetoothdVersion() >= QVersionNumber(5, 42)); + qDebug() << "isDBusBluez:" << isBluezDbusLE; +#endif } tst_QLowEnergyController::~tst_QLowEnergyController() @@ -135,6 +148,7 @@ void tst_QLowEnergyController::initTestCase() #endif devAgent = new QBluetoothDeviceDiscoveryAgent(this); + devAgent->setLowEnergyDiscoveryTimeout(5000); QSignalSpy finishedSpy(devAgent, SIGNAL(finished())); // there should be no changes yet @@ -163,7 +177,8 @@ void tst_QLowEnergyController::initTestCase() // 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")); + if (!isBluezDbusLE) // Bluez LE Dbus intentionally hides 0x1800 service + 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")); @@ -449,9 +464,38 @@ void tst_QLowEnergyController::tst_concurrentDiscovery() 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); + if (!isBluezDbusLE) { + // see QTBUG-42519 + // Linux non-DBus GATT cannot maintain two controller connections at the same time + QCOMPARE(control.state(), QLowEnergyController::UnconnectedState); + QCOMPARE(control2.state(), QLowEnergyController::ConnectedState); + control2.disconnectFromDevice(); + QTRY_COMPARE(control2.state(), QLowEnergyController::UnconnectedState); + QTRY_COMPARE(control2.error(), QLowEnergyController::NoError); + + // reconnect control + control.connectToDevice(); + { + QTRY_VERIFY_WITH_TIMEOUT(control.state() != QLowEnergyController::ConnectingState, + 30000); + } + QCOMPARE(control.state(), QLowEnergyController::ConnectedState); + } else { + QCOMPARE(control.state(), QLowEnergyController::ConnectedState); + QCOMPARE(control2.state(), QLowEnergyController::ConnectedState); + control2.disconnectFromDevice(); + QTRY_COMPARE(control2.state(), QLowEnergyController::UnconnectedState); + QTRY_COMPARE(control2.error(), QLowEnergyController::NoError); + QTRY_COMPARE(control.state(), QLowEnergyController::UnconnectedState); + + // reconnect control + control.connectToDevice(); + { + QTRY_VERIFY_WITH_TIMEOUT(control.state() != QLowEnergyController::ConnectingState, + 30000); + } + QCOMPARE(control.state(), QLowEnergyController::ConnectedState); + } #endif } @@ -1981,12 +2025,30 @@ void tst_QLowEnergyController::tst_readWriteDescriptor() QVERIFY(notification == signalDesc); descWrittenSpy.clear(); + // The series of wait calls below is required because toggling CCC via the notifying + // property consistently crashes BlueZ 5.47. BlueZ 5.48 does not crash but + // an error is thrown. For details see QTBUG-65729 + if (isBluezDbusLE) + QTest::qWait(1000); + // test concurrent writeRequests // they need to be queued up service->writeDescriptor(notification,QByteArray::fromHex("0100")); + if (isBluezDbusLE) + QTest::qWait(1000); + service->writeDescriptor(notification, QByteArray::fromHex("0000")); + if (isBluezDbusLE) + QTest::qWait(1000); + service->writeDescriptor(notification, QByteArray::fromHex("0100")); + if (isBluezDbusLE) + QTest::qWait(1000); + service->writeDescriptor(notification, QByteArray::fromHex("0000")); + if (isBluezDbusLE) + QTest::qWait(1000); + QTRY_VERIFY_WITH_TIMEOUT(descWrittenSpy.count() == 4, 10000); QCOMPARE(notification.value(), QByteArray::fromHex("0000")); @@ -2520,10 +2582,14 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() QVERIFY(imageBlockChar.isValid()); // 2. Get "Image Identity" notification descriptor - const QLowEnergyDescriptor notification = imageIdentityChar.descriptor( + const QLowEnergyDescriptor identityNotification = imageIdentityChar.descriptor( + QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); + const QLowEnergyDescriptor blockNotification = imageBlockChar.descriptor( QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); - if (!notification.isValid() || !imageIdentityChar.isValid()) { + if (!identityNotification.isValid() + || !blockNotification.isValid() + || !imageIdentityChar.isValid()) { delete service; control.disconnectFromDevice(); QSKIP("Cannot find OAD char/notification"); @@ -2541,19 +2607,28 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() QSignalSpy errorSpy(service, SIGNAL(error(QLowEnergyService::ServiceError))); + //enable notifications on both characteristics + if (identityNotification.value() != QByteArray::fromHex("0100")) { + service->writeDescriptor(identityNotification, QByteArray::fromHex("0100")); + QTRY_VERIFY_WITH_TIMEOUT(!descWrittenSpy.isEmpty(), 3000); + QCOMPARE(identityNotification.value(), QByteArray::fromHex("0100")); + QList firstSignalData = descWrittenSpy.first(); + QLowEnergyDescriptor signalDesc = firstSignalData[0].value(); + QByteArray signalValue = firstSignalData[1].toByteArray(); + QCOMPARE(signalValue, QByteArray::fromHex("0100")); + QVERIFY(identityNotification == signalDesc); + descWrittenSpy.clear(); + } - // 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")) { - service->writeDescriptor(notification, QByteArray::fromHex("0100")); + if (blockNotification.value() != QByteArray::fromHex("0100")) { + service->writeDescriptor(blockNotification, QByteArray::fromHex("0100")); QTRY_VERIFY_WITH_TIMEOUT(!descWrittenSpy.isEmpty(), 3000); - QCOMPARE(notification.value(), QByteArray::fromHex("0100")); + QCOMPARE(blockNotification.value(), QByteArray::fromHex("0100")); QList firstSignalData = descWrittenSpy.first(); QLowEnergyDescriptor signalDesc = firstSignalData[0].value(); QByteArray signalValue = firstSignalData[1].toByteArray(); QCOMPARE(signalValue, QByteArray::fromHex("0100")); - QVERIFY(notification == signalDesc); + QVERIFY(blockNotification == signalDesc); descWrittenSpy.clear(); } @@ -2577,8 +2652,8 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() // Write triggers a notification and write confirmation service->writeCharacteristic(imageIdentityChar, QByteArray::fromHex("0")); QTest::qWait(1000); - QTRY_VERIFY_WITH_TIMEOUT(charChangedSpy.count() == 1, 5000); - QTRY_VERIFY_WITH_TIMEOUT(charWrittenSpy.count() == 1, 5000); + QTRY_COMPARE_WITH_TIMEOUT(charChangedSpy.count(), 1, 5000); + QTRY_COMPARE_WITH_TIMEOUT(charWrittenSpy.count(), 1, 5000); // This is very SensorTag specific logic. // If the image block is empty the current firmware @@ -2592,8 +2667,7 @@ 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. + // we received a notification for imageBlockChar QCOMPARE(imageBlockChar, first); qWarning() << "Invalid image A ident info"; } @@ -2614,8 +2688,8 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() // Image B service->writeCharacteristic(imageIdentityChar, QByteArray::fromHex("1")); QTest::qWait(1000); - QTRY_VERIFY_WITH_TIMEOUT(charChangedSpy.count() == 1, 5000); - QTRY_VERIFY_WITH_TIMEOUT(charWrittenSpy.count() == 1, 5000); + QTRY_COMPARE_WITH_TIMEOUT(charChangedSpy.count(), 1, 5000); + QTRY_COMPARE_WITH_TIMEOUT(charWrittenSpy.count(), 1, 5000);; entry = charChangedSpy[0]; first = entry[0].value(); @@ -2660,7 +2734,8 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() // we only expect one signal (the notification but not the write confirmation) // Wait at least a second for a potential second signals QTest::qWait(1000); - QTRY_VERIFY_WITH_TIMEOUT(charChangedSpy.count() == 1, 10000); + QTRY_COMPARE_WITH_TIMEOUT(charChangedSpy.count(), 1, 10000); + QTRY_COMPARE_WITH_TIMEOUT(charWrittenSpy.count(), 0, 10000); entry = charChangedSpy[0]; first = entry[0].value(); @@ -2695,7 +2770,8 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse() // we only expect one signal (the notification but not the write confirmation) // Wait at least a second for a potential second signals QTest::qWait(1000); - QTRY_VERIFY_WITH_TIMEOUT(charChangedSpy.count() == 1, 10000); + QTRY_COMPARE_WITH_TIMEOUT(charWrittenSpy.count(), 0, 10000); + QTRY_COMPARE_WITH_TIMEOUT(charChangedSpy.count(), 1, 10000); entry = charChangedSpy[0]; first = entry[0].value(); -- cgit v1.2.3 From 1d9d30a75a1c13851a9f050d7ce4f8057c4fa9fb Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 23 Jan 2018 13:59:27 +0100 Subject: Improve robustness of tst_lowenergycontroller test The test checks the value of various descriptors and characteristics of the TI Sensortag. One of those values are ClientCharacteristicConfiguration descriptors. This type of descriptor is consistent across multiple session for the same connecting central device. Therefore it may change and would create frequent test failures. Even worse, the unit test itself toggles the CCC value and assuming that a test may fail, the CC may remain with an uncertain value. This change makes the CCC value test more generic as it checks that the found value is within the acceptable range w/o expecting a defined value. Change-Id: I004a1037ee9e602807e4df5511c7d2205c92e5fe Reviewed-by: Oliver Wolff Reviewed-by: Timur Pocheptsov --- .../tst_qlowenergycontroller.cpp | 51 +++++++++++++++------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp index 1d1997e0..53c2f754 100644 --- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp +++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp @@ -92,6 +92,7 @@ private slots: void tst_errorCases(); private: void verifyServiceProperties(const QLowEnergyService *info); + bool verifyClientCharacteristicValue(const QByteArray& value); QBluetoothDeviceDiscoveryAgent *devAgent; QBluetoothAddress remoteDevice; @@ -708,7 +709,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), QBluetoothUuid::ClientCharacteristicConfiguration); - QCOMPARE(chars[0].descriptors().at(0).value(), QByteArray::fromHex("0000")); + QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value())); QVERIFY(info->contains(chars[0].descriptors().at(0))); } else if (info->serviceUuid() == QBluetoothUuid(QString("0000180a-0000-1000-8000-00805f9b34fb"))) { @@ -841,7 +842,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), QBluetoothUuid::ClientCharacteristicConfiguration); - QCOMPARE(chars[0].descriptors().at(0).value(), QByteArray::fromHex("0000")); + QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value())); QVERIFY(info->contains(chars[0].descriptors().at(0))); QCOMPARE(chars[0].descriptors().at(1).isValid(), true); @@ -928,7 +929,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), QBluetoothUuid::ClientCharacteristicConfiguration); - QCOMPARE(chars[0].descriptors().at(0).value(), QByteArray::fromHex("0000")); + QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value())); QVERIFY(info->contains(chars[0].descriptors().at(0))); QCOMPARE(chars[0].descriptors().at(1).isValid(), true); @@ -968,7 +969,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), QBluetoothUuid::ClientCharacteristicConfiguration); - QCOMPARE(chars[0].descriptors().at(0).value(), QByteArray::fromHex("0000")); + QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value())); QVERIFY(info->contains(chars[0].descriptors().at(0))); QCOMPARE(chars[0].descriptors().at(1).isValid(), true); @@ -1055,7 +1056,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), QBluetoothUuid::ClientCharacteristicConfiguration); - QCOMPARE(chars[0].descriptors().at(0).value(), QByteArray::fromHex("0000")); + QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value())); QVERIFY(info->contains(chars[0].descriptors().at(0))); QCOMPARE(chars[0].descriptors().at(1).isValid(), true); @@ -1143,7 +1144,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), QBluetoothUuid::ClientCharacteristicConfiguration); - QCOMPARE(chars[0].descriptors().at(0).value(), QByteArray::fromHex("0000")); + QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value())); QVERIFY(info->contains(chars[0].descriptors().at(0))); QCOMPARE(chars[0].descriptors().at(1).isValid(), true); @@ -1230,7 +1231,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), QBluetoothUuid::ClientCharacteristicConfiguration); - QCOMPARE(chars[0].descriptors().at(0).value(), QByteArray::fromHex("0000")); + QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value())); QVERIFY(info->contains(chars[0].descriptors().at(0))); QCOMPARE(chars[0].descriptors().at(1).isValid(), true); @@ -1299,7 +1300,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(calibration.descriptors().at(0).type(), QBluetoothUuid::ClientCharacteristicConfiguration); - QCOMPARE(calibration.descriptors().at(0).value(), QByteArray::fromHex("0000")); + QVERIFY(verifyClientCharacteristicValue(calibration.descriptors().at(0).value())); QVERIFY(info->contains(calibration.descriptors().at(0))); QCOMPARE(calibration.descriptors().at(1).isValid(), true); @@ -1365,7 +1366,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), QBluetoothUuid::ClientCharacteristicConfiguration); - QCOMPARE(chars[0].descriptors().at(0).value(), QByteArray::fromHex("0000")); + QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value())); QVERIFY(info->contains(chars[0].descriptors().at(0))); QCOMPARE(chars[0].descriptors().at(1).isValid(), true); @@ -1503,8 +1504,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), QBluetoothUuid::ClientCharacteristicConfiguration); - // value different in other revisions and test may fail - QCOMPARE(chars[0].descriptors().at(0).value(), QByteArray::fromHex("0100")); + QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value())); QVERIFY(info->contains(chars[0].descriptors().at(0))); QCOMPARE(chars[0].descriptors().at(1).isValid(), true); @@ -1582,8 +1582,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[0].descriptors().at(0).type(), QBluetoothUuid::ClientCharacteristicConfiguration); - // value different in other revisions and test may fail - QCOMPARE(chars[0].descriptors().at(0).value(), QByteArray::fromHex("0100")); + QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value())); QVERIFY(info->contains(chars[0].descriptors().at(0))); QCOMPARE(chars[0].descriptors().at(1).isValid(), true); @@ -1617,8 +1616,7 @@ void tst_QLowEnergyController::verifyServiceProperties( QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)); QCOMPARE(chars[1].descriptors().at(0).type(), QBluetoothUuid::ClientCharacteristicConfiguration); - // value different in other revisions and test may fail - QCOMPARE(chars[1].descriptors().at(0).value(), QByteArray::fromHex("0100")); + QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value())); QVERIFY(info->contains(chars[1].descriptors().at(0))); QCOMPARE(chars[1].descriptors().at(1).isValid(), true); @@ -1636,6 +1634,29 @@ void tst_QLowEnergyController::verifyServiceProperties( } } +/* + * CCC descriptors can have one of three distinct values: + * 0000 - notifications and indications are off + * 0100 - notifications enabled + * 0200 - indications enabled + * + * The exact value is managed by the BTLE peripheral for each central + * that connects. The value of this field is session based and may be retained + * during multiple connections. + * + * This function returns \c true if the CCC value has a valid range. + * */ +bool tst_QLowEnergyController::verifyClientCharacteristicValue(const QByteArray &value) +{ + if (value == QByteArray::fromHex("0000") + || value == QByteArray::fromHex("0100") + || value == QByteArray::fromHex("0200") ) + return true; + + qWarning() << "Found incorrect CC value" << value.toHex(); + return false; +} + void tst_QLowEnergyController::tst_defaultBehavior() { QList foundAddresses; -- cgit v1.2.3 From df376c4c27d16f70ba69925553acfc69287b269a Mon Sep 17 00:00:00 2001 From: Andy Shaw Date: Fri, 26 Jan 2018 11:54:55 +0100 Subject: Windows: Cancel and close the operation before deleting the SocketWorker Since it is possible that after calling Cancel() on the IAsyncInfo that it will still call the Completed() callback, we need to ensure that it has a chance to process the pending events before it is deleted. Change-Id: I7d6fbb5bf6344098048b147c9d361c1fe7923b55 Reviewed-by: Alex Blasche Reviewed-by: Oliver Wolff --- src/bluetooth/qbluetoothsocket_winrt.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/bluetooth/qbluetoothsocket_winrt.cpp b/src/bluetooth/qbluetoothsocket_winrt.cpp index 17eeb195..1faebf69 100644 --- a/src/bluetooth/qbluetoothsocket_winrt.cpp +++ b/src/bluetooth/qbluetoothsocket_winrt.cpp @@ -125,6 +125,9 @@ public: } ~SocketWorker() + { + } + void close() { if (Q_UNLIKELY(m_initialReadOp)) { ComPtr info; @@ -402,6 +405,7 @@ void QBluetoothSocketPrivate::abort() this, &QBluetoothSocketPrivate::handleNewData); disconnect(m_worker, &SocketWorker::socketErrorOccured, this, &QBluetoothSocketPrivate::handleError); + m_worker->close(); m_worker->deleteLater(); if (socket != -1) { -- cgit v1.2.3 From 1187c4cfcb8b02e499802331b8fe31dc2c17f53e Mon Sep 17 00:00:00 2001 From: Andrew O'Doherty Date: Wed, 20 Dec 2017 15:38:06 +0100 Subject: Revamp Qt NFC examples: annotatedurl example Align QtNfc Module examples to QML and c++ coding conventions. This commit is focused on the annotatedurl example. Task-number: QTBUG-60644 Change-Id: Ia8e847fe270a677812a75827945a1e85d6c1d1a9 Reviewed-by: Maurice Kalinowski --- examples/nfc/annotatedurl/annotatedurl.cpp | 40 ++++++++++++++---------------- examples/nfc/annotatedurl/annotatedurl.h | 4 +-- examples/nfc/annotatedurl/main.cpp | 17 +++++-------- examples/nfc/annotatedurl/mainwindow.cpp | 4 +-- examples/nfc/annotatedurl/mainwindow.h | 6 ++++- 5 files changed, 33 insertions(+), 38 deletions(-) diff --git a/examples/nfc/annotatedurl/annotatedurl.cpp b/examples/nfc/annotatedurl/annotatedurl.cpp index 7f63f44b..5c4a0527 100644 --- a/examples/nfc/annotatedurl/annotatedurl.cpp +++ b/examples/nfc/annotatedurl/annotatedurl.cpp @@ -47,24 +47,22 @@ ** $QT_END_LICENSE$ ** ****************************************************************************/ - #include "annotatedurl.h" -#include -#include -#include -#include -#include -#include - -#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include #include - -#include -#include -#include -#include -#include +#include AnnotatedUrl::AnnotatedUrl(QObject *parent) : QObject(parent) @@ -91,10 +89,10 @@ AnnotatedUrl::AnnotatedUrl(QObject *parent) qWarning() << "Platform does not support NDEF message handler registration"; manager->startTargetDetection(); - connect(manager, SIGNAL(targetDetected(QNearFieldTarget*)), - this, SLOT(targetDetected(QNearFieldTarget*))); - connect(manager, SIGNAL(targetLost(QNearFieldTarget*)), - this, SLOT(targetLost(QNearFieldTarget*))); + connect(manager, &QNearFieldManager::targetDetected, + this, &AnnotatedUrl::targetDetected); + connect(manager, &QNearFieldManager::targetLost, + this, &AnnotatedUrl::targetLost); } AnnotatedUrl::~AnnotatedUrl() @@ -107,8 +105,8 @@ void AnnotatedUrl::targetDetected(QNearFieldTarget *target) if (!target) return; - connect(target, SIGNAL(ndefMessageRead(QNdefMessage)), - this, SLOT(handlePolledNdefMessage(QNdefMessage))); + connect(target, &QNearFieldTarget::ndefMessageRead, + this, &AnnotatedUrl::handlePolledNdefMessage); target->readNdefMessages(); } diff --git a/examples/nfc/annotatedurl/annotatedurl.h b/examples/nfc/annotatedurl/annotatedurl.h index f4fe2ab9..e62b9d08 100644 --- a/examples/nfc/annotatedurl/annotatedurl.h +++ b/examples/nfc/annotatedurl/annotatedurl.h @@ -51,7 +51,7 @@ #ifndef ANNOTATEDURL_H #define ANNOTATEDURL_H -#include +#include #include @@ -60,8 +60,6 @@ QT_FORWARD_DECLARE_CLASS(QPixmap) QT_FORWARD_DECLARE_CLASS(QNearFieldManager) QT_FORWARD_DECLARE_CLASS(QNearFieldTarget) -QT_USE_NAMESPACE - class AnnotatedUrl : public QObject { Q_OBJECT diff --git a/examples/nfc/annotatedurl/main.cpp b/examples/nfc/annotatedurl/main.cpp index 109fb3b7..9ce6c1b9 100644 --- a/examples/nfc/annotatedurl/main.cpp +++ b/examples/nfc/annotatedurl/main.cpp @@ -51,26 +51,21 @@ #include "annotatedurl.h" #include "mainwindow.h" -#include -#include -#include - -#include - -#include +#include +#include +#include +#include int main(int argc, char *argv[]) { - //QLocale::setDefault(QLocale(QLocale::Japanese)); - QApplication a(argc, argv); MainWindow mainWindow; AnnotatedUrl annotatedUrl; - QObject::connect(&annotatedUrl, SIGNAL(annotatedUrl(QUrl,QString,QPixmap)), - &mainWindow, SLOT(displayAnnotatedUrl(QUrl,QString,QPixmap))); + QObject::connect(&annotatedUrl, &AnnotatedUrl::annotatedUrl, + &mainWindow, &MainWindow::displayAnnotatedUrl); mainWindow.show(); diff --git a/examples/nfc/annotatedurl/mainwindow.cpp b/examples/nfc/annotatedurl/mainwindow.cpp index 2220d747..707c03eb 100644 --- a/examples/nfc/annotatedurl/mainwindow.cpp +++ b/examples/nfc/annotatedurl/mainwindow.cpp @@ -51,9 +51,9 @@ #include "mainwindow.h" #include "ui_mainwindow.h" -#include -#include #include +#include +#include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) diff --git a/examples/nfc/annotatedurl/mainwindow.h b/examples/nfc/annotatedurl/mainwindow.h index e56ba521..9cfb6e7f 100644 --- a/examples/nfc/annotatedurl/mainwindow.h +++ b/examples/nfc/annotatedurl/mainwindow.h @@ -51,9 +51,13 @@ #ifndef MAINWINDOW_H #define MAINWINDOW_H -#include +#include +QT_FORWARD_DECLARE_CLASS(QMouseEvent) QT_FORWARD_DECLARE_CLASS(QUrl) +QT_FORWARD_DECLARE_CLASS(QPixmap) +QT_FORWARD_DECLARE_CLASS(QString) +QT_FORWARD_DECLARE_CLASS(QWidget) QT_BEGIN_NAMESPACE namespace Ui { -- cgit v1.2.3 From 0f1e8d9199eff71f84ed5bab10b60d9eaef1bf1b Mon Sep 17 00:00:00 2001 From: Andrew O'Doherty Date: Thu, 21 Dec 2017 13:47:44 +0100 Subject: Revamp Qt NFC examples: corkboard example Align QtNfc Module examples to QML and c++ coding conventions. This commit is focused on the corkboard example. Task-number: QTBUG-60644 Change-Id: I545cbffb6841b14e344ce1763e2387e2d5daa927 Reviewed-by: Maurice Kalinowski --- examples/nfc/corkboard/Mode.qml | 7 ++++--- examples/nfc/corkboard/corkboards.qml | 5 ++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/nfc/corkboard/Mode.qml b/examples/nfc/corkboard/Mode.qml index b06b22a5..0d427cf5 100644 --- a/examples/nfc/corkboard/Mode.qml +++ b/examples/nfc/corkboard/Mode.qml @@ -66,7 +66,8 @@ Item { Text { anchors { horizontalCenter: parent.horizontalCenter; top: parent.top; topMargin: 10} text: name; - font.pixelSize: 30; font.bold: true; color: "white" + font { pixelSize: 30; bold: true } + color: "white" style: Text.Outline; styleColor: "black" } @@ -75,8 +76,8 @@ Item { Item { id: stickyPage - 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 + x: ListView.width * (0.7 * Math.random() + 0.1) + y: ListView.height * (0.7 * Math.random() + 0.1) rotation: -listView.horizontalVelocity / 200; Behavior on rotation { diff --git a/examples/nfc/corkboard/corkboards.qml b/examples/nfc/corkboard/corkboards.qml index a1d9bee1..92cb6616 100644 --- a/examples/nfc/corkboard/corkboards.qml +++ b/examples/nfc/corkboard/corkboards.qml @@ -110,15 +110,14 @@ Rectangle { ListElement { name: "Work" notes: [ - //ListElement { noteText: "To write a tag, click the red flag of a note and then touch a tag" }, - ListElement { noteText: "https://www.qt.io" } + ListElement { noteText: "https://www.qt.io" }, + ListElement { noteText: "To write a tag, click the red flag of a note and then touch a tag" } ] } } ListView { id: listView - anchors.fill: parent orientation: ListView.Horizontal snapMode: ListView.SnapOneItem -- cgit v1.2.3 From 1d6687a0c3f3ac8033eaec43c8b77eef8ee5c833 Mon Sep 17 00:00:00 2001 From: Andrew O'Doherty Date: Thu, 21 Dec 2017 13:48:28 +0100 Subject: Revamp Qt NFC examples: ndefeditor example Align QtNfc Module examples to QML and c++ coding conventions. This commit is focused on the ndefeditor example. Task-number: QTBUG-60644 Change-Id: I6c14e1a7965bb335bfea87ed80c442926b6a36a4 Reviewed-by: Maurice Kalinowski --- examples/nfc/ndefeditor/mainwindow.cpp | 38 ++++++++++------------- examples/nfc/ndefeditor/mainwindow.h | 12 +++---- examples/nfc/ndefeditor/mimeimagerecordeditor.cpp | 6 ++-- examples/nfc/ndefeditor/mimeimagerecordeditor.h | 4 +-- examples/nfc/ndefeditor/textrecordeditor.cpp | 2 -- examples/nfc/ndefeditor/textrecordeditor.h | 4 +-- examples/nfc/ndefeditor/urirecordeditor.h | 5 ++- 7 files changed, 29 insertions(+), 42 deletions(-) diff --git a/examples/nfc/ndefeditor/mainwindow.cpp b/examples/nfc/ndefeditor/mainwindow.cpp index 02a969ae..41077c2d 100644 --- a/examples/nfc/ndefeditor/mainwindow.cpp +++ b/examples/nfc/ndefeditor/mainwindow.cpp @@ -55,21 +55,18 @@ #include "urirecordeditor.h" #include "mimeimagerecordeditor.h" -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include class EmptyRecordLabel : public QLabel { @@ -239,19 +236,16 @@ void MainWindow::targetDetected(QNearFieldTarget *target) case NoAction: break; case ReadNdef: - connect(target, SIGNAL(ndefMessageRead(QNdefMessage)), - this, SLOT(ndefMessageRead(QNdefMessage))); - connect(target, SIGNAL(error(QNearFieldTarget::Error,QNearFieldTarget::RequestId)), - this, SLOT(targetError(QNearFieldTarget::Error,QNearFieldTarget::RequestId))); + connect(target, &QNearFieldTarget::ndefMessageRead, this, &MainWindow::ndefMessageRead); + connect(target, &QNearFieldTarget::error, this, &MainWindow::targetError); 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())); - connect(target, SIGNAL(error(QNearFieldTarget::Error,QNearFieldTarget::RequestId)), - this, SLOT(targetError(QNearFieldTarget::Error,QNearFieldTarget::RequestId))); + connect(target, &QNearFieldTarget::ndefMessagesWritten, this, &MainWindow::ndefMessageWritten); + connect(target, &QNearFieldTarget::error, this, &MainWindow::targetError); m_request = target->writeNdefMessages(QList() << ndefMessage()); if (!m_request.isValid()) // cannot write messages diff --git a/examples/nfc/ndefeditor/mainwindow.h b/examples/nfc/ndefeditor/mainwindow.h index ebdb24f0..9018cbfb 100644 --- a/examples/nfc/ndefeditor/mainwindow.h +++ b/examples/nfc/ndefeditor/mainwindow.h @@ -51,16 +51,12 @@ #ifndef MAINWINDOW_H #define MAINWINDOW_H -#include +#include -#include +#include -QT_BEGIN_NAMESPACE -class QNearFieldManager; -class QNdefMessage; -QT_END_NAMESPACE - -QT_USE_NAMESPACE +QT_FORWARD_DECLARE_CLASS(QNearFieldManager) +QT_FORWARD_DECLARE_CLASS(QNdefMessage) QT_BEGIN_NAMESPACE namespace Ui { diff --git a/examples/nfc/ndefeditor/mimeimagerecordeditor.cpp b/examples/nfc/ndefeditor/mimeimagerecordeditor.cpp index ef8cf1fd..8044e8a6 100644 --- a/examples/nfc/ndefeditor/mimeimagerecordeditor.cpp +++ b/examples/nfc/ndefeditor/mimeimagerecordeditor.cpp @@ -51,9 +51,9 @@ #include "mimeimagerecordeditor.h" #include "ui_mimeimagerecordeditor.h" -#include -#include -#include +#include +#include +#include static QString imageFormatToMimeType(const QByteArray &format) { diff --git a/examples/nfc/ndefeditor/mimeimagerecordeditor.h b/examples/nfc/ndefeditor/mimeimagerecordeditor.h index f6089d43..1e810f64 100644 --- a/examples/nfc/ndefeditor/mimeimagerecordeditor.h +++ b/examples/nfc/ndefeditor/mimeimagerecordeditor.h @@ -52,9 +52,9 @@ #ifndef MIMEIMAGERECORDEDITOR_H #define MIMEIMAGERECORDEDITOR_H -#include +#include -#include +#include QT_USE_NAMESPACE diff --git a/examples/nfc/ndefeditor/textrecordeditor.cpp b/examples/nfc/ndefeditor/textrecordeditor.cpp index 390674ad..381ff88f 100644 --- a/examples/nfc/ndefeditor/textrecordeditor.cpp +++ b/examples/nfc/ndefeditor/textrecordeditor.cpp @@ -51,8 +51,6 @@ #include "textrecordeditor.h" #include "ui_textrecordeditor.h" -#include - TextRecordEditor::TextRecordEditor(QWidget *parent) : QWidget(parent), ui(new Ui::TextRecordEditor) diff --git a/examples/nfc/ndefeditor/textrecordeditor.h b/examples/nfc/ndefeditor/textrecordeditor.h index 65e33fb7..d7bf4d2e 100644 --- a/examples/nfc/ndefeditor/textrecordeditor.h +++ b/examples/nfc/ndefeditor/textrecordeditor.h @@ -51,9 +51,9 @@ #ifndef TEXTRECORDEDITOR_H #define TEXTRECORDEDITOR_H -#include +#include -#include +#include QT_BEGIN_NAMESPACE namespace Ui { diff --git a/examples/nfc/ndefeditor/urirecordeditor.h b/examples/nfc/ndefeditor/urirecordeditor.h index ef75065a..7eee55eb 100644 --- a/examples/nfc/ndefeditor/urirecordeditor.h +++ b/examples/nfc/ndefeditor/urirecordeditor.h @@ -48,13 +48,12 @@ ** ****************************************************************************/ - #ifndef URIRECORDEDITOR_H #define URIRECORDEDITOR_H -#include +#include -#include +#include QT_BEGIN_NAMESPACE namespace Ui { -- cgit v1.2.3 From 4fec6958d7af80c10453d4d45c2e9e90500a7549 Mon Sep 17 00:00:00 2001 From: Andrew O'Doherty Date: Thu, 21 Dec 2017 13:49:08 +0100 Subject: Revamp Qt NFC examples: poster example Align QtNfc Module examples to QML and c++ coding conventions. This commit is focused on the poster example. Task-number: QTBUG-60644 Change-Id: Icd0990c24d2d0e79a67a1354d82a9f6c1bf59244 Reviewed-by: Maurice Kalinowski --- examples/nfc/poster/poster.qml | 59 +++++++++++++-------------------------- examples/nfc/poster/qmlposter.cpp | 2 +- 2 files changed, 21 insertions(+), 40 deletions(-) diff --git a/examples/nfc/poster/poster.qml b/examples/nfc/poster/poster.qml index 3127d44e..3e2a1eda 100644 --- a/examples/nfc/poster/poster.qml +++ b/examples/nfc/poster/poster.qml @@ -128,11 +128,9 @@ Rectangle { Text { id: touchText - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter + anchors { horizontalCenter: parent.horizontalCenter; horizontalCenterOffset: parent.verticalCenter } text: "Touch an NFC tag with at least one Text and one URI record." - font.bold: true - font.pointSize: 18 + font { italic: true; pointSize: 18 } wrapMode: Text.WordWrap width: root.width*0.75 horizontalAlignment: Text.AlignHCenter @@ -150,27 +148,22 @@ Rectangle { Text { id: posterText - anchors.horizontalCenter: parent.right - anchors.horizontalCenterOffset: - parent.width / 4 y: -height - font.bold: true - font.pointSize: 18 + anchors { horizontalCenter: parent.right; horizontalCenterOffset: - parent.width / 4 } + font { italic: true; pointSize: 18 } } Text { id: posterUrl - anchors.horizontalCenter: parent.right - anchors.horizontalCenterOffset: - parent.width / 4 y: parent.height - font.italic: true - font.pointSize: 14 + anchors { horizontalCenter: parent.right; horizontalCenterOffset: - parent.width / 4 } + font { italic: true; pointSize: 14 } } MouseArea { id: openMouseArea anchors.fill: parent enabled: root.state == "show" - onClicked: Qt.openUrlExternally(posterUrl.text) Rectangle { @@ -179,14 +172,10 @@ Rectangle { height: 50 color: "lightsteelblue" opacity: 0.3 - anchors.top: parent.top - anchors.right: close.left - anchors.rightMargin: 10 - + anchors { top: parent.top; right: close.left; rightMargin: 10 } MouseArea { id: touchMouseArea anchors.fill: parent - onClicked: { if (root.state == "") { root.state = "show"; @@ -204,34 +193,26 @@ Rectangle { color: "black" radius: 0 opacity: 0.3 - anchors.top: parent.top - anchors.topMargin: 0 - anchors.right: parent.right - anchors.rightMargin: 0 - + anchors { top: parent.top; topMargin: 0; right: parent.right; rightMargin: 0 } MouseArea { id: closeMouseArea anchors.fill: parent - onClicked: Qt.quit(); } } } - states: [ - State { - name: "show" - PropertyChanges { target: posterText; y: root.height / 3 } - PropertyChanges { target: posterUrl; y: 2 * root.height / 3 } - PropertyChanges { target: posterImage; x: root.width / 20 } - PropertyChanges { target: touchText; opacity: 0 } - } - ] + states: State { + name: "show" + PropertyChanges { target: posterText; y: root.height / 3 } + PropertyChanges { target: posterUrl; y: 2 * root.height / 3 } + PropertyChanges { target: posterImage; x: root.width / 20 } + PropertyChanges { target: touchText; opacity: 0 } + } - transitions: [ - Transition { - PropertyAnimation { easing.type: Easing.OutQuad; properties: "x,y" } - PropertyAnimation { property: "opacity"; duration: 125 } - } - ] + + transitions: Transition { + PropertyAnimation { easing.type: Easing.OutQuad; properties: "x,y" } + PropertyAnimation { property: "opacity"; duration: 125 } + } } diff --git a/examples/nfc/poster/qmlposter.cpp b/examples/nfc/poster/qmlposter.cpp index 5bf5f352..a4f98de3 100644 --- a/examples/nfc/poster/qmlposter.cpp +++ b/examples/nfc/poster/qmlposter.cpp @@ -61,7 +61,7 @@ int main(int argc, char *argv[]) view.setResizeMode(QQuickView::SizeRootObjectToView); // Qt.quit() called in embedded .qml by default only emits // quit() signal, so do this (optionally use Qt.exit()). - QObject::connect(view.engine(), SIGNAL(quit()), qApp, SLOT(quit())); + QObject::connect(view.engine(), &QQmlEngine::quit, qApp, &QGuiApplication::quit); view.setGeometry(QRect(100, 100, 640, 360)); view.show(); return application.exec(); -- cgit v1.2.3 From 234907ae5fc3dd5b9e5c3b0fa76d65f986104a27 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 2 Feb 2018 15:11:47 +0100 Subject: Bump version Change-Id: I20893f8057bc1065957530fd1a1311a7b1879bed --- .qmake.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.qmake.conf b/.qmake.conf index 4f571fb5..7e0ad0e1 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,3 +1,3 @@ load(qt_build_config) -MODULE_VERSION = 5.9.4 +MODULE_VERSION = 5.9.5 -- cgit v1.2.3 From a7be018dfae73e4e2a68fd82e775d05d52aea983 Mon Sep 17 00:00:00 2001 From: Denis Shienkov Date: Fri, 26 Jan 2018 17:44:16 +0300 Subject: Fix stalling at characteristics updating in Low Energy Scanner example The method device.connectToService() can be finished quickly and Device::characteristicsUpdated() can be triggered before than the Characteristics.qml page will be loaded. Therefore we will get stuck in "Scanning for characteristics..." state. So, we need to call the device.connectToService() after loading of the Characteristics.qml page. Change-Id: Ic5c790f6f8dbeeae1e368c8a1c8ad8fb12a57087 Reviewed-by: Alex Blasche --- examples/bluetooth/lowenergyscanner/assets/Services.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/bluetooth/lowenergyscanner/assets/Services.qml b/examples/bluetooth/lowenergyscanner/assets/Services.qml index e22d1db3..68d7d447 100644 --- a/examples/bluetooth/lowenergyscanner/assets/Services.qml +++ b/examples/bluetooth/lowenergyscanner/assets/Services.qml @@ -115,8 +115,8 @@ Rectangle { MouseArea { anchors.fill: parent onClicked: { - device.connectToService(modelData.serviceUuid); pageLoader.source = "Characteristics.qml"; + device.connectToService(modelData.serviceUuid); } } -- cgit v1.2.3 From 2331b915d207fe794a07b834ec2bf8578965bc4d Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 30 Jan 2018 15:50:48 +0200 Subject: Add changes file for Qt 5.10.1 Change-Id: Iade3422ae5acf099eb0b79e857e4c73d60651d37 Reviewed-by: Maurice Kalinowski --- dist/changes-5.10.1 | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 dist/changes-5.10.1 diff --git a/dist/changes-5.10.1 b/dist/changes-5.10.1 new file mode 100644 index 00000000..3754c07c --- /dev/null +++ b/dist/changes-5.10.1 @@ -0,0 +1,39 @@ +Qt 5.10.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.10.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/index.html + +The Qt version 5.10 series is binary compatible with the 5.9.x series. +Applications compiled for 5.9 will continue to run with 5.10. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +This release contains all fixes included in the Qt 5.9.4 release. + +**************************************************************************** +* Qt 5.10.1 Changes * +**************************************************************************** + +QtBluetooth +----------- + + - Fixed missing QML version bump. The QML import statement for QtBluetooth + was still 5.9. + - Added various documentation improvements, e.g. special handling for iOS + use cases. + +QtNfc +----- + + - Fixed missing QML version bump. The QML import statement for QtNfc + was still 5.9. + - Added various improvements to all NFC examples. -- cgit v1.2.3 From d3f89fd77ec1fbd262a9479c37772a0aa6a13394 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 13 Feb 2018 14:37:15 +0100 Subject: Fix typos Change-Id: I0a35d5584c2c4364c6987d9add5e66f996647403 Reviewed-by: Leena Miettinen --- src/bluetooth/qbluetoothserver.cpp | 2 +- src/bluetooth/qlowenergyservice.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/qbluetoothserver.cpp b/src/bluetooth/qbluetoothserver.cpp index 90c3ff19..d9e42adf 100644 --- a/src/bluetooth/qbluetoothserver.cpp +++ b/src/bluetooth/qbluetoothserver.cpp @@ -189,7 +189,7 @@ QBluetoothServer::~QBluetoothServer() required to call \l QBluetoothServiceInfo::unregisterService() and \l close() on this server object. - Returns a registered QBluetoothServiceInfo instance if sucessful otherwise an + Returns a registered QBluetoothServiceInfo instance if successful otherwise an invalid QBluetoothServiceInfo. This function always assumes that the default Bluetooth adapter should be used. diff --git a/src/bluetooth/qlowenergyservice.cpp b/src/bluetooth/qlowenergyservice.cpp index 39de9d01..357d3901 100644 --- a/src/bluetooth/qlowenergyservice.cpp +++ b/src/bluetooth/qlowenergyservice.cpp @@ -75,7 +75,7 @@ QT_BEGIN_NAMESPACE \image peripheral-structure.png Structure of a generic peripheral - A characteristic is the principle information carrier. It has a + A characteristic is the principal information carrier. It has a \l {QLowEnergyCharacteristic::value()}{value()} and \l {QLowEnergyCharacteristic::value()}{properties()} describing the access permissions for the value. The general purpose -- cgit v1.2.3 From 3160f0850f3f3884220355693de0e7788f6e8f0c Mon Sep 17 00:00:00 2001 From: Konstantin Ritt Date: Fri, 2 Feb 2018 21:36:09 +0300 Subject: LE/Android: replace activity()/service() with context() Change-Id: I3fc082b42b6d56890039b482643ed41b9c9456ce Reviewed-by: Alex Blasche --- src/bluetooth/android/androidbroadcastreceiver.cpp | 4 +--- src/bluetooth/android/lowenergynotificationhub.cpp | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/bluetooth/android/androidbroadcastreceiver.cpp b/src/bluetooth/android/androidbroadcastreceiver.cpp index 50465017..c64e61ff 100644 --- a/src/bluetooth/android/androidbroadcastreceiver.cpp +++ b/src/bluetooth/android/androidbroadcastreceiver.cpp @@ -54,9 +54,7 @@ AndroidBroadcastReceiver::AndroidBroadcastReceiver(QObject* parent) : QObject(parent), valid(false) { // get Qt Context - // TODO: replace with QtAndroidPrivate::context() introduced by Qt 5.8 - contextObject = QAndroidJniObject(QtAndroidPrivate::activity() - ? QtAndroidPrivate::activity() : QtAndroidPrivate::service()); + contextObject = QAndroidJniObject(QtAndroidPrivate::context()); broadcastReceiverObject = QAndroidJniObject("org/qtproject/qt5/android/bluetooth/QtBluetoothBroadcastReceiver"); if (!broadcastReceiverObject.isValid()) diff --git a/src/bluetooth/android/lowenergynotificationhub.cpp b/src/bluetooth/android/lowenergynotificationhub.cpp index fee8ce19..b37e3e0c 100644 --- a/src/bluetooth/android/lowenergynotificationhub.cpp +++ b/src/bluetooth/android/lowenergynotificationhub.cpp @@ -70,7 +70,7 @@ LowEnergyNotificationHub::LowEnergyNotificationHub(const QBluetoothAddress &remo jBluetoothLe = QAndroidJniObject("org/qtproject/qt5/android/bluetooth/QtBluetoothLE", "(Ljava/lang/String;Landroid/content/Context;)V", address.object(), - QtAndroidPrivate::activity() ? QtAndroidPrivate::activity() : QtAndroidPrivate::service()); + QtAndroidPrivate::context()); } if (env->ExceptionCheck() || !jBluetoothLe.isValid()) { -- cgit v1.2.3 From b87affb8b2353af57ed5e736d82d67eb56ea1235 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Mon, 19 Feb 2018 13:52:41 +0100 Subject: Bump version Change-Id: I920c0707dec0670478d8905bdd67328d2a206e60 --- .qmake.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.qmake.conf b/.qmake.conf index dc68d388..097d8b94 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,3 +1,3 @@ load(qt_build_config) -MODULE_VERSION = 5.11.0 +MODULE_VERSION = 5.12.0 -- cgit v1.2.3 From 560c762f9b57a21b0424b080ff6aa414c88c86b3 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 21 Feb 2018 09:49:02 +0100 Subject: Fix qdoc Warning QBluetoothLocalDevice qbluetoothlocaldevice.cpp:272: (qdoc) warning: Undocumented parameter 'confirmation' in QBluetoothLocalDevice::pairingConfirmation() qbluetoothlocaldevice.cpp:272: (qdoc) warning: No such parameter 'accept' in QBluetoothLocalDevice::pairingConfirmation() Change-Id: Ice53e3a965b2d38a2d81d9b1a77292bd43c93967 Reviewed-by: Oliver Wolff --- src/bluetooth/qbluetoothlocaldevice.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/qbluetoothlocaldevice.cpp b/src/bluetooth/qbluetoothlocaldevice.cpp index 40d86ae3..e52dd88f 100644 --- a/src/bluetooth/qbluetoothlocaldevice.cpp +++ b/src/bluetooth/qbluetoothlocaldevice.cpp @@ -270,9 +270,9 @@ bool QBluetoothLocalDevice::isValid() const */ /*! - \fn QBluetoothLocalDevice::pairingConfirmation(bool accept) + \fn QBluetoothLocalDevice::pairingConfirmation(bool confirmation) - To be called after getting a pairingDisplayConfirmation(). The \a accept parameter either + To be called after getting a pairingDisplayConfirmation(). The \a confirmation parameter either accepts the pairing or rejects it. Accepting a pairing always refers to the last pairing request issued via \l requestPairing(). -- cgit v1.2.3 From d70fe2ac47dbf034991f0b2a4b0a3e1f16d171b9 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 22 Feb 2018 08:16:50 +0100 Subject: Remove not needed forward declaration Change-Id: I73650a766eb667b254f32ddab7bcf26e7c42f847 Reviewed-by: Oliver Wolff --- src/bluetooth/qlowenergyservice.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/bluetooth/qlowenergyservice.h b/src/bluetooth/qlowenergyservice.h index f413e7f7..9de65a84 100644 --- a/src/bluetooth/qlowenergyservice.h +++ b/src/bluetooth/qlowenergyservice.h @@ -47,7 +47,6 @@ QT_BEGIN_NAMESPACE class QLowEnergyServicePrivate; -class QLowEnergyControllerPrivateCommon; class Q_BLUETOOTH_EXPORT QLowEnergyService : public QObject { Q_OBJECT -- cgit v1.2.3 From 7f18a765d6e31bd3bd666eb965a8a36c021a8216 Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Tue, 13 Feb 2018 14:34:07 +0100 Subject: winrt: Properly close the bluetooth socket If I understand the documentation correctly, the socket's onCompleted callback should be called manually (with a proper status) before calling Close on its read operation (see https://docs.microsoft.com/en-us/uwp/api/windows.foundation.iasyncoperationwithprogress_tresult_tprogress_). Additionally all logic could be cut from the callback as soon as shutdown is initiated as we might run into dangling pointers otherwise. Change-Id: I3b7969f1aae16c453bc450b652746c8e21b2ef8f Reviewed-by: Andre de la Rocha Reviewed-by: Maurice Kalinowski --- src/bluetooth/qbluetoothsocket_winrt.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/bluetooth/qbluetoothsocket_winrt.cpp b/src/bluetooth/qbluetoothsocket_winrt.cpp index 8fa1338f..670235fa 100644 --- a/src/bluetooth/qbluetoothsocket_winrt.cpp +++ b/src/bluetooth/qbluetoothsocket_winrt.cpp @@ -132,7 +132,9 @@ public: } void close() { + m_shuttingDown = true; if (Q_UNLIKELY(m_initialReadOp)) { + onReadyRead(m_initialReadOp.Get(), Canceled); ComPtr info; HRESULT hr = m_initialReadOp.As(&info); Q_ASSERT_SUCCEEDED(hr); @@ -142,9 +144,11 @@ public: hr = info->Close(); Q_ASSERT_SUCCEEDED(hr); } + m_initialReadOp.Reset(); } if (m_readOp) { + onReadyRead(m_readOp.Get(), Canceled); ComPtr info; HRESULT hr = m_readOp.As(&info); Q_ASSERT_SUCCEEDED(hr); @@ -154,6 +158,7 @@ public: hr = info->Close(); Q_ASSERT_SUCCEEDED(hr); } + m_readOp.Reset(); } } @@ -193,6 +198,9 @@ public: HRESULT onReadyRead(IAsyncBufferOperation *asyncInfo, AsyncStatus status) { + if (m_shuttingDown) + return S_OK; + if (asyncInfo == m_initialReadOp.Get()) { m_initialReadOp.Reset(); } else if (asyncInfo == m_readOp.Get()) { @@ -302,6 +310,7 @@ public: private: ComPtr m_socket; QVector m_pendingData; + bool m_shuttingDown = false; // Protects pendingData/pendingDatagrams which are accessed from native callbacks QMutex m_mutex; -- cgit v1.2.3 From e03ac5fa38b51275dd62668a04ef279243299cd4 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 22 Feb 2018 09:17:51 +0100 Subject: Clarify Bluetooth support on Win32 when WinRT API is available Change-Id: I3ab1a8a474d33d3831e125e7f2760cc464c2437f Reviewed-by: Oliver Wolff --- src/bluetooth/doc/src/bluetooth-index.qdoc | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/bluetooth/doc/src/bluetooth-index.qdoc b/src/bluetooth/doc/src/bluetooth-index.qdoc index 9cb5f3b2..2a4f72bc 100644 --- a/src/bluetooth/doc/src/bluetooth-index.qdoc +++ b/src/bluetooth/doc/src/bluetooth-index.qdoc @@ -43,7 +43,7 @@ Currently, the API is supported on the following platforms: \li \l {Qt for Linux/X11}{Linux (BlueZ 4.x/5.x)} \li \l {Qt for OS X}{macOS} \li \l {Qt for WinRT}{WinRT} - \li \l {Qt for Windows}{Windows} + \li \l {Qt for Windows}{Win32} \row \li Classic Bluetooth \li x @@ -78,6 +78,11 @@ Currently, the API is supported on the following platforms: \li \endtable +Despite there not being a Win32 port yet, the WinRT backend is automatically used +if the win32 target platform supports the required WinRT APIs. Minimal requirement is Windows 10 version 1507 +with slightly improved service discovery since Windows 10 version 1607. Therefore Windows 7 and 8.x +targets are excluded. + \section1 Overview Bluetooth is a short-range (less than 100 meters) wireless technology. It -- cgit v1.2.3 From cfdfce6139c27e1c9f2e9dace2534b4f052cc0ba Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Thu, 1 Mar 2018 10:13:08 +0100 Subject: doc: State that QBluetoothLocalDevice is not supported on winrt As the winrt backend is the only available Windows backend atm, it probably causes least confusion if we state that the class is not available when using Windows. Change-Id: Ide9a1ad799c1bc19f0d503ac78e9f6b32f44b574 Reviewed-by: Andy Shaw Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothlocaldevice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bluetooth/qbluetoothlocaldevice.cpp b/src/bluetooth/qbluetoothlocaldevice.cpp index e52dd88f..78095beb 100644 --- a/src/bluetooth/qbluetoothlocaldevice.cpp +++ b/src/bluetooth/qbluetoothlocaldevice.cpp @@ -56,7 +56,7 @@ QT_BEGIN_NAMESPACE QBluetoothLocalDevice provides functions for getting and setting the state of local Bluetooth devices. - On iOS, this class cannot be used because the platform does not expose + On iOS and Windows, this class cannot be used because the platform does not expose any data or API which may provide information on the local Bluetooth device. */ -- cgit v1.2.3 From 588086170d79453095beee567ec138ecf7b2440c Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 2 Mar 2018 14:41:07 +0100 Subject: Reset mtu to default value after reconnect In theory each time a new connection is established, central and peripheral device should renegotiate the mtu. However this is not always happening which leads to wrong MTU assumptions. The most likely assumption is the default size of 23 bytes. Task-number: QTBUG-66056 Change-Id: I27d2cd89558b0c08925d31e2c7ed42ee45c303a4 Reviewed-by: Christian Kandeler --- src/bluetooth/qlowenergycontroller_bluez.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index c4ff0e7f..40519b51 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -796,6 +796,7 @@ void QLowEnergyControllerPrivateBluez::resetController() requestPending = false; encryptionChangePending = false; receivedMtuExchangeRequest = false; + mtuSize = ATT_DEFAULT_LE_MTU; securityLevelValue = -1; connectionHandle = 0; -- cgit v1.2.3 From 3d93b58fcc36f556a90613750a3150d56379b2a4 Mon Sep 17 00:00:00 2001 From: Nikita Baryshnikov Date: Mon, 5 Mar 2018 12:38:56 +0300 Subject: QLowEnergyDescriptor fix spelling in docs Change-Id: Ibbdf40f5cf2bdb174e5a7d5efc90e880fc0b2edc Reviewed-by: Leena Miettinen Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergydescriptor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/qlowenergydescriptor.cpp b/src/bluetooth/qlowenergydescriptor.cpp index 37a8f619..15859f17 100644 --- a/src/bluetooth/qlowenergydescriptor.cpp +++ b/src/bluetooth/qlowenergydescriptor.cpp @@ -54,14 +54,14 @@ QT_BEGIN_NAMESPACE QLowEnergyDescriptor provides information about a Bluetooth Low Energy descriptor's \l name(), \l uuid(), \l value() and \l handle(). Descriptors are encapsulated by Bluetooth Low Energy characteristics and provide additional - centextual information about the characteristic (data format, notification activation + contextual information about the characteristic (data format, notification activation and so on). The descriptor value may be written via the \l QLowEnergyService instance that manages the service to which this descriptor belongs. The \l {QLowEnergyService::writeDescriptor()} function writes the new value. The \l {QLowEnergyService::descriptorWritten()} signal - is emitted upon success. The cahced \l value() of this object is updated accordingly. + is emitted upon success. The cached \l value() of this object is updated accordingly. \sa QLowEnergyService, QLowEnergyCharacteristic */ -- cgit v1.2.3 From a0188acf80824e26632b8e008c22a4d2074d909a Mon Sep 17 00:00:00 2001 From: Andrew O'Doherty Date: Thu, 1 Feb 2018 12:46:32 +0100 Subject: Revamp Qt NFC examples: documentation update Update the documentation of annotatedurl and corkboard examples Task-number: QTBUG-60644 Change-Id: Ide980dd2573e443bc54553cd2916ac6b209da2c9 Reviewed-by: Alex Blasche --- examples/nfc/annotatedurl/annotatedurl.cpp | 4 +- examples/nfc/annotatedurl/annotatedurl.h | 2 + .../nfc/annotatedurl/doc/images/annotatedurl.png | Bin 34705 -> 7345 bytes .../nfc/annotatedurl/doc/images/annotatedurl2.png | Bin 0 -> 7685 bytes .../nfc/annotatedurl/doc/src/annotatedurl.qdoc | 48 +++++++++- examples/nfc/corkboard/doc/src/corkboard.qdoc | 101 ++++++++++++++++++++- examples/nfc/corkboard/main.cpp | 2 + 7 files changed, 147 insertions(+), 10 deletions(-) create mode 100644 examples/nfc/annotatedurl/doc/images/annotatedurl2.png diff --git a/examples/nfc/annotatedurl/annotatedurl.cpp b/examples/nfc/annotatedurl/annotatedurl.cpp index 5c4a0527..0e6b58fa 100644 --- a/examples/nfc/annotatedurl/annotatedurl.cpp +++ b/examples/nfc/annotatedurl/annotatedurl.cpp @@ -168,12 +168,12 @@ void AnnotatedUrl::handleMessage(const QNdefMessage &message, QNearFieldTarget * QNdefNfcUriRecord uriRecord(record); url = uriRecord.uri(); -//! [handleMessage 3] } else if (record.typeNameFormat() == QNdefRecord::Mime && record.type().startsWith("image/")) { pixmap = QPixmap::fromImage(QImage::fromData(record.payload())); -//! [handleMessage 4] } +//! [handleMessage 3] +//! [handleMessage 4] } emit annotatedUrl(url, title, pixmap); diff --git a/examples/nfc/annotatedurl/annotatedurl.h b/examples/nfc/annotatedurl/annotatedurl.h index e62b9d08..204bed5f 100644 --- a/examples/nfc/annotatedurl/annotatedurl.h +++ b/examples/nfc/annotatedurl/annotatedurl.h @@ -60,6 +60,7 @@ QT_FORWARD_DECLARE_CLASS(QPixmap) QT_FORWARD_DECLARE_CLASS(QNearFieldManager) QT_FORWARD_DECLARE_CLASS(QNearFieldTarget) +//! [0] class AnnotatedUrl : public QObject { Q_OBJECT @@ -79,5 +80,6 @@ public slots: private: QNearFieldManager *manager; }; +//! [0] #endif // ANNOTATEDURL_H diff --git a/examples/nfc/annotatedurl/doc/images/annotatedurl.png b/examples/nfc/annotatedurl/doc/images/annotatedurl.png index b6cf8637..01130ecd 100644 Binary files a/examples/nfc/annotatedurl/doc/images/annotatedurl.png and b/examples/nfc/annotatedurl/doc/images/annotatedurl.png differ diff --git a/examples/nfc/annotatedurl/doc/images/annotatedurl2.png b/examples/nfc/annotatedurl/doc/images/annotatedurl2.png new file mode 100644 index 00000000..2ea6f12f Binary files /dev/null and b/examples/nfc/annotatedurl/doc/images/annotatedurl2.png differ diff --git a/examples/nfc/annotatedurl/doc/src/annotatedurl.qdoc b/examples/nfc/annotatedurl/doc/src/annotatedurl.qdoc index 0ea57a7c..7fda040f 100644 --- a/examples/nfc/annotatedurl/doc/src/annotatedurl.qdoc +++ b/examples/nfc/annotatedurl/doc/src/annotatedurl.qdoc @@ -30,13 +30,53 @@ \title Annotated URL Example \brief An example showing reading from formatted NFC Data Exchange Format (NDEF) messages. -The Annotated URL example displays the contents of specifically formatted NFC -Data Exchange Format (NDEF) messages read from an NFC Tag. The NDEF message -should contain a URI record, an optional \c image/* MIME record, and one or more -localized Text records. +The Annotated URL example displays the contents of specifically +formatted NFC Data Exchange Format (NDEF) messages read from an NFC +Tag. The NDEF message should contain a URI record, an optional \c +image/* MIME record, and one or more localized Text records. +This is the initial state of the example: \image annotatedurl.png +In this example the NFC Tag used contains a text record. The UI +gets updated accordingly to: + +\image annotatedurl2.png + +\section1 AnnotatedUrl Class Definition + +The \c AnnotatedUrl class wraps the \c QNearFieldManager, the class +providing the NFC Tag detection functionality. NDEF messages are read +by the QNearFieldManager and forwarded to a handler contained in the +\c AnnotatedUrl class. After parsing the NDEF message the class emits +the signal AnnotatedUrl::annotatedUrl(const QUrl &url, const QString +&title, const QPixmap &pixmap). The UI reacts to the signal displaying +the contents of the NDEF message. + +\snippet annotatedurl/annotatedurl.h 0 + +\section1 AnnotatedUrl Handler Implementation + +NFC messages read by the \c QNearFieldManager are forwarded to +AnnotatedUrl::handleMessage. The callback signature details can be +read in \l{QNearFieldManager::registerNdefMessageHandler}. + +\snippet annotatedurl/annotatedurl.cpp handleMessage 1 + +Because NFC messages are composed of several NDEF records, looping +through all of the records allows the extraction of the 3 parameters +to be displayed in the UI: the Uri, the Title and the Pixmap: + + +\snippet annotatedurl/annotatedurl.cpp handleMessage 2 +\snippet annotatedurl/annotatedurl.cpp handleMessage 3 + +Finally after having extracted the parameters of the NFC message the +corresponding signal is emitted so that the UI can handle it. + +\snippet annotatedurl/annotatedurl.cpp handleMessage 4 + + \include examples-run.qdocinc \sa {Qt NFC} diff --git a/examples/nfc/corkboard/doc/src/corkboard.qdoc b/examples/nfc/corkboard/doc/src/corkboard.qdoc index 29ad8eac..ac21187b 100644 --- a/examples/nfc/corkboard/doc/src/corkboard.qdoc +++ b/examples/nfc/corkboard/doc/src/corkboard.qdoc @@ -30,13 +30,106 @@ \title QML CorkBoard Example \brief A QML example about displaying NFC Data Exchange Format (NDEF) messages. -The QML CorkBoard example displays the contents of NDEF messages read from an -NFC Tag. Each newly detected NDEF message is added to the corkboard and can be -dragged into an arbitrary position on the board. The corkboard has a \e Personal -and \e Work space. The workspace can be changed by sliding left or right. +The QML corkboard example displays the contents of NDEF messages read +from an NFC Tag. Each newly detected NDEF message is added to the +corkboard and can be dragged into an arbitrary position on the +board. The corkboard has a \e Personal and \e Work space. The +workspace can be changed by sliding left or right. + \image corkboard.png +\section1 Implementation details +In the corkboard example, we use the following .qml files: + \list + \li corkboards.qml + \li Mode.qml + \endlist + +The main.cpp holds the application logic to load the main view stored +in the corkboards.qml file. + +\snippet corkboard/main.cpp 0 + +\section1 corkboards.qml details +There are two basic QML components in this file: + \list + \li NearField + \li ListView + \endlist + +The first time the NearField QML type is instantiated, the +Component.onCompleted handler will start the NFC polling process. The +\l [Qml] {NearField} {onMessageRecordsChanged} handler parses NFC +Messages that are detected by the NearField component and builds up a +data model that is passed into the ListView. Additionally, every time the +NearField manager stops the polling process, the onPollingChanged +handler restarts it. + +\quotefromfile corkboard/corkboards.qml +\skipto NearField +\printuntil onMessageRecordsChanged +\dots 8 +\skipuntil } +\skipto onPollingChanged +\printuntil onPollingChanged +\dots 8 +\skipuntil } +\skipto Component +\printuntil Component +\dots 8 +\skipuntil } +\printline } +\skipto ListModel +\printto ListModel + +The ListView component takes a ListModel as parameter (built from the +NFC records). The view of each of the items of the model is defined by +the Mode component (its implementation details can be found in the +file Mode.qml). The data model consists of a list of corkboards. Each +corkboard can display multiple NFC text message records. + +\quotefromfile corkboard/corkboards.qml +\skipto ListView +\printuntil id +\dots 8 +\skipto model +\printuntil model +\dots 8 +\skipto delegate +\printuntil delegate +\skipto } +\printline } + +\section1 Mode.qml details + +A corkboard title is displayed for each of the items that form part +of the data model: + +\quotefromfile corkboard/Mode.qml +\skipto Text +\printuntil } +\printuntil } + +Every text record that was read from an NFC message, is represented by +a sticky note with its own position on the display. Initially the +position is set randomly. The text on the sticky note is set on a +TextField. + +\quotefromfile corkboard/Mode.qml +\skipto Repeater +\printuntil y: +\skipto Item +\dots 16 +\printuntil sticky +\dots 20 +\skipto TextEdit +\printuntil noteText +\dots 24 +\skipto } +\printuntil } +\dots 20 + \include examples-run.qdocinc \sa {Qt NFC} diff --git a/examples/nfc/corkboard/main.cpp b/examples/nfc/corkboard/main.cpp index 99673c80..74fad72f 100644 --- a/examples/nfc/corkboard/main.cpp +++ b/examples/nfc/corkboard/main.cpp @@ -53,6 +53,7 @@ #include #include +//! [0] int main(int argc, char *argv[]) { QGuiApplication application(argc, argv); @@ -62,3 +63,4 @@ int main(int argc, char *argv[]) view.show(); return application.exec(); } +//! [0] -- cgit v1.2.3 From beaca75d17de2c1b0cfe1c70a1f3d37a3f8ac669 Mon Sep 17 00:00:00 2001 From: Andrew O'Doherty Date: Thu, 1 Feb 2018 13:27:28 +0100 Subject: Revamp Qt NFC examples: documentation update Update the documentation of the ndefeditor example Task-number: QTBUG-60644 Change-Id: Id74ee10565dd812fcf51db151f641549d3d60682 Reviewed-by: Maurice Kalinowski Reviewed-by: Alex Blasche --- examples/nfc/ndefeditor/doc/images/ndefeditor.png | Bin 24397 -> 13445 bytes examples/nfc/ndefeditor/doc/src/ndefeditor.qdoc | 78 ++++++++++++++++++++-- examples/nfc/ndefeditor/mainwindow.cpp | 8 +-- examples/nfc/ndefeditor/mainwindow.h | 3 +- examples/nfc/ndefeditor/mimeimagerecordeditor.h | 4 +- examples/nfc/ndefeditor/textrecordeditor.h | 4 +- examples/nfc/ndefeditor/urirecordeditor.h | 5 +- 7 files changed, 86 insertions(+), 16 deletions(-) diff --git a/examples/nfc/ndefeditor/doc/images/ndefeditor.png b/examples/nfc/ndefeditor/doc/images/ndefeditor.png index 9a5fbba7..d203e474 100644 Binary files a/examples/nfc/ndefeditor/doc/images/ndefeditor.png and b/examples/nfc/ndefeditor/doc/images/ndefeditor.png differ diff --git a/examples/nfc/ndefeditor/doc/src/ndefeditor.qdoc b/examples/nfc/ndefeditor/doc/src/ndefeditor.qdoc index ed7d2bba..eb638200 100644 --- a/examples/nfc/ndefeditor/doc/src/ndefeditor.qdoc +++ b/examples/nfc/ndefeditor/doc/src/ndefeditor.qdoc @@ -3,7 +3,7 @@ ** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** -** This file is part of the documentation of the Qt local connectivty modules. +** This file is part of the documentation of the Qt local connectivity modules. ** ** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage @@ -30,12 +30,82 @@ \title NDEF Editor Example \brief An example about reading and writing NFC Data Exchange Format (NDEF) messages to NFC Forum Tags. -The NDEF Editor example reads and writes NFC Data Exchange Format (NDEF) -messages to NFC Forum Tags. NDEF messages can be composed by adding records of -supported types. +The NDEF Editor example reads and writes NFC Data Exchange Format +(NDEF) messages to NFC Forum Tags. NDEF messages can be composed by +adding records of supported types. Additionally, NDEF messages can be +loaded/saved from/into a file located in the file system of the +machine where the application is running. \image ndefeditor.png +\section1 NFC Tag detection + +The MainWindow class is able to detect if a NFC Tag is in the range +for read/write operations. It can also detect if connectivity has been +lost. This is achieved by connecting the MainWindow class private +handlers to the signals QNearFieldManager::targetDetected and +QNearFieldManager::targetLost. + +\snippet ndefeditor/mainwindow.cpp QNearFieldManager init + +Through the UI a user requests when to start the detection of a NFC +Tag by calling the method QNearFieldManager::startTargetDetection. + +\snippet ndefeditor/mainwindow.cpp QNearFieldManager start detection + +Once the target is detected the MainWindow connects the following +signals to its internal private slots: +QNearFieldTarget::ndefMessageRead, QNearFieldTarget::NdefReadError, +QNearFieldTarget::ndefMessagesWritten, +QNearFieldTarget::NdefWriteError and QNearFieldTarget::error + +\snippet ndefeditor/mainwindow.cpp QNearFieldTarget detected + +If during the process of reading or writing to a NFC Tag the +connection is lost, the MainWindow reacts to this event by +scheduling the target deletion (QObject::deleteLater). + +\snippet ndefeditor/mainwindow.cpp QNearFieldTarget lost + +\section1 Record creation + +The main window of the ndefeditor example manages the composition and +creation of NFC records. The UI contains a QScrollArea where +RecordEditors are added dynamically on a user requests basis. The +following methods of the MainWindow class provide an interface towards +each of the record editing classes managing the different types of +records. + +\snippet ndefeditor/mainwindow.h 0 + +The following sections explain each of the record editing classes. +\section1 Record editing classes + +\section2 TextRecordEditor + +The TextRecordEditor is a QWidget that can handle editing the values +of text record that has been requested by the user. For each text +record, there is a new instance of this class. + +\snippet ndefeditor/textrecordeditor.h 0 + +\section2 UriRecordEditor + +The UriRecordEditor is a QWidget that can handle editing the values of +Uri record that has been requested by the user. For each new Uri +record there is a new instance of this class. + +\snippet ndefeditor/urirecordeditor.h 0 + +\section2 MimeImageRecordEditor + +The UriRecordEditor is a QWidget that can handle editing the values of +a Mime Image record that has been requested by the user. For each Mime +Image record there is a new instance of this class. + +\snippet ndefeditor/mimeimagerecordeditor.h 0 + + \include examples-run.qdocinc \sa {Qt NFC} diff --git a/examples/nfc/ndefeditor/mainwindow.cpp b/examples/nfc/ndefeditor/mainwindow.cpp index 41077c2d..38865b88 100644 --- a/examples/nfc/ndefeditor/mainwindow.cpp +++ b/examples/nfc/ndefeditor/mainwindow.cpp @@ -143,10 +143,10 @@ MainWindow::MainWindow(QWidget *parent) //! [QNearFieldManager init] m_manager = new QNearFieldManager(this); - connect(m_manager, SIGNAL(targetDetected(QNearFieldTarget*)), - this, SLOT(targetDetected(QNearFieldTarget*))); - connect(m_manager, SIGNAL(targetLost(QNearFieldTarget*)), - this, SLOT(targetLost(QNearFieldTarget*))); + connect(m_manager, &QNearFieldManager::targetDetected, + this, &MainWindow::targetDetected); + connect(m_manager, &QNearFieldManager::targetLost, + this, &MainWindow::targetLost); //! [QNearFieldManager init] } diff --git a/examples/nfc/ndefeditor/mainwindow.h b/examples/nfc/ndefeditor/mainwindow.h index 9018cbfb..234efcd2 100644 --- a/examples/nfc/ndefeditor/mainwindow.h +++ b/examples/nfc/ndefeditor/mainwindow.h @@ -73,11 +73,12 @@ public: ~MainWindow(); private slots: + //! [0] void addNfcTextRecord(); void addNfcUriRecord(); void addMimeImageRecord(); void addEmptyRecord(); - + //! [0] void clearMessage(); void loadMessage(); diff --git a/examples/nfc/ndefeditor/mimeimagerecordeditor.h b/examples/nfc/ndefeditor/mimeimagerecordeditor.h index 1e810f64..44cd084b 100644 --- a/examples/nfc/ndefeditor/mimeimagerecordeditor.h +++ b/examples/nfc/ndefeditor/mimeimagerecordeditor.h @@ -64,7 +64,7 @@ namespace Ui { } QT_END_NAMESPACE - +//! [0] class MimeImageRecordEditor : public QWidget { Q_OBJECT @@ -83,5 +83,5 @@ private: private slots: void on_mimeImageOpen_clicked(); }; - +//! [0] #endif // MIMEIMAGERECORDEDITOR_H diff --git a/examples/nfc/ndefeditor/textrecordeditor.h b/examples/nfc/ndefeditor/textrecordeditor.h index d7bf4d2e..df3a872c 100644 --- a/examples/nfc/ndefeditor/textrecordeditor.h +++ b/examples/nfc/ndefeditor/textrecordeditor.h @@ -61,8 +61,7 @@ namespace Ui { } QT_END_NAMESPACE -QT_USE_NAMESPACE - +//! [0] class TextRecordEditor : public QWidget { Q_OBJECT @@ -77,5 +76,6 @@ public: private: Ui::TextRecordEditor *ui; }; +//! [0] #endif // TEXTRECORDEDITOR_H diff --git a/examples/nfc/ndefeditor/urirecordeditor.h b/examples/nfc/ndefeditor/urirecordeditor.h index 7eee55eb..aa3f4dfc 100644 --- a/examples/nfc/ndefeditor/urirecordeditor.h +++ b/examples/nfc/ndefeditor/urirecordeditor.h @@ -61,8 +61,7 @@ namespace Ui { } QT_END_NAMESPACE -QT_USE_NAMESPACE - +//! [0] class UriRecordEditor : public QWidget { Q_OBJECT @@ -77,5 +76,5 @@ public: private: Ui::UriRecordEditor *ui; }; - +//! [0] #endif // URIRECORDEDITOR_H -- cgit v1.2.3 From 1409087076f86e53f51ad165fcc4f5f8758df0a0 Mon Sep 17 00:00:00 2001 From: Andrew O'Doherty Date: Mon, 5 Mar 2018 15:41:35 +0100 Subject: Revamp Qt NFC examples: Fix qdoc Warning qdeclarativendeffilter.cpp:78: (qdoc) warning: Multiple topic commands found in comment: \qmlproperty and \enum. Task-number: QTBUG-60644 Change-Id: I57418d83a74234da6a64fa1b88a65dea1a4a5f2f Reviewed-by: Alex Blasche --- src/imports/nfc/qdeclarativendeffilter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/imports/nfc/qdeclarativendeffilter.cpp b/src/imports/nfc/qdeclarativendeffilter.cpp index 010be47f..6cbda747 100644 --- a/src/imports/nfc/qdeclarativendeffilter.cpp +++ b/src/imports/nfc/qdeclarativendeffilter.cpp @@ -78,7 +78,7 @@ /*! \qmlproperty QQmlNdefRecord::TypeNameFormat NdefFilter::typeNameFormat - This property holds the NDEF record name format type \enum QQmlNdefRecord::TypeNameFormat. + This property holds the NDEF record name format type \l QQmlNdefRecord::TypeNameFormat. */ /*! -- cgit v1.2.3 From 0a97e6cd908995699793b8513d3c7ef8020c2e32 Mon Sep 17 00:00:00 2001 From: Andrew O'Doherty Date: Tue, 6 Mar 2018 14:58:34 +0100 Subject: Android Qt NFC manager may not start qmetaobject.cpp:1483 (static bool QMetaObject::invokeMethod(QObject*, const char*, Qt::ConnectionType, QGenericReturnArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument, QGenericArgument)): QMetaObject::invokeMethod: No such method NearFieldTarget::ndefMessageRead(QNdefMessage&) Remove the reference symbols since Q_ARG data parameter is already treated as a Reference. Task-number: QTBUG-64415 Change-Id: I4eb83c34cfbc06ac85e5579c690c9562fbc82841 Reviewed-by: Alex Blasche --- src/nfc/qnearfieldtarget_android.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/nfc/qnearfieldtarget_android.cpp b/src/nfc/qnearfieldtarget_android.cpp index 690fc272..26f3d429 100644 --- a/src/nfc/qnearfieldtarget_android.cpp +++ b/src/nfc/qnearfieldtarget_android.cpp @@ -192,12 +192,12 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages() // Sending QNdefMessage, requestCompleted and exit. QNdefMessage qNdefMessage = QNdefMessage::fromByteArray(ndefMessageQBA); QMetaObject::invokeMethod(this, "ndefMessageRead", Qt::QueuedConnection, - Q_ARG(QNdefMessage&, qNdefMessage)); + Q_ARG(QNdefMessage, qNdefMessage)); QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + Q_ARG(QNearFieldTarget::RequestId, requestId)); QMetaObject::invokeMethod(this, "ndefMessageRead", Qt::QueuedConnection, - Q_ARG(QNdefMessage&, qNdefMessage), - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + Q_ARG(QNdefMessage, qNdefMessage), + Q_ARG(QNearFieldTarget::RequestId, requestId)); return requestId; } -- cgit v1.2.3 From 24a07f0a94a0ac036866c18ef415f06dd1fb8bbe Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 7 Mar 2018 15:05:03 +0100 Subject: Enable new DBus LE backed for central role use cases The manual override env variable was renamed. The new name is more fitting for the use case. Task-number: QTBUG-46819 Task-number: QTBUG-66908 Change-Id: I9202ebf3f847d5c7dcc9e3c84b060b35343dd2fd Reviewed-by: Timur Pocheptsov --- src/bluetooth/bluez/bluez5_helper.cpp | 5 +++-- src/bluetooth/qlowenergycontroller.cpp | 16 +++++++++------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/bluetooth/bluez/bluez5_helper.cpp b/src/bluetooth/bluez/bluez5_helper.cpp index 90b7e5e0..f798088e 100644 --- a/src/bluetooth/bluez/bluez5_helper.cpp +++ b/src/bluetooth/bluez/bluez5_helper.cpp @@ -197,8 +197,9 @@ QVersionNumber bluetoothdVersion() if (bluezDaemonVersion()->isNull()) { qCDebug(QT_BT_BLUEZ) << "Detecting bluetoothd version"; //Order of matching - // 1. Pick whatever the user decides via BLUETOOTH_USE_BLUEZ_DBUS_LE - const QString version = qEnvironmentVariable("BLUETOOTH_USE_BLUEZ_DBUS_LE"); + // 1. Pick whatever the user decides via BLUETOOTH_FORCE_DBUS_LE_VERSION + // Set version to below version 5.42 to use custom/old GATT stack implementation + const QString version = qEnvironmentVariable("BLUETOOTH_FORCE_DBUS_LE_VERSION"); if (!version.isNull()) { const QVersionNumber vn = QVersionNumber::fromString(version); if (!vn.isNull()) { diff --git a/src/bluetooth/qlowenergycontroller.cpp b/src/bluetooth/qlowenergycontroller.cpp index 3be1aed3..caa6c3fa 100644 --- a/src/bluetooth/qlowenergycontroller.cpp +++ b/src/bluetooth/qlowenergycontroller.cpp @@ -292,11 +292,13 @@ void registerQLowEnergyControllerMetaType() } } -static QLowEnergyControllerPrivate *privateController() +static QLowEnergyControllerPrivate *privateController(QLowEnergyController::Role role) { #if QT_CONFIG(bluez) && !defined(QT_BLUEZ_NO_BTLE) - // for now Bluez DBus disabled - if (false && bluetoothdVersion() >= QVersionNumber(5, 42)) { + // The new DBUS implementation only supports Central role for now + // For Peripheral role support see QTBUG-66909 + if (role == QLowEnergyController::CentralRole + && bluetoothdVersion() >= QVersionNumber(5, 42)) { qCWarning(QT_BT) << "Using BlueZ LE DBus API"; return new QLowEnergyControllerPrivateBluezDBus(); } else { @@ -329,7 +331,7 @@ QLowEnergyController::QLowEnergyController( QObject *parent) : QObject(parent) { - d_ptr = privateController(); + d_ptr = privateController(CentralRole); Q_D(QLowEnergyController); d->q_ptr = this; @@ -358,7 +360,7 @@ QLowEnergyController::QLowEnergyController( QObject *parent) : QObject(parent) { - d_ptr = privateController(); + d_ptr = privateController(CentralRole); Q_D(QLowEnergyController); d->q_ptr = this; @@ -391,7 +393,7 @@ QLowEnergyController::QLowEnergyController( QObject *parent) : QObject(parent) { - d_ptr = privateController(); + d_ptr = privateController(CentralRole); Q_D(QLowEnergyController); d->q_ptr = this; @@ -436,7 +438,7 @@ QLowEnergyController *QLowEnergyController::createPeripheral(QObject *parent) QLowEnergyController::QLowEnergyController(QObject *parent) : QObject(parent) { - d_ptr = privateController(); + d_ptr = privateController(PeripheralRole); Q_D(QLowEnergyController); d->q_ptr = this; -- cgit v1.2.3 From 8cdd3ed68bacfccfdbe719ef03f9f57ff3aa48eb Mon Sep 17 00:00:00 2001 From: Andrew O'Doherty Date: Wed, 7 Mar 2018 11:14:24 +0100 Subject: Add NFC API method isSupported Add API method isSupported to allow to check if the device supports NFC Task-number: QTBUG-62169 Change-Id: I4ff7f06348ecc902e66ee79bdd8abde672578904 Reviewed-by: Alex Blasche --- .../nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java | 5 +++++ src/nfc/android/androidjninfc.cpp | 5 +++++ src/nfc/android/androidjninfc_p.h | 1 + src/nfc/qnearfieldmanager.cpp | 16 +++++++++++++++- src/nfc/qnearfieldmanager.h | 1 + src/nfc/qnearfieldmanager_android.cpp | 5 +++++ src/nfc/qnearfieldmanager_android_p.h | 1 + src/nfc/qnearfieldmanager_neard.cpp | 15 +++++++++++++++ src/nfc/qnearfieldmanager_neard_p.h | 2 ++ src/nfc/qnearfieldmanager_p.h | 5 +++++ 10 files changed, 55 insertions(+), 1 deletion(-) diff --git a/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java b/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java index 345b87d3..6b0fbcbd 100644 --- a/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java +++ b/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfc.java @@ -169,6 +169,11 @@ public class QtNfc return m_adapter.isEnabled(); } + static public boolean isSupported() + { + return (m_adapter != null); + } + static public Intent getStartIntent() { Log.d(TAG, "getStartIntent"); diff --git a/src/nfc/android/androidjninfc.cpp b/src/nfc/android/androidjninfc.cpp index f21d3b08..9a1c5227 100644 --- a/src/nfc/android/androidjninfc.cpp +++ b/src/nfc/android/androidjninfc.cpp @@ -63,6 +63,11 @@ bool isAvailable() return QAndroidJniObject::callStaticMethod(nfcClassName,"isAvailable"); } +bool isSupported() +{ + return QAndroidJniObject::callStaticMethod(nfcClassName,"isSupported"); +} + bool stopDiscovery() { return QAndroidJniObject::callStaticMethod(nfcClassName,"stop"); diff --git a/src/nfc/android/androidjninfc_p.h b/src/nfc/android/androidjninfc_p.h index 746a93ee..60e9a107 100644 --- a/src/nfc/android/androidjninfc_p.h +++ b/src/nfc/android/androidjninfc_p.h @@ -71,6 +71,7 @@ bool startDiscovery(); bool stopDiscovery(); QAndroidJniObject getStartIntent(); bool isAvailable(); +bool isSupported(); bool registerListener(AndroidNfcListenerInterface *listener); bool unregisterListener(AndroidNfcListenerInterface *listener); QAndroidJniObject getTag(const QAndroidJniObject &intent); diff --git a/src/nfc/qnearfieldmanager.cpp b/src/nfc/qnearfieldmanager.cpp index 099a070c..0b9c9161 100644 --- a/src/nfc/qnearfieldmanager.cpp +++ b/src/nfc/qnearfieldmanager.cpp @@ -201,7 +201,10 @@ QNearFieldManager::~QNearFieldManager() } /*! - Returns true if NFC functionality is available; otherwise returns false. + Returns \c true if the device has a NFC adapter and + it is turned on; otherwise returns \c false. + + \sa isSupported() */ bool QNearFieldManager::isAvailable() const { @@ -210,6 +213,17 @@ bool QNearFieldManager::isAvailable() const return d->isAvailable(); } +/*! + Returns \c true if the underlying device has a NFC adapter; otherwise returns \c false. + + \sa isAvailable() +*/ +bool QNearFieldManager::isSupported() const +{ + Q_D(const QNearFieldManager); + + return d->isSupported(); +} /*! \fn bool QNearFieldManager::startTargetDetection() diff --git a/src/nfc/qnearfieldmanager.h b/src/nfc/qnearfieldmanager.h index 9583e01f..1dcb3485 100644 --- a/src/nfc/qnearfieldmanager.h +++ b/src/nfc/qnearfieldmanager.h @@ -70,6 +70,7 @@ public: ~QNearFieldManager(); bool isAvailable() const; + bool isSupported() const; void setTargetAccessModes(TargetAccessModes accessModes); TargetAccessModes targetAccessModes() const; diff --git a/src/nfc/qnearfieldmanager_android.cpp b/src/nfc/qnearfieldmanager_android.cpp index a5693218..dd814787 100644 --- a/src/nfc/qnearfieldmanager_android.cpp +++ b/src/nfc/qnearfieldmanager_android.cpp @@ -176,6 +176,11 @@ bool QNearFieldManagerPrivateImpl::isAvailable() const return AndroidNfc::isAvailable(); } +bool QNearFieldManagerPrivateImpl::isSupported() const +{ + return AndroidNfc::isSupported(); +} + bool QNearFieldManagerPrivateImpl::startTargetDetection() { if (m_detecting) diff --git a/src/nfc/qnearfieldmanager_android_p.h b/src/nfc/qnearfieldmanager_android_p.h index 69c99709..563d26bc 100644 --- a/src/nfc/qnearfieldmanager_android_p.h +++ b/src/nfc/qnearfieldmanager_android_p.h @@ -76,6 +76,7 @@ public: ~QNearFieldManagerPrivateImpl(); virtual bool isAvailable() const; + bool isSupported() const override; virtual bool startTargetDetection(); virtual void stopTargetDetection(); virtual int registerNdefMessageHandler(QObject *object, const QMetaMethod &method); diff --git a/src/nfc/qnearfieldmanager_neard.cpp b/src/nfc/qnearfieldmanager_neard.cpp index f1758ae9..450b9b42 100644 --- a/src/nfc/qnearfieldmanager_neard.cpp +++ b/src/nfc/qnearfieldmanager_neard.cpp @@ -114,6 +114,21 @@ bool QNearFieldManagerPrivateImpl::isAvailable() const return false; } +bool QNearFieldManagerPrivateImpl::isSupported() const +{ + if (m_adapterPath.isEmpty()) { + qCWarning(QT_NFC_NEARD) << "no adapter found, neard daemon running?"; + return false; + } + + if (!m_neardHelper->dbusObjectManager()->isValid() || m_adapterPath.isNull()) { + qCWarning(QT_NFC_NEARD) << "dbus object manager invalid or adapter path invalid"; + return false; + } + + return true; +} + bool QNearFieldManagerPrivateImpl::startTargetDetection() { qCDebug(QT_NFC_NEARD) << "starting target detection"; diff --git a/src/nfc/qnearfieldmanager_neard_p.h b/src/nfc/qnearfieldmanager_neard_p.h index b50f947a..cf026982 100644 --- a/src/nfc/qnearfieldmanager_neard_p.h +++ b/src/nfc/qnearfieldmanager_neard_p.h @@ -75,6 +75,8 @@ public: bool isAvailable() const; + bool isSupported() const override; + bool startTargetDetection(); void stopTargetDetection(); diff --git a/src/nfc/qnearfieldmanager_p.h b/src/nfc/qnearfieldmanager_p.h index 7e461da8..8e86ce4b 100644 --- a/src/nfc/qnearfieldmanager_p.h +++ b/src/nfc/qnearfieldmanager_p.h @@ -82,6 +82,11 @@ public: return false; } + virtual bool isSupported() const + { + return false; + } + virtual bool startTargetDetection() { return false; -- cgit v1.2.3 From 65092d3d371f53c202337d6cfc583f9fd24e5b8b Mon Sep 17 00:00:00 2001 From: Andrew O'Doherty Date: Mon, 19 Mar 2018 15:01:08 +0100 Subject: Add since command in documentation for new API method Specify for which release the isSupported method will be available Task-number: QTBUG-62169 Change-Id: Iee1e63b5727ab6cce87d0fb587a5bb76e6d502f5 Reviewed-by: Maurice Kalinowski Reviewed-by: Alex Blasche --- src/nfc/qnearfieldmanager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/nfc/qnearfieldmanager.cpp b/src/nfc/qnearfieldmanager.cpp index 0b9c9161..8b46d420 100644 --- a/src/nfc/qnearfieldmanager.cpp +++ b/src/nfc/qnearfieldmanager.cpp @@ -214,6 +214,8 @@ bool QNearFieldManager::isAvailable() const } /*! + \since 5.12 + Returns \c true if the underlying device has a NFC adapter; otherwise returns \c false. \sa isAvailable() -- cgit v1.2.3 From 279a6968a7550b59e41ff8ffa70a5ca705780d4b Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 20 Mar 2018 15:45:12 +0100 Subject: Fix shadow warning qbluetoothsocket.h: In member function 'void QBluetoothSocket::connectToService( const QBluetoothAddress&, QBluetoothUuid::ServiceClassUuid, QIODevice::OpenMode)': qbluetoothsocket.h:111:5: error: declaration of 'openMode' shadows a member of 'this' [-Werror=shadow] Change-Id: Ib9478027799b287430721d99bebee4002a1e5896 Reviewed-by: Oliver Wolff --- src/bluetooth/qbluetoothsocket.cpp | 2 +- src/bluetooth/qbluetoothsocket.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index ddc6469f..c5b0f7d3 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -387,7 +387,7 @@ void QBluetoothSocket::connectToService(const QBluetoothServiceInfo &service, Op } /*! - \fn void QBluetoothSocket::connectToService(const QBluetoothAddress &address, QBluetoothUuid::ServiceClassUuid uuid, OpenMode openMode = ReadWrite) + \fn void QBluetoothSocket::connectToService(const QBluetoothAddress &address, QBluetoothUuid::ServiceClassUuid uuid, OpenMode mode = ReadWrite) \internal diff --git a/src/bluetooth/qbluetoothsocket.h b/src/bluetooth/qbluetoothsocket.h index db8562ed..a7f43170 100644 --- a/src/bluetooth/qbluetoothsocket.h +++ b/src/bluetooth/qbluetoothsocket.h @@ -107,9 +107,9 @@ public: void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, OpenMode openMode = ReadWrite); void connectToService(const QBluetoothAddress &address, quint16 port, OpenMode openMode = ReadWrite); inline void connectToService(const QBluetoothAddress &address, QBluetoothUuid::ServiceClassUuid uuid, - OpenMode openMode = ReadWrite) + OpenMode mode = ReadWrite) { - connectToService(address, QBluetoothUuid(uuid), openMode); + connectToService(address, QBluetoothUuid(uuid), mode); } void disconnectFromService(); -- cgit v1.2.3 From 08ee3470fe71089503c57530396a4534f39afe9e Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 21 Mar 2018 07:48:29 +0100 Subject: Fix compiler warning qlowenergycontroller.cpp:295:82: warning: unused parameter 'role' [-Wunused-parameter] static QLowEnergyControllerPrivate *privateController(QLowEnergyController::Role role) Change-Id: I4d3d2ad1e2dbabd0101efd6294a2481491587926 Reviewed-by: Oliver Wolff --- src/bluetooth/qlowenergycontroller.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/bluetooth/qlowenergycontroller.cpp b/src/bluetooth/qlowenergycontroller.cpp index caa6c3fa..a23955ff 100644 --- a/src/bluetooth/qlowenergycontroller.cpp +++ b/src/bluetooth/qlowenergycontroller.cpp @@ -306,10 +306,13 @@ static QLowEnergyControllerPrivate *privateController(QLowEnergyController::Role return new QLowEnergyControllerPrivateBluez(); } #elif defined(QT_ANDROID_BLUETOOTH) + Q_UNUSED(role); return new QLowEnergyControllerPrivateAndroid(); #elif defined(QT_WINRT_BLUETOOTH) + Q_UNUSED(role); return new QLowEnergyControllerPrivateWinRT(); #else + Q_UNUSED(role); return new QLowEnergyControllerPrivateCommon(); #endif } -- cgit v1.2.3 From 54666d4b42cc212ad1639a058e90ad1f17eed898 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 20 Mar 2018 17:08:50 +0100 Subject: Ensure that BTLE scan works if app has ACCESS_FINE_LOCATION BTLE scanning requires Android's ACCESS_FINE_LOCATION or ACCESS_COARSE_LOCATION. The permission must be requested at runtime (assuming it was declared in the manifest file). So far, Qt only ever requested coarse location although FINE location is a perfectly OK substitute and the manifest may only declare FINE location. Task-number: QTBUG-66490 Change-Id: I4ce6a25735cb7cdf939f94f8fa545676d391ca2d Reviewed-by: Christian Stromme --- .../qbluetoothdevicediscoveryagent_android.cpp | 30 ++++++++++++++-------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp b/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp index 303dd67f..c7afd578 100644 --- a/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp +++ b/src/bluetooth/qbluetoothdevicediscoveryagent_android.cpp @@ -147,23 +147,33 @@ void QBluetoothDeviceDiscoveryAgentPrivate::start(QBluetoothDeviceDiscoveryAgent } // check Android v23+ permissions - // -> BTLE search requires android.permission.ACCESS_COARSE_LOCATION + // -> BTLE search requires android.permission.ACCESS_COARSE_LOCATION or android.permission.ACCESS_FINE_LOCATION if (requestedMethods & QBluetoothDeviceDiscoveryAgent::LowEnergyMethod && QtAndroid::androidSdkVersion() >= 23) { - QString permission(QLatin1String("android.permission.ACCESS_COARSE_LOCATION")); + const QString coarsePermission(QLatin1String("android.permission.ACCESS_COARSE_LOCATION")); + const QString finePermission(QLatin1String("android.permission.ACCESS_FINE_LOCATION")); // do we have required permission already, if so nothing to do - if (QtAndroidPrivate::checkPermission(permission) == QtAndroidPrivate::PermissionsResult::Denied) { - qCWarning(QT_BT_ANDROID) << "Requesting ACCESS_COARSE_LOCATION permission"; + if (QtAndroidPrivate::checkPermission(coarsePermission) == QtAndroidPrivate::PermissionsResult::Denied + && QtAndroidPrivate::checkPermission(finePermission) == QtAndroidPrivate::PermissionsResult::Denied) { + qCWarning(QT_BT_ANDROID) << "Requesting ACCESS_*_LOCATION permission"; QAndroidJniEnvironment env; const QHash results = - QtAndroidPrivate::requestPermissionsSync(env, QStringList() << permission); - if (!results.contains(permission) - || results[permission] == QtAndroidPrivate::PermissionsResult::Denied) - { - qCWarning(QT_BT_ANDROID) << "Search not possible due to missing permission (ACCESS_COARSE_LOCATION)"; + QtAndroidPrivate::requestPermissionsSync(env, QStringList() << coarsePermission << finePermission); + + bool permissionReceived = false; + for (const QString &permission: results.keys()) { + qCDebug(QT_BT_ANDROID) << permission << (results[permission] == QtAndroidPrivate::PermissionsResult::Denied); + if ((permission == coarsePermission || permission == finePermission) + && results[permission] == QtAndroidPrivate::PermissionsResult::Granted) { + permissionReceived = true; + break; + } + } + if (!permissionReceived) { + qCWarning(QT_BT_ANDROID) << "Search not possible due to missing permission (ACCESS_COARSE|FINE_LOCATION)"; lastError = QBluetoothDeviceDiscoveryAgent::UnknownError; errorString = QBluetoothDeviceDiscoveryAgent::tr("Missing Location permission. Search is not possible."); emit q->error(lastError); @@ -171,7 +181,7 @@ void QBluetoothDeviceDiscoveryAgentPrivate::start(QBluetoothDeviceDiscoveryAgent } } - qCWarning(QT_BT_ANDROID) << "ACCESS_COARSE_LOCATION permission available"; + qCWarning(QT_BT_ANDROID) << "ACCESS_COARSE|FINE_LOCATION permission available"; } // install Java BroadcastReceiver -- cgit v1.2.3 From 3c91e2ed4c6c6da153972cab296d80574acc11bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lisandro=20Dami=C3=A1n=20Nicanor=20P=C3=A9rez=20Meyer?= Date: Fri, 23 Mar 2018 13:35:44 -0300 Subject: Add missing headers while generating DBus interfaces Make qdbusxml2cpp include bluez5_helper_p.h to make definitions available to device1_bluez5_p.h and objectmanager_p.h. Task-number: QTBUG-66936 Change-Id: If700aeba7c67c10030f3d0fe2ac4e6bc0aeca3ed Reviewed-by: Alex Blasche --- src/bluetooth/bluez/generate | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/bluez/generate b/src/bluetooth/bluez/generate index caae92f6..5c401ffe 100755 --- a/src/bluetooth/bluez/generate +++ b/src/bluetooth/bluez/generate @@ -13,9 +13,9 @@ qdbusxml2cpp -a obex_agent_p.h:obex_agent.cpp org.openobex.agent.xml org.openobe #Bluez 5 qdbusxml2cpp -p adapter1_bluez5_p.h:adapter1_bluez5.cpp org.bluez.Adapter1.xml -qdbusxml2cpp -p device1_bluez5_p.h:device1_bluez5.cpp org.bluez.Device1.xml +qdbusxml2cpp -i bluez5_helper_p.h -p device1_bluez5_p.h:device1_bluez5.cpp org.bluez.Device1.xml qdbusxml2cpp -p profile1_p.h:profile1.cpp org.bluez.ProfileManager1.xml -qdbusxml2cpp -p objectmanager_p.h:objectmanager.cpp org.freedesktop.dbus.objectmanager.xml +qdbusxml2cpp -i bluez5_helper_p.h -p objectmanager_p.h:objectmanager.cpp org.freedesktop.dbus.objectmanager.xml qdbusxml2cpp -p properties_p.h:properties.cpp org.freedesktop.dbus.properties.xml qdbusxml2cpp -p obex_client1_bluez5_p.h:obex_client1_bluez5_p.h org.bluez.Client1.xml qdbusxml2cpp -p obex_objectpush1_bluez5_p.h:obex_objectpush1_bluez5.cpp org.bluez.obex.ObjectPush1.xml -- cgit v1.2.3 From 96afc728c508708da7a5fa16266dcafafcb60d0b Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 9 Apr 2018 08:59:12 +0200 Subject: Fix missing include It caused problems for the code model Change-Id: I57978be203b24a44c67ce826ec9957755029cfd1 Reviewed-by: Oliver Wolff --- src/bluetooth/qlowenergycontroller_android.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 8dccb859..70b6098b 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -40,6 +40,7 @@ #include "qlowenergycontroller_android_p.h" #include #include +#include #include #include #include -- cgit v1.2.3 From 5c160d9fdf9d93307bcdfabef4a78eb7dc18694e Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 13 Apr 2018 17:00:19 +0200 Subject: BlueZ: Fix crash when discovering GATT service without readable items The jobs list might be empty and calling last() causes an assert in QVector. This implies the current process under discovery does not have any descriptors or characteristics which are readable. In such cases no async read requests have to be put forward and the discovery is already done. Change-Id: I8417bfcd146866cb16c295c9e9d4890270574a56 Reviewed-by: Oliver Wolff --- src/bluetooth/qlowenergycontroller_bluezdbus.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp index e9087642..afc4b8c1 100644 --- a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp +++ b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp @@ -537,8 +537,12 @@ void QLowEnergyControllerPrivateBluezDBus::discoverServiceDetails(const QBluetoo serviceData->endHandle = runningHandle++; // last job is last step of service discovery - GattJob &lastJob = jobs.last(); - lastJob.flags.setFlag(GattJob::LastServiceDiscovery, true); + if (!jobs.isEmpty()) { + GattJob &lastJob = jobs.last(); + lastJob.flags.setFlag(GattJob::LastServiceDiscovery, true); + } else { + serviceData->setState(QLowEnergyService::ServiceDiscovered); + } scheduleNextJob(); } -- cgit v1.2.3 From 8b334771babd64b1c7f47babcb5c4c449b9067a1 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 13 Apr 2018 13:17:18 +0200 Subject: Android: Fix QLEController's remoteName() and remoteAddress() The values were never obtained on the Java side. Task-number: QTBUG-67651 Change-Id: Ifceb124b07cf505c4e96fe7ba9d58364b3923c3a Reviewed-by: Timur Pocheptsov --- .../org/qtproject/qt5/android/bluetooth/QtBluetoothLEServer.java | 9 +++++++++ src/bluetooth/qlowenergycontroller_android.cpp | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLEServer.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLEServer.java index 00217904..034190fd 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLEServer.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLEServer.java @@ -82,6 +82,12 @@ public class QtBluetoothLEServer { private BluetoothGattServer mGattServer = null; private BluetoothLeAdvertiser mLeAdvertiser = null; + private String mRemoteName = ""; + public String remoteName() { return mRemoteName; } + + private String mRemoteAddress = ""; + public String remoteAddress() { return mRemoteAddress; } + /* As per Bluetooth specification each connected device can have individual and persistent Client characteristic configurations (see Bluetooth Spec 5.0 Vol 3 Part G 3.3.3.3) @@ -238,6 +244,9 @@ public class QtBluetoothLEServer { break; } + mRemoteName = device.getName(); + mRemoteAddress = device.getAddress(); + int qtErrorCode; switch (status) { case BluetoothGatt.GATT_SUCCESS: diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index 70b6098b..c5c9ba56 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -430,9 +430,15 @@ void QLowEnergyControllerPrivateAndroid::peripheralConnectionUpdated( Q_Q(QLowEnergyController); if (oldState == QLowEnergyController::ConnectedState && newState != QLowEnergyController::ConnectedState) { + remoteDevice.clear(); + remoteName.clear(); emit q->disconnected(); } else if (newState == QLowEnergyController::ConnectedState && oldState != QLowEnergyController::ConnectedState) { + if (hub) { + remoteDevice = QBluetoothAddress(hub->javaObject().callObjectMethod("remoteAddress").toString()); + remoteName = hub->javaObject().callObjectMethod("remoteName").toString(); + } emit q->connected(); } } -- cgit v1.2.3 From 184307884f560653421286cc9e5e6f0e86a4cef4 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 12 Apr 2018 11:17:00 +0200 Subject: BlueZ: Ensure that QLEController::remoteName() has a value This fixes the problem for the custom GATT stack on Bluez4 and older Bluez5 versions (below 5.42). Task-number: QTBUG-67651 Change-Id: Ia3c64c06777c8d357f615d681838bcdc83b92236 Reviewed-by: Oliver Wolff Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller_bluez.cpp | 79 +++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index 40519b51..d58e0ee8 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -44,10 +44,16 @@ #include "qleadvertiser_p.h" #include "bluez/bluez_data_p.h" #include "bluez/hcimanager_p.h" +#include "bluez/objectmanager_p.h" #include "bluez/remotedevicemanager_p.h" #include "bluez/bluez5_helper_p.h" #include "bluez/bluetoothmanagement_p.h" +// Bluez 4 +#include "bluez/adapter_p.h" +#include "bluez/device_p.h" +#include "bluez/manager_p.h" + #include #include #include @@ -746,8 +752,11 @@ void QLowEnergyControllerPrivateBluez::l2cpDisconnected() { Q_Q(QLowEnergyController); - if (role == QLowEnergyController::PeripheralRole) + if (role == QLowEnergyController::PeripheralRole) { storeClientConfigurations(); + remoteDevice.clear(); + remoteName.clear(); + } invalidateServices(); resetController(); setState(QLowEnergyController::UnconnectedState); @@ -3012,6 +3021,69 @@ void QLowEnergyControllerPrivateBluez::sendNextIndication() sendIndication(scheduledIndications.takeFirst()); } +static QString nameOfRemoteCentral(const QBluetoothAddress &peerAddress, const QBluetoothAddress &localAdapter) +{ + const QString peerAddressString = peerAddress.toString(); + if (isBluez5()) { + OrgFreedesktopDBusObjectManagerInterface manager(QStringLiteral("org.bluez"), + QStringLiteral("/"), + QDBusConnection::systemBus()); + QDBusPendingReply reply = manager.GetManagedObjects(); + reply.waitForFinished(); + if (reply.isError()) + return QString(); + + ManagedObjectList managedObjectList = reply.value(); + for (ManagedObjectList::const_iterator it = managedObjectList.constBegin(); it != managedObjectList.constEnd(); ++it) { + const InterfaceList &ifaceList = it.value(); + + for (InterfaceList::const_iterator jt = ifaceList.constBegin(); jt != ifaceList.constEnd(); ++jt) { + const QString &iface = jt.key(); + const QVariantMap &ifaceValues = jt.value(); + + if (iface == QStringLiteral("org.bluez.Device1")) { + if (ifaceValues.value(QStringLiteral("Address")).toString() == peerAddressString) + return ifaceValues.value(QStringLiteral("Alias")).toString(); + } + } + } + return QString(); + } else { + OrgBluezManagerInterface manager(QStringLiteral("org.bluez"), QStringLiteral("/"), + QDBusConnection::systemBus()); + + QDBusPendingReply reply = manager.FindAdapter(localAdapter.toString()); + reply.waitForFinished(); + if (reply.isError()) + return QString(); + + OrgBluezAdapterInterface adapter(QStringLiteral("org.bluez"), reply.value().path(), + QDBusConnection::systemBus()); + + QDBusPendingReply deviceObjectPath = adapter.FindDevice(peerAddressString); + deviceObjectPath.waitForFinished(); + if (deviceObjectPath.isError()) { + if (deviceObjectPath.error().name() != QStringLiteral("org.bluez.Error.DoesNotExist")) + return QString(); + + deviceObjectPath = adapter.CreateDevice(peerAddressString); + deviceObjectPath.waitForFinished(); + if (deviceObjectPath.isError()) + return QString(); + } + + OrgBluezDeviceInterface device(QStringLiteral("org.bluez"), deviceObjectPath.value().path(), + QDBusConnection::systemBus()); + + QDBusPendingReply properties = device.GetProperties(); + properties.waitForFinished(); + if (properties.isError()) + return QString(); + + return properties.value().value(QStringLiteral("Alias")).toString(); + } +} + void QLowEnergyControllerPrivateBluez::handleConnectionRequest() { if (state != QLowEnergyController::AdvertisingState) { @@ -3030,8 +3102,11 @@ void QLowEnergyControllerPrivateBluez::handleConnectionRequest() serverSocketNotifier->setEnabled(true); return; } + remoteDevice = QBluetoothAddress(convertAddress(clientAddr.l2_bdaddr.b)); - qCDebug(QT_BT_BLUEZ) << "GATT connection from device" << remoteDevice; + remoteName = nameOfRemoteCentral(remoteDevice, localAdapter); + qCDebug(QT_BT_BLUEZ) << "GATT connection from device" << remoteDevice << remoteName; + if (connectionHandle == 0) qCWarning(QT_BT_BLUEZ) << "Received client connection, but no connection complete event"; -- cgit v1.2.3 From e68b5e17b071ca11974474546be04c7d564eae3a Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 13 Apr 2018 17:17:19 +0200 Subject: Android: Fix start/stop behavior of QLowEnergyController (peripheral) This patch addresses two bugs. Firstly it ensures that the correct Java function is executed when disconectFromDevice() is called on Android peripheral. Secondly, it turned out that calling disconnectFromDevice() while a connection to a central exists and restarting the advertisement resulted in a non-functional QLEController instance because BluetoothGattServer was not properly restarted. As a side effects the controller's state tracking stopped as well. Change-Id: I98851fc974ceff2a1fcb03fe754dbda9c4aba271 Reviewed-by: Timur Pocheptsov --- .../qt5/android/bluetooth/QtBluetoothLEServer.java | 29 +++++++++++++++++----- src/bluetooth/qlowenergycontroller_android.cpp | 8 ++++-- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLEServer.java b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLEServer.java index 034190fd..cdd16686 100644 --- a/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLEServer.java +++ b/src/android/bluetooth/src/org/qtproject/qt5/android/bluetooth/QtBluetoothLEServer.java @@ -213,7 +213,6 @@ public class QtBluetoothLEServer { return; } - mGattServer = manager.openGattServer(qtContext, mGattServerListener); mLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser(); if (!mBluetoothAdapter.isMultipleAdvertisementSupported()) @@ -229,7 +228,7 @@ public class QtBluetoothLEServer { { @Override public void onConnectionStateChange(BluetoothDevice device, int status, int newState) { - Log.w(TAG, "Our gatt server connection state changed, new state: " + newState); + Log.w(TAG, "Our gatt server connection state changed, new state: " + newState + " " + status); super.onConnectionStateChange(device, status, newState); int qtControllerState = 0; @@ -237,6 +236,7 @@ public class QtBluetoothLEServer { case BluetoothProfile.STATE_DISCONNECTED: qtControllerState = 0; // QLowEnergyController::UnconnectedState clientCharacteristicManager.markDeviceConnectivity(device, false); + mGattServer.close(); break; case BluetoothProfile.STATE_CONNECTED: clientCharacteristicManager.markDeviceConnectivity(device, true); @@ -401,10 +401,18 @@ public class QtBluetoothLEServer { public boolean connectServer() { - if (mGattServer == null) + if (mGattServer != null) + return true; + + BluetoothManager manager = (BluetoothManager) qtContext.getSystemService(Context.BLUETOOTH_SERVICE); + if (manager == null) { + Log.w(TAG, "Bluetooth service not available."); return false; + } - return true; + mGattServer = manager.openGattServer(qtContext, mGattServerListener); + + return (mGattServer != null); } public void disconnectServer() @@ -413,6 +421,10 @@ public class QtBluetoothLEServer { return; mGattServer.close(); + mGattServer = null; + + mRemoteName = mRemoteAddress = ""; + leServerConnectionStateChange(qtObject, 0 /*NoError*/, 0 /*QLowEnergyController::UnconnectedState*/); } public boolean startAdvertising(AdvertiseData advertiseData, @@ -422,7 +434,10 @@ public class QtBluetoothLEServer { if (mLeAdvertiser == null) return false; - connectServer(); + if (!connectServer()) { + Log.w(TAG, "Server::startAdvertising: Cannot open GATT server"); + return false; + } Log.w(TAG, "Starting to advertise."); mLeAdvertiser.startAdvertising(settings, advertiseData, scanResponse, mAdvertiseListener); @@ -441,8 +456,10 @@ public class QtBluetoothLEServer { public void addService(BluetoothGattService service) { - if (mGattServer == null) + if (!connectServer()) { + Log.w(TAG, "Server::addService: Cannot open GATT server"); return; + } mGattServer.addService(service); } diff --git a/src/bluetooth/qlowenergycontroller_android.cpp b/src/bluetooth/qlowenergycontroller_android.cpp index c5c9ba56..54665f7b 100644 --- a/src/bluetooth/qlowenergycontroller_android.cpp +++ b/src/bluetooth/qlowenergycontroller_android.cpp @@ -180,8 +180,12 @@ void QLowEnergyControllerPrivateAndroid::disconnectFromDevice() QLowEnergyController::ControllerState oldState = state; setState(QLowEnergyController::ClosingState); - if (hub) - hub->javaObject().callMethod("disconnect"); + if (hub) { + if (role == QLowEnergyController::PeripheralRole) + hub->javaObject().callMethod("disconnectServer"); + else + hub->javaObject().callMethod("disconnect"); + } if (oldState == QLowEnergyController::ConnectingState) setState(QLowEnergyController::UnconnectedState); -- cgit v1.2.3 From dc435c6ce0a6ecae776dc0dd032016453a0b4b56 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 18 Apr 2018 09:51:46 +0200 Subject: General QML version bump in docs and qmltypes Change-Id: If31e244e44106af1550e572acb9a172497467b20 Reviewed-by: Kai Koehne --- src/bluetooth/doc/src/bluetooth-qml.qdoc | 2 +- src/imports/bluetooth/plugins.qmltypes | 2 +- src/imports/nfc/plugins.qmltypes | 2 +- src/nfc/doc/src/nfc-qml.qdoc | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bluetooth/doc/src/bluetooth-qml.qdoc b/src/bluetooth/doc/src/bluetooth-qml.qdoc index 51aa5a25..2f37cb9b 100644 --- a/src/bluetooth/doc/src/bluetooth-qml.qdoc +++ b/src/bluetooth/doc/src/bluetooth-qml.qdoc @@ -28,7 +28,7 @@ /*! -\qmlmodule QtBluetooth 5.2 +\qmlmodule QtBluetooth 5.11 \title Qt Bluetooth QML Types \ingroup qmlmodules \brief Provides QML types for basic Bluetooth operations on devices. diff --git a/src/imports/bluetooth/plugins.qmltypes b/src/imports/bluetooth/plugins.qmltypes index a00b0324..a22b950a 100644 --- a/src/imports/bluetooth/plugins.qmltypes +++ b/src/imports/bluetooth/plugins.qmltypes @@ -4,7 +4,7 @@ import QtQuick.tooling 1.2 // It is used for QML tooling purposes only. // // This file was auto-generated by: -// 'qmlplugindump -nonrelocatable QtBluetooth 5.10' +// 'qmlplugindump -nonrelocatable QtBluetooth 5.11' Module { dependencies: ["QtQuick 2.8"] diff --git a/src/imports/nfc/plugins.qmltypes b/src/imports/nfc/plugins.qmltypes index e6e98c24..4f723967 100644 --- a/src/imports/nfc/plugins.qmltypes +++ b/src/imports/nfc/plugins.qmltypes @@ -4,7 +4,7 @@ import QtQuick.tooling 1.2 // It is used for QML tooling purposes only. // // This file was auto-generated by: -// 'qmlplugindump -nonrelocatable QtNfc 5.10' +// 'qmlplugindump -nonrelocatable QtNfc 5.11' Module { dependencies: ["QtQuick 2.8"] diff --git a/src/nfc/doc/src/nfc-qml.qdoc b/src/nfc/doc/src/nfc-qml.qdoc index 48df6d32..bbacb2de 100644 --- a/src/nfc/doc/src/nfc-qml.qdoc +++ b/src/nfc/doc/src/nfc-qml.qdoc @@ -28,7 +28,7 @@ /*! -\qmlmodule QtNfc 5.2 +\qmlmodule QtNfc 5.11 \title Qt NFC QML Types \ingroup qmlmodules \brief Provides QML types for accessing NFC Forum Tags. -- cgit v1.2.3 From 43f063427a3ffc62bd85237801b28c9f9826d562 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 23 Apr 2018 09:45:45 +0200 Subject: Add changes file for Qt 5.11.0 Change-Id: I88d23a426812c98628f94714e2394e07fe48c94f Reviewed-by: Timur Pocheptsov Reviewed-by: Oliver Wolff --- dist/changes-5.11.0 | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 dist/changes-5.11.0 diff --git a/dist/changes-5.11.0 b/dist/changes-5.11.0 new file mode 100644 index 00000000..227c9a4a --- /dev/null +++ b/dist/changes-5.11.0 @@ -0,0 +1,79 @@ +Qt 5.11 introduces many new features and improvements as well as bugfixes +over the 5.10.x series. For more details, refer to the online documentation +included in this distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.11 series is binary compatible with the 5.10.x series. +Applications compiled for 5.10 will continue to run with 5.11. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.11.0 Changes * +**************************************************************************** + +QtBluetooth +----------- + + - Added default assignment operator for QBluetoothUuid. + + - Added default qRegisterMetaType() calls for QLowEnergyCharacteristic + and QLowEnergyDescriptor. + + - Fixed various clazy warnings throughout the library. + + - [QTBUG-65831] Added QBluetoothSocket::connectToService() overload to + disambiguate corner cases. + + - Fixed minor documentation issues. + + - [QTBUG-67651] Fixed QLowEnergyController::remoteName() and remoteAddress(). + +QtNfc +----- + + - Improved and reviewed most examples and their documentation + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +Android +------- + + - [QTBUG-66490] Fixed case of ACCESS_FINE_LOCATION not being recognized as + possible permission besides ACCESS_COARSE_LOCATION for device discovery. + + - Fixed repeated connect()/disconnect() behavior for QLowEnergyController + in peripheral mode. + +iOS/macOS +--------- + + - Dropped 10.9 SDK support + +Linux/BlueZ +----------- + + - [QTBUG-46819] Ported QLowEnergyController central mode to BlueZ's DBus + API. The new implementation is used when BlueZ 5.42+ is detected. Earlier + versions will continue to use the the previous custom GATT stack. The benefit + of this change is improved co-existence with BlueZ which avoids interference + between BlueZ and Qt and permits multiple Qt and platform apps being able to + share BTLE connections. The custom GATT peripheral role implementation is still used on + all BlueZ platforms. + + - [QTBUG-66056] Fixed case of QLowEnergyController not resetting the MTU in between connect()/ + disconnect() cycles. + +WinRT +----- + + - Fixed issues with not properly closing QBluetoothSocket. -- cgit v1.2.3 From 32e5af2f9322e25ed4e9a61036f48262b8f56ee7 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Fri, 20 Apr 2018 15:37:02 +0200 Subject: Remove the code to manually initialize resources in static builds After commit be9a56e5e3ced5d0d668fa24e4c65ae928f2e25a in qtbase, this is not needed anymore. Instead the resource system injects the plugin entry point with a reference to all resources. Change-Id: Ic2200668bc1e5cacf78d2808d33eb5c4f30d2c6a Reviewed-by: Alex Blasche --- src/imports/bluetooth/plugin.cpp | 9 +-------- src/imports/nfc/plugin.cpp | 9 +-------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/src/imports/bluetooth/plugin.cpp b/src/imports/bluetooth/plugin.cpp index 07654ca9..1e9737c6 100644 --- a/src/imports/bluetooth/plugin.cpp +++ b/src/imports/bluetooth/plugin.cpp @@ -45,13 +45,6 @@ #include "qdeclarativebluetoothservice_p.h" #include "qdeclarativebluetoothsocket_p.h" -static void initResources() -{ -#ifdef QT_STATIC - Q_INIT_RESOURCE(qmake_QtBluetooth); -#endif -} - QT_USE_NAMESPACE class QBluetoothQmlPlugin : public QQmlExtensionPlugin @@ -59,7 +52,7 @@ class QBluetoothQmlPlugin : public QQmlExtensionPlugin Q_OBJECT Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) public: - QBluetoothQmlPlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { initResources(); } + QBluetoothQmlPlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { } void registerTypes(const char *uri) { // @uri QtBluetooth diff --git a/src/imports/nfc/plugin.cpp b/src/imports/nfc/plugin.cpp index 749e03d7..3a6806fa 100644 --- a/src/imports/nfc/plugin.cpp +++ b/src/imports/nfc/plugin.cpp @@ -47,13 +47,6 @@ #include "qdeclarativendefurirecord_p.h" #include "qdeclarativendefmimerecord_p.h" -static void initResources() -{ -#ifdef QT_STATIC - Q_INIT_RESOURCE(qmake_QtNfc); -#endif -} - QT_USE_NAMESPACE class QNfcQmlPlugin : public QQmlExtensionPlugin @@ -62,7 +55,7 @@ class QNfcQmlPlugin : public QQmlExtensionPlugin Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) public: - QNfcQmlPlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { initResources(); } + QNfcQmlPlugin(QObject *parent = 0) : QQmlExtensionPlugin(parent) { } void registerTypes(const char *uri) { Q_ASSERT(uri == QStringLiteral("QtNfc")); -- cgit v1.2.3 From ef332e4deedc914fe33bab68107f902182e03356 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 27 Apr 2018 14:04:14 +0200 Subject: Fix crash when entries is empty (caused by disconnect somewhere else) The patch fixes the obvious problem of the crash. The question is however what might have caused entries to be empty. The only theoretical explanation is the remote device being disconnected (which resets most internal data). Task-number: QTBUG-65826 Change-Id: I6b3509248f795d9cee5dcfe0c6e0caf06405b4e4 Reviewed-by: Timur Pocheptsov --- .../qt5/android/bluetooth/QtBluetoothLE.java | 39 +++++++++++++++------- 1 file changed, 27 insertions(+), 12 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 1b527ae3..4063537b 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 @@ -1141,16 +1141,24 @@ public class QtBluetoothLE { if (handle == HANDLE_FOR_MTU_EXCHANGE) return; - GattEntry entry = entries.get(handle); - if (entry == null) - return; - if (entry.valueKnown) - return; - entry.valueKnown = true; + try { + synchronized (this) { - GattEntry serviceEntry = entries.get(entry.associatedServiceHandle); - if (serviceEntry != null && serviceEntry.endHandle == handle) - finishCurrentServiceDiscovery(entry.associatedServiceHandle); + GattEntry entry = entries.get(handle); + if (entry == null) + return; + if (entry.valueKnown) + return; + entry.valueKnown = true; + + GattEntry serviceEntry = entries.get(entry.associatedServiceHandle); + if (serviceEntry != null && serviceEntry.endHandle == handle) + finishCurrentServiceDiscovery(entry.associatedServiceHandle); + } + } catch (IndexOutOfBoundsException outOfBounds) { + Log.w(TAG, "interruptCurrentIO(): Unknown gatt entry, index: " + + handle + " size: " + entries.size()); + } } /* @@ -1271,9 +1279,16 @@ public class QtBluetoothLE { } // last entry of current discovery run? - GattEntry serviceEntry = entries.get(entry.associatedServiceHandle); - if (serviceEntry.endHandle == handle) - finishCurrentServiceDiscovery(entry.associatedServiceHandle); + synchronized (this) { + try { + GattEntry serviceEntry = entries.get(entry.associatedServiceHandle); + if (serviceEntry.endHandle == handle) + finishCurrentServiceDiscovery(entry.associatedServiceHandle); + } catch (IndexOutOfBoundsException outOfBounds) { + Log.w(TAG, "performNextIO(): Unknown service for entry, index: " + + entry.associatedServiceHandle + " size: " + entries.size()); + } + } } else { int errorCode = 0; -- cgit v1.2.3 From db58c8691d9a0d6f9ee9226658b0fd6508a52c12 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 26 Apr 2018 08:59:00 +0200 Subject: Add missing emission of readChannelFinished() This fixes the problem for all supported platforms. Task-number: QTBUG-67672 Change-Id: I9cecfbe8a73df46070293eba1870ea3bee738b7b Reviewed-by: Oliver Wolff Reviewed-by: Timur Pocheptsov --- src/bluetooth/qbluetoothsocket.cpp | 2 ++ src/bluetooth/qbluetoothsocket_android.cpp | 1 + src/bluetooth/qbluetoothsocket_osx.mm | 3 +++ 3 files changed, 6 insertions(+) diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index c5b0f7d3..1ad3ffc2 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -742,6 +742,7 @@ void QBluetoothSocket::abort() #ifndef QT_ANDROID_BLUETOOTH //Android closes when the Java event loop comes around setSocketState(QBluetoothSocket::UnconnectedState); + emit readChannelFinished(); emit disconnected(); #endif } @@ -827,6 +828,7 @@ void QBluetoothSocket::close() #ifndef QT_ANDROID_BLUETOOTH //Android closes when the Java event loop comes around setSocketState(UnconnectedState); + emit readChannelFinished(); emit disconnected(); #endif } diff --git a/src/bluetooth/qbluetoothsocket_android.cpp b/src/bluetooth/qbluetoothsocket_android.cpp index d0b901ae..a70b95a2 100644 --- a/src/bluetooth/qbluetoothsocket_android.cpp +++ b/src/bluetooth/qbluetoothsocket_android.cpp @@ -779,6 +779,7 @@ void QBluetoothSocketPrivate::inputThreadError(int errorCode) q->setSocketState(QBluetoothSocket::UnconnectedState); q->setOpenMode(QIODevice::NotOpen); + emit q->readChannelFinished(); emit q->disconnected(); } diff --git a/src/bluetooth/qbluetoothsocket_osx.mm b/src/bluetooth/qbluetoothsocket_osx.mm index de7e2120..dec542dd 100644 --- a/src/bluetooth/qbluetoothsocket_osx.mm +++ b/src/bluetooth/qbluetoothsocket_osx.mm @@ -351,6 +351,7 @@ void QBluetoothSocketPrivate::channelClosed() if (!isConnecting) { q_ptr->setSocketState(QBluetoothSocket::UnconnectedState); q_ptr->setOpenMode(QIODevice::NotOpen); + emit q_ptr->readChannelFinished(); emit q_ptr->disconnected(); } else { state = QBluetoothSocket::UnconnectedState; @@ -638,6 +639,7 @@ void QBluetoothSocket::abort() d_ptr->abort(); setSocketState(QBluetoothSocket::UnconnectedState); + emit readChannelFinished(); emit disconnected(); } @@ -726,6 +728,7 @@ void QBluetoothSocket::close() d_ptr->close(); setSocketState(UnconnectedState); + emit readChannelFinished(); emit disconnected(); } -- cgit v1.2.3 From 8bf0702792f2d41764e62b63432870fee6a9e9c7 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 30 Apr 2018 15:57:13 +0200 Subject: Make Adapter1.RemoveDevice() call async This function is called as part of QBluetoothLocalDevice::requestPairing(..., Unpaired). On heavy I/O systems this may be a rather slow function call. This patch ensures that the function is called asynchronously. Task-number: QTBUG-64735 Change-Id: I7e3b4ab3e9dca26a33af4d13bcc0ea64c44e1540 Reviewed-by: Oliver Wolff Reviewed-by: Denis Shienkov Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothlocaldevice_bluez.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/bluetooth/qbluetoothlocaldevice_bluez.cpp b/src/bluetooth/qbluetoothlocaldevice_bluez.cpp index 4eb3ca58..c247f679 100644 --- a/src/bluetooth/qbluetoothlocaldevice_bluez.cpp +++ b/src/bluetooth/qbluetoothlocaldevice_bluez.cpp @@ -529,16 +529,20 @@ void QBluetoothLocalDevicePrivate::processPairingBluez5(const QString &objectPat switch (target) { case QBluetoothLocalDevice::Unpaired: { delete pairingTarget; - pairingTarget = 0; + pairingTarget = nullptr; QDBusPendingReply<> removeReply = adapterBluez5->RemoveDevice(QDBusObjectPath(objectPath)); - removeReply.waitForFinished(); - - if (removeReply.isError()) - emit q->error(QBluetoothLocalDevice::PairingError); - else - emit q->pairingFinished(targetAddress, QBluetoothLocalDevice::Unpaired); + auto watcher = new QDBusPendingCallWatcher(removeReply, this); + connect(watcher, &QDBusPendingCallWatcher::finished, + this, [q, targetAddress](QDBusPendingCallWatcher* watcher){ + QDBusPendingReply<> reply = *watcher; + if (reply.isError()) + emit q->error(QBluetoothLocalDevice::PairingError); + else + emit q->pairingFinished(targetAddress, QBluetoothLocalDevice::Unpaired); + watcher->deleteLater(); + }); break; } case QBluetoothLocalDevice::Paired: -- cgit v1.2.3 From 88207ae868002f0b53151d2c5c2ac416284ce9c1 Mon Sep 17 00:00:00 2001 From: Kai Koehne Date: Thu, 10 May 2018 19:10:07 +0200 Subject: Doc: Add license details to index page of Qt NFC Change-Id: Iae1cde9f313d6d97858e2bf9de974b0e09bad1b4 Reviewed-by: Alex Blasche --- src/nfc/doc/src/nfc-index.qdoc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/nfc/doc/src/nfc-index.qdoc b/src/nfc/doc/src/nfc-index.qdoc index c9acc92b..21f775a6 100644 --- a/src/nfc/doc/src/nfc-index.qdoc +++ b/src/nfc/doc/src/nfc-index.qdoc @@ -60,6 +60,15 @@ import statement in your \c .qml file: \snippet doc_src_qtnfc.qml import +\section1 Licenses + +Qt NFC is available under commercial licenses from \l{The Qt Company}. +In addition, it is available under free software licenses. Since Qt 5.4, +these free software licenses are +\l{GNU Lesser General Public License, version 3}, or +the \l{GNU General Public License, version 2}. +See \l{Qt Licensing} for further details. + \section1 Related Information \section2 Guides -- cgit v1.2.3 From aad6e26574ff069e080bf6461c0fb7d0fee9e403 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 17 May 2018 16:15:04 +0200 Subject: Properly invalidate services when calling disconnectService() on BlueZ While the central role implementation properly invalidates all the LowEnergyServicePrivate instances, peripheral mode was leaking service instances. This is triggered when the peripheral disconnects from a client or when the user calls disconnectService(). On the other hand stopAdvertising() does not do that. This patch fixes the service instance leak and ensures that the class docs specifically state the behavior difference between stopAdvertising() and disconnectService(). Change-Id: Ia52b141096dc1db3d0cefe3ed18c230eecccd9c0 Reviewed-by: Christian Kandeler Reviewed-by: Timur Pocheptsov Reviewed-by: Oliver Wolff --- src/bluetooth/qlowenergycontroller.cpp | 19 +++++++++++++++---- src/bluetooth/qlowenergycontroller_bluez.cpp | 9 ++++++--- src/bluetooth/qlowenergycontrollerbase.cpp | 7 +++++++ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller.cpp b/src/bluetooth/qlowenergycontroller.cpp index a23955ff..6b4c17d6 100644 --- a/src/bluetooth/qlowenergycontroller.cpp +++ b/src/bluetooth/qlowenergycontroller.cpp @@ -603,9 +603,10 @@ void QLowEnergyController::connectToDevice() This function does nothing if the controller is in the \l UnconnectedState. - If the controller is in the peripheral role, it stops advertising too. - The application must restart the advertising mode by calling - \l startAdvertising(). + If the controller is in the peripheral role, it stops advertising and removes + all services which have previously been added via \l addService(). + To reuse the QLowEnergyController instance the application must re-add services + and restart the advertising mode by calling \l startAdvertising(). \sa connectToDevice() */ @@ -742,6 +743,9 @@ void QLowEnergyController::startAdvertising(const QLowEnergyAdvertisingParameter /*! Stops advertising, if this object is currently in the advertising state. + The controller has to be in the \l PeripheralRole for this function to work. + It does not invalidate services which have previously been added via \l addService(). + \since 5.7 \sa startAdvertising() */ @@ -760,8 +764,15 @@ void QLowEnergyController::stopAdvertising() The controller must be in the \l PeripheralRole and in the \l UnconnectedState. The \a service object must be valid. + \note Once the peripheral instance is disconnected from the remote central device or + if \l disconnectFromDevice() is manually called, every service definition that was + previously added via this function is removed from the peripheral. Therefore this function + must be called again before re-advertising this peripheral controller instance. The described + behavior is connection specific and therefore not dependent on whether \l stopAdvertising() + was called. + \since 5.7 - \sa QLowEnergyServiceData::addIncludedService + \sa stopAdvertising(), disconnectFromDevice(), QLowEnergyServiceData::addIncludedService */ QLowEnergyService *QLowEnergyController::addService(const QLowEnergyServiceData &service, QObject *parent) diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index d58e0ee8..d288f3ad 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -809,9 +809,12 @@ void QLowEnergyControllerPrivateBluez::resetController() securityLevelValue = -1; connectionHandle = 0; - // public API behavior requires stop of advertisement - if (role == QLowEnergyController::PeripheralRole && advertiser) - advertiser->stopAdvertising(); + if (role == QLowEnergyController::PeripheralRole) { + // public API behavior requires stop of advertisement + if (advertiser) + advertiser->stopAdvertising(); + localAttributes.clear(); + } } void QLowEnergyControllerPrivateBluez::restartRequestTimer() diff --git a/src/bluetooth/qlowenergycontrollerbase.cpp b/src/bluetooth/qlowenergycontrollerbase.cpp index 687f5b9e..c7b9ec0b 100644 --- a/src/bluetooth/qlowenergycontrollerbase.cpp +++ b/src/bluetooth/qlowenergycontrollerbase.cpp @@ -261,6 +261,8 @@ void QLowEnergyControllerPrivate::invalidateServices() } serviceList.clear(); + localServices.clear(); + lastLocalHandle = {}; } QLowEnergyService *QLowEnergyControllerPrivate::addServiceHelper( @@ -308,7 +310,12 @@ QLowEnergyService *QLowEnergyControllerPrivate::addServiceHelper( return nullptr; } + if (localServices.contains(servicePrivate->uuid)) { + qWarning() << "Overriding existing local service with uuid" + << servicePrivate->uuid; + } this->localServices.insert(servicePrivate->uuid, servicePrivate); + this->addToGenericAttributeList(service, servicePrivate->startHandle); return new QLowEnergyService(servicePrivate); } -- cgit v1.2.3 From c8e6dae2d9749179327df460755282cf5102e902 Mon Sep 17 00:00:00 2001 From: Lars Schmertmann Date: Fri, 27 Apr 2018 14:30:14 +0200 Subject: Use Android broadcast ACTION_ADAPTER_STATE_CHANGED To avoid polling of the NFC adapter state a signal is added to the QNearFieldManager. Change-Id: If9e1e8025cca2deb1338fa7db255ebe171cab823 Reviewed-by: Alex Blasche --- src/android/nfc/nfc.pro | 3 +- .../qt5/android/nfc/QtNfcBroadcastReceiver.java | 72 ++++++++++++++++++++++ src/nfc/qnearfieldmanager.cpp | 31 ++++++++++ src/nfc/qnearfieldmanager.h | 8 +++ src/nfc/qnearfieldmanager_android.cpp | 30 +++++++++ src/nfc/qnearfieldmanager_p.h | 1 + 6 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver.java diff --git a/src/android/nfc/nfc.pro b/src/android/nfc/nfc.pro index 89026b75..a725fb7d 100644 --- a/src/android/nfc/nfc.pro +++ b/src/android/nfc/nfc.pro @@ -7,7 +7,8 @@ PATHPREFIX = $$PWD/src/org/qtproject/qt5/android/nfc JAVACLASSPATH += $$PWD/src/ JAVASOURCES += \ - $$PWD/src/org/qtproject/qt5/android/nfc/QtNfc.java + $$PWD/src/org/qtproject/qt5/android/nfc/QtNfc.java \ + $$PWD/src/org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver.java \ # install target.path = $$[QT_INSTALL_PREFIX]/jar diff --git a/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver.java b/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver.java new file mode 100644 index 00000000..ea650ede --- /dev/null +++ b/src/android/nfc/src/org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver.java @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2018 Governikus GmbH & Co. KG +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +package org.qtproject.qt5.android.nfc; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.nfc.NfcAdapter; + + +public class QtNfcBroadcastReceiver extends BroadcastReceiver +{ + private Context qtContext; + + public QtNfcBroadcastReceiver(Context context) + { + qtContext = context; + IntentFilter filter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED); + qtContext.registerReceiver(this, filter); + } + + public void unregisterReceiver() + { + qtContext.unregisterReceiver(this); + } + + public void onReceive(Context context, Intent intent) + { + final int state = intent.getIntExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NfcAdapter.STATE_OFF); + jniOnReceive(state); + } + + public native void jniOnReceive(int state); +} diff --git a/src/nfc/qnearfieldmanager.cpp b/src/nfc/qnearfieldmanager.cpp index 8b46d420..73b0c360 100644 --- a/src/nfc/qnearfieldmanager.cpp +++ b/src/nfc/qnearfieldmanager.cpp @@ -118,6 +118,19 @@ QT_BEGIN_NAMESPACE debug output can be enabled by enabling categorized logging for 'qt.nfc.neard'. */ +/*! + \enum QNearFieldManager::AdapterState + + \since 5.12 + + This enum describes the different states a NFC adapter can have. + + \value Offline The nfc adapter is offline. + \value TurningOn The nfc adapter is turning on. + \value Online The nfc adapter is online. + \value TurningOff The nfc adapter is turning off. +*/ + /*! \enum QNearFieldManager::TargetAccessMode @@ -132,6 +145,16 @@ QT_BEGIN_NAMESPACE calling QNearFieldTarget::sendCommand(). */ +/*! + \fn void QNearFieldManager::adapterStateChanged(AdapterState state) + + \since 5.12 + + This signal is emitted whenever the state of the NFC adapter changed. + + \note Currently, this signal is only emitted on Android. +*/ + /*! \fn void QNearFieldManager::targetDetected(QNearFieldTarget *target) @@ -169,6 +192,10 @@ QT_BEGIN_NAMESPACE QNearFieldManager::QNearFieldManager(QObject *parent) : QObject(parent), d_ptr(new QNearFieldManagerPrivateImpl) { + qRegisterMetaType(); + + connect(d_ptr, &QNearFieldManagerPrivate::adapterStateChanged, + this, &QNearFieldManager::adapterStateChanged); connect(d_ptr, SIGNAL(targetDetected(QNearFieldTarget*)), this, SIGNAL(targetDetected(QNearFieldTarget*))); connect(d_ptr, SIGNAL(targetLost(QNearFieldTarget*)), @@ -186,6 +213,10 @@ QNearFieldManager::QNearFieldManager(QObject *parent) QNearFieldManager::QNearFieldManager(QNearFieldManagerPrivate *backend, QObject *parent) : QObject(parent), d_ptr(backend) { + qRegisterMetaType(); + + connect(d_ptr, &QNearFieldManagerPrivate::adapterStateChanged, + this, &QNearFieldManager::adapterStateChanged); connect(d_ptr, SIGNAL(targetDetected(QNearFieldTarget*)), this, SIGNAL(targetDetected(QNearFieldTarget*))); connect(d_ptr, SIGNAL(targetLost(QNearFieldTarget*)), diff --git a/src/nfc/qnearfieldmanager.h b/src/nfc/qnearfieldmanager.h index 1dcb3485..500b9631 100644 --- a/src/nfc/qnearfieldmanager.h +++ b/src/nfc/qnearfieldmanager.h @@ -56,6 +56,13 @@ class Q_NFC_EXPORT QNearFieldManager : public QObject Q_DECLARE_PRIVATE(QNearFieldManager) public: + enum class AdapterState { + Offline = 1, + TurningOn = 2, + Online = 3, + TurningOff = 4 + }; + Q_ENUM(AdapterState) enum TargetAccessMode { NoTargetAccess = 0x00, NdefReadTargetAccess = 0x01, @@ -92,6 +99,7 @@ public: bool unregisterNdefMessageHandler(int handlerId); Q_SIGNALS: + void adapterStateChanged(AdapterState state); void targetDetected(QNearFieldTarget *target); void targetLost(QNearFieldTarget *target); diff --git a/src/nfc/qnearfieldmanager_android.cpp b/src/nfc/qnearfieldmanager_android.cpp index dd814787..ecefa801 100644 --- a/src/nfc/qnearfieldmanager_android.cpp +++ b/src/nfc/qnearfieldmanager_android.cpp @@ -48,22 +48,52 @@ #include "qdebug.h" #include "qlist.h" +#include #include #include +#include QT_BEGIN_NAMESPACE +Q_GLOBAL_STATIC(QAndroidJniObject, broadcastReceiver) +Q_GLOBAL_STATIC(QList, broadcastListener) + +extern "C" +{ + JNIEXPORT void JNICALL Java_org_qtproject_qt5_android_nfc_QtNfcBroadcastReceiver_jniOnReceive( + JNIEnv */*env*/, jobject /*javaObject*/, jint state) + { + QNearFieldManager::AdapterState adapterState = static_cast((int) state); + + for (const auto listener : *broadcastListener) { + Q_EMIT listener->adapterStateChanged(adapterState); + } + } +} + QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl() : m_detecting(false), m_handlerID(0) { qRegisterMetaType("QAndroidJniObject"); qRegisterMetaType("QNdefMessage"); + + if (!broadcastReceiver->isValid()) { + *broadcastReceiver = QAndroidJniObject("org/qtproject/qt5/android/nfc/QtNfcBroadcastReceiver", + "(Landroid/content/Context;)V", QtAndroidPrivate::context()); + } + broadcastListener->append(this); + connect(this, SIGNAL(targetDetected(QNearFieldTarget*)), this, SLOT(handlerTargetDetected(QNearFieldTarget*))); connect(this, SIGNAL(targetLost(QNearFieldTarget*)), this, SLOT(handlerTargetLost(QNearFieldTarget*))); } QNearFieldManagerPrivateImpl::~QNearFieldManagerPrivateImpl() { + broadcastListener->removeOne(this); + if (broadcastListener->isEmpty()) { + broadcastReceiver->callMethod("unregisterReceiver"); + *broadcastReceiver = QAndroidJniObject(); + } } void QNearFieldManagerPrivateImpl::handlerTargetDetected(QNearFieldTarget *target) diff --git a/src/nfc/qnearfieldmanager_p.h b/src/nfc/qnearfieldmanager_p.h index 8e86ce4b..351c844a 100644 --- a/src/nfc/qnearfieldmanager_p.h +++ b/src/nfc/qnearfieldmanager_p.h @@ -129,6 +129,7 @@ public: } signals: + void adapterStateChanged(QNearFieldManager::AdapterState state); void targetDetected(QNearFieldTarget *target); void targetLost(QNearFieldTarget *target); -- cgit v1.2.3 From 370f751edd826f483dec0115000370811ff1202a Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 28 May 2018 13:23:51 +0200 Subject: Add G(rand)C(entral)D(ispatch) timeout handler QtBluetooth is using its own dispatch queue in CoreBluetooth back-end - this is where CoreBluetooth is executing all callbacks we're providing in delegate classes. Some operations like service discovery/characteristic or descriptor read(s) amd write(s) e.t.c. may sometimes fail to finish - no value read, no error reported (so delegate's method - callback - is never called). To deal with this we introduce the class OSXBTGCDTimer and GCDTimerDelegate protocol; GCDTimer periodically inserts blocks into the serial LE queue and checks for timeouts upon their execution. Task-number: QTBUG-68422 Change-Id: Ic17bf91d4223ad1ffc7b9808da36c902a4158227 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbt.pri | 5 +- src/bluetooth/osx/osxbtgcdtimer.mm | 110 ++++++++++++++++++++++++++++++++++++ src/bluetooth/osx/osxbtgcdtimer_p.h | 94 ++++++++++++++++++++++++++++++ 3 files changed, 208 insertions(+), 1 deletion(-) create mode 100644 src/bluetooth/osx/osxbtgcdtimer.mm create mode 100644 src/bluetooth/osx/osxbtgcdtimer_p.h diff --git a/src/bluetooth/osx/osxbt.pri b/src/bluetooth/osx/osxbt.pri index 0f293107..b7ac0535 100644 --- a/src/bluetooth/osx/osxbt.pri +++ b/src/bluetooth/osx/osxbt.pri @@ -1,5 +1,8 @@ SOURCES += osx/uistrings.cpp osx/osxbtnotifier.cpp -PRIVATE_HEADERS += osx/uistrings_p.h +PRIVATE_HEADERS += osx/uistrings_p.h \ + osx/osxbtgcdtimer_p.h + +OBJECTIVE_SOURCES += osx/osxbtgcdtimer.mm #QMAKE_CXXFLAGS_WARN_ON += -Wno-nullability-completeness CONFIG(osx) { diff --git a/src/bluetooth/osx/osxbtgcdtimer.mm b/src/bluetooth/osx/osxbtgcdtimer.mm new file mode 100644 index 00000000..0a49c25c --- /dev/null +++ b/src/bluetooth/osx/osxbtgcdtimer.mm @@ -0,0 +1,110 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "osxbtgcdtimer_p.h" +#include "osxbtutility_p.h" + +#include + +#include + +@implementation QT_MANGLE_NAMESPACE(OSXBTGCDTimer) + +- (instancetype)initWithDelegate:(id)delegate +{ + if (self = [super init]) { + timeoutHandler = delegate; + timeoutMS = 0; + timeoutStepMS = 0; + cancelled = false; + } + return self; +} + +- (void)startWithTimeout:(qint64)ms step:(qint64)stepMS +{ + Q_ASSERT(!timeoutMS && !timeoutStepMS); + Q_ASSERT(!cancelled); + + if (!timeoutHandler) { + // Nobody to report timeout to, no need to start any task then. + return; + } + + if (ms <= 0 || stepMS <= 0) { + qCWarning(QT_BT_OSX, "Invalid timeout/step parameters"); + return; + } + + timeoutMS = ms; + timeoutStepMS = stepMS; + timer.start(); + + [self handleTimeout]; +} + +- (void)handleTimeout +{ + if (cancelled) + return; + + const qint64 elapsed = timer.elapsed(); + if (elapsed >= timeoutMS) { + [timeoutHandler timeout]; + } else { + using namespace QT_PREPEND_NAMESPACE(OSXBluetooth); + // Re-schedule: + dispatch_queue_t leQueue(qt_LE_queue()); + Q_ASSERT(leQueue); + const qint64 timeChunkMS = std::min(timeoutMS - elapsed, timeoutStepMS); + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, + int64_t(timeChunkMS / 1000. * NSEC_PER_SEC)), + leQueue, + ^{ + [self handleTimeout]; + }); + } +} + +- (void)cancelTimer +{ + cancelled = true; +} + +@end diff --git a/src/bluetooth/osx/osxbtgcdtimer_p.h b/src/bluetooth/osx/osxbtgcdtimer_p.h new file mode 100644 index 00000000..007a004b --- /dev/null +++ b/src/bluetooth/osx/osxbtgcdtimer_p.h @@ -0,0 +1,94 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef OSXBTGCDTIMER_P_H +#define OSXBTGCDTIMER_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "osxbtutility_p.h" + +#include +#include + +#include + +@protocol QT_MANGLE_NAMESPACE(GCDTimerDelegate) +@required +- (void)timeout; +@end + +@interface QT_MANGLE_NAMESPACE(OSXBTGCDTimer) : NSObject { +@private + qint64 timeoutMS; + qint64 timeoutStepMS; + QT_PREPEND_NAMESPACE(QElapsedTimer) timer; + id timeoutHandler; + bool cancelled; +} + +- (instancetype)initWithDelegate:(id)delegate; +- (void)startWithTimeout:(qint64)ms step:(qint64)stepMS; +- (void)handleTimeout; +- (void)cancelTimer; + +@end + +QT_BEGIN_NAMESPACE + +namespace OSXBluetooth { + +using GCDTimerObjC = QT_MANGLE_NAMESPACE(OSXBTGCDTimer); +using GCDTimer = ObjCScopedPointer; + +} + +QT_END_NAMESPACE + +#endif // OSXBTGCDTIMER_P_H + -- cgit v1.2.3 From c2513dce68f2643b0c62e13d16d376115d9c8476 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Thu, 31 May 2018 14:03:58 +0200 Subject: Bump version Change-Id: Ie059fb032d764d744a3e9dad9edf04bce161223d --- .qmake.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.qmake.conf b/.qmake.conf index dc68d388..67c54ee6 100644 --- a/.qmake.conf +++ b/.qmake.conf @@ -1,3 +1,3 @@ load(qt_build_config) -MODULE_VERSION = 5.11.0 +MODULE_VERSION = 5.11.1 -- cgit v1.2.3 From 5bdc4e8b0b1e6664b7c289cfc9c1a9d12da6e87e Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 28 May 2018 14:35:17 +0200 Subject: Reimplement scan/manager state timeouts using GCD timer And remove some essentially duplicated code. Task-number: QTBUG-68422 Change-Id: I677581ebb0998d64a0081f568479efb7e8156474 Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtgcdtimer.mm | 1 + src/bluetooth/osx/osxbtledeviceinquiry.mm | 114 +++++++---------------------- src/bluetooth/osx/osxbtledeviceinquiry_p.h | 18 ++--- 3 files changed, 34 insertions(+), 99 deletions(-) diff --git a/src/bluetooth/osx/osxbtgcdtimer.mm b/src/bluetooth/osx/osxbtgcdtimer.mm index 0a49c25c..095f8680 100644 --- a/src/bluetooth/osx/osxbtgcdtimer.mm +++ b/src/bluetooth/osx/osxbtgcdtimer.mm @@ -105,6 +105,7 @@ - (void)cancelTimer { cancelled = true; + timeoutHandler = nil; } @end diff --git a/src/bluetooth/osx/osxbtledeviceinquiry.mm b/src/bluetooth/osx/osxbtledeviceinquiry.mm index 60222370..2cece15b 100644 --- a/src/bluetooth/osx/osxbtledeviceinquiry.mm +++ b/src/bluetooth/osx/osxbtledeviceinquiry.mm @@ -65,9 +65,7 @@ QBluetoothUuid qt_uuid(NSUUID *nsUuid) } const int timeStepMS = 100; - const int powerOffTimeoutMS = 30000; -const qreal powerOffTimeStepS = 30. / 100.; struct AdvertisementData { // That's what CoreBluetooth has: @@ -115,14 +113,6 @@ QT_END_NAMESPACE QT_USE_NAMESPACE -@interface QT_MANGLE_NAMESPACE(OSXBTLEDeviceInquiry) (PrivateAPI) -// These two methods are scheduled with a small time step -// within a given timeout, they either re-schedule -// themselves or emit a signal/stop some operation. -- (void)stopScan; -- (void)handlePoweredOff; -@end - @implementation QT_MANGLE_NAMESPACE(OSXBTLEDeviceInquiry) -(id)initWithNotifier:(LECBManagerNotifier *)aNotifier @@ -153,60 +143,22 @@ QT_USE_NAMESPACE [super dealloc]; } -- (void)stopScan +- (void)timeout { - using namespace OSXBluetooth; - - // We never schedule stopScan if there is no timeout: - Q_ASSERT(inquiryTimeoutMS > 0); - if (internalState == InquiryActive) { - const int elapsed = scanTimer.elapsed(); - if (elapsed >= inquiryTimeoutMS) { - [manager stopScan]; - [manager setDelegate:nil]; - internalState = InquiryFinished; - Q_ASSERT(notifier); - emit notifier->discoveryFinished(); - } else { - // Re-schedule 'stopScan': - dispatch_queue_t leQueue(qt_LE_queue()); - Q_ASSERT(leQueue); - const int timeChunkMS = std::min(inquiryTimeoutMS - elapsed, timeStepMS); - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, - int64_t(timeChunkMS / 1000. * NSEC_PER_SEC)), - leQueue, - ^{ - [self stopScan]; - }); - } - } -} - -- (void)handlePoweredOff -{ - // This is interesting on iOS only, where - // the system shows an alert asking to enable - // Bluetooth in the 'Settings' app. If not done yet (after 30 - // seconds) - we consider it an error. - using namespace OSXBluetooth; - - if (internalState == InquiryStarting) { - if (errorTimer.elapsed() >= powerOffTimeoutMS) { - [manager setDelegate:nil]; - internalState = ErrorPoweredOff; - Q_ASSERT(notifier); - emit notifier->CBManagerError(QBluetoothDeviceDiscoveryAgent::PoweredOffError); - } else { - dispatch_queue_t leQueue(qt_LE_queue()); - Q_ASSERT(leQueue); - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, - (int64_t)(powerOffTimeStepS * NSEC_PER_SEC)), - leQueue, - ^{ - [self handlePoweredOff]; - }); - } + [manager stopScan]; + [manager setDelegate:nil]; + internalState = InquiryFinished; + Q_ASSERT(notifier); + emit notifier->discoveryFinished(); + } else if (internalState == InquiryStarting) { + // This is interesting on iOS only, where the system shows an alert + // asking to enable Bluetooth in the 'Settings' app. If not done yet + // (after 30 seconds) - we consider this as an error. + [manager setDelegate:nil]; + internalState = ErrorPoweredOff; + Q_ASSERT(notifier); + emit notifier->CBManagerError(QBluetoothDeviceDiscoveryAgent::PoweredOffError); } } @@ -233,9 +185,6 @@ QT_USE_NAMESPACE using namespace OSXBluetooth; - dispatch_queue_t leQueue(qt_LE_queue()); - Q_ASSERT(leQueue); - const auto state = central.state; #if QT_IOS_PLATFORM_SDK_EQUAL_OR_ABOVE(__IPHONE_10_0) || QT_OSX_PLATFORM_SDK_EQUAL_OR_ABOVE(__MAC_10_13) if (state == CBManagerStatePoweredOn) { @@ -246,18 +195,9 @@ QT_USE_NAMESPACE internalState = InquiryActive; if (inquiryTimeoutMS > 0) { - // We have a finite-length discovery, schedule stopScan, - // with a smaller time step, otherwise it can prevent - // 'self' from being deleted in time, which is not good - // (the block will retain 'self', waiting for timeout). - scanTimer.start(); - const int timeChunkMS = std::min(timeStepMS, inquiryTimeoutMS); - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, - int64_t(timeChunkMS / 1000. * NSEC_PER_SEC)), - leQueue, - ^{ - [self stopScan]; - }); + [elapsedTimer cancelTimer]; + elapsedTimer.reset([[GCDTimerObjC alloc] initWithDelegate:self]); + [elapsedTimer startWithTimeout:inquiryTimeoutMS step:timeStepMS]; } [manager scanForPeripheralsWithServices:nil options:nil]; @@ -287,19 +227,15 @@ QT_USE_NAMESPACE if (internalState == InquiryStarting) { #ifndef Q_OS_OSX // On iOS a user can see at this point an alert asking to - // enable Bluetooth in the "Settings" app. If a user does, + // enable Bluetooth in the "Settings" app. If a user does so, // we'll receive 'PoweredOn' state update later. - // No change in internalState. Wait for 30 seconds - // (we split it into smaller steps not to retain 'self' for - // too long ) ... - errorTimer.start(); - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, - (int64_t)(powerOffTimeStepS * NSEC_PER_SEC)), - leQueue, - ^{ - [self handlePoweredOff]; - }); + // No change in internalState. Wait for 30 seconds. + [elapsedTimer cancelTimer]; + elapsedTimer.reset([[GCDTimerObjC alloc] initWithDelegate:self]); + [elapsedTimer startWithTimeout:powerOffTimeoutMS step:300]; return; +#else + Q_UNUSED(powerOffTimeoutMS) #endif internalState = ErrorPoweredOff; emit notifier->CBManagerError(QBluetoothDeviceDiscoveryAgent::PoweredOffError); @@ -330,6 +266,8 @@ QT_USE_NAMESPACE if (internalState == InquiryActive) [manager stopScan]; + [elapsedTimer cancelTimer]; + [manager setDelegate:nil]; internalState = InquiryCancelled; diff --git a/src/bluetooth/osx/osxbtledeviceinquiry_p.h b/src/bluetooth/osx/osxbtledeviceinquiry_p.h index fc787a6d..a19055ab 100644 --- a/src/bluetooth/osx/osxbtledeviceinquiry_p.h +++ b/src/bluetooth/osx/osxbtledeviceinquiry_p.h @@ -53,10 +53,10 @@ #include "qbluetoothdevicediscoveryagent.h" #include "qbluetoothdeviceinfo.h" +#include "osxbtgcdtimer_p.h" #include "osxbtutility_p.h" #include "osxbluetooth_p.h" -#include #include #include @@ -75,10 +75,8 @@ class LECBManagerNotifier; QT_END_NAMESPACE -// Ugly but all these QT_PREPEND_NAMESPACE etc. are even worse ... -using OSXBluetooth::LECBManagerNotifier; -using OSXBluetooth::ObjCScopedPointer; -using QT_PREPEND_NAMESPACE(QElapsedTimer); +using QT_PREPEND_NAMESPACE(OSXBluetooth)::LECBManagerNotifier; +using QT_PREPEND_NAMESPACE(OSXBluetooth)::ObjCScopedPointer; enum LEInquiryState { @@ -90,7 +88,7 @@ enum LEInquiryState ErrorLENotSupported }; -@interface QT_MANGLE_NAMESPACE(OSXBTLEDeviceInquiry) : NSObject +@interface QT_MANGLE_NAMESPACE(OSXBTLEDeviceInquiry) : NSObject { LECBManagerNotifier *notifier; ObjCScopedPointer manager; @@ -99,16 +97,14 @@ enum LEInquiryState LEInquiryState internalState; int inquiryTimeoutMS; - // Timers to check if we can execute delayed callbacks: - QT_PREPEND_NAMESPACE(QElapsedTimer) errorTimer; - QT_PREPEND_NAMESPACE(QElapsedTimer) scanTimer; + QT_PREPEND_NAMESPACE(OSXBluetooth)::GCDTimer elapsedTimer; } - (id)initWithNotifier:(LECBManagerNotifier *)aNotifier; - (void)dealloc; -// IMPORTANT: both 'startWithTimeout' and 'stop' -// can be executed only on the "Qt's LE queue". +// IMPORTANT: both 'startWithTimeout' and 'stop' MUST be executed on the "Qt's +// LE queue". - (void)startWithTimeout:(int)timeout; - (void)stop; -- cgit v1.2.3 From 82c9845fdb25f28aca6d0c8017c3fec79425941d Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 16 Mar 2018 13:16:00 +0200 Subject: Add changes file for Qt 5.9.5 Change-Id: Ie522ad947cf4a5657cfc95f82dc1b467eae954e1 Reviewed-by: Oliver Wolff (cherry picked from commit 6d2e1761ebd62ef60c39af83b7ef88ac986b2d1e) Reviewed-by: Alex Blasche --- dist/changes-5.9.5 | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 dist/changes-5.9.5 diff --git a/dist/changes-5.9.5 b/dist/changes-5.9.5 new file mode 100644 index 00000000..8a69c52f --- /dev/null +++ b/dist/changes-5.9.5 @@ -0,0 +1,29 @@ +Qt 5.9.5 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.9.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/index.html + +The Qt version 5.9 series is binary compatible with the 5.8.x series. +Applications compiled for 5.9 will continue to run with 5.9. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.9.5 Changes * +**************************************************************************** + +QtBluetooth +----------- + + - [QTBUG-65801] Fixed never ending QBLuetoothDeviceDiscoveryAhgent::start(ClassMethod) + on WinRT/UWP. + - Fixed internal cleanup issue in QBluetoothSocket on WinRT/UWP. -- cgit v1.2.3 From 5e106754314ca0f58f7f8c3ae86d5ef298894742 Mon Sep 17 00:00:00 2001 From: Antti Kokko Date: Mon, 28 May 2018 09:04:26 +0300 Subject: Add changes file for Qt 5.9.6 Change-Id: Ib91829d9b96aaefa06b0fae5730ce9d99699fbf1 Reviewed-by: Alex Blasche (cherry picked from commit 513e69bd6aca390d7e6ef28d3527c24dee99ee2b) Reviewed-by: Antti Kokko --- dist/changes-5.9.6 | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 dist/changes-5.9.6 diff --git a/dist/changes-5.9.6 b/dist/changes-5.9.6 new file mode 100644 index 00000000..f0179a5a --- /dev/null +++ b/dist/changes-5.9.6 @@ -0,0 +1,24 @@ +Qt 5.9.6 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.9.0 through 5.9.5. + +For more details, refer to the online documentation included in this +distribution. The documentation is also available online: + +http://doc.qt.io/qt-5/index.html + +The Qt version 5.9 series is binary compatible with the 5.8.x series. +Applications compiled for 5.8 will continue to run with 5.9. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.9.6 Changes * +**************************************************************************** + + - This release contains only minor code improvements. -- cgit v1.2.3 From 6e111b1631ca43c6c78edf0cf28b943e62cb2804 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Tue, 29 May 2018 10:21:27 +0200 Subject: LE controller (CoreBluetooth) - handle timeouts While we're discovering service's details (included services, characteristics, descriptors, etc.) some operations can result in timeout, without CoreBluetooth reporting any error back. To cope with this we need an additional logic - all such operations must be guarded with a 'watchdog' timer (OSXBTGCDTimer). Fortunately enough, we can re-use CBPeripheralDelegate's callbacks to handle these timeouts. As a micro-bonus - a couple of bugs in callbacks: whenever we are in service details discovery, after having some error we have to finish with discovery anyway, not to stick in 'discovering' state forever. Task-number: QTBUG-68422 Change-Id: I13a377ebec3983ac48a33d6b89b67223d5ec412f Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 213 +++++++++++++++++++++++++----- src/bluetooth/osx/osxbtcentralmanager_p.h | 22 ++- 2 files changed, 199 insertions(+), 36 deletions(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index 78e6b832..b56dc0d5 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -79,8 +79,21 @@ NSUInteger qt_countGATTEntries(CBService *service) return n; } +ObjCStrongReference qt_timeoutNSError(OperationTimeout type) +{ + // For now we do not provide details, since nobody is using this NSError + // after all (except callbacks checking if an operation was successful + // or not). + Q_ASSERT(type != OperationTimeout::none); + Q_UNUSED(type) + NSError *nsError = [[NSError alloc] initWithDomain:CBErrorDomain + code:CBErrorOperationCancelled + userInfo:nil]; + return ObjCStrongReference(nsError, false /*do not retain, done already*/); } +} // namespace OSXBluetooth + QT_END_NAMESPACE @@ -115,9 +128,11 @@ QT_END_NAMESPACE - (id)initWith:(OSXBluetooth::LECBManagerNotifier *)aNotifier { + using namespace OSXBluetooth; + if (self = [super init]) { manager = nil; - managerState = OSXBluetooth::CentralManagerIdle; + managerState = CentralManagerIdle; disconnectPending = false; peripheral = nil; notifier = aNotifier; @@ -125,6 +140,17 @@ QT_END_NAMESPACE lastValidHandle = 0; requestPending = false; currentReadHandle = 0; + timeoutType = OperationTimeout::none; + + if (Q_UNLIKELY(!qEnvironmentVariableIsEmpty("BLUETOOTH_GATT_TIMEOUT"))) { + bool ok = false; + const int value = qEnvironmentVariableIntValue("BLUETOOTH_GATT_TIMEOUT", &ok); + if (ok && value >= 0) + timeoutMS = value; + } + + if (!timeoutMS) + timeoutMS = 20000; } return self; @@ -153,6 +179,60 @@ QT_END_NAMESPACE [super dealloc]; } +- (void)watchAfter:(id)object timeout:(OSXBluetooth::OperationTimeout)type +{ + using namespace OSXBluetooth; + + objectUnderWatch = object; + timeoutType = type; + [timeoutWatchdog cancelTimer]; + timeoutWatchdog.reset([[GCDTimerObjC alloc] initWithDelegate:self]); + [timeoutWatchdog startWithTimeout:timeoutMS step:200]; +} + +- (void)stopWatchdog +{ + [timeoutWatchdog cancelTimer]; + objectUnderWatch = nil; + timeoutType = OSXBluetooth::OperationTimeout::none; +} + +- (void)timeout +{ + using namespace OSXBluetooth; + + Q_ASSERT(objectUnderWatch); + NSLog(@"Timeout caused by: %@", objectUnderWatch); + const ObjCStrongReference nsError(qt_timeoutNSError(timeoutType)); + switch (timeoutType) { + case OperationTimeout::serviceDiscovery: + qCWarning(QT_BT_OSX, "Timeout in services discovery"); + [self peripheral:peripheral didDiscoverServices:nsError]; + break; + case OperationTimeout::includedServicesDiscovery: + qCWarning(QT_BT_OSX, "Timeout in included services discovery"); + [self peripheral:peripheral didDiscoverIncludedServicesForService:objectUnderWatch error:nsError]; + break; + case OperationTimeout::characteristicsDiscovery: + qCWarning(QT_BT_OSX, "Timeout in characteristics discovery"); + [self peripheral:peripheral didDiscoverCharacteristicsForService:objectUnderWatch error:nsError]; + break; + case OperationTimeout::characteristicRead: + qCWarning(QT_BT_OSX, "Timeout while reading a characteristic"); + [self peripheral:peripheral didUpdateValueForCharacteristic:objectUnderWatch error:nsError]; + break; + case OperationTimeout::descriptorsDiscovery: + qCWarning(QT_BT_OSX, "Timeout in descriptors discovery"); + [self peripheral:peripheral didDiscoverDescriptorsForCharacteristic:objectUnderWatch error:nsError]; + break; + case OperationTimeout::descriptorRead: + qCWarning(QT_BT_OSX, "Timeout while reading a descriptor"); + [self peripheral:peripheral didUpdateValueForDescriptor:objectUnderWatch error:nsError]; + break; + default:; + } +} + - (void)connectToDevice:(const QBluetoothUuid &)aDeviceUuid { disconnectPending = false; // Cancel the previous disconnect if any. @@ -235,10 +315,11 @@ QT_END_NAMESPACE - (void)connectToPeripheral { + using namespace OSXBluetooth; + 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, - Q_FUNC_INFO, "invalid state"); + Q_ASSERT_X(managerState == CentralManagerIdle, Q_FUNC_INFO, "invalid state"); // The state is still the same - connecting. if ([self isConnected]) { @@ -247,7 +328,7 @@ QT_END_NAMESPACE emit notifier->connected(); } else { qCDebug(QT_BT_OSX) << "trying to connect"; - managerState = OSXBluetooth::CentralManagerConnecting; + managerState = CentralManagerConnecting; [manager connectPeripheral:peripheral options:nil]; } } @@ -292,9 +373,10 @@ QT_END_NAMESPACE - (void)discoverServices { + using namespace OSXBluetooth; + Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); - Q_ASSERT_X(managerState == OSXBluetooth::CentralManagerIdle, - Q_FUNC_INFO, "invalid state"); + Q_ASSERT_X(managerState == CentralManagerIdle, Q_FUNC_INFO, "invalid state"); // From Apple's docs: // @@ -304,7 +386,8 @@ QT_END_NAMESPACE // // ... but we'd like to have them all: [peripheral setDelegate:self]; - managerState = OSXBluetooth::CentralManagerDiscovering; + managerState = CentralManagerDiscovering; + [self watchAfter:peripheral timeout:OperationTimeout::serviceDiscovery]; [peripheral discoverServices:nil]; } @@ -333,6 +416,7 @@ QT_END_NAMESPACE CBService *const s = [services objectAtIndex:currentService]; [visitedServices addObject:s]; managerState = CentralManagerDiscovering; + [self watchAfter:s timeout:OperationTimeout::includedServicesDiscovery]; [peripheral discoverIncludedServices:nil forService:s]; } } @@ -359,6 +443,7 @@ QT_END_NAMESPACE if (CBService *const service = [self serviceForUUID:serviceUuid]) { servicesToDiscoverDetails.append(serviceUuid); + [self watchAfter:service timeout:OperationTimeout::characteristicsDiscovery]; [peripheral discoverCharacteristics:nil forService:service]; return; } @@ -366,10 +451,8 @@ QT_END_NAMESPACE qCWarning(QT_BT_OSX) << "unknown service uuid" << serviceUuid; - if (notifier) { - emit notifier->CBManagerError(serviceUuid, - QLowEnergyService::UnknownError); - } + if (notifier) + emit notifier->CBManagerError(serviceUuid, QLowEnergyService::UnknownError); } - (void)readCharacteristics:(CBService *)service @@ -391,8 +474,10 @@ QT_END_NAMESPACE NSArray *const cs = service.characteristics; for (CBCharacteristic *c in cs) { - if (c.properties & CBCharacteristicPropertyRead) + if (c.properties & CBCharacteristicPropertyRead) { + [self watchAfter:c timeout:OperationTimeout::characteristicRead]; return [peripheral readValueForCharacteristic:c]; + } } // No readable properties? Discover descriptors then: @@ -418,15 +503,18 @@ QT_END_NAMESPACE [self serviceDetailsDiscoveryFinished:service]; } else { // Start from 0 and continue in the callback. - [peripheral discoverDescriptorsForCharacteristic:[service.characteristics objectAtIndex:0]]; + CBCharacteristic *ch = [service.characteristics objectAtIndex:0]; + [self watchAfter:ch timeout:OperationTimeout::descriptorsDiscovery]; + [peripheral discoverDescriptorsForCharacteristic:ch]; } } - (void)readDescriptors:(CBService *)service { + using namespace OSXBluetooth; + Q_ASSERT_X(service, Q_FUNC_INFO, "invalid service (nil)"); - Q_ASSERT_X(managerState != OSXBluetooth::CentralManagerUpdating, - Q_FUNC_INFO, "invalid state"); + Q_ASSERT_X(managerState != CentralManagerUpdating, Q_FUNC_INFO, "invalid state"); Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); QT_BT_MAC_AUTORELEASEPOOL; @@ -435,8 +523,11 @@ QT_END_NAMESPACE // We can never be here if we have no characteristics. Q_ASSERT_X(cs && cs.count, Q_FUNC_INFO, "invalid service"); for (CBCharacteristic *c in cs) { - if (c.descriptors && c.descriptors.count) - return [peripheral readValueForDescriptor:[c.descriptors objectAtIndex:0]]; + if (c.descriptors && c.descriptors.count) { + CBDescriptor *desc = [c.descriptors objectAtIndex:0]; + [self watchAfter:desc timeout:OperationTimeout::descriptorRead]; + return [peripheral readValueForDescriptor:desc]; + } } // No descriptors to read, done. @@ -571,6 +662,8 @@ QT_END_NAMESPACE requestPending = true; currentReadHandle = request.handle; + // Timeouts: for now, we do not alert timeoutWatchdog - never had such + // bug reports and after all a read timeout can be handled externally. [peripheral readValueForCharacteristic:charMap[request.handle]]; } else { if (!descMap.contains(request.handle)) { @@ -581,6 +674,7 @@ QT_END_NAMESPACE requestPending = true; currentReadHandle = request.handle; + // Timeouts: see the comment above (CharRead). [peripheral readValueForDescriptor:descMap[request.handle]]; } } @@ -1021,6 +1115,7 @@ QT_END_NAMESPACE charMap.clear(); descMap.clear(); currentReadHandle = 0; + [self stopWatchdog]; // TODO: also serviceToVisit/VisitNext and visitedServices ? } @@ -1075,12 +1170,14 @@ QT_END_NAMESPACE #else if (state == CBCentralManagerStatePoweredOff) { #endif - managerState = CentralManagerIdle; + if (managerState == CentralManagerUpdating) { + managerState = CentralManagerIdle; // I've seen this instead of Unsupported on OS X. if (notifier) emit notifier->LEnotSupported(); } else { + managerState = CentralManagerIdle; // TODO: we need a better error + // what will happen if later the state changes to PoweredOn??? if (notifier) @@ -1167,10 +1264,16 @@ QT_END_NAMESPACE Q_UNUSED(aPeripheral) if (managerState != OSXBluetooth::CentralManagerDiscovering) { - // Canceled by -disconnectFromDevice. + // Canceled by -disconnectFromDevice, or as a result of a timeout. return; } + if (objectUnderWatch != aPeripheral) { + // Timed out. + return; + } + + [self stopWatchdog]; managerState = OSXBluetooth::CentralManagerIdle; if (error) { @@ -1178,9 +1281,9 @@ QT_END_NAMESPACE // TODO: better error mapping required. if (notifier) emit notifier->CBManagerError(QLowEnergyController::UnknownError); - } else { - [self discoverIncludedServices]; } + + [self discoverIncludedServices]; } @@ -1196,10 +1299,16 @@ QT_END_NAMESPACE return; } + if (service != objectUnderWatch) { + // Timed out. + return; + } + QT_BT_MAC_AUTORELEASEPOOL; Q_ASSERT_X(peripheral, Q_FUNC_INFO, "invalid peripheral (nil)"); + [self stopWatchdog]; managerState = CentralManagerIdle; if (error) { @@ -1222,6 +1331,7 @@ QT_END_NAMESPACE // Continue with discovery ... [visitedServices addObject:s]; managerState = CentralManagerDiscovering; + [self watchAfter:s timeout:OperationTimeout::includedServicesDiscovery]; return [peripheral discoverIncludedServices:nil forService:s]; } } @@ -1237,6 +1347,7 @@ QT_END_NAMESPACE if (![visitedServices containsObject:s]) { [visitedServices addObject:s]; managerState = CentralManagerDiscovering; + [self watchAfter:s timeout:OperationTimeout::includedServicesDiscovery]; return [peripheral discoverIncludedServices:nil forService:s]; } } @@ -1265,6 +1376,13 @@ QT_END_NAMESPACE return; } + if (service != objectUnderWatch) { + // Timed out already? + return; + } + + [self stopWatchdog]; + using namespace OSXBluetooth; Q_ASSERT_X(managerState != CentralManagerUpdating, Q_FUNC_INFO, "invalid state"); @@ -1274,9 +1392,9 @@ QT_END_NAMESPACE // We did not discover any characteristics and can not discover descriptors, // inform our delegate (it will set a service state also). emit notifier->CBManagerError(qt_uuid(service.UUID), QLowEnergyController::UnknownError); - } else { - [self readCharacteristics:service]; } + + [self readCharacteristics:service]; } - (void)peripheral:(CBPeripheral *)aPeripheral @@ -1290,6 +1408,10 @@ QT_END_NAMESPACE return; } + const bool readMatch = characteristic == objectUnderWatch; + if (readMatch) + [self stopWatchdog]; + using namespace OSXBluetooth; Q_ASSERT_X(managerState != CentralManagerUpdating, Q_FUNC_INFO, "invalid state"); @@ -1316,13 +1438,17 @@ QT_END_NAMESPACE } 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]; + if (readMatch) { + // Test if we have any other characteristic to read yet. + CBCharacteristic *const next = [self nextCharacteristicForService:characteristic.service + startingFrom:characteristic properties:CBCharacteristicPropertyRead]; + if (next) { + [self watchAfter:next timeout:OperationTimeout::characteristicRead]; + [peripheral readValueForCharacteristic:next]; + } else { + [self discoverDescriptors:characteristic.service]; + } + } } else { // This is (probably) the result of update notification. // It's very possible we can have an invalid handle here (0) - @@ -1365,6 +1491,11 @@ QT_END_NAMESPACE QT_BT_MAC_AUTORELEASEPOOL; + if (characteristic != objectUnderWatch) + return; + + [self stopWatchdog]; + using namespace OSXBluetooth; if (error) { @@ -1375,10 +1506,12 @@ QT_END_NAMESPACE // Do we have more characteristics on this service to discover descriptors? CBCharacteristic *const next = [self nextCharacteristicForService:characteristic.service startingFrom:characteristic]; - if (next) + if (next) { + [self watchAfter:next timeout:OperationTimeout::descriptorsDiscovery]; [peripheral discoverDescriptorsForCharacteristic:next]; - else + } else { [self readDescriptors:characteristic.service]; + } } - (void)peripheral:(CBPeripheral *)aPeripheral @@ -1396,6 +1529,11 @@ QT_END_NAMESPACE QT_BT_MAC_AUTORELEASEPOOL; + if (descriptor != objectUnderWatch) + return; + + [self stopWatchdog]; + using namespace OSXBluetooth; CBService *const service = descriptor.characteristic.service; @@ -1422,6 +1560,7 @@ QT_END_NAMESPACE CBDescriptor *const next = [self nextDescriptorForCharacteristic:descriptor.characteristic startingFrom:descriptor]; if (next) { + [self watchAfter:next timeout:OperationTimeout::descriptorRead]; [peripheral readValueForDescriptor:next]; } else { // We either have to read a value for a next descriptor @@ -1431,8 +1570,11 @@ QT_END_NAMESPACE CBCharacteristic *nextCh = [self nextCharacteristicForService:ch.service startingFrom:ch]; while (nextCh) { - if (nextCh.descriptors && nextCh.descriptors.count) - return [peripheral readValueForDescriptor:[nextCh.descriptors objectAtIndex:0]]; + if (nextCh.descriptors && nextCh.descriptors.count) { + CBDescriptor *desc = [nextCh.descriptors objectAtIndex:0]; + [self watchAfter:desc timeout:OperationTimeout::descriptorRead]; + return [peripheral readValueForDescriptor:desc]; + } nextCh = [self nextCharacteristicForService:ch.service startingFrom:nextCh]; @@ -1574,9 +1716,10 @@ QT_END_NAMESPACE if (notifier) { notifier->disconnect(); notifier->deleteLater(); - notifier = 0; + notifier = nullptr; } + [self stopWatchdog]; [self disconnectFromDevice]; } diff --git a/src/bluetooth/osx/osxbtcentralmanager_p.h b/src/bluetooth/osx/osxbtcentralmanager_p.h index 697d922c..c0f278b2 100644 --- a/src/bluetooth/osx/osxbtcentralmanager_p.h +++ b/src/bluetooth/osx/osxbtcentralmanager_p.h @@ -53,6 +53,7 @@ #include "qlowenergycontroller.h" #include "qlowenergyservice.h" +#include "osxbtgcdtimer_p.h" #include "qbluetoothuuid.h" #include "osxbtutility_p.h" #include "osxbluetooth_p.h" @@ -86,6 +87,17 @@ enum CentralManagerState CentralManagerDisconnecting }; +enum class OperationTimeout +{ + none, + serviceDiscovery, + includedServicesDiscovery, + characteristicsDiscovery, + characteristicRead, + descriptorsDiscovery, + descriptorRead +}; + // 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 @@ -132,7 +144,9 @@ typedef QHash ValueHash; QT_END_NAMESPACE -@interface QT_MANGLE_NAMESPACE(OSXBTCentralManager) : NSObject +@interface QT_MANGLE_NAMESPACE(OSXBTCentralManager) : NSObject { @private CBCentralManager *manager; @@ -166,6 +180,12 @@ QT_END_NAMESPACE QT_PREPEND_NAMESPACE(QLowEnergyHandle) currentReadHandle; QT_PREPEND_NAMESPACE(OSXBluetooth)::ValueHash valuesToWrite; + + qint64 timeoutMS; + id objectUnderWatch; + QT_PREPEND_NAMESPACE(OSXBluetooth)::OperationTimeout timeoutType; + QT_PREPEND_NAMESPACE(OSXBluetooth)::GCDTimer timeoutWatchdog; + @public CBPeripheral *peripheral; } -- cgit v1.2.3 From 72ead528a7a1102d147e0b511eaf7ddc3416a162 Mon Sep 17 00:00:00 2001 From: Milla Pohjanheimo Date: Tue, 29 May 2018 10:17:49 +0300 Subject: Add binary compatibility files for Qt 5.11 Add files to test binary compatibility for QtConnectivity Change-Id: If3f921dd2a73f1f3b7fdbf8dc18e5322a03acbee Reviewed-by: Liang Qi --- .../data/QtBluetooth.5.11.0.linux-gcc-amd64.txt | 4988 ++++++++++++++++++++ .../auto/bic/data/QtNfc.5.11.0.linux-gcc-amd64.txt | 4754 +++++++++++++++++++ 2 files changed, 9742 insertions(+) create mode 100644 tests/auto/bic/data/QtBluetooth.5.11.0.linux-gcc-amd64.txt create mode 100644 tests/auto/bic/data/QtNfc.5.11.0.linux-gcc-amd64.txt diff --git a/tests/auto/bic/data/QtBluetooth.5.11.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtBluetooth.5.11.0.linux-gcc-amd64.txt new file mode 100644 index 00000000..ed8c8d2e --- /dev/null +++ b/tests/auto/bic/data/QtBluetooth.5.11.0.linux-gcc-amd64.txt @@ -0,0 +1,4988 @@ +Class std::__failure_type + size=1 align=1 + base size=0 base align=1 +std::__failure_type (0x0x7f441c92a780) 0 empty + +Class std::__do_is_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_destructible_impl (0x0x7f441c97ff00) 0 empty + +Class std::__do_is_nt_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nt_destructible_impl (0x0x7f441a52b180) 0 empty + +Class std::__do_is_default_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_default_constructible_impl (0x0x7f441a52b3c0) 0 empty + +Class std::__do_is_static_castable_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_static_castable_impl (0x0x7f441a52b600) 0 empty + +Class std::__do_is_direct_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_direct_constructible_impl (0x0x7f441a52b780) 0 empty + +Class std::__do_is_nary_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nary_constructible_impl (0x0x7f441a52bb40) 0 empty + +Class std::__do_common_type_impl + size=1 align=1 + base size=0 base align=1 +std::__do_common_type_impl (0x0x7f441a5e4300) 0 empty + +Class std::__do_member_type_wrapper + size=1 align=1 + base size=0 base align=1 +std::__do_member_type_wrapper (0x0x7f441a5e43c0) 0 empty + +Class std::__result_of_memfun_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_ref_impl (0x0x7f441a5e4720) 0 empty + +Class std::__result_of_memfun_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_deref_impl (0x0x7f441a5e47e0) 0 empty + +Class std::__result_of_memobj_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_ref_impl (0x0x7f441a5e48a0) 0 empty + +Class std::__result_of_memobj_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_deref_impl (0x0x7f441a5e4960) 0 empty + +Class std::__result_of_other_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_other_impl (0x0x7f441a5e4c00) 0 empty + +Class std::piecewise_construct_t + size=1 align=1 + base size=0 base align=1 +std::piecewise_construct_t (0x0x7f441a5e4de0) 0 empty + +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7f441a6612a0) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7f441a661300) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7f441a69ff60) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7f441a6cf000) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7f441a59eb60) 0 empty + std::input_iterator_tag (0x0x7f441a6cf060) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7f441a59ebc8) 0 empty + std::forward_iterator_tag (0x0x7f441a59ec30) 0 empty + std::input_iterator_tag (0x0x7f441a6cf0c0) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7f441a59ec98) 0 empty + std::bidirectional_iterator_tag (0x0x7f441a59ed00) 0 empty + std::forward_iterator_tag (0x0x7f441a59ed68) 0 empty + std::input_iterator_tag (0x0x7f441a6cf120) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_iter (0x0x7f441a6cfd80) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_val (0x0x7f441a6cfde0) 0 empty + +Class __gnu_cxx::__ops::_Val_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Val_less_iter (0x0x7f441a6cfe40) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_iter (0x0x7f441a6cfea0) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_val (0x0x7f441a6cff00) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7f441a395a20) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7f441a395c60) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7f441a395d20) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7f441a395d80) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7f441a395e40) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7f441a395ea0) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7f441a447360) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7f441a4473c0) 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 (0x0x7f441a447420) 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 (0x0x7f441a6ff2d8) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7f441a447480) 0 nearly-empty + primary-for std::bad_exception (0x0x7f441a6ff2d8) + +Class std::__exception_ptr::exception_ptr + size=8 align=8 + base size=8 base align=8 +std::__exception_ptr::exception_ptr (0x0x7f441a4474e0) 0 + +Vtable for std::nested_exception +std::nested_exception::_ZTVSt16nested_exception: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16nested_exception) +16 (int (*)(...))std::nested_exception::~nested_exception +24 (int (*)(...))std::nested_exception::~nested_exception + +Class std::nested_exception + size=16 align=8 + base size=16 base align=8 +std::nested_exception (0x0x7f441a447540) 0 + vptr=((& std::nested_exception::_ZTVSt16nested_exception) + 16u) + +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 (0x0x7f441a6ff4e0) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7f441a447960) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f441a6ff4e0) + +Vtable for std::bad_array_new_length +std::bad_array_new_length::_ZTVSt20bad_array_new_length: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt20bad_array_new_length) +16 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +24 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +32 (int (*)(...))std::bad_array_new_length::what + +Class std::bad_array_new_length + size=8 align=8 + base size=8 base align=8 +std::bad_array_new_length (0x0x7f441a6ff548) 0 nearly-empty + vptr=((& std::bad_array_new_length::_ZTVSt20bad_array_new_length) + 16u) + std::bad_alloc (0x0x7f441a6ff5b0) 0 nearly-empty + primary-for std::bad_array_new_length (0x0x7f441a6ff548) + std::exception (0x0x7f441a4479c0) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f441a6ff5b0) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7f441a447a20) 0 empty + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7f441a1c1660) 0 + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7f4419fdb360) 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 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7f4419fdb3c0) 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 (0x0x7f441a07d2a0) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7f441a07d300) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7f441a07d3c0) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7f441a07d420) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7f441a07d480) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7f441a07d4e0) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7f441a07d600) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7f441a07d660) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7f441a07da80) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7f441a07dae0) 0 + +Class std::_Hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Hash_impl (0x0x7f4419bb7300) 0 empty + +Class std::_Fnv_hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Fnv_hash_impl (0x0x7f4419bb7360) 0 empty + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7f4419c83300) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7f4419a3d120) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7f441996d1a0) 0 + std::iterator (0x0x7f4419a3d1e0) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7f441996d208) 0 + std::_Bit_iterator_base (0x0x7f441996d270) 0 + std::iterator (0x0x7f4419a3d240) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7f441996d2d8) 0 + std::_Bit_iterator_base (0x0x7f441996d340) 0 + std::iterator (0x0x7f4419a3d2a0) 0 empty + +Class std::random_device + size=5000 align=8 + base size=5000 base align=8 +std::random_device (0x0x7f44198650c0) 0 + +Class std::bernoulli_distribution::param_type + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution::param_type (0x0x7f4419865e40) 0 + +Class std::bernoulli_distribution + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution (0x0x7f4419865de0) 0 + +Class std::seed_seq + size=24 align=8 + base size=24 base align=8 +std::seed_seq (0x0x7f44195c3de0) 0 + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7f4418249900) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7f4418249960) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7f4417f33420) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7f4417f33480) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7f4417f334e0) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7f4417f33540) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7f4417f337e0) 0 + +Class std::__atomic_flag_base + size=1 align=1 + base size=1 base align=1 +std::__atomic_flag_base (0x0x7f4417f33d20) 0 + +Class std::atomic_flag + size=1 align=1 + base size=1 base align=1 +std::atomic_flag (0x0x7f4417f8e208) 0 + std::__atomic_flag_base (0x0x7f4417f33d80) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7f4417f8e958) 0 + QAtomicInteger (0x0x7f4417f8e9c0) 0 + QBasicAtomicInteger (0x0x7f4417eee4e0) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7f44179afa80) 0 empty + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7f44177caae0) 0 + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7f44177cac00) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7f44177eb410) 0 + QGenericArgument (0x0x7f44177cac60) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7f44177cade0) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7f44177caea0) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7f44178c2f00) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7f44178c2f60) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7f4417572240) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7f44175722a0) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7f4417572600) 0 empty + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7f4417572660) 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 (0x0x7f44175726c0) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7f4417572720) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7f4417572780) 0 + +Class std::__cow_string + size=8 align=8 + base size=8 base align=8 +std::__cow_string (0x0x7f4417572b40) 0 + +Vtable for std::logic_error +std::logic_error::_ZTVSt11logic_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11logic_error) +16 (int (*)(...))std::logic_error::~logic_error +24 (int (*)(...))std::logic_error::~logic_error +32 (int (*)(...))std::logic_error::what + +Class std::logic_error + size=16 align=8 + base size=16 base align=8 +std::logic_error (0x0x7f44175f2a28) 0 + vptr=((& std::logic_error::_ZTVSt11logic_error) + 16u) + std::exception (0x0x7f4417572c00) 0 nearly-empty + primary-for std::logic_error (0x0x7f44175f2a28) + +Vtable for std::domain_error +std::domain_error::_ZTVSt12domain_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12domain_error) +16 (int (*)(...))std::domain_error::~domain_error +24 (int (*)(...))std::domain_error::~domain_error +32 (int (*)(...))std::logic_error::what + +Class std::domain_error + size=16 align=8 + base size=16 base align=8 +std::domain_error (0x0x7f44175f2a90) 0 + vptr=((& std::domain_error::_ZTVSt12domain_error) + 16u) + std::logic_error (0x0x7f44175f2af8) 0 + primary-for std::domain_error (0x0x7f44175f2a90) + std::exception (0x0x7f4417572c60) 0 nearly-empty + primary-for std::logic_error (0x0x7f44175f2af8) + +Vtable for std::invalid_argument +std::invalid_argument::_ZTVSt16invalid_argument: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16invalid_argument) +16 (int (*)(...))std::invalid_argument::~invalid_argument +24 (int (*)(...))std::invalid_argument::~invalid_argument +32 (int (*)(...))std::logic_error::what + +Class std::invalid_argument + size=16 align=8 + base size=16 base align=8 +std::invalid_argument (0x0x7f44175f2b60) 0 + vptr=((& std::invalid_argument::_ZTVSt16invalid_argument) + 16u) + std::logic_error (0x0x7f44175f2bc8) 0 + primary-for std::invalid_argument (0x0x7f44175f2b60) + std::exception (0x0x7f4417572cc0) 0 nearly-empty + primary-for std::logic_error (0x0x7f44175f2bc8) + +Vtable for std::length_error +std::length_error::_ZTVSt12length_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12length_error) +16 (int (*)(...))std::length_error::~length_error +24 (int (*)(...))std::length_error::~length_error +32 (int (*)(...))std::logic_error::what + +Class std::length_error + size=16 align=8 + base size=16 base align=8 +std::length_error (0x0x7f44175f2c30) 0 + vptr=((& std::length_error::_ZTVSt12length_error) + 16u) + std::logic_error (0x0x7f44175f2c98) 0 + primary-for std::length_error (0x0x7f44175f2c30) + std::exception (0x0x7f4417572d20) 0 nearly-empty + primary-for std::logic_error (0x0x7f44175f2c98) + +Vtable for std::out_of_range +std::out_of_range::_ZTVSt12out_of_range: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12out_of_range) +16 (int (*)(...))std::out_of_range::~out_of_range +24 (int (*)(...))std::out_of_range::~out_of_range +32 (int (*)(...))std::logic_error::what + +Class std::out_of_range + size=16 align=8 + base size=16 base align=8 +std::out_of_range (0x0x7f44175f2d00) 0 + vptr=((& std::out_of_range::_ZTVSt12out_of_range) + 16u) + std::logic_error (0x0x7f44175f2d68) 0 + primary-for std::out_of_range (0x0x7f44175f2d00) + std::exception (0x0x7f4417572d80) 0 nearly-empty + primary-for std::logic_error (0x0x7f44175f2d68) + +Vtable for std::runtime_error +std::runtime_error::_ZTVSt13runtime_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13runtime_error) +16 (int (*)(...))std::runtime_error::~runtime_error +24 (int (*)(...))std::runtime_error::~runtime_error +32 (int (*)(...))std::runtime_error::what + +Class std::runtime_error + size=16 align=8 + base size=16 base align=8 +std::runtime_error (0x0x7f44175f2dd0) 0 + vptr=((& std::runtime_error::_ZTVSt13runtime_error) + 16u) + std::exception (0x0x7f4417572de0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f44175f2dd0) + +Vtable for std::range_error +std::range_error::_ZTVSt11range_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11range_error) +16 (int (*)(...))std::range_error::~range_error +24 (int (*)(...))std::range_error::~range_error +32 (int (*)(...))std::runtime_error::what + +Class std::range_error + size=16 align=8 + base size=16 base align=8 +std::range_error (0x0x7f44175f2e38) 0 + vptr=((& std::range_error::_ZTVSt11range_error) + 16u) + std::runtime_error (0x0x7f44175f2ea0) 0 + primary-for std::range_error (0x0x7f44175f2e38) + std::exception (0x0x7f4417572e40) 0 nearly-empty + primary-for std::runtime_error (0x0x7f44175f2ea0) + +Vtable for std::overflow_error +std::overflow_error::_ZTVSt14overflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt14overflow_error) +16 (int (*)(...))std::overflow_error::~overflow_error +24 (int (*)(...))std::overflow_error::~overflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::overflow_error + size=16 align=8 + base size=16 base align=8 +std::overflow_error (0x0x7f44175f2f08) 0 + vptr=((& std::overflow_error::_ZTVSt14overflow_error) + 16u) + std::runtime_error (0x0x7f44175f2f70) 0 + primary-for std::overflow_error (0x0x7f44175f2f08) + std::exception (0x0x7f4417572ea0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f44175f2f70) + +Vtable for std::underflow_error +std::underflow_error::_ZTVSt15underflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt15underflow_error) +16 (int (*)(...))std::underflow_error::~underflow_error +24 (int (*)(...))std::underflow_error::~underflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::underflow_error + size=16 align=8 + base size=16 base align=8 +std::underflow_error (0x0x7f44175f2750) 0 + vptr=((& std::underflow_error::_ZTVSt15underflow_error) + 16u) + std::runtime_error (0x0x7f44175f2820) 0 + primary-for std::underflow_error (0x0x7f44175f2750) + std::exception (0x0x7f4417572f00) 0 nearly-empty + primary-for std::runtime_error (0x0x7f44175f2820) + +Vtable for std::_V2::error_category +std::_V2::error_category::_ZTVNSt3_V214error_categoryE: 10u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt3_V214error_categoryE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))std::_V2::error_category::_M_message +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))std::_V2::error_category::default_error_condition +64 (int (*)(...))std::_V2::error_category::equivalent +72 (int (*)(...))std::_V2::error_category::equivalent + +Class std::_V2::error_category + size=8 align=8 + base size=8 base align=8 +std::_V2::error_category (0x0x7f44176bc0c0) 0 nearly-empty + vptr=((& std::_V2::error_category::_ZTVNSt3_V214error_categoryE) + 16u) + +Class std::error_code + size=16 align=8 + base size=16 base align=8 +std::error_code (0x0x7f44176bc300) 0 + +Class std::error_condition + size=16 align=8 + base size=16 base align=8 +std::error_condition (0x0x7f44176bc480) 0 + +Vtable for std::system_error +std::system_error::_ZTVSt12system_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12system_error) +16 (int (*)(...))std::system_error::~system_error +24 (int (*)(...))std::system_error::~system_error +32 (int (*)(...))std::runtime_error::what + +Class std::system_error + size=32 align=8 + base size=32 base align=8 +std::system_error (0x0x7f44176b9478) 0 + vptr=((& std::system_error::_ZTVSt12system_error) + 16u) + std::runtime_error (0x0x7f44176b94e0) 0 + primary-for std::system_error (0x0x7f44176b9478) + std::exception (0x0x7f44176bc6c0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f44176b94e0) + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureB5cxx11E) +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=32 align=8 + base size=32 base align=8 +std::ios_base::failure (0x0x7f44173310d0) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E) + 16u) + std::system_error (0x0x7f4417331138) 0 + primary-for std::ios_base::failure (0x0x7f44173310d0) + std::runtime_error (0x0x7f44173311a0) 0 + primary-for std::system_error (0x0x7f4417331138) + std::exception (0x0x7f44176bc9c0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f44173311a0) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7f44176bca20) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7f44176bca80) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7f44176bcae0) 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 (0x0x7f44176bc960) 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 (0x0x7f44173f62a0) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7f44173f6960) 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 (0x0x7f4416fa1c30 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7f4416fa1d00 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 0u +72 0u + +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 (0x0x7f4416fa11a0 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 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7f4416fa12d8 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 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 0u +72 0u + +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 QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7f44170231e0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7f4417023240) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7f4416d365a0) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7f4416d36900) 0 + +Class QStringView + size=16 align=8 + base size=16 base align=8 +QStringView (0x0x7f4416d36d80) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7f4416e6cc00) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7f4416efc2a0) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7f4416efc240) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7f4416ca6360) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7f4416ca6f60) 0 + +Class QtPrivate::QHashCombine + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombine (0x0x7f4416a9bc00) 0 empty + +Class QtPrivate::QHashCombineCommutative + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombineCommutative (0x0x7f4416a9bc60) 0 empty + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7f4416a9bcc0) 0 + +Class QListData::NotArrayCompatibleLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotArrayCompatibleLayout (0x0x7f44169040c0) 0 empty + +Class QListData::NotIndirectLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotIndirectLayout (0x0x7f4416904120) 0 empty + +Class QListData::ArrayCompatibleLayout + size=1 align=1 + base size=1 base align=1 +QListData::ArrayCompatibleLayout (0x0x7f4416ab6a28) 0 empty + QListData::NotIndirectLayout (0x0x7f4416904180) 0 empty + +Class QListData::InlineWithPaddingLayout + size=1 align=1 + base size=1 base align=1 +QListData::InlineWithPaddingLayout (0x0x7f44168fecb0) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f44169041e0) 0 empty + QListData::NotIndirectLayout (0x0x7f4416904240) 0 empty + +Class QListData::IndirectLayout + size=1 align=1 + base size=1 base align=1 +QListData::IndirectLayout (0x0x7f4416ab6a90) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f44169042a0) 0 empty + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7f4416904300) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7f4416904060) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7f4416904780) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7f44166b49c0) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7f44166b4960) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7f44166be4e0) 0 + QList (0x0x7f44166be548) 0 + QListSpecialMethods (0x0x7f44166b4ba0) 0 empty + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7f4416355000) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7f4416355ba0) 0 + +Class std::allocator_arg_t + size=1 align=1 + base size=0 base align=1 +std::allocator_arg_t (0x0x7f4416144240) 0 empty + +Class std::__uses_alloc_base + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc_base (0x0x7f44161443c0) 0 empty + +Class std::__uses_alloc0::_Sink + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc0::_Sink (0x0x7f4416144480) 0 empty + +Class std::__uses_alloc0 + size=1 align=1 + base size=1 base align=1 +std::__uses_alloc0 (0x0x7f44166bee38) 0 + std::__uses_alloc_base (0x0x7f4416144420) 0 empty + +Class std::_Swallow_assign + size=1 align=1 + base size=0 base align=1 +std::_Swallow_assign (0x0x7f441625f4e0) 0 empty + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7f441625f720) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7f441625f7e0) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7f441625f900) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7f441625fa80) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7f441625fea0) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7f4415fbd000) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7f4415fbd960) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7f4415fbdd80) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7f44160ac0c0) 0 + +Class std::chrono::_V2::system_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::system_clock (0x0x7f4415ecf900) 0 empty + +Class std::chrono::_V2::steady_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::steady_clock (0x0x7f4415c36780) 0 empty + +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 (0x0x7f4415c367e0) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7f4415c369c0) 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 (0x0x7f4415c36960) 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 (0x0x7f4415cfec60) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7f4415cfecc0) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7f4415cfed80) 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 0u +48 0u +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 (0x0x7f441592d068) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7f4415cfed20) 0 + primary-for QAbstractAnimation (0x0x7f441592d068) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7f4415cfee40) 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 (0x0x7f441592d0d0) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7f4415cfede0) 0 + primary-for QAnimationDriver (0x0x7f441592d0d0) + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7f4415cfef00) 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 (0x0x7f441592d138) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7f4415cfeea0) 0 + primary-for QEventLoop (0x0x7f441592d138) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7f4415987120) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7f44159871e0) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7f4415987240) 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 0u +48 0u +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 (0x0x7f441592d270) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7f4415987180) 0 + primary-for QAbstractEventDispatcher (0x0x7f441592d270) + +Vtable for std::type_info +std::type_info::_ZTVSt9type_info: 8u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9type_info) +16 (int (*)(...))std::type_info::~type_info +24 (int (*)(...))std::type_info::~type_info +32 (int (*)(...))std::type_info::__is_pointer_p +40 (int (*)(...))std::type_info::__is_function_p +48 (int (*)(...))std::type_info::__do_catch +56 (int (*)(...))std::type_info::__do_upcast + +Class std::type_info + size=16 align=8 + base size=16 base align=8 +std::type_info (0x0x7f44159874e0) 0 + vptr=((& std::type_info::_ZTVSt9type_info) + 16u) + +Vtable for std::bad_cast +std::bad_cast::_ZTVSt8bad_cast: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8bad_cast) +16 (int (*)(...))std::bad_cast::~bad_cast +24 (int (*)(...))std::bad_cast::~bad_cast +32 (int (*)(...))std::bad_cast::what + +Class std::bad_cast + size=8 align=8 + base size=8 base align=8 +std::bad_cast (0x0x7f441592d478) 0 nearly-empty + vptr=((& std::bad_cast::_ZTVSt8bad_cast) + 16u) + std::exception (0x0x7f4415987540) 0 nearly-empty + primary-for std::bad_cast (0x0x7f441592d478) + +Vtable for std::bad_typeid +std::bad_typeid::_ZTVSt10bad_typeid: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt10bad_typeid) +16 (int (*)(...))std::bad_typeid::~bad_typeid +24 (int (*)(...))std::bad_typeid::~bad_typeid +32 (int (*)(...))std::bad_typeid::what + +Class std::bad_typeid + size=8 align=8 + base size=8 base align=8 +std::bad_typeid (0x0x7f441592d4e0) 0 nearly-empty + vptr=((& std::bad_typeid::_ZTVSt10bad_typeid) + 16u) + std::exception (0x0x7f44159875a0) 0 nearly-empty + primary-for std::bad_typeid (0x0x7f441592d4e0) + +Vtable for std::bad_function_call +std::bad_function_call::_ZTVSt17bad_function_call: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt17bad_function_call) +16 (int (*)(...))std::bad_function_call::~bad_function_call +24 (int (*)(...))std::bad_function_call::~bad_function_call +32 (int (*)(...))std::bad_function_call::what + +Class std::bad_function_call + size=8 align=8 + base size=8 base align=8 +std::bad_function_call (0x0x7f4415ae9750) 0 nearly-empty + vptr=((& std::bad_function_call::_ZTVSt17bad_function_call) + 16u) + std::exception (0x0x7f441574c660) 0 nearly-empty + primary-for std::bad_function_call (0x0x7f4415ae9750) + +Class std::_Nocopy_types + size=16 align=8 + base size=16 base align=8 +std::_Nocopy_types (0x0x7f441574c720) 0 + +Class std::_Any_data + size=16 align=8 + base size=16 base align=8 +std::_Any_data (0x0x7f441574c780) 0 + +Class std::_Function_base + size=24 align=8 + base size=24 base align=8 +std::_Function_base (0x0x7f441574c8a0) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7f441574cd80) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7f4415805300) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7f44158056c0) 0 + +Class QHashData + size=48 align=8 + base size=44 base align=8 +QHashData (0x0x7f4415805660) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7f4415805720) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7f4415644000) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7f44156440c0) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7f4415644060) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7f4415644120) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7f4415805f60) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7f44156edc00) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7f441538f2a0) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7f441538f240) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7f441538f360) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7f441538f300) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7f44154b0660) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7f44154b0d20) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7f4415299480) 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 0u +48 0u +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 (0x0x7f441529c4e0) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7f4415299420) 0 + primary-for QAbstractItemModel (0x0x7f441529c4e0) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7f4415299d20) 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 0u +48 0u +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 (*)(...))QAbstractTableModel::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 (0x0x7f441529cbc8) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7f441529cc30) 0 + primary-for QAbstractTableModel (0x0x7f441529cbc8) + QObject (0x0x7f4415299cc0) 0 + primary-for QAbstractItemModel (0x0x7f441529cc30) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7f4415299de0) 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 0u +48 0u +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 (*)(...))QAbstractListModel::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 (0x0x7f441529cc98) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7f441529cd00) 0 + primary-for QAbstractListModel (0x0x7f441529cc98) + QObject (0x0x7f4415299d80) 0 + primary-for QAbstractItemModel (0x0x7f441529cd00) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7f4414fd30c0) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7f4414fd3180) 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 0u +48 0u +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 (0x0x7f441529ce38) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7f441529cea0) 0 + primary-for QAbstractProxyModel (0x0x7f441529ce38) + QObject (0x0x7f4414fd3120) 0 + primary-for QAbstractItemModel (0x0x7f441529cea0) + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7f4414fd3240) 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 0u +48 0u +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 (0x0x7f441529cf08) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7f4414fd31e0) 0 + primary-for QAbstractState (0x0x7f441529cf08) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7f4414fd3300) 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 0u +48 0u +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 (0x0x7f441529cf70) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7f4414fd32a0) 0 + primary-for QAbstractTransition (0x0x7f441529cf70) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7f4414fd33c0) 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 0u +48 0u +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 (0x0x7f4415020000) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7f4415020068) 0 + primary-for QAnimationGroup (0x0x7f4415020000) + QObject (0x0x7f4414fd3360) 0 + primary-for QAbstractAnimation (0x0x7f4415020068) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7f441506d120) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7f441506d3c0) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7f441506d480) 0 + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7f441506d780) 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 0u +48 0u +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 (0x0x7f44150206e8) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7f441506d720) 0 + primary-for QIODevice (0x0x7f44150206e8) + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7f441506d9c0) 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 (0x0x7f4415020820) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7f4415020888) 0 + primary-for QBuffer (0x0x7f4415020820) + QObject (0x0x7f441506d960) 0 + primary-for QIODevice (0x0x7f4415020888) + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7f441506da80) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7f441506da20) 0 + +Class QStaticByteArrayMatcherBase::Skiptable + size=256 align=1 + base size=256 base align=1 +QStaticByteArrayMatcherBase::Skiptable (0x0x7f441506dba0) 0 + +Class QStaticByteArrayMatcherBase + size=256 align=16 + base size=256 base align=16 +QStaticByteArrayMatcherBase (0x0x7f441506db40) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7f441506dd80) 0 + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7f441506df60) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7f4414e405a0) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7f4414e40660) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7f4414b3d660) 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 (0x0x7f4414b3dae0) 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 (0x0x7f4414b36d68) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7f4414b3db40) 0 + primary-for QTimerEvent (0x0x7f4414b36d68) + +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 (0x0x7f4414b36dd0) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7f4414b3dba0) 0 + primary-for QChildEvent (0x0x7f4414b36dd0) + +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 (0x0x7f4414bbf340) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7f4414bc20c0) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7f4414bbf340) + +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 (0x0x7f4414bbf3a8) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7f4414bc2120) 0 + primary-for QDeferredDeleteEvent (0x0x7f4414bbf3a8) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7f4414bc21e0) 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 (0x0x7f4414bbf410) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7f4414bc2180) 0 + primary-for QCoreApplication (0x0x7f4414bbf410) + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7f4414bc2240) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7f4414bc22a0) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7f4414bc28a0) 0 + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7f4414bc2900) 0 + +Class QtPrivate::StreamStateSaver + size=16 align=8 + base size=12 base align=8 +QtPrivate::StreamStateSaver (0x0x7f4414bc29c0) 0 + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7f4414bc2ea0) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7f4414cef180) 0 + +Class QDateTime::ShortData + size=8 align=8 + base size=8 base align=8 +QDateTime::ShortData (0x0x7f4414cef900) 0 + +Class QDateTime::Data + size=8 align=8 + base size=8 base align=8 +QDateTime::Data (0x0x7f4414cef960) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7f4414cef8a0) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7f44149b4a80) 0 + +Class QDeadlineTimer + size=16 align=8 + base size=16 base align=8 +QDeadlineTimer (0x0x7f44149b4f60) 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 (0x0x7f4414ad5f00) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7f441475b1e0) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7f441475b420) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7f441475b5a0) 0 + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7f441475bae0) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7f441475ba80) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7f44145d6000) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7f44145d60c0) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7f441467a240) 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 (0x0x7f441467d270) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7f441467d2d8) 0 + primary-for QFileDevice (0x0x7f441467d270) + QObject (0x0x7f441467a1e0) 0 + primary-for QIODevice (0x0x7f441467d2d8) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7f441467a480) 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 (0x0x7f441467d410) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7f441467d478) 0 + primary-for QFile (0x0x7f441467d410) + QIODevice (0x0x7f441467d4e0) 0 + primary-for QFileDevice (0x0x7f441467d478) + QObject (0x0x7f441467a420) 0 + primary-for QIODevice (0x0x7f441467d4e0) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7f441467a660) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7f441467aa80) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7f441439e0c0) 0 + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7f441439e300) 0 + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7f4414489720) 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 (0x0x7f441448e410) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7f441448e478) 0 + primary-for QEventTransition (0x0x7f441448e410) + QObject (0x0x7f44144896c0) 0 + primary-for QAbstractTransition (0x0x7f441448e478) + +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 (0x0x7f441448e4e0) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7f4414489780) 0 nearly-empty + primary-for QException (0x0x7f441448e4e0) + +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 (0x0x7f441448e548) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7f441448e5b0) 0 nearly-empty + primary-for QUnhandledException (0x0x7f441448e548) + std::exception (0x0x7f44144897e0) 0 nearly-empty + primary-for QException (0x0x7f441448e5b0) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7f4414489840) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7f4414489900) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7f4414489960) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7f4414489a80) 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 (0x0x7f441448e618) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7f4414489a20) 0 + primary-for QFileSelector (0x0x7f441448e618) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7f4414489b40) 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 (0x0x7f441448e680) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7f4414489ae0) 0 + primary-for QFileSystemWatcher (0x0x7f441448e680) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7f4414489c00) 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 (0x0x7f441448e6e8) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7f441448e750) 0 + primary-for QFinalState (0x0x7f441448e6e8) + QObject (0x0x7f4414489ba0) 0 + primary-for QAbstractState (0x0x7f441448e750) + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7f4414489c60) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7f4414489cc0) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7f441448e888) 0 + QBasicMutex (0x0x7f4414489ea0) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7f4414489f00) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7f4414489f60) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7f44141d2000) 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 (0x0x7f44141d2120) 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 (0x0x7f44141d2960) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7f44142a7180) 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 0u +48 0u +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 (0x0x7f44142219c0) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7f44142a7120) 0 + primary-for QFutureWatcherBase (0x0x7f44142219c0) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7f44142a7780) 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 (0x0x7f44142fd2d8) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7f44142fd340) 0 + primary-for QHistoryState (0x0x7f44142fd2d8) + QObject (0x0x7f44142a7720) 0 + primary-for QAbstractState (0x0x7f44142fd340) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7f44142a7840) 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 (0x0x7f44142fd3a8) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7f44142fd410) 0 + primary-for QIdentityProxyModel (0x0x7f44142fd3a8) + QAbstractItemModel (0x0x7f44142fd478) 0 + primary-for QAbstractProxyModel (0x0x7f44142fd410) + QObject (0x0x7f44142a77e0) 0 + primary-for QAbstractItemModel (0x0x7f44142fd478) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7f44142a78a0) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7f44142a7f60) 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 (0x0x7f44142fdc98) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7f44142a7f00) 0 + primary-for QItemSelectionModel (0x0x7f44142fdc98) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7f44142fdea0) 0 + QList (0x0x7f44142fdf08) 0 + QListSpecialMethods (0x0x7f4413f9a2a0) 0 empty + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7f4413f9a780) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7f4413d59ea0) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7f4413dce420) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7f4413dce480) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7f4413dce660) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7f4413dce6c0) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7f4413dce600) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7f4413e90900) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7f4413e90960) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7f4413f19000) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7f4413f19060) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7f4413e90f60) 0 + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7f4413ba2300) 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 (0x0x7f4413ba1270) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7f4413ba22a0) 0 + primary-for QLibrary (0x0x7f4413ba1270) + +Class QVersionNumber::SegmentStorage + size=8 align=8 + base size=8 base align=8 +QVersionNumber::SegmentStorage (0x0x7f4413ba29c0) 0 + +Class QVersionNumber + size=8 align=8 + base size=8 base align=8 +QVersionNumber (0x0x7f4413ba24e0) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7f4413ba2ea0) 0 empty + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7f4413ba2f00) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7f4413caf1e0) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7f4413caf480) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7f4413cafde0) 0 + +Class QLinkedListData + size=32 align=8 + base size=25 base align=8 +QLinkedListData (0x0x7f441396f780) 0 + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7f441396fae0) 0 + +Class QLoggingCategory::AtomicBools + size=4 align=1 + base size=4 base align=1 +QLoggingCategory::AtomicBools (0x0x7f441396fc60) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7f441396fc00) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7f441396fde0) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7f4413ac00c0) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7f4413ac0720) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7f4413ac0780) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7f4413ac0d80) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7f44137a90c0) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7f44137a9120) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7f44137a9420) 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 (0x0x7f44137984e0) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7f44137a93c0) 0 + primary-for QMimeData (0x0x7f44137984e0) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7f44137a9480) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7f44137a9780) 0 + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7f44137a9840) 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 (0x0x7f44137986e8) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7f44137a97e0) 0 + primary-for QObjectCleanupHandler (0x0x7f44137986e8) + +Class QOperatingSystemVersion + size=16 align=4 + base size=16 base align=4 +QOperatingSystemVersion (0x0x7f44137a98a0) 0 + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7f441383a060) 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 (0x0x7f4413798e38) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7f4413798ea0) 0 + primary-for QParallelAnimationGroup (0x0x7f4413798e38) + QAbstractAnimation (0x0x7f4413798f08) 0 + primary-for QAnimationGroup (0x0x7f4413798ea0) + QObject (0x0x7f441383a000) 0 + primary-for QAbstractAnimation (0x0x7f4413798f08) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7f441383a120) 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 (0x0x7f4413798f70) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7f4413798750) 0 + primary-for QPauseAnimation (0x0x7f4413798f70) + QObject (0x0x7f441383a0c0) 0 + primary-for QAbstractAnimation (0x0x7f4413798750) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7f441383a300) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7f441383a600) 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 (0x0x7f44138741a0) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7f441383a5a0) 0 + primary-for QPluginLoader (0x0x7f44138741a0) + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7f441383a660) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7f441383ad20) 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 (0x0x7f4413874820) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7f4413874888) 0 + primary-for QProcess (0x0x7f4413874820) + QObject (0x0x7f441383acc0) 0 + primary-for QIODevice (0x0x7f4413874888) + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7f441383ade0) 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 (0x0x7f44138748f0) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7f4413874958) 0 + primary-for QVariantAnimation (0x0x7f44138748f0) + QObject (0x0x7f441383ad80) 0 + primary-for QAbstractAnimation (0x0x7f4413874958) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7f441383aea0) 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 (0x0x7f4413874a28) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7f4413874a90) 0 + primary-for QPropertyAnimation (0x0x7f4413874a28) + QAbstractAnimation (0x0x7f4413874af8) 0 + primary-for QVariantAnimation (0x0x7f4413874a90) + QObject (0x0x7f441383ae40) 0 + primary-for QAbstractAnimation (0x0x7f4413874af8) + +Class QRandomGenerator::Storage + size=2504 align=8 + base size=2504 base align=8 +QRandomGenerator::Storage (0x0x7f441351f000) 0 + +Class QRandomGenerator + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator (0x0x7f441383af60) 0 + +Class QRandomGenerator64 + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator64 (0x0x7f4413574dd0) 0 + QRandomGenerator (0x0x7f441356df60) 0 + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7f44135c3060) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7f44135c3300) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7f44135c33c0) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7f44135c3480) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7f44135c3720) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7f44135c39c0) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7f44135c3c60) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7f44135c3f00) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7f4413417540) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7f4413417840) 0 + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7f4413417b40) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7f4413417cc0) 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 (0x0x7f44134c3000) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7f44134c3068) 0 + primary-for QSaveFile (0x0x7f44134c3000) + QIODevice (0x0x7f44134c30d0) 0 + primary-for QFileDevice (0x0x7f44134c3068) + QObject (0x0x7f4413417c60) 0 + primary-for QIODevice (0x0x7f44134c30d0) + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7f4413417d80) 0 + +Class QSemaphoreReleaser + size=16 align=8 + base size=12 base align=8 +QSemaphoreReleaser (0x0x7f4413417f00) 0 + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7f4413203540) 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 (0x0x7f4413201958) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7f44132019c0) 0 + primary-for QSequentialAnimationGroup (0x0x7f4413201958) + QAbstractAnimation (0x0x7f4413201a28) 0 + primary-for QAnimationGroup (0x0x7f44132019c0) + QObject (0x0x7f44132034e0) 0 + primary-for QAbstractAnimation (0x0x7f4413201a28) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7f4413203600) 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 (0x0x7f4413201a90) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7f44132035a0) 0 + primary-for QSettings (0x0x7f4413201a90) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7f44132036c0) 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 (0x0x7f4413201af8) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7f4413203660) 0 + primary-for QSharedMemory (0x0x7f4413201af8) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7f4413203780) 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 (0x0x7f4413201b60) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7f4413203720) 0 + primary-for QSignalMapper (0x0x7f4413201b60) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7f4413203840) 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 (0x0x7f4413201bc8) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7f4413201c30) 0 + primary-for QSignalTransition (0x0x7f4413201bc8) + QObject (0x0x7f44132037e0) 0 + primary-for QAbstractTransition (0x0x7f4413201c30) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7f4413203900) 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 (0x0x7f4413201c98) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7f44132038a0) 0 + primary-for QSocketNotifier (0x0x7f4413201c98) + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7f44132039c0) 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 (0x0x7f4413201d00) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7f4413201d68) 0 + primary-for QSortFilterProxyModel (0x0x7f4413201d00) + QAbstractItemModel (0x0x7f4413201dd0) 0 + primary-for QAbstractProxyModel (0x0x7f4413201d68) + QObject (0x0x7f4413203960) 0 + primary-for QAbstractItemModel (0x0x7f4413201dd0) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7f4413203a80) 0 empty + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7f4413203cc0) 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 (0x0x7f4413201f70) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7f44132f1000) 0 + primary-for QState (0x0x7f4413201f70) + QObject (0x0x7f4413203c60) 0 + primary-for QAbstractState (0x0x7f44132f1000) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7f4413203de0) 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 (0x0x7f44132f11a0) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7f4413203e40) 0 + primary-for QStateMachine::SignalEvent (0x0x7f44132f11a0) + +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 (0x0x7f44132f1208) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7f4413203ea0) 0 + primary-for QStateMachine::WrappedEvent (0x0x7f44132f1208) + +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 (0x0x7f44132f1068) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7f44132f10d0) 0 + primary-for QStateMachine (0x0x7f44132f1068) + QAbstractState (0x0x7f44132f1138) 0 + primary-for QState (0x0x7f44132f10d0) + QObject (0x0x7f4413203d80) 0 + primary-for QAbstractState (0x0x7f44132f1138) + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7f4413203f00) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7f4412f54e40) 0 empty + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7f4413009240) 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 (0x0x7f441300a208) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7f441300a270) 0 + primary-for QStringListModel (0x0x7f441300a208) + QAbstractItemModel (0x0x7f441300a2d8) 0 + primary-for QAbstractListModel (0x0x7f441300a270) + QObject (0x0x7f44130091e0) 0 + primary-for QAbstractItemModel (0x0x7f441300a2d8) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7f44130092a0) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7f4413009360) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7f4413009480) 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 (0x0x7f441300a340) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7f441300a3a8) 0 + primary-for QTemporaryFile (0x0x7f441300a340) + QFileDevice (0x0x7f441300a410) 0 + primary-for QFile (0x0x7f441300a3a8) + QIODevice (0x0x7f441300a478) 0 + primary-for QFileDevice (0x0x7f441300a410) + QObject (0x0x7f4413009420) 0 + primary-for QIODevice (0x0x7f441300a478) + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7f44130094e0) 0 + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7f4413009720) 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 0u +64 0u + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7f44130096c0) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7f4413009900) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7f4413009960) 0 + +Class std::__mutex_base + size=40 align=8 + base size=40 base align=8 +std::__mutex_base (0x0x7f44130099c0) 0 + +Class std::__recursive_mutex_base + size=40 align=8 + base size=40 base align=8 +std::__recursive_mutex_base (0x0x7f4413009a20) 0 + +Class std::mutex + size=40 align=8 + base size=40 base align=8 +std::mutex (0x0x7f441300a680) 0 + std::__mutex_base (0x0x7f4413009a80) 0 + +Class std::recursive_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_mutex (0x0x7f441300a6e8) 0 + std::__recursive_mutex_base (0x0x7f4413009ae0) 0 + +Class std::timed_mutex + size=40 align=8 + base size=40 base align=8 +std::timed_mutex (0x0x7f4412c00e00) 0 + std::__mutex_base (0x0x7f4413009c00) 0 + std::__timed_mutex_impl (0x0x7f4413009c60) 0 empty + +Class std::recursive_timed_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_timed_mutex (0x0x7f4412c1c7e0) 0 + std::__recursive_mutex_base (0x0x7f4413009d20) 0 + std::__timed_mutex_impl (0x0x7f4413009d80) 0 empty + +Class std::defer_lock_t + size=1 align=1 + base size=0 base align=1 +std::defer_lock_t (0x0x7f4413009de0) 0 empty + +Class std::try_to_lock_t + size=1 align=1 + base size=0 base align=1 +std::try_to_lock_t (0x0x7f4413009e40) 0 empty + +Class std::adopt_lock_t + size=1 align=1 + base size=0 base align=1 +std::adopt_lock_t (0x0x7f4413009ea0) 0 empty + +Class std::once_flag + size=4 align=4 + base size=4 base align=4 +std::once_flag (0x0x7f4412c5e120) 0 + +Vtable for __gnu_cxx::__concurrence_lock_error +__gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_lock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +24 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +32 (int (*)(...))__gnu_cxx::__concurrence_lock_error::what + +Class __gnu_cxx::__concurrence_lock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_lock_error (0x0x7f441300a820) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE) + 16u) + std::exception (0x0x7f4412c5e1e0) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_lock_error (0x0x7f441300a820) + +Vtable for __gnu_cxx::__concurrence_unlock_error +__gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx26__concurrence_unlock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +24 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +32 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::what + +Class __gnu_cxx::__concurrence_unlock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_unlock_error (0x0x7f441300a888) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE) + 16u) + std::exception (0x0x7f4412c5e2a0) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_unlock_error (0x0x7f441300a888) + +Vtable for __gnu_cxx::__concurrence_broadcast_error +__gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx29__concurrence_broadcast_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +24 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +32 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::what + +Class __gnu_cxx::__concurrence_broadcast_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_broadcast_error (0x0x7f441300a8f0) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE) + 16u) + std::exception (0x0x7f4412c5e360) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_broadcast_error (0x0x7f441300a8f0) + +Vtable for __gnu_cxx::__concurrence_wait_error +__gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_wait_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +24 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +32 (int (*)(...))__gnu_cxx::__concurrence_wait_error::what + +Class __gnu_cxx::__concurrence_wait_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_wait_error (0x0x7f441300a9c0) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE) + 16u) + std::exception (0x0x7f4412c5e420) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_wait_error (0x0x7f441300a9c0) + +Class __gnu_cxx::__mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__mutex (0x0x7f4412c5e4e0) 0 + +Class __gnu_cxx::__recursive_mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__recursive_mutex (0x0x7f4412c5e540) 0 + +Class __gnu_cxx::__scoped_lock + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__scoped_lock (0x0x7f4412c5e5a0) 0 + +Class __gnu_cxx::__cond + size=48 align=8 + base size=48 base align=8 +__gnu_cxx::__cond (0x0x7f4412c5e600) 0 + +Vtable for std::bad_weak_ptr +std::bad_weak_ptr::_ZTVSt12bad_weak_ptr: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12bad_weak_ptr) +16 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +24 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +32 (int (*)(...))std::bad_weak_ptr::what + +Class std::bad_weak_ptr + size=8 align=8 + base size=8 base align=8 +std::bad_weak_ptr (0x0x7f441300ac98) 0 nearly-empty + vptr=((& std::bad_weak_ptr::_ZTVSt12bad_weak_ptr) + 16u) + std::exception (0x0x7f4412c5e960) 0 nearly-empty + primary-for std::bad_weak_ptr (0x0x7f441300ac98) + +Class std::_Sp_make_shared_tag + size=1 align=1 + base size=0 base align=1 +std::_Sp_make_shared_tag (0x0x7f4412da11e0) 0 empty + +Class std::_Sp_locker + size=2 align=1 + base size=2 base align=1 +std::_Sp_locker (0x0x7f4412da19c0) 0 + +Class std::thread::id + size=8 align=8 + base size=8 base align=8 +std::thread::id (0x0x7f4412da1ba0) 0 + +Vtable for std::thread::_Impl_base +std::thread::_Impl_base::_ZTVNSt6thread10_Impl_baseE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6thread10_Impl_baseE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class std::thread::_Impl_base + size=24 align=8 + base size=24 base align=8 +std::thread::_Impl_base (0x0x7f4412da1c00) 0 + vptr=((& std::thread::_Impl_base::_ZTVNSt6thread10_Impl_baseE) + 16u) + +Class std::thread + size=8 align=8 + base size=8 base align=8 +std::thread (0x0x7f4412da1b40) 0 + +Class std::condition_variable + size=48 align=8 + base size=48 base align=8 +std::condition_variable (0x0x7f4412834840) 0 + +Class std::__at_thread_exit_elt + size=16 align=8 + base size=16 base align=8 +std::__at_thread_exit_elt (0x0x7f4412834900) 0 + +Class std::_V2::condition_variable_any + size=64 align=8 + base size=64 base align=8 +std::_V2::condition_variable_any (0x0x7f4412834960) 0 + +Class std::__atomic_futex_unsigned_base + size=1 align=1 + base size=0 base align=1 +std::__atomic_futex_unsigned_base (0x0x7f4412954000) 0 empty + +Vtable for std::future_error +std::future_error::_ZTVSt12future_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12future_error) +16 (int (*)(...))std::future_error::~future_error +24 (int (*)(...))std::future_error::~future_error +32 (int (*)(...))std::future_error::what + +Class std::future_error + size=32 align=8 + base size=32 base align=8 +std::future_error (0x0x7f4412969000) 0 + vptr=((& std::future_error::_ZTVSt12future_error) + 16u) + std::logic_error (0x0x7f4412969068) 0 + primary-for std::future_error (0x0x7f4412969000) + std::exception (0x0x7f4412954120) 0 nearly-empty + primary-for std::logic_error (0x0x7f4412969068) + +Class std::__future_base::_Result_base::_Deleter + size=1 align=1 + base size=0 base align=1 +std::__future_base::_Result_base::_Deleter (0x0x7f4412954240) 0 empty + +Vtable for std::__future_base::_Result_base +std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base12_Result_baseE) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class std::__future_base::_Result_base + size=16 align=8 + base size=16 base align=8 +std::__future_base::_Result_base (0x0x7f44129541e0) 0 + vptr=((& std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE) + 16u) + +Class std::__future_base::_State_baseV2::__exception_ptr_tag + size=1 align=1 + base size=0 base align=1 +std::__future_base::_State_baseV2::__exception_ptr_tag (0x0x7f4412671780) 0 empty + +Class std::__future_base::_State_baseV2::_Make_ready + size=32 align=8 + base size=32 base align=8 +std::__future_base::_State_baseV2::_Make_ready (0x0x7f4412673618) 0 + std::__at_thread_exit_elt (0x0x7f4412671840) 0 + +Vtable for std::__future_base::_State_baseV2 +std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base13_State_baseV2E) +16 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +24 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +32 (int (*)(...))std::__future_base::_State_baseV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_State_baseV2 + size=32 align=8 + base size=28 base align=8 +std::__future_base::_State_baseV2 (0x0x7f44129543c0) 0 + vptr=((& std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E) + 16u) + +Class std::__future_base + size=1 align=1 + base size=0 base align=1 +std::__future_base (0x0x7f4412954180) 0 empty + +Vtable for std::__future_base::_Async_state_commonV2 +std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base21_Async_state_commonV2E) +16 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +24 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +32 (int (*)(...))std::__future_base::_Async_state_commonV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_Async_state_commonV2 + size=48 align=8 + base size=44 base align=8 +std::__future_base::_Async_state_commonV2 (0x0x7f4412018208) 0 + vptr=((& std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E) + 16u) + std::__future_base::_State_baseV2 (0x0x7f44123d3720) 0 + primary-for std::__future_base::_Async_state_commonV2 (0x0x7f4412018208) + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7f44123d3e40) 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 (0x0x7f4412018c98) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7f44123d3de0) 0 + primary-for QThread (0x0x7f4412018c98) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7f44123d3f60) 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 (0x0x7f4412018d00) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7f44123d3f00) 0 + primary-for QThreadPool (0x0x7f4412018d00) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7f4412086000) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7f4412086120) 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 (0x0x7f4412018d68) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7f44120860c0) 0 + primary-for QTimeLine (0x0x7f4412018d68) + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7f44120861e0) 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 (0x0x7f4412018dd0) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7f4412086180) 0 + primary-for QTimer (0x0x7f4412018dd0) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7f44120868a0) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7f4412086840) 0 + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7f4412086e40) 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 (0x0x7f44120dc820) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7f4412086de0) 0 + primary-for QTranslator (0x0x7f44120dc820) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7f4412086f60) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7f4411e3a660) 0 + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7f4411e3acc0) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7f4411efb300) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7f4411efb360) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7f4411efb600) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7f4411f73208) 0 + QVector (0x0x7f4411efb9c0) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7f4411efba20) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7f4411efbcc0) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7f4411efbf60) 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 (0x0x7f4411c18240) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7f4411c182a0) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7f4411c18cc0) 0 + +Class QBluetoothAddress + size=8 align=8 + base size=8 base align=8 +QBluetoothAddress (0x0x7f4411cc2120) 0 + +Class QBluetoothDeviceInfo + size=8 align=8 + base size=8 base align=8 +QBluetoothDeviceInfo (0x0x7f4411cc22a0) 0 + +Class QBluetoothDeviceDiscoveryAgent::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothDeviceDiscoveryAgent::QPrivateSignal (0x0x7f4411cc2780) 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 (0x0x7f4411c706e8) 0 + vptr=((& QBluetoothDeviceDiscoveryAgent::_ZTV30QBluetoothDeviceDiscoveryAgent) + 16u) + QObject (0x0x7f4411cc2720) 0 + primary-for QBluetoothDeviceDiscoveryAgent (0x0x7f4411c706e8) + +Class QBluetoothHostInfo + size=8 align=8 + base size=8 base align=8 +QBluetoothHostInfo (0x0x7f4411cc2960) 0 + +Class QBluetoothLocalDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothLocalDevice::QPrivateSignal (0x0x7f4411cc2b40) 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 (0x0x7f4411c70820) 0 + vptr=((& QBluetoothLocalDevice::_ZTV21QBluetoothLocalDevice) + 16u) + QObject (0x0x7f4411cc2ae0) 0 + primary-for QBluetoothLocalDevice (0x0x7f4411c70820) + +Class quint128 + size=16 align=1 + base size=16 base align=1 +quint128 (0x0x7f4411cc2f00) 0 + +Class QBluetoothUuid + size=16 align=4 + base size=16 base align=4 +QBluetoothUuid (0x0x7f4411c70888) 0 + QUuid (0x0x7f4411cc2f60) 0 + +Class QBluetoothServiceInfo::Sequence + size=8 align=8 + base size=8 base align=8 +QBluetoothServiceInfo::Sequence (0x0x7f4411c708f0) 0 + QList (0x0x7f4411c70958) 0 + QListSpecialMethods (0x0x7f4411a36240) 0 empty + +Class QBluetoothServiceInfo::Alternative + size=8 align=8 + base size=8 base align=8 +QBluetoothServiceInfo::Alternative (0x0x7f4411c709c0) 0 + QList (0x0x7f4411c70a28) 0 + QListSpecialMethods (0x0x7f4411a362a0) 0 empty + +Class QBluetoothServiceInfo + size=16 align=8 + base size=16 base align=8 +QBluetoothServiceInfo (0x0x7f4411a361e0) 0 + +Class QAbstractSocket::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractSocket::QPrivateSignal (0x0x7f4411a36720) 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 (0x0x7f4411c70c98) 0 + vptr=((& QAbstractSocket::_ZTV15QAbstractSocket) + 16u) + QIODevice (0x0x7f4411c70d00) 0 + primary-for QAbstractSocket (0x0x7f4411c70c98) + QObject (0x0x7f4411a366c0) 0 + primary-for QIODevice (0x0x7f4411c70d00) + +Class QBluetoothSocket::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothSocket::QPrivateSignal (0x0x7f4411a36d20) 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 (0x0x7f4411c70f08) 0 + vptr=((& QBluetoothSocket::_ZTV16QBluetoothSocket) + 16u) + QIODevice (0x0x7f4411c70f70) 0 + primary-for QBluetoothSocket (0x0x7f4411c70f08) + QObject (0x0x7f4411a36cc0) 0 + primary-for QIODevice (0x0x7f4411c70f70) + +Class QBluetoothServer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothServer::QPrivateSignal (0x0x7f4411a36de0) 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 (0x0x7f4411b85000) 0 + vptr=((& QBluetoothServer::_ZTV16QBluetoothServer) + 16u) + QObject (0x0x7f4411a36d80) 0 + primary-for QBluetoothServer (0x0x7f4411b85000) + +Class QBluetoothServiceDiscoveryAgent::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothServiceDiscoveryAgent::QPrivateSignal (0x0x7f4411a36ea0) 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 (0x0x7f4411b85068) 0 + vptr=((& QBluetoothServiceDiscoveryAgent::_ZTV31QBluetoothServiceDiscoveryAgent) + 16u) + QObject (0x0x7f4411a36e40) 0 + primary-for QBluetoothServiceDiscoveryAgent (0x0x7f4411b85068) + +Class QBluetoothTransferManager::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothTransferManager::QPrivateSignal (0x0x7f4411a36f60) 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 (0x0x7f4411b850d0) 0 + vptr=((& QBluetoothTransferManager::_ZTV25QBluetoothTransferManager) + 16u) + QObject (0x0x7f4411a36f00) 0 + primary-for QBluetoothTransferManager (0x0x7f4411b850d0) + +Class QBluetoothTransferRequest + size=8 align=8 + base size=8 base align=8 +QBluetoothTransferRequest (0x0x7f4411bba000) 0 + +Class QBluetoothTransferReply::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBluetoothTransferReply::QPrivateSignal (0x0x7f4411bba0c0) 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 0u +48 0u +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 (0x0x7f4411b85138) 0 + vptr=((& QBluetoothTransferReply::_ZTV23QBluetoothTransferReply) + 16u) + QObject (0x0x7f4411bba060) 0 + primary-for QBluetoothTransferReply (0x0x7f4411b85138) + +Class QLowEnergyAdvertisingData + size=8 align=8 + base size=8 base align=8 +QLowEnergyAdvertisingData (0x0x7f4411bba240) 0 + +Class QLowEnergyDescriptor + size=24 align=8 + base size=24 base align=8 +QLowEnergyDescriptor (0x0x7f4411bba8a0) 0 + +Class QLowEnergyCharacteristic + size=24 align=8 + base size=24 base align=8 +QLowEnergyCharacteristic (0x0x7f4411bbaa80) 0 + +Class QLowEnergyService::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLowEnergyService::QPrivateSignal (0x0x7f4411bbade0) 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 (0x0x7f4411b85888) 0 + vptr=((& QLowEnergyService::_ZTV17QLowEnergyService) + 16u) + QObject (0x0x7f4411bbad80) 0 + primary-for QLowEnergyService (0x0x7f4411b85888) + +Class QLowEnergyController::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLowEnergyController::QPrivateSignal (0x0x7f44118c94e0) 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 (0x0x7f4411b859c0) 0 + vptr=((& QLowEnergyController::_ZTV20QLowEnergyController) + 16u) + QObject (0x0x7f44118c9480) 0 + primary-for QLowEnergyController (0x0x7f4411b859c0) + +Class QLowEnergyAdvertisingParameters::AddressInfo + size=16 align=8 + base size=12 base align=8 +QLowEnergyAdvertisingParameters::AddressInfo (0x0x7f44118c9a20) 0 + +Class QLowEnergyAdvertisingParameters + size=8 align=8 + base size=8 base align=8 +QLowEnergyAdvertisingParameters (0x0x7f44118c99c0) 0 + +Class QLowEnergyCharacteristicData + size=8 align=8 + base size=8 base align=8 +QLowEnergyCharacteristicData (0x0x7f44119669c0) 0 + +Class QLowEnergyConnectionParameters + size=8 align=8 + base size=8 base align=8 +QLowEnergyConnectionParameters (0x0x7f44119a3060) 0 + +Class QLowEnergyDescriptorData + size=8 align=8 + base size=8 base align=8 +QLowEnergyDescriptorData (0x0x7f44119a37e0) 0 + +Class QLowEnergyServiceData + size=8 align=8 + base size=8 base align=8 +QLowEnergyServiceData (0x0x7f44119a3e40) 0 + diff --git a/tests/auto/bic/data/QtNfc.5.11.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtNfc.5.11.0.linux-gcc-amd64.txt new file mode 100644 index 00000000..da6230be --- /dev/null +++ b/tests/auto/bic/data/QtNfc.5.11.0.linux-gcc-amd64.txt @@ -0,0 +1,4754 @@ +Class std::__failure_type + size=1 align=1 + base size=0 base align=1 +std::__failure_type (0x0x7f4a13c830c0) 0 empty + +Class std::__do_is_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_destructible_impl (0x0x7f4a13cc9840) 0 empty + +Class std::__do_is_nt_destructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nt_destructible_impl (0x0x7f4a13cc9a80) 0 empty + +Class std::__do_is_default_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_default_constructible_impl (0x0x7f4a13cc9cc0) 0 empty + +Class std::__do_is_static_castable_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_static_castable_impl (0x0x7f4a13cc9f00) 0 empty + +Class std::__do_is_direct_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_direct_constructible_impl (0x0x7f4a13cf70c0) 0 empty + +Class std::__do_is_nary_constructible_impl + size=1 align=1 + base size=0 base align=1 +std::__do_is_nary_constructible_impl (0x0x7f4a13cf7480) 0 empty + +Class std::__do_common_type_impl + size=1 align=1 + base size=0 base align=1 +std::__do_common_type_impl (0x0x7f4a11902c00) 0 empty + +Class std::__do_member_type_wrapper + size=1 align=1 + base size=0 base align=1 +std::__do_member_type_wrapper (0x0x7f4a11902cc0) 0 empty + +Class std::__result_of_memfun_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_ref_impl (0x0x7f4a11931060) 0 empty + +Class std::__result_of_memfun_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memfun_deref_impl (0x0x7f4a11931120) 0 empty + +Class std::__result_of_memobj_ref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_ref_impl (0x0x7f4a119311e0) 0 empty + +Class std::__result_of_memobj_deref_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_memobj_deref_impl (0x0x7f4a119312a0) 0 empty + +Class std::__result_of_other_impl + size=1 align=1 + base size=0 base align=1 +std::__result_of_other_impl (0x0x7f4a11931540) 0 empty + +Class std::piecewise_construct_t + size=1 align=1 + base size=0 base align=1 +std::piecewise_construct_t (0x0x7f4a11931720) 0 empty + +Class std::__true_type + size=1 align=1 + base size=0 base align=1 +std::__true_type (0x0x7f4a11931ba0) 0 empty + +Class std::__false_type + size=1 align=1 + base size=0 base align=1 +std::__false_type (0x0x7f4a11931c00) 0 empty + +Class std::input_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::input_iterator_tag (0x0x7f4a119e48a0) 0 empty + +Class std::output_iterator_tag + size=1 align=1 + base size=0 base align=1 +std::output_iterator_tag (0x0x7f4a119e4900) 0 empty + +Class std::forward_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::forward_iterator_tag (0x0x7f4a118f08f0) 0 empty + std::input_iterator_tag (0x0x7f4a119e4960) 0 empty + +Class std::bidirectional_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::bidirectional_iterator_tag (0x0x7f4a118f0958) 0 empty + std::forward_iterator_tag (0x0x7f4a118f09c0) 0 empty + std::input_iterator_tag (0x0x7f4a119e49c0) 0 empty + +Class std::random_access_iterator_tag + size=1 align=1 + base size=1 base align=1 +std::random_access_iterator_tag (0x0x7f4a118f0a28) 0 empty + std::bidirectional_iterator_tag (0x0x7f4a118f0a90) 0 empty + std::forward_iterator_tag (0x0x7f4a118f0af8) 0 empty + std::input_iterator_tag (0x0x7f4a119e4a20) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_iter (0x0x7f4a11a256c0) 0 empty + +Class __gnu_cxx::__ops::_Iter_less_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_less_val (0x0x7f4a11a25720) 0 empty + +Class __gnu_cxx::__ops::_Val_less_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Val_less_iter (0x0x7f4a11a25780) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_iter + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_iter (0x0x7f4a11a257e0) 0 empty + +Class __gnu_cxx::__ops::_Iter_equal_to_val + size=1 align=1 + base size=0 base align=1 +__gnu_cxx::__ops::_Iter_equal_to_val (0x0x7f4a11a25840) 0 empty + +Class wait + size=4 align=4 + base size=4 base align=4 +wait (0x0x7f4a11718360) 0 + +Class __locale_struct + size=232 align=8 + base size=232 base align=8 +__locale_struct (0x0x7f4a117185a0) 0 + +Class timespec + size=16 align=8 + base size=16 base align=8 +timespec (0x0x7f4a11718660) 0 + +Class timeval + size=16 align=8 + base size=16 base align=8 +timeval (0x0x7f4a117186c0) 0 + +Class pthread_attr_t + size=56 align=8 + base size=56 base align=8 +pthread_attr_t (0x0x7f4a11718780) 0 + +Class __pthread_internal_list + size=16 align=8 + base size=16 base align=8 +__pthread_internal_list (0x0x7f4a117187e0) 0 + +Class random_data + size=48 align=8 + base size=48 base align=8 +random_data (0x0x7f4a11718c60) 0 + +Class drand48_data + size=24 align=8 + base size=24 base align=8 +drand48_data (0x0x7f4a11718cc0) 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 (0x0x7f4a11718d20) 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 (0x0x7f4a116f7068) 0 nearly-empty + vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16u) + std::exception (0x0x7f4a11718d80) 0 nearly-empty + primary-for std::bad_exception (0x0x7f4a116f7068) + +Class std::__exception_ptr::exception_ptr + size=8 align=8 + base size=8 base align=8 +std::__exception_ptr::exception_ptr (0x0x7f4a11718de0) 0 + +Vtable for std::nested_exception +std::nested_exception::_ZTVSt16nested_exception: 4u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16nested_exception) +16 (int (*)(...))std::nested_exception::~nested_exception +24 (int (*)(...))std::nested_exception::~nested_exception + +Class std::nested_exception + size=16 align=8 + base size=16 base align=8 +std::nested_exception (0x0x7f4a11718e40) 0 + vptr=((& std::nested_exception::_ZTVSt16nested_exception) + 16u) + +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 (0x0x7f4a116f7270) 0 nearly-empty + vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16u) + std::exception (0x0x7f4a118692a0) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f4a116f7270) + +Vtable for std::bad_array_new_length +std::bad_array_new_length::_ZTVSt20bad_array_new_length: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt20bad_array_new_length) +16 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +24 (int (*)(...))std::bad_array_new_length::~bad_array_new_length +32 (int (*)(...))std::bad_array_new_length::what + +Class std::bad_array_new_length + size=8 align=8 + base size=8 base align=8 +std::bad_array_new_length (0x0x7f4a116f72d8) 0 nearly-empty + vptr=((& std::bad_array_new_length::_ZTVSt20bad_array_new_length) + 16u) + std::bad_alloc (0x0x7f4a116f7340) 0 nearly-empty + primary-for std::bad_array_new_length (0x0x7f4a116f72d8) + std::exception (0x0x7f4a11869300) 0 nearly-empty + primary-for std::bad_alloc (0x0x7f4a116f7340) + +Class std::nothrow_t + size=1 align=1 + base size=0 base align=1 +std::nothrow_t (0x0x7f4a11869360) 0 empty + +Class __exception + size=40 align=8 + base size=40 base align=8 +__exception (0x0x7f4a11869f60) 0 + +Class lconv + size=96 align=8 + base size=96 base align=8 +lconv (0x0x7f4a115b1c60) 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 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class __cxxabiv1::__forced_unwind + size=8 align=8 + base size=8 base align=8 +__cxxabiv1::__forced_unwind (0x0x7f4a115b1cc0) 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 (0x0x7f4a1136eba0) 0 + +Class __sched_param + size=4 align=4 + base size=4 base align=4 +__sched_param (0x0x7f4a1136ec00) 0 + +Class timex + size=208 align=8 + base size=208 base align=8 +timex (0x0x7f4a1136ecc0) 0 + +Class tm + size=56 align=8 + base size=56 base align=8 +tm (0x0x7f4a1136ed20) 0 + +Class itimerspec + size=32 align=8 + base size=32 base align=8 +itimerspec (0x0x7f4a1136ed80) 0 + +Class _pthread_cleanup_buffer + size=32 align=8 + base size=32 base align=8 +_pthread_cleanup_buffer (0x0x7f4a1136ede0) 0 + +Class __pthread_cleanup_frame + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_frame (0x0x7f4a1136ef00) 0 + +Class __pthread_cleanup_class + size=24 align=8 + base size=24 base align=8 +__pthread_cleanup_class (0x0x7f4a1136ef60) 0 + +Class _IO_marker + size=24 align=8 + base size=24 base align=8 +_IO_marker (0x0x7f4a114633c0) 0 + +Class _IO_FILE + size=216 align=8 + base size=216 base align=8 +_IO_FILE (0x0x7f4a11463420) 0 + +Class std::_Hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Hash_impl (0x0x7f4a10ed0c00) 0 empty + +Class std::_Fnv_hash_impl + size=1 align=1 + base size=0 base align=1 +std::_Fnv_hash_impl (0x0x7f4a10ed0c60) 0 empty + +Class std::__numeric_limits_base + size=1 align=1 + base size=0 base align=1 +std::__numeric_limits_base (0x0x7f4a10f08c00) 0 empty + +Class std::_Bit_reference + size=16 align=8 + base size=16 base align=8 +std::_Bit_reference (0x0x7f4a10ccca20) 0 + +Class std::_Bit_iterator_base + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator_base (0x0x7f4a10ee1bc8) 0 + std::iterator (0x0x7f4a10cccae0) 0 empty + +Class std::_Bit_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_iterator (0x0x7f4a10ee1c30) 0 + std::_Bit_iterator_base (0x0x7f4a10e0b000) 0 + std::iterator (0x0x7f4a10cccb40) 0 empty + +Class std::_Bit_const_iterator + size=16 align=8 + base size=12 base align=8 +std::_Bit_const_iterator (0x0x7f4a10e0b068) 0 + std::_Bit_iterator_base (0x0x7f4a10e0b0d0) 0 + std::iterator (0x0x7f4a10cccba0) 0 empty + +Class std::random_device + size=5000 align=8 + base size=5000 base align=8 +std::random_device (0x0x7f4a10aac9c0) 0 + +Class std::bernoulli_distribution::param_type + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution::param_type (0x0x7f4a10bd1780) 0 + +Class std::bernoulli_distribution + size=8 align=8 + base size=8 base align=8 +std::bernoulli_distribution (0x0x7f4a10bd1720) 0 + +Class std::seed_seq + size=24 align=8 + base size=24 base align=8 +std::seed_seq (0x0x7f4a109a7720) 0 + +Class qIsNull(double)::U + size=8 align=8 + base size=8 base align=8 +qIsNull(double)::U (0x0x7f4a0f5a9240) 0 + +Class qIsNull(float)::U + size=4 align=4 + base size=4 base align=4 +qIsNull(float)::U (0x0x7f4a0f5a92a0) 0 + +Class QSysInfo + size=1 align=1 + base size=0 base align=1 +QSysInfo (0x0x7f4a0f650d20) 0 empty + +Class QMessageLogContext + size=32 align=8 + base size=32 base align=8 +QMessageLogContext (0x0x7f4a0f650d80) 0 + +Class QMessageLogger + size=32 align=8 + base size=32 base align=8 +QMessageLogger (0x0x7f4a0f650de0) 0 + +Class QFlag + size=4 align=4 + base size=4 base align=4 +QFlag (0x0x7f4a0f650e40) 0 + +Class QIncompatibleFlag + size=4 align=4 + base size=4 base align=4 +QIncompatibleFlag (0x0x7f4a0f2bc120) 0 + +Class std::__atomic_flag_base + size=1 align=1 + base size=1 base align=1 +std::__atomic_flag_base (0x0x7f4a0f2bc660) 0 + +Class std::atomic_flag + size=1 align=1 + base size=1 base align=1 +std::atomic_flag (0x0x7f4a0f647f70) 0 + std::__atomic_flag_base (0x0x7f4a0f2bc6c0) 0 + +Class QAtomicInt + size=4 align=4 + base size=4 base align=4 +QAtomicInt (0x0x7f4a0f4186e8) 0 + QAtomicInteger (0x0x7f4a0f418750) 0 + QBasicAtomicInteger (0x0x7f4a0f082de0) 0 + +Class QInternal + size=1 align=1 + base size=0 base align=1 +QInternal (0x0x7f4a0ed3f3c0) 0 empty + +Class QtPrivate::QSlotObjectBase + size=16 align=8 + base size=16 base align=8 +QtPrivate::QSlotObjectBase (0x0x7f4a0eb29420) 0 + +Class QGenericArgument + size=16 align=8 + base size=16 base align=8 +QGenericArgument (0x0x7f4a0eb29540) 0 + +Class QGenericReturnArgument + size=16 align=8 + base size=16 base align=8 +QGenericReturnArgument (0x0x7f4a0eb521a0) 0 + QGenericArgument (0x0x7f4a0eb295a0) 0 + +Class QMetaObject + size=48 align=8 + base size=48 base align=8 +QMetaObject (0x0x7f4a0eb29720) 0 + +Class QMetaObject::Connection + size=8 align=8 + base size=8 base align=8 +QMetaObject::Connection (0x0x7f4a0eb297e0) 0 + +Class QLatin1Char + size=1 align=1 + base size=1 base align=1 +QLatin1Char (0x0x7f4a0ec10840) 0 + +Class QChar + size=2 align=2 + base size=2 base align=2 +QChar (0x0x7f4a0ec108a0) 0 + +Class QtPrivate::RefCount + size=4 align=4 + base size=4 base align=4 +QtPrivate::RefCount (0x0x7f4a0ec10b40) 0 + +Class QArrayData + size=24 align=8 + base size=24 base align=8 +QArrayData (0x0x7f4a0ec10ba0) 0 + +Class QtPrivate::QContainerImplHelper + size=1 align=1 + base size=0 base align=1 +QtPrivate::QContainerImplHelper (0x0x7f4a0ec10f00) 0 empty + +Class std::locale + size=8 align=8 + base size=8 base align=8 +std::locale (0x0x7f4a0ec10f60) 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 (0x0x7f4a0e954000) 0 + vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16u) + +Class std::locale::id + size=8 align=8 + base size=8 base align=8 +std::locale::id (0x0x7f4a0e954060) 0 + +Class std::locale::_Impl + size=40 align=8 + base size=40 base align=8 +std::locale::_Impl (0x0x7f4a0e9540c0) 0 + +Class std::__cow_string + size=8 align=8 + base size=8 base align=8 +std::__cow_string (0x0x7f4a0e954480) 0 + +Vtable for std::logic_error +std::logic_error::_ZTVSt11logic_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11logic_error) +16 (int (*)(...))std::logic_error::~logic_error +24 (int (*)(...))std::logic_error::~logic_error +32 (int (*)(...))std::logic_error::what + +Class std::logic_error + size=16 align=8 + base size=16 base align=8 +std::logic_error (0x0x7f4a0e9307b8) 0 + vptr=((& std::logic_error::_ZTVSt11logic_error) + 16u) + std::exception (0x0x7f4a0e954540) 0 nearly-empty + primary-for std::logic_error (0x0x7f4a0e9307b8) + +Vtable for std::domain_error +std::domain_error::_ZTVSt12domain_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12domain_error) +16 (int (*)(...))std::domain_error::~domain_error +24 (int (*)(...))std::domain_error::~domain_error +32 (int (*)(...))std::logic_error::what + +Class std::domain_error + size=16 align=8 + base size=16 base align=8 +std::domain_error (0x0x7f4a0e930820) 0 + vptr=((& std::domain_error::_ZTVSt12domain_error) + 16u) + std::logic_error (0x0x7f4a0e930888) 0 + primary-for std::domain_error (0x0x7f4a0e930820) + std::exception (0x0x7f4a0e9545a0) 0 nearly-empty + primary-for std::logic_error (0x0x7f4a0e930888) + +Vtable for std::invalid_argument +std::invalid_argument::_ZTVSt16invalid_argument: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt16invalid_argument) +16 (int (*)(...))std::invalid_argument::~invalid_argument +24 (int (*)(...))std::invalid_argument::~invalid_argument +32 (int (*)(...))std::logic_error::what + +Class std::invalid_argument + size=16 align=8 + base size=16 base align=8 +std::invalid_argument (0x0x7f4a0e9308f0) 0 + vptr=((& std::invalid_argument::_ZTVSt16invalid_argument) + 16u) + std::logic_error (0x0x7f4a0e930958) 0 + primary-for std::invalid_argument (0x0x7f4a0e9308f0) + std::exception (0x0x7f4a0e954600) 0 nearly-empty + primary-for std::logic_error (0x0x7f4a0e930958) + +Vtable for std::length_error +std::length_error::_ZTVSt12length_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12length_error) +16 (int (*)(...))std::length_error::~length_error +24 (int (*)(...))std::length_error::~length_error +32 (int (*)(...))std::logic_error::what + +Class std::length_error + size=16 align=8 + base size=16 base align=8 +std::length_error (0x0x7f4a0e9309c0) 0 + vptr=((& std::length_error::_ZTVSt12length_error) + 16u) + std::logic_error (0x0x7f4a0e930a28) 0 + primary-for std::length_error (0x0x7f4a0e9309c0) + std::exception (0x0x7f4a0e954660) 0 nearly-empty + primary-for std::logic_error (0x0x7f4a0e930a28) + +Vtable for std::out_of_range +std::out_of_range::_ZTVSt12out_of_range: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12out_of_range) +16 (int (*)(...))std::out_of_range::~out_of_range +24 (int (*)(...))std::out_of_range::~out_of_range +32 (int (*)(...))std::logic_error::what + +Class std::out_of_range + size=16 align=8 + base size=16 base align=8 +std::out_of_range (0x0x7f4a0e930a90) 0 + vptr=((& std::out_of_range::_ZTVSt12out_of_range) + 16u) + std::logic_error (0x0x7f4a0e930af8) 0 + primary-for std::out_of_range (0x0x7f4a0e930a90) + std::exception (0x0x7f4a0e9546c0) 0 nearly-empty + primary-for std::logic_error (0x0x7f4a0e930af8) + +Vtable for std::runtime_error +std::runtime_error::_ZTVSt13runtime_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt13runtime_error) +16 (int (*)(...))std::runtime_error::~runtime_error +24 (int (*)(...))std::runtime_error::~runtime_error +32 (int (*)(...))std::runtime_error::what + +Class std::runtime_error + size=16 align=8 + base size=16 base align=8 +std::runtime_error (0x0x7f4a0e930b60) 0 + vptr=((& std::runtime_error::_ZTVSt13runtime_error) + 16u) + std::exception (0x0x7f4a0e954720) 0 nearly-empty + primary-for std::runtime_error (0x0x7f4a0e930b60) + +Vtable for std::range_error +std::range_error::_ZTVSt11range_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt11range_error) +16 (int (*)(...))std::range_error::~range_error +24 (int (*)(...))std::range_error::~range_error +32 (int (*)(...))std::runtime_error::what + +Class std::range_error + size=16 align=8 + base size=16 base align=8 +std::range_error (0x0x7f4a0e930bc8) 0 + vptr=((& std::range_error::_ZTVSt11range_error) + 16u) + std::runtime_error (0x0x7f4a0e930c30) 0 + primary-for std::range_error (0x0x7f4a0e930bc8) + std::exception (0x0x7f4a0e954780) 0 nearly-empty + primary-for std::runtime_error (0x0x7f4a0e930c30) + +Vtable for std::overflow_error +std::overflow_error::_ZTVSt14overflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt14overflow_error) +16 (int (*)(...))std::overflow_error::~overflow_error +24 (int (*)(...))std::overflow_error::~overflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::overflow_error + size=16 align=8 + base size=16 base align=8 +std::overflow_error (0x0x7f4a0e930c98) 0 + vptr=((& std::overflow_error::_ZTVSt14overflow_error) + 16u) + std::runtime_error (0x0x7f4a0e930d00) 0 + primary-for std::overflow_error (0x0x7f4a0e930c98) + std::exception (0x0x7f4a0e9547e0) 0 nearly-empty + primary-for std::runtime_error (0x0x7f4a0e930d00) + +Vtable for std::underflow_error +std::underflow_error::_ZTVSt15underflow_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt15underflow_error) +16 (int (*)(...))std::underflow_error::~underflow_error +24 (int (*)(...))std::underflow_error::~underflow_error +32 (int (*)(...))std::runtime_error::what + +Class std::underflow_error + size=16 align=8 + base size=16 base align=8 +std::underflow_error (0x0x7f4a0e930d68) 0 + vptr=((& std::underflow_error::_ZTVSt15underflow_error) + 16u) + std::runtime_error (0x0x7f4a0e930dd0) 0 + primary-for std::underflow_error (0x0x7f4a0e930d68) + std::exception (0x0x7f4a0e954840) 0 nearly-empty + primary-for std::runtime_error (0x0x7f4a0e930dd0) + +Vtable for std::_V2::error_category +std::_V2::error_category::_ZTVNSt3_V214error_categoryE: 10u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt3_V214error_categoryE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual +40 (int (*)(...))std::_V2::error_category::_M_message +48 (int (*)(...))__cxa_pure_virtual +56 (int (*)(...))std::_V2::error_category::default_error_condition +64 (int (*)(...))std::_V2::error_category::equivalent +72 (int (*)(...))std::_V2::error_category::equivalent + +Class std::_V2::error_category + size=8 align=8 + base size=8 base align=8 +std::_V2::error_category (0x0x7f4a0e9549c0) 0 nearly-empty + vptr=((& std::_V2::error_category::_ZTVNSt3_V214error_categoryE) + 16u) + +Class std::error_code + size=16 align=8 + base size=16 base align=8 +std::error_code (0x0x7f4a0e954c00) 0 + +Class std::error_condition + size=16 align=8 + base size=16 base align=8 +std::error_condition (0x0x7f4a0e954d80) 0 + +Vtable for std::system_error +std::system_error::_ZTVSt12system_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12system_error) +16 (int (*)(...))std::system_error::~system_error +24 (int (*)(...))std::system_error::~system_error +32 (int (*)(...))std::runtime_error::what + +Class std::system_error + size=32 align=8 + base size=32 base align=8 +std::system_error (0x0x7f4a0ea2c208) 0 + vptr=((& std::system_error::_ZTVSt12system_error) + 16u) + std::runtime_error (0x0x7f4a0ea2c270) 0 + primary-for std::system_error (0x0x7f4a0ea2c208) + std::exception (0x0x7f4a0ea41000) 0 nearly-empty + primary-for std::runtime_error (0x0x7f4a0ea2c270) + +Vtable for std::ios_base::failure +std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt8ios_base7failureB5cxx11E) +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=32 align=8 + base size=32 base align=8 +std::ios_base::failure (0x0x7f4a0ea2ce38) 0 + vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E) + 16u) + std::system_error (0x0x7f4a0ea2cea0) 0 + primary-for std::ios_base::failure (0x0x7f4a0ea2ce38) + std::runtime_error (0x0x7f4a0ea2cf08) 0 + primary-for std::system_error (0x0x7f4a0ea2cea0) + std::exception (0x0x7f4a0ea41300) 0 nearly-empty + primary-for std::runtime_error (0x0x7f4a0ea2cf08) + +Class std::ios_base::_Callback_list + size=24 align=8 + base size=24 base align=8 +std::ios_base::_Callback_list (0x0x7f4a0ea41360) 0 + +Class std::ios_base::_Words + size=16 align=8 + base size=16 base align=8 +std::ios_base::_Words (0x0x7f4a0ea413c0) 0 + +Class std::ios_base::Init + size=1 align=1 + base size=0 base align=1 +std::ios_base::Init (0x0x7f4a0ea41420) 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 (0x0x7f4a0ea412a0) 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 (0x0x7f4a0ea41ba0) 0 empty + +Class std::__num_base + size=1 align=1 + base size=0 base align=1 +std::__num_base (0x0x7f4a0e7e02a0) 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 (0x0x7f4a0e2e8820 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd0_Si: 10u entries +0 24u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISi) +24 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISi) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7f4a0e2e88f0 instance) in std::basic_iostream +std::basic_iostream::_ZTCSd16_So: 10u entries +0 8u +8 (int (*)(...))0 +16 (int (*)(...))(& _ZTISo) +24 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISo) +64 0u +72 0u + +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 (0x0x7f4a0e2e8c98 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 0u +32 0u +40 18446744073709551592u +48 (int (*)(...))-24 +56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE) +64 0u +72 0u + +Construction vtable for std::basic_ostream (0x0x7f4a0e2e8d68 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 0u +32 0u +40 18446744073709551608u +48 (int (*)(...))-8 +56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE) +64 0u +72 0u + +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 QByteArrayDataPtr + size=8 align=8 + base size=8 base align=8 +QByteArrayDataPtr (0x0x7f4a0e59dae0) 0 + +Class QByteArray + size=8 align=8 + base size=8 base align=8 +QByteArray (0x0x7f4a0e59db40) 0 + +Class QByteRef + size=16 align=8 + base size=12 base align=8 +QByteRef (0x0x7f4a0e459ea0) 0 + +Class QStringDataPtr + size=8 align=8 + base size=8 base align=8 +QStringDataPtr (0x0x7f4a0e141240) 0 + +Class QStringView + size=16 align=8 + base size=16 base align=8 +QStringView (0x0x7f4a0e1416c0) 0 + +Class QLatin1String + size=16 align=8 + base size=16 base align=8 +QLatin1String (0x0x7f4a0e1cc540) 0 + +Class QString::Null + size=1 align=1 + base size=0 base align=1 +QString::Null (0x0x7f4a0e1ccba0) 0 empty + +Class QString + size=8 align=8 + base size=8 base align=8 +QString (0x0x7f4a0e1ccb40) 0 + +Class QCharRef + size=16 align=8 + base size=12 base align=8 +QCharRef (0x0x7f4a0dfbec60) 0 + +Class QStringRef + size=16 align=8 + base size=16 base align=8 +QStringRef (0x0x7f4a0dd5b8a0) 0 + +Class QtPrivate::QHashCombine + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombine (0x0x7f4a0dafa540) 0 empty + +Class QtPrivate::QHashCombineCommutative + size=1 align=1 + base size=0 base align=1 +QtPrivate::QHashCombineCommutative (0x0x7f4a0dafa5a0) 0 empty + +Class std::__detail::_List_node_base + size=16 align=8 + base size=16 base align=8 +std::__detail::_List_node_base (0x0x7f4a0dafa600) 0 + +Class QListData::NotArrayCompatibleLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotArrayCompatibleLayout (0x0x7f4a0dafa9c0) 0 empty + +Class QListData::NotIndirectLayout + size=1 align=1 + base size=0 base align=1 +QListData::NotIndirectLayout (0x0x7f4a0dafaa20) 0 empty + +Class QListData::ArrayCompatibleLayout + size=1 align=1 + base size=1 base align=1 +QListData::ArrayCompatibleLayout (0x0x7f4a0dae57b8) 0 empty + QListData::NotIndirectLayout (0x0x7f4a0dafaa80) 0 empty + +Class QListData::InlineWithPaddingLayout + size=1 align=1 + base size=1 base align=1 +QListData::InlineWithPaddingLayout (0x0x7f4a0dc34a10) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f4a0dafaae0) 0 empty + QListData::NotIndirectLayout (0x0x7f4a0dafab40) 0 empty + +Class QListData::IndirectLayout + size=1 align=1 + base size=1 base align=1 +QListData::IndirectLayout (0x0x7f4a0dae5820) 0 empty + QListData::NotArrayCompatibleLayout (0x0x7f4a0dafaba0) 0 empty + +Class QListData::Data + size=24 align=8 + base size=24 base align=8 +QListData::Data (0x0x7f4a0dafac00) 0 + +Class QListData + size=8 align=8 + base size=8 base align=8 +QListData (0x0x7f4a0dafa960) 0 + +Class QRegExp + size=8 align=8 + base size=8 base align=8 +QRegExp (0x0x7f4a0d9490c0) 0 + +Class QStringMatcher::Data + size=272 align=8 + base size=272 base align=8 +QStringMatcher::Data (0x0x7f4a0d9f3300) 0 + +Class QStringMatcher + size=1048 align=8 + base size=1048 base align=8 +QStringMatcher (0x0x7f4a0d9f32a0) 0 + +Class QStringList + size=8 align=8 + base size=8 base align=8 +QStringList (0x0x7f4a0d9f7270) 0 + QList (0x0x7f4a0d9f72d8) 0 + QListSpecialMethods (0x0x7f4a0d9f34e0) 0 empty + +Class QScopedPointerPodDeleter + size=1 align=1 + base size=0 base align=1 +QScopedPointerPodDeleter (0x0x7f4a0d9f3900) 0 empty + +Class std::_Rb_tree_node_base + size=32 align=8 + base size=32 base align=8 +std::_Rb_tree_node_base (0x0x7f4a0d7094e0) 0 + +Class std::allocator_arg_t + size=1 align=1 + base size=0 base align=1 +std::allocator_arg_t (0x0x7f4a0d709b40) 0 empty + +Class std::__uses_alloc_base + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc_base (0x0x7f4a0d709cc0) 0 empty + +Class std::__uses_alloc0::_Sink + size=1 align=1 + base size=0 base align=1 +std::__uses_alloc0::_Sink (0x0x7f4a0d709d80) 0 empty + +Class std::__uses_alloc0 + size=1 align=1 + base size=1 base align=1 +std::__uses_alloc0 (0x0x7f4a0d9f7bc8) 0 + std::__uses_alloc_base (0x0x7f4a0d709d20) 0 empty + +Class std::_Swallow_assign + size=1 align=1 + base size=0 base align=1 +std::_Swallow_assign (0x0x7f4a0d4c8de0) 0 empty + +Class QtPrivate::AbstractDebugStreamFunction + size=16 align=8 + base size=16 base align=8 +QtPrivate::AbstractDebugStreamFunction (0x0x7f4a0d60a060) 0 + +Class QtPrivate::AbstractComparatorFunction + size=24 align=8 + base size=24 base align=8 +QtPrivate::AbstractComparatorFunction (0x0x7f4a0d60a120) 0 + +Class QtPrivate::AbstractConverterFunction + size=8 align=8 + base size=8 base align=8 +QtPrivate::AbstractConverterFunction (0x0x7f4a0d60a240) 0 + +Class QMetaType + size=80 align=8 + base size=80 base align=8 +QMetaType (0x0x7f4a0d60a3c0) 0 + +Class QtMetaTypePrivate::VariantData + size=24 align=8 + base size=20 base align=8 +QtMetaTypePrivate::VariantData (0x0x7f4a0d60a7e0) 0 + +Class QtMetaTypePrivate::VectorBoolElements + size=1 align=1 + base size=0 base align=1 +QtMetaTypePrivate::VectorBoolElements (0x0x7f4a0d60a900) 0 empty + +Class QtMetaTypePrivate::QSequentialIterableImpl + size=104 align=8 + base size=104 base align=8 +QtMetaTypePrivate::QSequentialIterableImpl (0x0x7f4a0d37d2a0) 0 + +Class QtMetaTypePrivate::QAssociativeIterableImpl + size=112 align=8 + base size=112 base align=8 +QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7f4a0d37d6c0) 0 + +Class QtMetaTypePrivate::QPairVariantInterfaceImpl + size=40 align=8 + base size=40 base align=8 +QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7f4a0d37d9c0) 0 + +Class std::chrono::_V2::system_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::system_clock (0x0x7f4a0d235240) 0 empty + +Class std::chrono::_V2::steady_clock + size=1 align=1 + base size=0 base align=1 +std::chrono::_V2::steady_clock (0x0x7f4a0cf7e0c0) 0 empty + +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 (0x0x7f4a0cf7e120) 0 + vptr=((& QObjectData::_ZTV11QObjectData) + 16u) + +Class QObject::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObject::QPrivateSignal (0x0x7f4a0cf7e300) 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 (0x0x7f4a0cf7e2a0) 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 (0x0x7f4a0d05c5a0) 0 nearly-empty + vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16u) + +Class QSignalBlocker + size=16 align=8 + base size=10 base align=8 +QSignalBlocker (0x0x7f4a0d05c600) 0 + +Class QAbstractAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractAnimation::QPrivateSignal (0x0x7f4a0d05c6c0) 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 0u +48 0u +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 (0x0x7f4a0d035f70) 0 + vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16u) + QObject (0x0x7f4a0d05c660) 0 + primary-for QAbstractAnimation (0x0x7f4a0d035f70) + +Class QAnimationDriver::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationDriver::QPrivateSignal (0x0x7f4a0d05c780) 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 (0x0x7f4a0d035138) 0 + vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16u) + QObject (0x0x7f4a0d05c720) 0 + primary-for QAnimationDriver (0x0x7f4a0d035138) + +Class QEventLoop::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventLoop::QPrivateSignal (0x0x7f4a0d05c840) 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 (0x0x7f4a0d0352d8) 0 + vptr=((& QEventLoop::_ZTV10QEventLoop) + 16u) + QObject (0x0x7f4a0d05c7e0) 0 + primary-for QEventLoop (0x0x7f4a0d0352d8) + +Class QEventLoopLocker + size=8 align=8 + base size=8 base align=8 +QEventLoopLocker (0x0x7f4a0d05ca20) 0 + +Class QAbstractEventDispatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractEventDispatcher::QPrivateSignal (0x0x7f4a0d05cae0) 0 empty + +Class QAbstractEventDispatcher::TimerInfo + size=12 align=4 + base size=12 base align=4 +QAbstractEventDispatcher::TimerInfo (0x0x7f4a0d05cb40) 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 0u +48 0u +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 (0x0x7f4a0cce9000) 0 + vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16u) + QObject (0x0x7f4a0d05ca80) 0 + primary-for QAbstractEventDispatcher (0x0x7f4a0cce9000) + +Vtable for std::type_info +std::type_info::_ZTVSt9type_info: 8u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt9type_info) +16 (int (*)(...))std::type_info::~type_info +24 (int (*)(...))std::type_info::~type_info +32 (int (*)(...))std::type_info::__is_pointer_p +40 (int (*)(...))std::type_info::__is_function_p +48 (int (*)(...))std::type_info::__do_catch +56 (int (*)(...))std::type_info::__do_upcast + +Class std::type_info + size=16 align=8 + base size=16 base align=8 +std::type_info (0x0x7f4a0d05cde0) 0 + vptr=((& std::type_info::_ZTVSt9type_info) + 16u) + +Vtable for std::bad_cast +std::bad_cast::_ZTVSt8bad_cast: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt8bad_cast) +16 (int (*)(...))std::bad_cast::~bad_cast +24 (int (*)(...))std::bad_cast::~bad_cast +32 (int (*)(...))std::bad_cast::what + +Class std::bad_cast + size=8 align=8 + base size=8 base align=8 +std::bad_cast (0x0x7f4a0cce9208) 0 nearly-empty + vptr=((& std::bad_cast::_ZTVSt8bad_cast) + 16u) + std::exception (0x0x7f4a0d05ce40) 0 nearly-empty + primary-for std::bad_cast (0x0x7f4a0cce9208) + +Vtable for std::bad_typeid +std::bad_typeid::_ZTVSt10bad_typeid: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt10bad_typeid) +16 (int (*)(...))std::bad_typeid::~bad_typeid +24 (int (*)(...))std::bad_typeid::~bad_typeid +32 (int (*)(...))std::bad_typeid::what + +Class std::bad_typeid + size=8 align=8 + base size=8 base align=8 +std::bad_typeid (0x0x7f4a0cce9270) 0 nearly-empty + vptr=((& std::bad_typeid::_ZTVSt10bad_typeid) + 16u) + std::exception (0x0x7f4a0d05cea0) 0 nearly-empty + primary-for std::bad_typeid (0x0x7f4a0cce9270) + +Vtable for std::bad_function_call +std::bad_function_call::_ZTVSt17bad_function_call: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt17bad_function_call) +16 (int (*)(...))std::bad_function_call::~bad_function_call +24 (int (*)(...))std::bad_function_call::~bad_function_call +32 (int (*)(...))std::bad_function_call::what + +Class std::bad_function_call + size=8 align=8 + base size=8 base align=8 +std::bad_function_call (0x0x7f4a0ce5e4e0) 0 nearly-empty + vptr=((& std::bad_function_call::_ZTVSt17bad_function_call) + 16u) + std::exception (0x0x7f4a0cdf9f60) 0 nearly-empty + primary-for std::bad_function_call (0x0x7f4a0ce5e4e0) + +Class std::_Nocopy_types + size=16 align=8 + base size=16 base align=8 +std::_Nocopy_types (0x0x7f4a0caaf060) 0 + +Class std::_Any_data + size=16 align=8 + base size=16 base align=8 +std::_Any_data (0x0x7f4a0caaf0c0) 0 + +Class std::_Function_base + size=24 align=8 + base size=24 base align=8 +std::_Function_base (0x0x7f4a0caaf1e0) 0 + +Class QMapNodeBase + size=24 align=8 + base size=24 base align=8 +QMapNodeBase (0x0x7f4a0caaf6c0) 0 + +Class QMapDataBase + size=40 align=8 + base size=40 base align=8 +QMapDataBase (0x0x7f4a0caafc00) 0 + +Class QHashData::Node + size=16 align=8 + base size=16 base align=8 +QHashData::Node (0x0x7f4a0cc4d000) 0 + +Class QHashData + size=48 align=8 + base size=44 base align=8 +QHashData (0x0x7f4a0caaff60) 0 + +Class QHashDummyValue + size=1 align=1 + base size=0 base align=1 +QHashDummyValue (0x0x7f4a0cc4d060) 0 empty + +Class QVariant::PrivateShared + size=16 align=8 + base size=12 base align=8 +QVariant::PrivateShared (0x0x7f4a0cc4d900) 0 + +Class QVariant::Private::Data + size=8 align=8 + base size=8 base align=8 +QVariant::Private::Data (0x0x7f4a0cc4d9c0) 0 + +Class QVariant::Private + size=16 align=8 + base size=12 base align=8 +QVariant::Private (0x0x7f4a0cc4d960) 0 + +Class QVariant::Handler + size=72 align=8 + base size=72 base align=8 +QVariant::Handler (0x0x7f4a0cc4da20) 0 + +Class QVariant + size=16 align=8 + base size=16 base align=8 +QVariant (0x0x7f4a0cc4d8a0) 0 + +Class QVariantComparisonHelper + size=8 align=8 + base size=8 base align=8 +QVariantComparisonHelper (0x0x7f4a0c6a9540) 0 + +Class QSequentialIterable::const_iterator + size=112 align=8 + base size=112 base align=8 +QSequentialIterable::const_iterator (0x0x7f4a0c6a9ba0) 0 + +Class QSequentialIterable + size=104 align=8 + base size=104 base align=8 +QSequentialIterable (0x0x7f4a0c6a9b40) 0 + +Class QAssociativeIterable::const_iterator + size=120 align=8 + base size=120 base align=8 +QAssociativeIterable::const_iterator (0x0x7f4a0c6a9c60) 0 + +Class QAssociativeIterable + size=112 align=8 + base size=112 base align=8 +QAssociativeIterable (0x0x7f4a0c6a9c00) 0 + +Class QModelIndex + size=24 align=8 + base size=24 base align=8 +QModelIndex (0x0x7f4a0c7cff60) 0 + +Class QPersistentModelIndex + size=8 align=8 + base size=8 base align=8 +QPersistentModelIndex (0x0x7f4a0c51b660) 0 + +Class QAbstractItemModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractItemModel::QPrivateSignal (0x0x7f4a0c5b7d80) 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 0u +48 0u +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 (0x0x7f4a0c5d0270) 0 + vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16u) + QObject (0x0x7f4a0c5b7d20) 0 + primary-for QAbstractItemModel (0x0x7f4a0c5d0270) + +Class QAbstractTableModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTableModel::QPrivateSignal (0x0x7f4a0c61a660) 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 0u +48 0u +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 (*)(...))QAbstractTableModel::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 (0x0x7f4a0c5d0958) 0 + vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16u) + QAbstractItemModel (0x0x7f4a0c5d09c0) 0 + primary-for QAbstractTableModel (0x0x7f4a0c5d0958) + QObject (0x0x7f4a0c61a600) 0 + primary-for QAbstractItemModel (0x0x7f4a0c5d09c0) + +Class QAbstractListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractListModel::QPrivateSignal (0x0x7f4a0c61a720) 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 0u +48 0u +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 (*)(...))QAbstractListModel::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 (0x0x7f4a0c5d0a28) 0 + vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16u) + QAbstractItemModel (0x0x7f4a0c5d0a90) 0 + primary-for QAbstractListModel (0x0x7f4a0c5d0a28) + QObject (0x0x7f4a0c61a6c0) 0 + primary-for QAbstractItemModel (0x0x7f4a0c5d0a90) + +Vtable for QAbstractNativeEventFilter +QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QAbstractNativeEventFilter + size=16 align=8 + base size=16 base align=8 +QAbstractNativeEventFilter (0x0x7f4a0c61a9c0) 0 + vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16u) + +Class QAbstractProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractProxyModel::QPrivateSignal (0x0x7f4a0c61aa80) 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 0u +48 0u +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 (0x0x7f4a0c5d0bc8) 0 + vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16u) + QAbstractItemModel (0x0x7f4a0c5d0c30) 0 + primary-for QAbstractProxyModel (0x0x7f4a0c5d0bc8) + QObject (0x0x7f4a0c61aa20) 0 + primary-for QAbstractItemModel (0x0x7f4a0c5d0c30) + +Class QAbstractState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractState::QPrivateSignal (0x0x7f4a0c61ab40) 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 0u +48 0u +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 (0x0x7f4a0c5d0c98) 0 + vptr=((& QAbstractState::_ZTV14QAbstractState) + 16u) + QObject (0x0x7f4a0c61aae0) 0 + primary-for QAbstractState (0x0x7f4a0c5d0c98) + +Class QAbstractTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAbstractTransition::QPrivateSignal (0x0x7f4a0c61ac00) 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 0u +48 0u +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 (0x0x7f4a0c5d0d00) 0 + vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16u) + QObject (0x0x7f4a0c61aba0) 0 + primary-for QAbstractTransition (0x0x7f4a0c5d0d00) + +Class QAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QAnimationGroup::QPrivateSignal (0x0x7f4a0c61acc0) 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 0u +48 0u +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 (0x0x7f4a0c5d0d68) 0 + vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16u) + QAbstractAnimation (0x0x7f4a0c5d0dd0) 0 + primary-for QAnimationGroup (0x0x7f4a0c5d0d68) + QObject (0x0x7f4a0c61ac60) 0 + primary-for QAbstractAnimation (0x0x7f4a0c5d0dd0) + +Class QBasicTimer + size=4 align=4 + base size=4 base align=4 +QBasicTimer (0x0x7f4a0c380a20) 0 + +Class QBitArray + size=8 align=8 + base size=8 base align=8 +QBitArray (0x0x7f4a0c380cc0) 0 + +Class QBitRef + size=16 align=8 + base size=12 base align=8 +QBitRef (0x0x7f4a0c380d80) 0 + +Class QIODevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIODevice::QPrivateSignal (0x0x7f4a0c41c0c0) 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 0u +48 0u +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 (0x0x7f4a0c3a8478) 0 + vptr=((& QIODevice::_ZTV9QIODevice) + 16u) + QObject (0x0x7f4a0c41c060) 0 + primary-for QIODevice (0x0x7f4a0c3a8478) + +Class QBuffer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QBuffer::QPrivateSignal (0x0x7f4a0c41c300) 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 (0x0x7f4a0c3a85b0) 0 + vptr=((& QBuffer::_ZTV7QBuffer) + 16u) + QIODevice (0x0x7f4a0c3a8618) 0 + primary-for QBuffer (0x0x7f4a0c3a85b0) + QObject (0x0x7f4a0c41c2a0) 0 + primary-for QIODevice (0x0x7f4a0c3a8618) + +Class QByteArrayMatcher::Data + size=272 align=8 + base size=272 base align=8 +QByteArrayMatcher::Data (0x0x7f4a0c41c3c0) 0 + +Class QByteArrayMatcher + size=1040 align=8 + base size=1040 base align=8 +QByteArrayMatcher (0x0x7f4a0c41c360) 0 + +Class QStaticByteArrayMatcherBase::Skiptable + size=256 align=1 + base size=256 base align=1 +QStaticByteArrayMatcherBase::Skiptable (0x0x7f4a0c41c4e0) 0 + +Class QStaticByteArrayMatcherBase + size=256 align=16 + base size=256 base align=16 +QStaticByteArrayMatcherBase (0x0x7f4a0c41c480) 0 + +Class QSharedData + size=4 align=4 + base size=4 base align=4 +QSharedData (0x0x7f4a0c41c6c0) 0 + +Class QLocale + size=8 align=8 + base size=8 base align=8 +QLocale (0x0x7f4a0c41c8a0) 0 + +Class QCollatorSortKey + size=8 align=8 + base size=8 base align=8 +QCollatorSortKey (0x0x7f4a0c41cea0) 0 + +Class QCollator + size=8 align=8 + base size=8 base align=8 +QCollator (0x0x7f4a0c41cf60) 0 + +Class QCommandLineOption + size=8 align=8 + base size=8 base align=8 +QCommandLineOption (0x0x7f4a0c256f60) 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 (0x0x7f4a0be8d420) 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 (0x0x7f4a0c270af8) 0 + vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16u) + QEvent (0x0x7f4a0be8d480) 0 + primary-for QTimerEvent (0x0x7f4a0c270af8) + +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 (0x0x7f4a0c270b60) 0 + vptr=((& QChildEvent::_ZTV11QChildEvent) + 16u) + QEvent (0x0x7f4a0be8d4e0) 0 + primary-for QChildEvent (0x0x7f4a0c270b60) + +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 (0x0x7f4a0bef90d0) 0 + vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16u) + QEvent (0x0x7f4a0be8d9c0) 0 + primary-for QDynamicPropertyChangeEvent (0x0x7f4a0bef90d0) + +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 (0x0x7f4a0bef9138) 0 + vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16u) + QEvent (0x0x7f4a0be8da20) 0 + primary-for QDeferredDeleteEvent (0x0x7f4a0bef9138) + +Class QCoreApplication::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QCoreApplication::QPrivateSignal (0x0x7f4a0be8dae0) 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 (0x0x7f4a0bef91a0) 0 + vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16u) + QObject (0x0x7f4a0be8da80) 0 + primary-for QCoreApplication (0x0x7f4a0bef91a0) + +Class QCommandLineParser + size=8 align=8 + base size=8 base align=8 +QCommandLineParser (0x0x7f4a0be8db40) 0 + +Class QContiguousCacheData + size=24 align=4 + base size=24 base align=4 +QContiguousCacheData (0x0x7f4a0be8dba0) 0 + +Class QCryptographicHash + size=8 align=8 + base size=8 base align=8 +QCryptographicHash (0x0x7f4a0bf7d1e0) 0 + +Class QDataStream + size=32 align=8 + base size=32 base align=8 +QDataStream (0x0x7f4a0bf7d240) 0 + +Class QtPrivate::StreamStateSaver + size=16 align=8 + base size=12 base align=8 +QtPrivate::StreamStateSaver (0x0x7f4a0bf7d300) 0 + +Class QDate + size=8 align=8 + base size=8 base align=8 +QDate (0x0x7f4a0bf7d7e0) 0 + +Class QTime + size=4 align=4 + base size=4 base align=4 +QTime (0x0x7f4a0bf7da80) 0 + +Class QDateTime::ShortData + size=8 align=8 + base size=8 base align=8 +QDateTime::ShortData (0x0x7f4a0c054240) 0 + +Class QDateTime::Data + size=8 align=8 + base size=8 base align=8 +QDateTime::Data (0x0x7f4a0c0542a0) 0 + +Class QDateTime + size=8 align=8 + base size=8 base align=8 +QDateTime (0x0x7f4a0c0541e0) 0 + +Class QElapsedTimer + size=16 align=8 + base size=16 base align=8 +QElapsedTimer (0x0x7f4a0bcfb3c0) 0 + +Class QDeadlineTimer + size=16 align=8 + base size=16 base align=8 +QDeadlineTimer (0x0x7f4a0bcfb8a0) 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 (0x0x7f4a0be1d840) 0 + vptr=((& QTextStream::_ZTV11QTextStream) + 16u) + +Class QTextStreamManipulator + size=40 align=8 + base size=38 base align=8 +QTextStreamManipulator (0x0x7f4a0be1dae0) 0 + +Class QtSharedPointer::NormalDeleter + size=1 align=1 + base size=0 base align=1 +QtSharedPointer::NormalDeleter (0x0x7f4a0be1dd20) 0 empty + +Class QtSharedPointer::ExternalRefCountData + size=16 align=8 + base size=16 base align=8 +QtSharedPointer::ExternalRefCountData (0x0x7f4a0be1dea0) 0 + +Class QDebug::Stream + size=80 align=8 + base size=76 base align=8 +QDebug::Stream (0x0x7f4a0bb6f420) 0 + +Class QDebug + size=8 align=8 + base size=8 base align=8 +QDebug (0x0x7f4a0bb6f3c0) 0 + +Class QDebugStateSaver + size=8 align=8 + base size=8 base align=8 +QDebugStateSaver (0x0x7f4a0b8c2900) 0 + +Class QNoDebug + size=1 align=1 + base size=0 base align=1 +QNoDebug (0x0x7f4a0b8c29c0) 0 empty + +Class QFileDevice::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileDevice::QPrivateSignal (0x0x7f4a0b999b40) 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 (0x0x7f4a0b998c30) 0 + vptr=((& QFileDevice::_ZTV11QFileDevice) + 16u) + QIODevice (0x0x7f4a0b998e38) 0 + primary-for QFileDevice (0x0x7f4a0b998c30) + QObject (0x0x7f4a0b999ae0) 0 + primary-for QIODevice (0x0x7f4a0b998e38) + +Class QFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFile::QPrivateSignal (0x0x7f4a0b999d80) 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 (0x0x7f4a0b9de0d0) 0 + vptr=((& QFile::_ZTV5QFile) + 16u) + QFileDevice (0x0x7f4a0b9de138) 0 + primary-for QFile (0x0x7f4a0b9de0d0) + QIODevice (0x0x7f4a0b9de1a0) 0 + primary-for QFileDevice (0x0x7f4a0b9de138) + QObject (0x0x7f4a0b999d20) 0 + primary-for QIODevice (0x0x7f4a0b9de1a0) + +Class QFileInfo + size=8 align=8 + base size=8 base align=8 +QFileInfo (0x0x7f4a0b999f60) 0 + +Class QDir + size=8 align=8 + base size=8 base align=8 +QDir (0x0x7f4a0ba4b3c0) 0 + +Class QDirIterator + size=8 align=8 + base size=8 base align=8 +QDirIterator (0x0x7f4a0ba4b9c0) 0 + +Class QEasingCurve + size=8 align=8 + base size=8 base align=8 +QEasingCurve (0x0x7f4a0ba4bc00) 0 + +Class QEventTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QEventTransition::QPrivateSignal (0x0x7f4a0b80b060) 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 (0x0x7f4a0b7ca1a0) 0 + vptr=((& QEventTransition::_ZTV16QEventTransition) + 16u) + QAbstractTransition (0x0x7f4a0b7ca208) 0 + primary-for QEventTransition (0x0x7f4a0b7ca1a0) + QObject (0x0x7f4a0b80b000) 0 + primary-for QAbstractTransition (0x0x7f4a0b7ca208) + +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 (0x0x7f4a0b7ca270) 0 nearly-empty + vptr=((& QException::_ZTV10QException) + 16u) + std::exception (0x0x7f4a0b80b0c0) 0 nearly-empty + primary-for QException (0x0x7f4a0b7ca270) + +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 (0x0x7f4a0b7ca2d8) 0 nearly-empty + vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16u) + QException (0x0x7f4a0b7ca340) 0 nearly-empty + primary-for QUnhandledException (0x0x7f4a0b7ca2d8) + std::exception (0x0x7f4a0b80b120) 0 nearly-empty + primary-for QException (0x0x7f4a0b7ca340) + +Class QtPrivate::ExceptionHolder + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionHolder (0x0x7f4a0b80b180) 0 + +Class QtPrivate::ExceptionStore + size=8 align=8 + base size=8 base align=8 +QtPrivate::ExceptionStore (0x0x7f4a0b80b240) 0 + +Vtable for QFactoryInterface +QFactoryInterface::_ZTV17QFactoryInterface: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI17QFactoryInterface) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class QFactoryInterface + size=8 align=8 + base size=8 base align=8 +QFactoryInterface (0x0x7f4a0b80b2a0) 0 nearly-empty + vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16u) + +Class QFileSelector::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSelector::QPrivateSignal (0x0x7f4a0b80b3c0) 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 (0x0x7f4a0b7ca3a8) 0 + vptr=((& QFileSelector::_ZTV13QFileSelector) + 16u) + QObject (0x0x7f4a0b80b360) 0 + primary-for QFileSelector (0x0x7f4a0b7ca3a8) + +Class QFileSystemWatcher::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFileSystemWatcher::QPrivateSignal (0x0x7f4a0b80b480) 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 (0x0x7f4a0b7ca410) 0 + vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16u) + QObject (0x0x7f4a0b80b420) 0 + primary-for QFileSystemWatcher (0x0x7f4a0b7ca410) + +Class QFinalState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFinalState::QPrivateSignal (0x0x7f4a0b80b540) 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 (0x0x7f4a0b7ca478) 0 + vptr=((& QFinalState::_ZTV11QFinalState) + 16u) + QAbstractState (0x0x7f4a0b7ca4e0) 0 + primary-for QFinalState (0x0x7f4a0b7ca478) + QObject (0x0x7f4a0b80b4e0) 0 + primary-for QAbstractState (0x0x7f4a0b7ca4e0) + +Vtable for QRunnable +QRunnable::_ZTV9QRunnable: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTI9QRunnable) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class QRunnable + size=16 align=8 + base size=12 base align=8 +QRunnable (0x0x7f4a0b80b5a0) 0 + vptr=((& QRunnable::_ZTV9QRunnable) + 16u) + +Class QBasicMutex + size=8 align=8 + base size=8 base align=8 +QBasicMutex (0x0x7f4a0b80b600) 0 + +Class QMutex + size=8 align=8 + base size=8 base align=8 +QMutex (0x0x7f4a0b7ca618) 0 + QBasicMutex (0x0x7f4a0b80b7e0) 0 + +Class QMutexLocker + size=8 align=8 + base size=8 base align=8 +QMutexLocker (0x0x7f4a0b80b840) 0 + +Class QtPrivate::ResultItem + size=16 align=8 + base size=16 base align=8 +QtPrivate::ResultItem (0x0x7f4a0b80b8a0) 0 + +Class QtPrivate::ResultIteratorBase + size=16 align=8 + base size=12 base align=8 +QtPrivate::ResultIteratorBase (0x0x7f4a0b80b900) 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 (0x0x7f4a0b80ba20) 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 (0x0x7f4a0b5542a0) 0 + vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16u) + +Class QFutureWatcherBase::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QFutureWatcherBase::QPrivateSignal (0x0x7f4a0b554a80) 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 0u +48 0u +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 (0x0x7f4a0b575750) 0 + vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16u) + QObject (0x0x7f4a0b554a20) 0 + primary-for QFutureWatcherBase (0x0x7f4a0b575750) + +Class QHistoryState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QHistoryState::QPrivateSignal (0x0x7f4a0b6350c0) 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 (0x0x7f4a0b639068) 0 + vptr=((& QHistoryState::_ZTV13QHistoryState) + 16u) + QAbstractState (0x0x7f4a0b6390d0) 0 + primary-for QHistoryState (0x0x7f4a0b639068) + QObject (0x0x7f4a0b635060) 0 + primary-for QAbstractState (0x0x7f4a0b6390d0) + +Class QIdentityProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QIdentityProxyModel::QPrivateSignal (0x0x7f4a0b635180) 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 (0x0x7f4a0b639138) 0 + vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16u) + QAbstractProxyModel (0x0x7f4a0b6391a0) 0 + primary-for QIdentityProxyModel (0x0x7f4a0b639138) + QAbstractItemModel (0x0x7f4a0b639208) 0 + primary-for QAbstractProxyModel (0x0x7f4a0b6391a0) + QObject (0x0x7f4a0b635120) 0 + primary-for QAbstractItemModel (0x0x7f4a0b639208) + +Class QItemSelectionRange + size=16 align=8 + base size=16 base align=8 +QItemSelectionRange (0x0x7f4a0b6351e0) 0 + +Class QItemSelectionModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QItemSelectionModel::QPrivateSignal (0x0x7f4a0b6358a0) 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 (0x0x7f4a0b639a28) 0 + vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16u) + QObject (0x0x7f4a0b635840) 0 + primary-for QItemSelectionModel (0x0x7f4a0b639a28) + +Class QItemSelection + size=8 align=8 + base size=8 base align=8 +QItemSelection (0x0x7f4a0b639c30) 0 + QList (0x0x7f4a0b639c98) 0 + QListSpecialMethods (0x0x7f4a0b635ba0) 0 empty + +Class QJsonValue + size=24 align=8 + base size=20 base align=8 +QJsonValue (0x0x7f4a0b33f0c0) 0 + +Class QJsonValueRef + size=16 align=8 + base size=12 base align=8 +QJsonValueRef (0x0x7f4a0b0a87e0) 0 + +Class QJsonValuePtr + size=24 align=8 + base size=24 base align=8 +QJsonValuePtr (0x0x7f4a0b0a8d20) 0 + +Class QJsonValueRefPtr + size=16 align=8 + base size=16 base align=8 +QJsonValueRefPtr (0x0x7f4a0b0a8d80) 0 + +Class QJsonArray::iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::iterator (0x0x7f4a0b0a8f60) 0 + +Class QJsonArray::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonArray::const_iterator (0x0x7f4a0b135000) 0 + +Class QJsonArray + size=16 align=8 + base size=16 base align=8 +QJsonArray (0x0x7f4a0b0a8f00) 0 + +Class QJsonParseError + size=8 align=4 + base size=8 base align=4 +QJsonParseError (0x0x7f4a0b216240) 0 + +Class QJsonDocument + size=8 align=8 + base size=8 base align=8 +QJsonDocument (0x0x7f4a0b2162a0) 0 + +Class QJsonObject::iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::iterator (0x0x7f4a0b216900) 0 + +Class QJsonObject::const_iterator + size=16 align=8 + base size=12 base align=8 +QJsonObject::const_iterator (0x0x7f4a0b216960) 0 + +Class QJsonObject + size=16 align=8 + base size=16 base align=8 +QJsonObject (0x0x7f4a0b2168a0) 0 + +Class QLibrary::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QLibrary::QPrivateSignal (0x0x7f4a0aec9c00) 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 (0x0x7f4a0af0f000) 0 + vptr=((& QLibrary::_ZTV8QLibrary) + 16u) + QObject (0x0x7f4a0aec9ba0) 0 + primary-for QLibrary (0x0x7f4a0af0f000) + +Class QVersionNumber::SegmentStorage + size=8 align=8 + base size=8 base align=8 +QVersionNumber::SegmentStorage (0x0x7f4a0af5b300) 0 + +Class QVersionNumber + size=8 align=8 + base size=8 base align=8 +QVersionNumber (0x0x7f4a0aec9de0) 0 + +Class QLibraryInfo + size=1 align=1 + base size=0 base align=1 +QLibraryInfo (0x0x7f4a0af5b7e0) 0 empty + +Class QPoint + size=8 align=4 + base size=8 base align=4 +QPoint (0x0x7f4a0af5b840) 0 + +Class QPointF + size=16 align=8 + base size=16 base align=8 +QPointF (0x0x7f4a0af5bae0) 0 + +Class QLine + size=16 align=4 + base size=16 base align=4 +QLine (0x0x7f4a0af5bd80) 0 + +Class QLineF + size=32 align=8 + base size=32 base align=8 +QLineF (0x0x7f4a0b051720) 0 + +Class QLinkedListData + size=32 align=8 + base size=25 base align=8 +QLinkedListData (0x0x7f4a0ace40c0) 0 + +Class QLockFile + size=8 align=8 + base size=8 base align=8 +QLockFile (0x0x7f4a0ace4420) 0 + +Class QLoggingCategory::AtomicBools + size=4 align=1 + base size=4 base align=1 +QLoggingCategory::AtomicBools (0x0x7f4a0ace45a0) 0 + +Class QLoggingCategory + size=24 align=8 + base size=24 base align=8 +QLoggingCategory (0x0x7f4a0ace4540) 0 + +Class QMargins + size=16 align=4 + base size=16 base align=4 +QMargins (0x0x7f4a0ace4720) 0 + +Class QMarginsF + size=32 align=8 + base size=32 base align=8 +QMarginsF (0x0x7f4a0ace49c0) 0 + +Class QMessageAuthenticationCode + size=8 align=8 + base size=8 base align=8 +QMessageAuthenticationCode (0x0x7f4a0aa84060) 0 + +Class QMetaMethod + size=16 align=8 + base size=12 base align=8 +QMetaMethod (0x0x7f4a0aa840c0) 0 + +Class QMetaEnum + size=16 align=8 + base size=12 base align=8 +QMetaEnum (0x0x7f4a0aa846c0) 0 + +Class QMetaProperty + size=32 align=8 + base size=32 base align=8 +QMetaProperty (0x0x7f4a0aa849c0) 0 + +Class QMetaClassInfo + size=16 align=8 + base size=12 base align=8 +QMetaClassInfo (0x0x7f4a0aa84a20) 0 + +Class QMimeData::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QMimeData::QPrivateSignal (0x0x7f4a0aa84d20) 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 (0x0x7f4a0aade270) 0 + vptr=((& QMimeData::_ZTV9QMimeData) + 16u) + QObject (0x0x7f4a0aa84cc0) 0 + primary-for QMimeData (0x0x7f4a0aade270) + +Class QMimeType + size=8 align=8 + base size=8 base align=8 +QMimeType (0x0x7f4a0aa84d80) 0 + +Class QMimeDatabase + size=8 align=8 + base size=8 base align=8 +QMimeDatabase (0x0x7f4a0ab230c0) 0 + +Class QObjectCleanupHandler::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QObjectCleanupHandler::QPrivateSignal (0x0x7f4a0ab23180) 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 (0x0x7f4a0aade478) 0 + vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16u) + QObject (0x0x7f4a0ab23120) 0 + primary-for QObjectCleanupHandler (0x0x7f4a0aade478) + +Class QOperatingSystemVersion + size=16 align=4 + base size=16 base align=4 +QOperatingSystemVersion (0x0x7f4a0ab231e0) 0 + +Class QParallelAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QParallelAnimationGroup::QPrivateSignal (0x0x7f4a0ab23960) 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 (0x0x7f4a0aadebc8) 0 + vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16u) + QAnimationGroup (0x0x7f4a0aadec30) 0 + primary-for QParallelAnimationGroup (0x0x7f4a0aadebc8) + QAbstractAnimation (0x0x7f4a0aadec98) 0 + primary-for QAnimationGroup (0x0x7f4a0aadec30) + QObject (0x0x7f4a0ab23900) 0 + primary-for QAbstractAnimation (0x0x7f4a0aadec98) + +Class QPauseAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPauseAnimation::QPrivateSignal (0x0x7f4a0ab23a20) 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 (0x0x7f4a0aaded00) 0 + vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16u) + QAbstractAnimation (0x0x7f4a0aaded68) 0 + primary-for QPauseAnimation (0x0x7f4a0aaded00) + QObject (0x0x7f4a0ab239c0) 0 + primary-for QAbstractAnimation (0x0x7f4a0aaded68) + +Class QStaticPlugin + size=16 align=8 + base size=16 base align=8 +QStaticPlugin (0x0x7f4a0ab23c00) 0 + +Class QPluginLoader::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPluginLoader::QPrivateSignal (0x0x7f4a0ab23f00) 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 (0x0x7f4a0aadef70) 0 + vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16u) + QObject (0x0x7f4a0ab23ea0) 0 + primary-for QPluginLoader (0x0x7f4a0aadef70) + +Class QProcessEnvironment + size=8 align=8 + base size=8 base align=8 +QProcessEnvironment (0x0x7f4a0ab23f60) 0 + +Class QProcess::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QProcess::QPrivateSignal (0x0x7f4a0abbf660) 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 (0x0x7f4a0abd25b0) 0 + vptr=((& QProcess::_ZTV8QProcess) + 16u) + QIODevice (0x0x7f4a0abd2618) 0 + primary-for QProcess (0x0x7f4a0abd25b0) + QObject (0x0x7f4a0abbf600) 0 + primary-for QIODevice (0x0x7f4a0abd2618) + +Class QVariantAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QVariantAnimation::QPrivateSignal (0x0x7f4a0abbf720) 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 (0x0x7f4a0abd2680) 0 + vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16u) + QAbstractAnimation (0x0x7f4a0abd26e8) 0 + primary-for QVariantAnimation (0x0x7f4a0abd2680) + QObject (0x0x7f4a0abbf6c0) 0 + primary-for QAbstractAnimation (0x0x7f4a0abd26e8) + +Class QPropertyAnimation::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QPropertyAnimation::QPrivateSignal (0x0x7f4a0abbf7e0) 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 (0x0x7f4a0abd27b8) 0 + vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16u) + QVariantAnimation (0x0x7f4a0abd2820) 0 + primary-for QPropertyAnimation (0x0x7f4a0abd27b8) + QAbstractAnimation (0x0x7f4a0abd2888) 0 + primary-for QVariantAnimation (0x0x7f4a0abd2820) + QObject (0x0x7f4a0abbf780) 0 + primary-for QAbstractAnimation (0x0x7f4a0abd2888) + +Class QRandomGenerator::Storage + size=2504 align=8 + base size=2504 base align=8 +QRandomGenerator::Storage (0x0x7f4a0abbf900) 0 + +Class QRandomGenerator + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator (0x0x7f4a0abbf8a0) 0 + +Class QRandomGenerator64 + size=2512 align=8 + base size=2512 base align=8 +QRandomGenerator64 (0x0x7f4a0a8b5b60) 0 + QRandomGenerator (0x0x7f4a0a8bb8a0) 0 + +Class QReadWriteLock + size=8 align=8 + base size=8 base align=8 +QReadWriteLock (0x0x7f4a0a8bb960) 0 + +Class QReadLocker + size=8 align=8 + base size=8 base align=8 +QReadLocker (0x0x7f4a0a8bbc00) 0 + +Class QWriteLocker + size=8 align=8 + base size=8 base align=8 +QWriteLocker (0x0x7f4a0a8bbcc0) 0 + +Class QSize + size=8 align=4 + base size=8 base align=4 +QSize (0x0x7f4a0a8bbd80) 0 + +Class QSizeF + size=16 align=8 + base size=16 base align=8 +QSizeF (0x0x7f4a0a99c060) 0 + +Class QRect + size=16 align=4 + base size=16 base align=4 +QRect (0x0x7f4a0a99c300) 0 + +Class QRectF + size=32 align=8 + base size=32 base align=8 +QRectF (0x0x7f4a0a99c5a0) 0 + +Class QRegularExpression + size=8 align=8 + base size=8 base align=8 +QRegularExpression (0x0x7f4a0a99c840) 0 + +Class QRegularExpressionMatch + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatch (0x0x7f4a0a99ce40) 0 + +Class QRegularExpressionMatchIterator + size=8 align=8 + base size=8 base align=8 +QRegularExpressionMatchIterator (0x0x7f4a0a7c6180) 0 + +Class QResource + size=8 align=8 + base size=8 base align=8 +QResource (0x0x7f4a0a7c6480) 0 + +Class QSaveFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSaveFile::QPrivateSignal (0x0x7f4a0a7c6600) 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 (0x0x7f4a0a9dcd68) 0 + vptr=((& QSaveFile::_ZTV9QSaveFile) + 16u) + QFileDevice (0x0x7f4a0a9dcdd0) 0 + primary-for QSaveFile (0x0x7f4a0a9dcd68) + QIODevice (0x0x7f4a0a9dce38) 0 + primary-for QFileDevice (0x0x7f4a0a9dcdd0) + QObject (0x0x7f4a0a7c65a0) 0 + primary-for QIODevice (0x0x7f4a0a9dce38) + +Class QSemaphore + size=8 align=8 + base size=8 base align=8 +QSemaphore (0x0x7f4a0a7c66c0) 0 + +Class QSemaphoreReleaser + size=16 align=8 + base size=12 base align=8 +QSemaphoreReleaser (0x0x7f4a0a7c6840) 0 + +Class QSequentialAnimationGroup::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSequentialAnimationGroup::QPrivateSignal (0x0x7f4a0a521e40) 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 (0x0x7f4a0a53a6e8) 0 + vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16u) + QAnimationGroup (0x0x7f4a0a53a750) 0 + primary-for QSequentialAnimationGroup (0x0x7f4a0a53a6e8) + QAbstractAnimation (0x0x7f4a0a53a7b8) 0 + primary-for QAnimationGroup (0x0x7f4a0a53a750) + QObject (0x0x7f4a0a521de0) 0 + primary-for QAbstractAnimation (0x0x7f4a0a53a7b8) + +Class QSettings::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSettings::QPrivateSignal (0x0x7f4a0a521f00) 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 (0x0x7f4a0a53a820) 0 + vptr=((& QSettings::_ZTV9QSettings) + 16u) + QObject (0x0x7f4a0a521ea0) 0 + primary-for QSettings (0x0x7f4a0a53a820) + +Class QSharedMemory::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSharedMemory::QPrivateSignal (0x0x7f4a0a57f000) 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 (0x0x7f4a0a53a888) 0 + vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16u) + QObject (0x0x7f4a0a521f60) 0 + primary-for QSharedMemory (0x0x7f4a0a53a888) + +Class QSignalMapper::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalMapper::QPrivateSignal (0x0x7f4a0a57f0c0) 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 (0x0x7f4a0a53a8f0) 0 + vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16u) + QObject (0x0x7f4a0a57f060) 0 + primary-for QSignalMapper (0x0x7f4a0a53a8f0) + +Class QSignalTransition::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSignalTransition::QPrivateSignal (0x0x7f4a0a57f180) 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 (0x0x7f4a0a53a958) 0 + vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16u) + QAbstractTransition (0x0x7f4a0a53a9c0) 0 + primary-for QSignalTransition (0x0x7f4a0a53a958) + QObject (0x0x7f4a0a57f120) 0 + primary-for QAbstractTransition (0x0x7f4a0a53a9c0) + +Class QSocketNotifier::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSocketNotifier::QPrivateSignal (0x0x7f4a0a57f240) 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 (0x0x7f4a0a53aa28) 0 + vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16u) + QObject (0x0x7f4a0a57f1e0) 0 + primary-for QSocketNotifier (0x0x7f4a0a53aa28) + +Class QSortFilterProxyModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QSortFilterProxyModel::QPrivateSignal (0x0x7f4a0a57f300) 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 (0x0x7f4a0a53aa90) 0 + vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16u) + QAbstractProxyModel (0x0x7f4a0a53aaf8) 0 + primary-for QSortFilterProxyModel (0x0x7f4a0a53aa90) + QAbstractItemModel (0x0x7f4a0a53ab60) 0 + primary-for QAbstractProxyModel (0x0x7f4a0a53aaf8) + QObject (0x0x7f4a0a57f2a0) 0 + primary-for QAbstractItemModel (0x0x7f4a0a53ab60) + +Class QStandardPaths + size=1 align=1 + base size=0 base align=1 +QStandardPaths (0x0x7f4a0a57f3c0) 0 empty + +Class QState::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QState::QPrivateSignal (0x0x7f4a0a57f600) 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 (0x0x7f4a0a53ad00) 0 + vptr=((& QState::_ZTV6QState) + 16u) + QAbstractState (0x0x7f4a0a53ad68) 0 + primary-for QState (0x0x7f4a0a53ad00) + QObject (0x0x7f4a0a57f5a0) 0 + primary-for QAbstractState (0x0x7f4a0a53ad68) + +Class QStateMachine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStateMachine::QPrivateSignal (0x0x7f4a0a57f720) 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 (0x0x7f4a0a53af08) 0 + vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16u) + QEvent (0x0x7f4a0a57f780) 0 + primary-for QStateMachine::SignalEvent (0x0x7f4a0a53af08) + +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 (0x0x7f4a0a53af70) 0 + vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16u) + QEvent (0x0x7f4a0a57f7e0) 0 + primary-for QStateMachine::WrappedEvent (0x0x7f4a0a53af70) + +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 (0x0x7f4a0a53add0) 0 + vptr=((& QStateMachine::_ZTV13QStateMachine) + 16u) + QState (0x0x7f4a0a53ae38) 0 + primary-for QStateMachine (0x0x7f4a0a53add0) + QAbstractState (0x0x7f4a0a53aea0) 0 + primary-for QState (0x0x7f4a0a53ae38) + QObject (0x0x7f4a0a57f6c0) 0 + primary-for QAbstractState (0x0x7f4a0a53aea0) + +Class QStorageInfo + size=8 align=8 + base size=8 base align=8 +QStorageInfo (0x0x7f4a0a57f840) 0 + +Class QAbstractConcatenable + size=1 align=1 + base size=0 base align=1 +QAbstractConcatenable (0x0x7f4a0a291780) 0 empty + +Class QStringListModel::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QStringListModel::QPrivateSignal (0x0x7f4a0a31db40) 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 (0x0x7f4a0a30cf70) 0 + vptr=((& QStringListModel::_ZTV16QStringListModel) + 16u) + QAbstractListModel (0x0x7f4a0a356000) 0 + primary-for QStringListModel (0x0x7f4a0a30cf70) + QAbstractItemModel (0x0x7f4a0a356068) 0 + primary-for QAbstractListModel (0x0x7f4a0a356000) + QObject (0x0x7f4a0a31dae0) 0 + primary-for QAbstractItemModel (0x0x7f4a0a356068) + +Class QSystemSemaphore + size=8 align=8 + base size=8 base align=8 +QSystemSemaphore (0x0x7f4a0a31dba0) 0 + +Class QTemporaryDir + size=8 align=8 + base size=8 base align=8 +QTemporaryDir (0x0x7f4a0a31dc60) 0 + +Class QTemporaryFile::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTemporaryFile::QPrivateSignal (0x0x7f4a0a31dd80) 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 (0x0x7f4a0a3560d0) 0 + vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16u) + QFile (0x0x7f4a0a356138) 0 + primary-for QTemporaryFile (0x0x7f4a0a3560d0) + QFileDevice (0x0x7f4a0a3561a0) 0 + primary-for QFile (0x0x7f4a0a356138) + QIODevice (0x0x7f4a0a356208) 0 + primary-for QFileDevice (0x0x7f4a0a3561a0) + QObject (0x0x7f4a0a31dd20) 0 + primary-for QIODevice (0x0x7f4a0a356208) + +Class QTextBoundaryFinder + size=48 align=8 + base size=48 base align=8 +QTextBoundaryFinder (0x0x7f4a0a31dde0) 0 + +Class QTextCodec::ConverterState + size=32 align=8 + base size=32 base align=8 +QTextCodec::ConverterState (0x0x7f4a0a3d5060) 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 0u +64 0u + +Class QTextCodec + size=8 align=8 + base size=8 base align=8 +QTextCodec (0x0x7f4a0a3d5000) 0 nearly-empty + vptr=((& QTextCodec::_ZTV10QTextCodec) + 16u) + +Class QTextEncoder + size=40 align=8 + base size=40 base align=8 +QTextEncoder (0x0x7f4a0a3d5240) 0 + +Class QTextDecoder + size=40 align=8 + base size=40 base align=8 +QTextDecoder (0x0x7f4a0a3d52a0) 0 + +Class std::__mutex_base + size=40 align=8 + base size=40 base align=8 +std::__mutex_base (0x0x7f4a0a3d5300) 0 + +Class std::__recursive_mutex_base + size=40 align=8 + base size=40 base align=8 +std::__recursive_mutex_base (0x0x7f4a0a3d5360) 0 + +Class std::mutex + size=40 align=8 + base size=40 base align=8 +std::mutex (0x0x7f4a0a356410) 0 + std::__mutex_base (0x0x7f4a0a3d53c0) 0 + +Class std::recursive_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_mutex (0x0x7f4a0a356478) 0 + std::__recursive_mutex_base (0x0x7f4a0a3d5420) 0 + +Class std::timed_mutex + size=40 align=8 + base size=40 base align=8 +std::timed_mutex (0x0x7f4a0a43ab60) 0 + std::__mutex_base (0x0x7f4a0a3d5540) 0 + std::__timed_mutex_impl (0x0x7f4a0a3d55a0) 0 empty + +Class std::recursive_timed_mutex + size=40 align=8 + base size=40 base align=8 +std::recursive_timed_mutex (0x0x7f4a0a45a540) 0 + std::__recursive_mutex_base (0x0x7f4a0a3d5660) 0 + std::__timed_mutex_impl (0x0x7f4a0a3d56c0) 0 empty + +Class std::defer_lock_t + size=1 align=1 + base size=0 base align=1 +std::defer_lock_t (0x0x7f4a0a3d5720) 0 empty + +Class std::try_to_lock_t + size=1 align=1 + base size=0 base align=1 +std::try_to_lock_t (0x0x7f4a0a3d5780) 0 empty + +Class std::adopt_lock_t + size=1 align=1 + base size=0 base align=1 +std::adopt_lock_t (0x0x7f4a0a3d57e0) 0 empty + +Class std::once_flag + size=4 align=4 + base size=4 base align=4 +std::once_flag (0x0x7f4a0a3d5a20) 0 + +Vtable for __gnu_cxx::__concurrence_lock_error +__gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_lock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +24 (int (*)(...))__gnu_cxx::__concurrence_lock_error::~__concurrence_lock_error +32 (int (*)(...))__gnu_cxx::__concurrence_lock_error::what + +Class __gnu_cxx::__concurrence_lock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_lock_error (0x0x7f4a0a3565b0) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE) + 16u) + std::exception (0x0x7f4a0a3d5ae0) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_lock_error (0x0x7f4a0a3565b0) + +Vtable for __gnu_cxx::__concurrence_unlock_error +__gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx26__concurrence_unlock_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +24 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::~__concurrence_unlock_error +32 (int (*)(...))__gnu_cxx::__concurrence_unlock_error::what + +Class __gnu_cxx::__concurrence_unlock_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_unlock_error (0x0x7f4a0a356618) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE) + 16u) + std::exception (0x0x7f4a0a3d5ba0) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_unlock_error (0x0x7f4a0a356618) + +Vtable for __gnu_cxx::__concurrence_broadcast_error +__gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx29__concurrence_broadcast_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +24 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::~__concurrence_broadcast_error +32 (int (*)(...))__gnu_cxx::__concurrence_broadcast_error::what + +Class __gnu_cxx::__concurrence_broadcast_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_broadcast_error (0x0x7f4a0a356680) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE) + 16u) + std::exception (0x0x7f4a0a3d5c60) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_broadcast_error (0x0x7f4a0a356680) + +Vtable for __gnu_cxx::__concurrence_wait_error +__gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTIN9__gnu_cxx24__concurrence_wait_errorE) +16 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +24 (int (*)(...))__gnu_cxx::__concurrence_wait_error::~__concurrence_wait_error +32 (int (*)(...))__gnu_cxx::__concurrence_wait_error::what + +Class __gnu_cxx::__concurrence_wait_error + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__concurrence_wait_error (0x0x7f4a0a356750) 0 nearly-empty + vptr=((& __gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE) + 16u) + std::exception (0x0x7f4a0a3d5d20) 0 nearly-empty + primary-for __gnu_cxx::__concurrence_wait_error (0x0x7f4a0a356750) + +Class __gnu_cxx::__mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__mutex (0x0x7f4a0a3d5de0) 0 + +Class __gnu_cxx::__recursive_mutex + size=40 align=8 + base size=40 base align=8 +__gnu_cxx::__recursive_mutex (0x0x7f4a0a3d5e40) 0 + +Class __gnu_cxx::__scoped_lock + size=8 align=8 + base size=8 base align=8 +__gnu_cxx::__scoped_lock (0x0x7f4a0a3d5ea0) 0 + +Class __gnu_cxx::__cond + size=48 align=8 + base size=48 base align=8 +__gnu_cxx::__cond (0x0x7f4a0a3d5f00) 0 + +Vtable for std::bad_weak_ptr +std::bad_weak_ptr::_ZTVSt12bad_weak_ptr: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12bad_weak_ptr) +16 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +24 (int (*)(...))std::bad_weak_ptr::~bad_weak_ptr +32 (int (*)(...))std::bad_weak_ptr::what + +Class std::bad_weak_ptr + size=8 align=8 + base size=8 base align=8 +std::bad_weak_ptr (0x0x7f4a0a356a28) 0 nearly-empty + vptr=((& std::bad_weak_ptr::_ZTVSt12bad_weak_ptr) + 16u) + std::exception (0x0x7f4a0a0042a0) 0 nearly-empty + primary-for std::bad_weak_ptr (0x0x7f4a0a356a28) + +Class std::_Sp_make_shared_tag + size=1 align=1 + base size=0 base align=1 +std::_Sp_make_shared_tag (0x0x7f4a0a004ae0) 0 empty + +Class std::_Sp_locker + size=2 align=1 + base size=2 base align=1 +std::_Sp_locker (0x0x7f4a09d9c300) 0 + +Class std::thread::id + size=8 align=8 + base size=8 base align=8 +std::thread::id (0x0x7f4a09d9c4e0) 0 + +Vtable for std::thread::_Impl_base +std::thread::_Impl_base::_ZTVNSt6thread10_Impl_baseE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt6thread10_Impl_baseE) +16 0u +24 0u +32 (int (*)(...))__cxa_pure_virtual + +Class std::thread::_Impl_base + size=24 align=8 + base size=24 base align=8 +std::thread::_Impl_base (0x0x7f4a09d9c540) 0 + vptr=((& std::thread::_Impl_base::_ZTVNSt6thread10_Impl_baseE) + 16u) + +Class std::thread + size=8 align=8 + base size=8 base align=8 +std::thread (0x0x7f4a09d9c480) 0 + +Class std::condition_variable + size=48 align=8 + base size=48 base align=8 +std::condition_variable (0x0x7f4a09b81180) 0 + +Class std::__at_thread_exit_elt + size=16 align=8 + base size=16 base align=8 +std::__at_thread_exit_elt (0x0x7f4a09b81240) 0 + +Class std::_V2::condition_variable_any + size=64 align=8 + base size=64 base align=8 +std::_V2::condition_variable_any (0x0x7f4a09b812a0) 0 + +Class std::__atomic_futex_unsigned_base + size=1 align=1 + base size=0 base align=1 +std::__atomic_futex_unsigned_base (0x0x7f4a09c3e900) 0 empty + +Vtable for std::future_error +std::future_error::_ZTVSt12future_error: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTISt12future_error) +16 (int (*)(...))std::future_error::~future_error +24 (int (*)(...))std::future_error::~future_error +32 (int (*)(...))std::future_error::what + +Class std::future_error + size=32 align=8 + base size=32 base align=8 +std::future_error (0x0x7f4a09c3dd68) 0 + vptr=((& std::future_error::_ZTVSt12future_error) + 16u) + std::logic_error (0x0x7f4a09c3ddd0) 0 + primary-for std::future_error (0x0x7f4a09c3dd68) + std::exception (0x0x7f4a09c3ea20) 0 nearly-empty + primary-for std::logic_error (0x0x7f4a09c3ddd0) + +Class std::__future_base::_Result_base::_Deleter + size=1 align=1 + base size=0 base align=1 +std::__future_base::_Result_base::_Deleter (0x0x7f4a09c3eb40) 0 empty + +Vtable for std::__future_base::_Result_base +std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE: 5u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base12_Result_baseE) +16 (int (*)(...))__cxa_pure_virtual +24 0u +32 0u + +Class std::__future_base::_Result_base + size=16 align=8 + base size=16 base align=8 +std::__future_base::_Result_base (0x0x7f4a09c3eae0) 0 + vptr=((& std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE) + 16u) + +Class std::__future_base::_State_baseV2::__exception_ptr_tag + size=1 align=1 + base size=0 base align=1 +std::__future_base::_State_baseV2::__exception_ptr_tag (0x0x7f4a099c80c0) 0 empty + +Class std::__future_base::_State_baseV2::_Make_ready + size=32 align=8 + base size=32 base align=8 +std::__future_base::_State_baseV2::_Make_ready (0x0x7f4a099ab3a8) 0 + std::__at_thread_exit_elt (0x0x7f4a099c8180) 0 + +Vtable for std::__future_base::_State_baseV2 +std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base13_State_baseV2E) +16 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +24 (int (*)(...))std::__future_base::_State_baseV2::~_State_baseV2 +32 (int (*)(...))std::__future_base::_State_baseV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_State_baseV2 + size=32 align=8 + base size=28 base align=8 +std::__future_base::_State_baseV2 (0x0x7f4a09c3ecc0) 0 + vptr=((& std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E) + 16u) + +Class std::__future_base + size=1 align=1 + base size=0 base align=1 +std::__future_base (0x0x7f4a09c3ea80) 0 empty + +Vtable for std::__future_base::_Async_state_commonV2 +std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E: 6u entries +0 (int (*)(...))0 +8 (int (*)(...))(& _ZTINSt13__future_base21_Async_state_commonV2E) +16 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +24 (int (*)(...))std::__future_base::_Async_state_commonV2::~_Async_state_commonV2 +32 (int (*)(...))std::__future_base::_Async_state_commonV2::_M_complete_async +40 (int (*)(...))std::__future_base::_State_baseV2::_M_is_deferred_future + +Class std::__future_base::_Async_state_commonV2 + size=48 align=8 + base size=44 base align=8 +std::__future_base::_Async_state_commonV2 (0x0x7f4a096f2f70) 0 + vptr=((& std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E) + 16u) + std::__future_base::_State_baseV2 (0x0x7f4a0934c060) 0 + primary-for std::__future_base::_Async_state_commonV2 (0x0x7f4a096f2f70) + +Class QThread::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThread::QPrivateSignal (0x0x7f4a0934c780) 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 (0x0x7f4a09356a28) 0 + vptr=((& QThread::_ZTV7QThread) + 16u) + QObject (0x0x7f4a0934c720) 0 + primary-for QThread (0x0x7f4a09356a28) + +Class QThreadPool::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QThreadPool::QPrivateSignal (0x0x7f4a0934c8a0) 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 (0x0x7f4a09356a90) 0 + vptr=((& QThreadPool::_ZTV11QThreadPool) + 16u) + QObject (0x0x7f4a0934c840) 0 + primary-for QThreadPool (0x0x7f4a09356a90) + +Class QThreadStorageData + size=4 align=4 + base size=4 base align=4 +QThreadStorageData (0x0x7f4a0934c900) 0 + +Class QTimeLine::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimeLine::QPrivateSignal (0x0x7f4a0934ca20) 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 (0x0x7f4a09356af8) 0 + vptr=((& QTimeLine::_ZTV9QTimeLine) + 16u) + QObject (0x0x7f4a0934c9c0) 0 + primary-for QTimeLine (0x0x7f4a09356af8) + +Class QTimer::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTimer::QPrivateSignal (0x0x7f4a0934cae0) 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 (0x0x7f4a09356b60) 0 + vptr=((& QTimer::_ZTV6QTimer) + 16u) + QObject (0x0x7f4a0934ca80) 0 + primary-for QTimer (0x0x7f4a09356b60) + +Class QTimeZone::OffsetData + size=32 align=8 + base size=28 base align=8 +QTimeZone::OffsetData (0x0x7f4a0941a1e0) 0 + +Class QTimeZone + size=8 align=8 + base size=8 base align=8 +QTimeZone (0x0x7f4a0941a180) 0 + +Class QTranslator::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QTranslator::QPrivateSignal (0x0x7f4a0941a780) 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 (0x0x7f4a094155b0) 0 + vptr=((& QTranslator::_ZTV11QTranslator) + 16u) + QObject (0x0x7f4a0941a720) 0 + primary-for QTranslator (0x0x7f4a094155b0) + +Class QUrl + size=8 align=8 + base size=8 base align=8 +QUrl (0x0x7f4a0941a8a0) 0 + +Class QUrlQuery + size=8 align=8 + base size=8 base align=8 +QUrlQuery (0x0x7f4a09156f60) 0 + +Class QUuid + size=16 align=4 + base size=16 base align=4 +QUuid (0x0x7f4a091ec600) 0 + +Class QWaitCondition + size=8 align=8 + base size=8 base align=8 +QWaitCondition (0x0x7f4a091ecc00) 0 + +Class QXmlStreamStringRef + size=16 align=8 + base size=16 base align=8 +QXmlStreamStringRef (0x0x7f4a091ecc60) 0 + +Class QXmlStreamAttribute + size=80 align=8 + base size=73 base align=8 +QXmlStreamAttribute (0x0x7f4a091ecf00) 0 + +Class QXmlStreamAttributes + size=8 align=8 + base size=8 base align=8 +QXmlStreamAttributes (0x0x7f4a09200d68) 0 + QVector (0x0x7f4a092a1300) 0 + +Class QXmlStreamNamespaceDeclaration + size=40 align=8 + base size=40 base align=8 +QXmlStreamNamespaceDeclaration (0x0x7f4a092a1360) 0 + +Class QXmlStreamNotationDeclaration + size=56 align=8 + base size=56 base align=8 +QXmlStreamNotationDeclaration (0x0x7f4a092a1600) 0 + +Class QXmlStreamEntityDeclaration + size=88 align=8 + base size=88 base align=8 +QXmlStreamEntityDeclaration (0x0x7f4a092a18a0) 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 (0x0x7f4a092a1b40) 0 nearly-empty + vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16u) + +Class QXmlStreamReader + size=8 align=8 + base size=8 base align=8 +QXmlStreamReader (0x0x7f4a092a1ba0) 0 + +Class QXmlStreamWriter + size=8 align=8 + base size=8 base align=8 +QXmlStreamWriter (0x0x7f4a08f7a600) 0 + +Class QNdefRecord + size=8 align=8 + base size=8 base align=8 +QNdefRecord (0x0x7f4a08f7a720) 0 + +Class QNdefFilter::Record + size=24 align=8 + base size=24 base align=8 +QNdefFilter::Record (0x0x7f4a08f7a840) 0 + +Class QNdefFilter + size=8 align=8 + base size=8 base align=8 +QNdefFilter (0x0x7f4a08f7a7e0) 0 + +Class QNdefMessage + size=8 align=8 + base size=8 base align=8 +QNdefMessage (0x0x7f4a08fa9208) 0 + QList (0x0x7f4a08fa9270) 0 + QListSpecialMethods (0x0x7f4a08f7aa20) 0 empty + +Class QNdefNfcTextRecord + size=8 align=8 + base size=8 base align=8 +QNdefNfcTextRecord (0x0x7f4a08fa92d8) 0 + QNdefRecord (0x0x7f4a08f7ac00) 0 + +Class QNdefNfcUriRecord + size=8 align=8 + base size=8 base align=8 +QNdefNfcUriRecord (0x0x7f4a08fa9820) 0 + QNdefRecord (0x0x7f4a09045120) 0 + +Class QNdefNfcIconRecord + size=8 align=8 + base size=8 base align=8 +QNdefNfcIconRecord (0x0x7f4a08fa9888) 0 + QNdefRecord (0x0x7f4a09045180) 0 + +Class QNdefNfcSmartPosterRecord + size=16 align=8 + base size=16 base align=8 +QNdefNfcSmartPosterRecord (0x0x7f4a08fa98f0) 0 + QNdefRecord (0x0x7f4a090451e0) 0 + +Class QNearFieldTarget::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldTarget::QPrivateSignal (0x0x7f4a09045300) 0 empty + +Class QNearFieldTarget::RequestId + size=8 align=8 + base size=8 base align=8 +QNearFieldTarget::RequestId (0x0x7f4a09045360) 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 0u +48 0u +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 (0x0x7f4a08fa9958) 0 + vptr=((& QNearFieldTarget::_ZTV16QNearFieldTarget) + 16u) + QObject (0x0x7f4a090452a0) 0 + primary-for QNearFieldTarget (0x0x7f4a08fa9958) + +Class QNearFieldManager::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldManager::QPrivateSignal (0x0x7f4a09045720) 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 (0x0x7f4a08fa9a90) 0 + vptr=((& QNearFieldManager::_ZTV17QNearFieldManager) + 16u) + QObject (0x0x7f4a090456c0) 0 + primary-for QNearFieldManager (0x0x7f4a08fa9a90) + +Class QNearFieldShareManager::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldShareManager::QPrivateSignal (0x0x7f4a09045960) 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 (0x0x7f4a08fa9c30) 0 + vptr=((& QNearFieldShareManager::_ZTV22QNearFieldShareManager) + 16u) + QObject (0x0x7f4a09045900) 0 + primary-for QNearFieldShareManager (0x0x7f4a08fa9c30) + +Class QNearFieldShareTarget::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QNearFieldShareTarget::QPrivateSignal (0x0x7f4a09045c60) 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 (0x0x7f4a08fa9d68) 0 + vptr=((& QNearFieldShareTarget::_ZTV21QNearFieldShareTarget) + 16u) + QObject (0x0x7f4a09045c00) 0 + primary-for QNearFieldShareTarget (0x0x7f4a08fa9d68) + +Class QQmlNdefRecord::QPrivateSignal + size=1 align=1 + base size=0 base align=1 +QQmlNdefRecord::QPrivateSignal (0x0x7f4a09045d20) 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 (0x0x7f4a08fa9dd0) 0 + vptr=((& QQmlNdefRecord::_ZTV14QQmlNdefRecord) + 16u) + QObject (0x0x7f4a09045cc0) 0 + primary-for QQmlNdefRecord (0x0x7f4a08fa9dd0) + -- cgit v1.2.3 From c7f826f0c07c05948c3882242ce4d2ea0ced8a6f Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 8 Jun 2018 10:00:03 +0300 Subject: Add changes file for Qt 5.11.1 Change-Id: Ieebe865e9d4eb9248c9686559c3686486729bbb4 Reviewed-by: Timur Pocheptsov --- dist/changes-5.11.1 | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 dist/changes-5.11.1 diff --git a/dist/changes-5.11.1 b/dist/changes-5.11.1 new file mode 100644 index 00000000..b4df5c88 --- /dev/null +++ b/dist/changes-5.11.1 @@ -0,0 +1,54 @@ +Qt 5.11.1 is a bug-fix release. It maintains both forward and backward +compatibility (source and binary) with Qt 5.11.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/index.html + +The Qt version 5.11 series is binary compatible with the 5.10.x series. +Applications compiled for 5.10 will continue to run with 5.11. + +Some of the changes listed in this file include issue tracking numbers +corresponding to tasks in the Qt Bug Tracker: + +https://bugreports.qt.io/ + +Each of these identifiers can be entered in the bug tracker to obtain more +information about a particular change. + +**************************************************************************** +* Qt 5.11.1 Changes * +**************************************************************************** + +QtBluetooth +----------- + + - [QTBUG-67672] Addressed missing emission of readChannelFinished() in + QBluetoothSocket as required by QIODevice. + +**************************************************************************** +* Platform Specific Changes * +**************************************************************************** + +Android +------- + + - [QTBUG-65826] Fixed crash in QLowEnergyController during service discovery. + +iOS/macOS +--------- + + - [QTBUG-68422] Fixed never-ending QLowEnergyController service discovery due + to remote peripheral devices not responding properly to requests. A timeout + was added to catch such cases. + +Linux/BlueZ +----------- + + - [QTBUG-64735] Fixed blocking QBluetoothLocalDevice::requestPairing() call + which should not block. + + - Fixed missing service invalidation when calling + QLowEnergyController::disconnectService(). + -- cgit v1.2.3 From 57ab030cdb245750e1043e3c5ca99c4f409cc868 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 15 Jun 2018 13:24:36 +0200 Subject: Fix QLEController::connectToDevice() on reconnect behavior If the desired remote peripheral is already connected, the next call to connectToDevice() does not succeed. The code path to handle this situation already exists it was forgotten to emit the relevant connected() signal. This patch fixes the problem. The problem only exists on Bluez 5.42+ platforms which use the DBus central implementation. [ChangeLog][Platform Specific Changes][Linux] Fixed missing emission of QLEController::connected() upon reconnect to already connected device. This affected platforms with Bluez 5.42+ only. Task-number: QTBUG-68911 Change-Id: Ife2f3b41c33a142d6627e433cb3b141ce9b1ff8a Reviewed-by: Maurice Kalinowski Reviewed-by: Timur Pocheptsov Reviewed-by: Alex Blasche Reviewed-by: Oliver Wolff --- src/bluetooth/qlowenergycontroller_bluezdbus.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp index afc4b8c1..8f001f92 100644 --- a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp +++ b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp @@ -289,7 +289,10 @@ void QLowEnergyControllerPrivateBluezDBus::connectToDevice() if (device->connected() && device->servicesResolved()) { //connectToDevice is noop disconnectSignalRequired = true; + setState(QLowEnergyController::ConnectedState); + Q_Q(QLowEnergyController); + emit q->connected(); return; } -- cgit v1.2.3 From 8bdacf17c5b00b462984004a936882d1c8b0e234 Mon Sep 17 00:00:00 2001 From: Paul Wicking Date: Mon, 18 Jun 2018 15:50:40 +0200 Subject: Doc: Add missing dots (qtconnectivity) Task-number: QTBUG-68933 Change-Id: I51d80cbc5ab1b3c8938e5004e399a9df4e7af5e0 Reviewed-by: Alex Blasche --- src/nfc/qndefnfctextrecord.cpp | 2 +- src/nfc/qndefnfcurirecord.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/nfc/qndefnfctextrecord.cpp b/src/nfc/qndefnfctextrecord.cpp index 78736cc0..95fb4c66 100644 --- a/src/nfc/qndefnfctextrecord.cpp +++ b/src/nfc/qndefnfctextrecord.cpp @@ -46,7 +46,7 @@ QT_BEGIN_NAMESPACE /*! \class QNdefNfcTextRecord - \brief The QNdefNfcTextRecord class provides an NFC RTD-Text + \brief The QNdefNfcTextRecord class provides an NFC RTD-Text. \ingroup connectivity-nfc \inmodule QtNfc diff --git a/src/nfc/qndefnfcurirecord.cpp b/src/nfc/qndefnfcurirecord.cpp index 44b17adf..3438d9f2 100644 --- a/src/nfc/qndefnfcurirecord.cpp +++ b/src/nfc/qndefnfcurirecord.cpp @@ -48,7 +48,7 @@ QT_BEGIN_NAMESPACE /*! \class QNdefNfcUriRecord - \brief The QNdefNfcUriRecord class provides an NFC RTD-URI + \brief The QNdefNfcUriRecord class provides an NFC RTD-URI. \ingroup connectivity-nfc \inmodule QtNfc -- cgit v1.2.3 From b6c0e2af96129c297b87c25796a36c3fbc680269 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 18 Jun 2018 14:17:00 +0200 Subject: QtBluetooth - handle timeous in characteristic writes (Darwin OS) This can allegedly happen when executing write with notification. While never observed so far, can easily be predicted/emulated, resulting in QLEC stuck in queued write/read requests and not progressing any futher. Task-number: QTBUG-68707 Change-Id: I3321257bb84a83a8ea25f9ae4e8acbdb95568cfa Reviewed-by: Alex Blasche --- src/bluetooth/osx/osxbtcentralmanager.mm | 8 ++++++++ src/bluetooth/osx/osxbtcentralmanager_p.h | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/bluetooth/osx/osxbtcentralmanager.mm b/src/bluetooth/osx/osxbtcentralmanager.mm index b56dc0d5..9254bd98 100644 --- a/src/bluetooth/osx/osxbtcentralmanager.mm +++ b/src/bluetooth/osx/osxbtcentralmanager.mm @@ -229,6 +229,9 @@ QT_END_NAMESPACE qCWarning(QT_BT_OSX, "Timeout while reading a descriptor"); [self peripheral:peripheral didUpdateValueForDescriptor:objectUnderWatch error:nsError]; break; + case OperationTimeout::characteristicWrite: + qCWarning(QT_BT_OSX, "Timeout while writing a characteristic with response"); + [self peripheral:peripheral didWriteValueForCharacteristic:objectUnderWatch error:nsError]; default:; } } @@ -751,6 +754,7 @@ QT_END_NAMESPACE return [self performNextRequest]; requestPending = true; + [self watchAfter:characteristic timeout:OperationTimeout::characteristicWrite]; [peripheral writeValue:data.data() forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse]; } else { @@ -1621,6 +1625,10 @@ QT_END_NAMESPACE QT_BT_MAC_AUTORELEASEPOOL; + if (characteristic != objectUnderWatch) + return; + + [self stopWatchdog]; requestPending = false; diff --git a/src/bluetooth/osx/osxbtcentralmanager_p.h b/src/bluetooth/osx/osxbtcentralmanager_p.h index c0f278b2..e172d874 100644 --- a/src/bluetooth/osx/osxbtcentralmanager_p.h +++ b/src/bluetooth/osx/osxbtcentralmanager_p.h @@ -95,7 +95,8 @@ enum class OperationTimeout characteristicsDiscovery, characteristicRead, descriptorsDiscovery, - descriptorRead + descriptorRead, + characteristicWrite }; // In Qt we work with handles and UUIDs. Core Bluetooth -- cgit v1.2.3 From c754e16ceddaf6826d2a74775df8409b3278d5b8 Mon Sep 17 00:00:00 2001 From: Lars Schmertmann Date: Tue, 19 Jun 2018 12:50:31 +0200 Subject: Fix "QMetaObject::invokeMethod: No such method" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-number: QTBUG-67958 Change-Id: I03dbf411d6a1b2a710d13c1eb5f1f75d594d2a9a Reviewed-by: Alex Blasche Reviewed-by: André Klitzing --- src/nfc/qnearfieldtarget_android.cpp | 10 ++++++---- src/nfc/qnearfieldtarget_neard_p.h | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/nfc/qnearfieldtarget_android.cpp b/src/nfc/qnearfieldtarget_android.cpp index 26f3d429..30b2eeca 100644 --- a/src/nfc/qnearfieldtarget_android.cpp +++ b/src/nfc/qnearfieldtarget_android.cpp @@ -193,8 +193,9 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages() QNdefMessage qNdefMessage = QNdefMessage::fromByteArray(ndefMessageQBA); QMetaObject::invokeMethod(this, "ndefMessageRead", Qt::QueuedConnection, Q_ARG(QNdefMessage, qNdefMessage)); - QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::RequestId, requestId)); + QMetaObject::invokeMethod(this, [this, requestId]() { + Q_EMIT this->requestCompleted(requestId); + }, Qt::QueuedConnection); QMetaObject::invokeMethod(this, "ndefMessageRead", Qt::QueuedConnection, Q_ARG(QNdefMessage, qNdefMessage), Q_ARG(QNearFieldTarget::RequestId, requestId)); @@ -273,8 +274,9 @@ QNearFieldTarget::RequestId NearFieldTarget::sendCommand(const QByteArray &comma // Closing connection disconnect(); // IOException at this point does not matter anymore. } - QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + QMetaObject::invokeMethod(this, [this, requestId]() { + Q_EMIT this->requestCompleted(requestId); + }, Qt::QueuedConnection); return requestId; } diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h index 78dedeeb..053df141 100644 --- a/src/nfc/qnearfieldtarget_neard_p.h +++ b/src/nfc/qnearfieldtarget_neard_p.h @@ -355,8 +355,9 @@ private: QMetaObject::invokeMethod(this, "ndefMessageRead", Qt::QueuedConnection, Q_ARG(QNdefMessage, newNdefMessage)); // the request id in requestCompleted has to match the one created in readNdefMessages - QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::RequestId, m_currentReadRequestId)); + QMetaObject::invokeMethod(this, [this]() { + Q_EMIT this->requestCompleted(this->m_currentReadRequestId); + }, Qt::QueuedConnection); } else { QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnknownError), @@ -394,8 +395,9 @@ private: } QMetaObject::invokeMethod(this, "ndefMessagesWritten", Qt::QueuedConnection); - QMetaObject::invokeMethod(this, "requestCompleted", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::RequestId, m_currentWriteRequestId)); + QMetaObject::invokeMethod(this, [this]() { + Q_EMIT this->requestCompleted(this->m_currentWriteRequestId); + }, Qt::QueuedConnection); } // invalidate current write request -- cgit v1.2.3 From 3e1c520f039484a9ecc5d6aacea5d761a183dc47 Mon Sep 17 00:00:00 2001 From: Lars Schmertmann Date: Mon, 18 Jun 2018 11:24:01 +0200 Subject: Use functor-based connections in the nfc implementation Change-Id: I90b6f044a902dabd08f0eccfc55438aab571c331 Reviewed-by: Alex Blasche --- src/nfc/neard/neard_helper.cpp | 8 ++++---- src/nfc/qllcpsocket_android_p.cpp | 6 +++--- src/nfc/qnearfieldmanager.cpp | 16 ++++++++-------- src/nfc/qnearfieldmanager_android.cpp | 32 ++++++++++++++++---------------- src/nfc/qnearfieldmanager_emulator.cpp | 4 ++-- src/nfc/qnearfieldmanager_neard.cpp | 8 ++++---- 6 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/nfc/neard/neard_helper.cpp b/src/nfc/neard/neard_helper.cpp index ef0447a0..9922c1a8 100644 --- a/src/nfc/neard/neard_helper.cpp +++ b/src/nfc/neard/neard_helper.cpp @@ -62,10 +62,10 @@ NeardHelper::NeardHelper(QObject *parent) : 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))); + connect(m_dbusObjectManager, &OrgFreedesktopDBusObjectManagerInterface::InterfacesAdded, + this, &NeardHelper::interfacesAdded); + connect(m_dbusObjectManager, &OrgFreedesktopDBusObjectManagerInterface::InterfacesRemoved, + this, &NeardHelper::interfacesRemoved); } NeardHelper *NeardHelper::instance() diff --git a/src/nfc/qllcpsocket_android_p.cpp b/src/nfc/qllcpsocket_android_p.cpp index e29634d4..26b50c34 100644 --- a/src/nfc/qllcpsocket_android_p.cpp +++ b/src/nfc/qllcpsocket_android_p.cpp @@ -71,7 +71,7 @@ void QLlcpSocketPrivate::connectToService(QNearFieldTarget *target, const QStrin QNXNFCManager::instance()->registerLLCPConnection(m_conListener, this); qQNXNFCDebug() << "Connecting client socket" << serviceUri << m_conListener; - connect(QNXNFCManager::instance(), SIGNAL(llcpDisconnected()), this, SLOT(disconnectFromService()));*/ + connect(QNXNFCManager::instance(), &QNXNFCManager::llcpDisconnected, this, &QLlcpSocketPrivate::disconnectFromService);*/ } void QLlcpSocketPrivate::disconnectFromService() @@ -83,7 +83,7 @@ void QLlcpSocketPrivate::disconnectFromService() qWarning() << Q_FUNC_INFO << "Error when trying to close LLCP socket"; } QNXNFCManager::instance()->unregisterLLCPConnection(m_conListener); - disconnect(QNXNFCManager::instance(), SIGNAL(llcpDisconnected()), this, SLOT(disconnectFromService())); + disconnect(QNXNFCManager::instance(), &QNXNFCManager::llcpDisconnected, this, &QLlcpSocketPrivate::disconnectFromService); q->disconnected(); m_conListener = 0; @@ -96,7 +96,7 @@ bool QLlcpSocketPrivate::bind(quint8 port) /*m_state = QLlcpSocket::ConnectedState; m_server = true; - connect(QNXNFCManager::instance(), SIGNAL(llcpDisconnected()), this, SLOT(disconnectFromService())); + connect(QNXNFCManager::instance(), &QNXNFCManager::llcpDisconnected, this, &QLlcpSocketPrivate::disconnectFromService); connected(QNXNFCManager::instance()->getLastTarget());*/ return true; diff --git a/src/nfc/qnearfieldmanager.cpp b/src/nfc/qnearfieldmanager.cpp index 73b0c360..02e4d918 100644 --- a/src/nfc/qnearfieldmanager.cpp +++ b/src/nfc/qnearfieldmanager.cpp @@ -196,10 +196,10 @@ QNearFieldManager::QNearFieldManager(QObject *parent) connect(d_ptr, &QNearFieldManagerPrivate::adapterStateChanged, this, &QNearFieldManager::adapterStateChanged); - connect(d_ptr, SIGNAL(targetDetected(QNearFieldTarget*)), - this, SIGNAL(targetDetected(QNearFieldTarget*))); - connect(d_ptr, SIGNAL(targetLost(QNearFieldTarget*)), - this, SIGNAL(targetLost(QNearFieldTarget*))); + connect(d_ptr, &QNearFieldManagerPrivate::targetDetected, + this, &QNearFieldManager::targetDetected); + connect(d_ptr, &QNearFieldManagerPrivate::targetLost, + this, &QNearFieldManager::targetLost); } /*! @@ -217,10 +217,10 @@ QNearFieldManager::QNearFieldManager(QNearFieldManagerPrivate *backend, QObject connect(d_ptr, &QNearFieldManagerPrivate::adapterStateChanged, this, &QNearFieldManager::adapterStateChanged); - connect(d_ptr, SIGNAL(targetDetected(QNearFieldTarget*)), - this, SIGNAL(targetDetected(QNearFieldTarget*))); - connect(d_ptr, SIGNAL(targetLost(QNearFieldTarget*)), - this, SIGNAL(targetLost(QNearFieldTarget*))); + connect(d_ptr, &QNearFieldManagerPrivate::targetDetected, + this, &QNearFieldManager::targetDetected); + connect(d_ptr, &QNearFieldManagerPrivate::targetLost, + this, &QNearFieldManager::targetLost); } /*! diff --git a/src/nfc/qnearfieldmanager_android.cpp b/src/nfc/qnearfieldmanager_android.cpp index ecefa801..297f8ef8 100644 --- a/src/nfc/qnearfieldmanager_android.cpp +++ b/src/nfc/qnearfieldmanager_android.cpp @@ -83,8 +83,8 @@ QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl() : } broadcastListener->append(this); - connect(this, SIGNAL(targetDetected(QNearFieldTarget*)), this, SLOT(handlerTargetDetected(QNearFieldTarget*))); - connect(this, SIGNAL(targetLost(QNearFieldTarget*)), this, SLOT(handlerTargetLost(QNearFieldTarget*))); + connect(this, &QNearFieldManagerPrivateImpl::targetDetected, this, &QNearFieldManagerPrivateImpl::handlerTargetDetected); + connect(this, &QNearFieldManagerPrivateImpl::targetLost, this, &QNearFieldManagerPrivateImpl::handlerTargetLost); } QNearFieldManagerPrivateImpl::~QNearFieldManagerPrivateImpl() @@ -101,12 +101,12 @@ void QNearFieldManagerPrivateImpl::handlerTargetDetected(QNearFieldTarget *targe if (ndefMessageHandlers.count() == 0 && ndefFilterHandlers.count() == 0) // if no handler is registered return; if (target->hasNdefMessage()) { - connect(target, SIGNAL(ndefMessageRead(const QNdefMessage &, const QNearFieldTarget::RequestId &)), - this, SLOT(handlerNdefMessageRead(const QNdefMessage &, const QNearFieldTarget::RequestId &))); - connect(target, SIGNAL(requestCompleted(const QNearFieldTarget::RequestId &)), - this, SLOT(handlerRequestCompleted(const QNearFieldTarget::RequestId &))); - connect(target, SIGNAL(error(QNearFieldTarget::Error, const QNearFieldTarget::RequestId &)), - this, SLOT(handlerError(QNearFieldTarget::Error, const QNearFieldTarget::RequestId &))); + connect(reinterpret_cast(target), &NearFieldTarget::ndefMessageRead, + this, &QNearFieldManagerPrivateImpl::handlerNdefMessageRead); + connect(target, &QNearFieldTarget::requestCompleted, + this, &QNearFieldManagerPrivateImpl::handlerRequestCompleted); + connect(target, &QNearFieldTarget::error, + this, &QNearFieldManagerPrivateImpl::handlerError); QNearFieldTarget::RequestId id = target->readNdefMessages(); m_idToTarget.insert(id, target); @@ -115,12 +115,12 @@ void QNearFieldManagerPrivateImpl::handlerTargetDetected(QNearFieldTarget *targe void QNearFieldManagerPrivateImpl::handlerTargetLost(QNearFieldTarget *target) { - disconnect(target, SIGNAL(ndefMessageRead(const QNdefMessage &, const QNearFieldTarget::RequestId &)), - this, SLOT(handlerNdefMessageRead(const QNdefMessage &, const QNearFieldTarget::RequestId &))); - disconnect(target, SIGNAL(requestCompleted(const QNearFieldTarget::RequestId &)), - this, SLOT(handlerRequestCompleted(const QNearFieldTarget::RequestId &))); - disconnect(target, SIGNAL(error(QNearFieldTarget::Error, const QNearFieldTarget::RequestId &)), - this, SLOT(handlerError(QNearFieldTarget::Error, const QNearFieldTarget::RequestId &))); + disconnect(reinterpret_cast(target), &NearFieldTarget::ndefMessageRead, + this, &QNearFieldManagerPrivateImpl::handlerNdefMessageRead); + disconnect(target, &QNearFieldTarget::requestCompleted, + this, &QNearFieldManagerPrivateImpl::handlerRequestCompleted); + disconnect(target, &QNearFieldTarget::error, + this, &QNearFieldManagerPrivateImpl::handlerError); m_idToTarget.remove(m_idToTarget.key(target)); } @@ -317,8 +317,8 @@ void QNearFieldManagerPrivateImpl::onTargetDiscovered(QAndroidJniObject intent) target->setIntent(intent); // Updating existing target } else { target = new NearFieldTarget(intent, uid, this); - connect(target, SIGNAL(targetDestroyed(QByteArray)), this, SLOT(onTargetDestroyed(QByteArray))); - connect(target, SIGNAL(targetLost(QNearFieldTarget*)), this, SIGNAL(targetLost(QNearFieldTarget*))); + connect(target, &NearFieldTarget::targetDestroyed, this, &QNearFieldManagerPrivateImpl::onTargetDestroyed); + connect(target, &NearFieldTarget::targetLost, this, &QNearFieldManagerPrivateImpl::targetLost); } emit targetDetected(target); } diff --git a/src/nfc/qnearfieldmanager_emulator.cpp b/src/nfc/qnearfieldmanager_emulator.cpp index 3186bae5..c2c037f6 100644 --- a/src/nfc/qnearfieldmanager_emulator.cpp +++ b/src/nfc/qnearfieldmanager_emulator.cpp @@ -53,8 +53,8 @@ QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl() tagActivator->initialize(); - connect(tagActivator, SIGNAL(tagActivated(TagBase*)), this, SLOT(tagActivated(TagBase*))); - connect(tagActivator, SIGNAL(tagDeactivated(TagBase*)), this, SLOT(tagDeactivated(TagBase*))); + connect(tagActivator, &TagActivator::tagActivated, this, &QNearFieldManagerPrivateImpl::tagActivated); + connect(tagActivator, &TagActivator::tagDeactivated, this, &QNearFieldManagerPrivateImpl::tagDeactivated); } QNearFieldManagerPrivateImpl::~QNearFieldManagerPrivateImpl() diff --git a/src/nfc/qnearfieldmanager_neard.cpp b/src/nfc/qnearfieldmanager_neard.cpp index 450b9b42..7c1c6e05 100644 --- a/src/nfc/qnearfieldmanager_neard.cpp +++ b/src/nfc/qnearfieldmanager_neard.cpp @@ -80,10 +80,10 @@ QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl() 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))); + connect(m_neardHelper, &NeardHelper::tagFound, + this, &QNearFieldManagerPrivateImpl::handleTagFound); + connect(m_neardHelper, &NeardHelper::tagRemoved, + this, &QNearFieldManagerPrivateImpl::handleTagRemoved); } } -- cgit v1.2.3 From 9b7a4c10b67dd7d89ed30f1f94d8982dab47ded0 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 22 Jun 2018 13:41:47 +0200 Subject: Fix crash in QLEController caused by random device disconnect This only happens with Bluez 5.42 or later versions as the DBus based GATT central client is used. The peripheral disconnects in the middle of a char or descriptor write request. The disconnect triggers the cleanup of all internal states. The write char/descriptor dbus request returns after the disconnect and executes in the context of an already reset QLowEnergyController instance. The fix ensures that the call back code does not make the assumption of operating with a connected peripheral. In fact the code had the relevant asserts already. [ChangeLog][QtBluetooth][PLatform Specific Changes] Fixed crash in DBus gatt central backend (BlueZ5) caused by device disconnecting and pending dbus call watcher returning later after disconnect. Task-number: QTBUG-68890 Change-Id: Iad9b8a1cfc8d916d49fd9b71b2d8f03b9c90639b Reviewed-by: Timur Pocheptsov --- src/bluetooth/qlowenergycontroller_bluezdbus.cpp | 32 ++++++++++++++++++------ 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp index 8f001f92..16f03405 100644 --- a/src/bluetooth/qlowenergycontroller_bluezdbus.cpp +++ b/src/bluetooth/qlowenergycontroller_bluezdbus.cpp @@ -560,8 +560,12 @@ void QLowEnergyControllerPrivateBluezDBus::prepareNextJob() void QLowEnergyControllerPrivateBluezDBus::onCharReadFinished(QDBusPendingCallWatcher *call) { - Q_ASSERT(jobPending); - Q_ASSERT(!jobs.isEmpty()); + if (!jobPending || jobs.isEmpty()) { + // this may happen when service disconnects before dbus watcher returns later on + qCWarning(QT_BT_BLUEZ) << "Aborting onCharReadFinished due to disconnect"; + Q_ASSERT(state == QLowEnergyController::UnconnectedState); + return; + } const GattJob nextJob = jobs.constFirst(); Q_ASSERT(nextJob.flags.testFlag(GattJob::CharRead)); @@ -604,8 +608,12 @@ void QLowEnergyControllerPrivateBluezDBus::onCharReadFinished(QDBusPendingCallWa void QLowEnergyControllerPrivateBluezDBus::onDescReadFinished(QDBusPendingCallWatcher *call) { - Q_ASSERT(jobPending); - Q_ASSERT(!jobs.isEmpty()); + if (!jobPending || jobs.isEmpty()) { + // this may happen when service disconnects before dbus watcher returns later on + qCWarning(QT_BT_BLUEZ) << "Aborting onDescReadFinished due to disconnect"; + Q_ASSERT(state == QLowEnergyController::UnconnectedState); + return; + } const GattJob nextJob = jobs.constFirst(); Q_ASSERT(nextJob.flags.testFlag(GattJob::DescRead)); @@ -666,8 +674,12 @@ void QLowEnergyControllerPrivateBluezDBus::onDescReadFinished(QDBusPendingCallWa void QLowEnergyControllerPrivateBluezDBus::onCharWriteFinished(QDBusPendingCallWatcher *call) { - Q_ASSERT(jobPending); - Q_ASSERT(!jobs.isEmpty()); + if (!jobPending || jobs.isEmpty()) { + // this may happen when service disconnects before dbus watcher returns later on + qCWarning(QT_BT_BLUEZ) << "Aborting onCharWriteFinished due to disconnect"; + Q_ASSERT(state == QLowEnergyController::UnconnectedState); + return; + } const GattJob nextJob = jobs.constFirst(); Q_ASSERT(nextJob.flags.testFlag(GattJob::CharWrite)); @@ -707,8 +719,12 @@ void QLowEnergyControllerPrivateBluezDBus::onCharWriteFinished(QDBusPendingCallW void QLowEnergyControllerPrivateBluezDBus::onDescWriteFinished(QDBusPendingCallWatcher *call) { - Q_ASSERT(jobPending); - Q_ASSERT(!jobs.isEmpty()); + if (!jobPending || jobs.isEmpty()) { + // this may happen when service disconnects before dbus watcher returns later on + qCWarning(QT_BT_BLUEZ) << "Aborting onDescWriteFinished due to disconnect"; + Q_ASSERT(state == QLowEnergyController::UnconnectedState); + return; + } const GattJob nextJob = jobs.constFirst(); Q_ASSERT(nextJob.flags.testFlag(GattJob::DescWrite)); -- cgit v1.2.3 From defb24004e9afcbe42d36b445151c2e842d59fba Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Tue, 10 Jul 2018 10:38:33 +0200 Subject: Make winrt_bt config test fail on ICC ICC chokes on the way, callbacks are registered for the winrt backend, so it should be disabled when ICC is used to build QtConnectivity. Task-number: QTBUG-68026 Change-Id: I6f8f0b031a97afe7ebecc5cdf78d4fe4d1aac2b4 Reviewed-by: Alexander Shevchenko Reviewed-by: Alex Blasche Reviewed-by: Thiago Macieira --- config.tests/winrt_bt/main.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config.tests/winrt_bt/main.cpp b/config.tests/winrt_bt/main.cpp index 2e0eb276..85c26bf7 100644 --- a/config.tests/winrt_bt/main.cpp +++ b/config.tests/winrt_bt/main.cpp @@ -30,6 +30,10 @@ #include #include +#if defined(_WIN32) && defined(__INTEL_COMPILER) +#error "Windows ICC fails to build the WinRT backend (QTBUG-68026)." +#endif + int main() { Microsoft::WRL::ComPtr deviceInformationStatics; -- cgit v1.2.3 From 21981b8ff96d5a5b5685ab33bb22959c3b584aaf Mon Sep 17 00:00:00 2001 From: Lars Schmertmann Date: Wed, 20 Jun 2018 12:22:33 +0200 Subject: Fix "QMetaObject::invokeMethod: No such method" for ndefMessageRead Task-number: QTBUG-67958 Change-Id: I26118eeee95bebd6f28364b0eea69e8ed2e6b6b2 Reviewed-by: Alex Blasche --- src/nfc/qnearfieldtarget_android.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/nfc/qnearfieldtarget_android.cpp b/src/nfc/qnearfieldtarget_android.cpp index 30b2eeca..e656996e 100644 --- a/src/nfc/qnearfieldtarget_android.cpp +++ b/src/nfc/qnearfieldtarget_android.cpp @@ -191,14 +191,17 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages() // Sending QNdefMessage, requestCompleted and exit. QNdefMessage qNdefMessage = QNdefMessage::fromByteArray(ndefMessageQBA); - QMetaObject::invokeMethod(this, "ndefMessageRead", Qt::QueuedConnection, - Q_ARG(QNdefMessage, qNdefMessage)); + QMetaObject::invokeMethod(this, [this, qNdefMessage]() { + Q_EMIT this->QNearFieldTarget::ndefMessageRead(qNdefMessage); + }, Qt::QueuedConnection); QMetaObject::invokeMethod(this, [this, requestId]() { Q_EMIT this->requestCompleted(requestId); }, Qt::QueuedConnection); - QMetaObject::invokeMethod(this, "ndefMessageRead", Qt::QueuedConnection, - Q_ARG(QNdefMessage, qNdefMessage), - Q_ARG(QNearFieldTarget::RequestId, requestId)); + QMetaObject::invokeMethod(this, [this, qNdefMessage, requestId]() { + //TODO This is an Android specific signal in NearFieldTarget. + // We need to check if it is still necessary. + Q_EMIT this->ndefMessageRead(qNdefMessage, requestId); + }, Qt::QueuedConnection); return requestId; } -- cgit v1.2.3 From 0df6eb94d989246dd0516a474266b9f562fca2f3 Mon Sep 17 00:00:00 2001 From: Lars Schmertmann Date: Wed, 20 Jun 2018 11:56:19 +0200 Subject: Introduce reportError to fix "QMetaObject::invokeMethod: No such method" Task-number: QTBUG-67958 Change-Id: Ia5a21cb19f0318844ac436adcc3f0fff9a3185b5 Reviewed-by: Alex Blasche --- src/nfc/qnearfieldtagtype1.cpp | 8 ++------ src/nfc/qnearfieldtarget.cpp | 13 +++++++++++++ src/nfc/qnearfieldtarget.h | 2 ++ src/nfc/qnearfieldtarget_android.cpp | 36 +++++++++-------------------------- src/nfc/qnearfieldtarget_emulator.cpp | 20 +++++-------------- src/nfc/qnearfieldtarget_neard_p.h | 8 ++------ 6 files changed, 33 insertions(+), 54 deletions(-) diff --git a/src/nfc/qnearfieldtagtype1.cpp b/src/nfc/qnearfieldtagtype1.cpp index 34f2c8b8..7f27fbe9 100644 --- a/src/nfc/qnearfieldtagtype1.cpp +++ b/src/nfc/qnearfieldtagtype1.cpp @@ -440,9 +440,7 @@ QNearFieldTarget::RequestId QNearFieldTagType1::readNdefMessages() if (d->m_readNdefMessageState == QNearFieldTagType1Private::NotReadingNdefMessage) { d->progressToNextNdefReadMessageState(); } else { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, NdefReadError), - Q_ARG(QNearFieldTarget::RequestId, d->m_readNdefRequestId)); + reportError(QNearFieldTarget::NdefReadError, d->m_readNdefRequestId); } return d->m_readNdefRequestId; @@ -462,9 +460,7 @@ QNearFieldTarget::RequestId QNearFieldTagType1::writeNdefMessages(const QListm_ndefWriteMessages = messages; d->progressToNextNdefWriteMessageState(); } else { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, NdefWriteError), - Q_ARG(QNearFieldTarget::RequestId, d->m_readNdefRequestId)); + reportError(QNearFieldTarget::NdefWriteError, d->m_readNdefRequestId); } return d->m_writeNdefRequestId; diff --git a/src/nfc/qnearfieldtarget.cpp b/src/nfc/qnearfieldtarget.cpp index e642824b..e9a6fa11 100644 --- a/src/nfc/qnearfieldtarget.cpp +++ b/src/nfc/qnearfieldtarget.cpp @@ -530,4 +530,17 @@ bool QNearFieldTarget::handleResponse(const QNearFieldTarget::RequestId &id, return true; } +/*! + \since 5.12 + + Reports the \a error for the request \a id by appending the signal emission to the event queue. +*/ +void QNearFieldTarget::reportError(QNearFieldTarget::Error error, + const QNearFieldTarget::RequestId &id) +{ + QMetaObject::invokeMethod(this, [this, error, id]() { + Q_EMIT this->error(error, id); + }, Qt::QueuedConnection); +} + QT_END_NAMESPACE diff --git a/src/nfc/qnearfieldtarget.h b/src/nfc/qnearfieldtarget.h index e51960f7..868b52d5 100644 --- a/src/nfc/qnearfieldtarget.h +++ b/src/nfc/qnearfieldtarget.h @@ -153,6 +153,8 @@ protected: Q_INVOKABLE virtual bool handleResponse(const QNearFieldTarget::RequestId &id, const QByteArray &response); + void reportError(QNearFieldTarget::Error error, const QNearFieldTarget::RequestId &id); + Q_SIGNALS: void disconnected(); diff --git a/src/nfc/qnearfieldtarget_android.cpp b/src/nfc/qnearfieldtarget_android.cpp index 30b2eeca..5ba48fa6 100644 --- a/src/nfc/qnearfieldtarget_android.cpp +++ b/src/nfc/qnearfieldtarget_android.cpp @@ -147,25 +147,19 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages() // Making sure that target is still in range QNearFieldTarget::RequestId requestId(new QNearFieldTarget::RequestIdPrivate); if (!m_intent.isValid()) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError), - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + reportError(QNearFieldTarget::TargetOutOfRangeError, requestId); return requestId; } // Getting Ndef technology object if (!setTagTechnology({NDEFTECHNOLOGY})) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnsupportedError), - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + reportError(QNearFieldTarget::UnsupportedError, requestId); return requestId; } // Connect if (!connect()) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError), - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + reportError(QNearFieldTarget::TargetOutOfRangeError, requestId); return requestId; } @@ -174,9 +168,7 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages() if (catchJavaExceptions()) ndefMessage = QAndroidJniObject(); if (!ndefMessage.isValid()) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::NdefReadError), - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + reportError(QNearFieldTarget::NdefReadError, requestId); return requestId; } @@ -246,9 +238,7 @@ QNearFieldTarget::RequestId NearFieldTarget::sendCommand(const QByteArray &comma // Connecting QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate()); if (!connect()) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError), - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + reportError(QNearFieldTarget::TargetOutOfRangeError, requestId); return requestId; } @@ -260,9 +250,7 @@ QNearFieldTarget::RequestId NearFieldTarget::sendCommand(const QByteArray &comma // Writing QAndroidJniObject myNewVal = m_tagTech.callObjectMethod("transceive", "([B)[B", jba); if (catchJavaExceptions()) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::CommandError), - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + reportError(QNearFieldTarget::CommandError, requestId); return requestId; } QByteArray result = jbyteArrayToQByteArray(myNewVal.object()); @@ -312,9 +300,7 @@ QNearFieldTarget::RequestId NearFieldTarget::writeNdefMessages(const QListSetByteArrayRegion(jba.object(), 0, ba.size(), reinterpret_cast(ba.data())); QAndroidJniObject jmessage = QAndroidJniObject("android/nfc/NdefMessage", "([B)V", jba.object()); if (catchJavaExceptions()) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnknownError), - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + reportError(QNearFieldTarget::UnknownError, requestId); return requestId; } // Writing m_tagTech.callMethod(writeMethod, "(Landroid/nfc/NdefMessage;)V", jmessage.object()); if (catchJavaExceptions()) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::NdefWriteError), - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + reportError(QNearFieldTarget::NdefWriteError, requestId); return requestId; } diff --git a/src/nfc/qnearfieldtarget_emulator.cpp b/src/nfc/qnearfieldtarget_emulator.cpp index 29b1f74d..030718cc 100644 --- a/src/nfc/qnearfieldtarget_emulator.cpp +++ b/src/nfc/qnearfieldtarget_emulator.cpp @@ -82,9 +82,7 @@ QNearFieldTarget::RequestId TagType1::sendCommand(const QByteArray &command) // tag not in proximity if (!tagMap.value(m_tag)) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, TargetOutOfRangeError), - Q_ARG(QNearFieldTarget::RequestId, id)); + reportError(QNearFieldTarget::TargetOutOfRangeError, id); return id; } @@ -93,17 +91,13 @@ QNearFieldTarget::RequestId TagType1::sendCommand(const QByteArray &command) QByteArray response = m_tag->processCommand(command + char(crc & 0xff) + char(crc >> 8)); if (response.isEmpty()) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, NoResponseError), - Q_ARG(QNearFieldTarget::RequestId, id)); + reportError(QNearFieldTarget::NoResponseError, id); return id; } // check crc if (qChecksum(response.constData(), response.length(), Qt::ChecksumItuV41) != 0) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, ChecksumMismatchError), - Q_ARG(QNearFieldTarget::RequestId, id)); + reportError(QNearFieldTarget::ChecksumMismatchError, id); return id; } @@ -152,9 +146,7 @@ QNearFieldTarget::RequestId TagType2::sendCommand(const QByteArray &command) // tag not in proximity if (!tagMap.value(m_tag)) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, TargetOutOfRangeError), - Q_ARG(QNearFieldTarget::RequestId, id)); + reportError(QNearFieldTarget::TargetOutOfRangeError, id); return id; } @@ -168,9 +160,7 @@ QNearFieldTarget::RequestId TagType2::sendCommand(const QByteArray &command) if (response.length() > 1) { // check crc if (qChecksum(response.constData(), response.length(), Qt::ChecksumItuV41) != 0) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, ChecksumMismatchError), - Q_ARG(QNearFieldTarget::RequestId, id)); + reportError(QNearFieldTarget::ChecksumMismatchError, id); return id; } diff --git a/src/nfc/qnearfieldtarget_neard_p.h b/src/nfc/qnearfieldtarget_neard_p.h index 053df141..625cee67 100644 --- a/src/nfc/qnearfieldtarget_neard_p.h +++ b/src/nfc/qnearfieldtarget_neard_p.h @@ -359,9 +359,7 @@ private: Q_EMIT this->requestCompleted(this->m_currentReadRequestId); }, Qt::QueuedConnection); } else { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnknownError), - Q_ARG(QNearFieldTarget::RequestId, m_currentReadRequestId)); + this->reportError(QNearFieldTarget::UnknownError, m_currentReadRequestId); } m_readRequested = false; @@ -389,9 +387,7 @@ private: reply.waitForFinished(); if (reply.isError()) { qCWarning(QT_NFC_NEARD) << "Error writing to NFC tag" << reply.error(); - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnknownError), - Q_ARG(QNearFieldTarget::RequestId, m_currentWriteRequestId)); + this->reportError(QNearFieldTarget::UnknownError, m_currentWriteRequestId); } QMetaObject::invokeMethod(this, "ndefMessagesWritten", Qt::QueuedConnection); -- cgit v1.2.3 From c24cf9e04a6e28baaabc4e4561db85eb311b25bf Mon Sep 17 00:00:00 2001 From: Oliver Wolff Date: Wed, 18 Jul 2018 14:40:09 +0200 Subject: winrt: Only emit characteristicWritten if WriteWithResponse was set Winrt API does not distinguish, whether the gatt write was done with or without response but always runs into the callback while doing "the right thing" on a lower level. If WriteWithResponse was not specified, we should not emit characteristicWritten though. Change-Id: I4479296d2931635f6f9d0eb52eed78b394a43d66 Reviewed-by: Andy Shaw Reviewed-by: Alex Blasche --- src/bluetooth/qlowenergycontroller_winrt.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_winrt.cpp b/src/bluetooth/qlowenergycontroller_winrt.cpp index 628f1195..917f3790 100644 --- a/src/bluetooth/qlowenergycontroller_winrt.cpp +++ b/src/bluetooth/qlowenergycontroller_winrt.cpp @@ -937,7 +937,7 @@ void QLowEnergyControllerPrivateWinRT::writeCharacteristic(const QSharedPointer< GattWriteOption option = writeWithResponse ? GattWriteOption_WriteWithResponse : GattWriteOption_WriteWithoutResponse; hr = characteristic->WriteValueWithOptionAsync(buffer.Get(), option, &writeOp); Q_ASSERT_SUCCEEDED(hr); - auto writeCompletedLambda =[charData, charHandle, newValue, service, this] + auto writeCompletedLambda =[charData, charHandle, newValue, service, writeWithResponse, this] (IAsyncOperation *op, AsyncStatus status) { if (status == AsyncStatus::Canceled || status == AsyncStatus::Error) { @@ -963,7 +963,8 @@ void QLowEnergyControllerPrivateWinRT::writeCharacteristic(const QSharedPointer< // empty. if (charData.properties & QLowEnergyCharacteristic::Read) updateValueOfCharacteristic(charHandle, newValue, false); - emit service->characteristicWritten(QLowEnergyCharacteristic(service, charHandle), newValue); + if (writeWithResponse) + emit service->characteristicWritten(QLowEnergyCharacteristic(service, charHandle), newValue); return S_OK; }; hr = writeOp->put_Completed(Callback>(writeCompletedLambda).Get()); -- cgit v1.2.3 From 1036b09c0e613f01c48cc5e25ca51c0faddaacb4 Mon Sep 17 00:00:00 2001 From: Timur Pocheptsov Date: Mon, 23 Jul 2018 10:29:58 +0200 Subject: QBluetoothSocket - fix info message (IOBluetooth) Change-Id: If84041384b09a73c1da0277fef571f3ac37155e2 Reviewed-by: Alex Blasche --- src/bluetooth/qbluetoothsocket.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index 1ad3ffc2..214201b9 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -661,7 +661,7 @@ void QBluetoothSocket::doDeviceDiscovery(const QBluetoothServiceInfo &service, O Q_D(QBluetoothSocket); setSocketState(QBluetoothSocket::ServiceLookupState); - qCDebug(QT_BT) << "Starting Bluetooth Socket discovery"; + qCDebug(QT_BT) << "Starting Bluetooth service discovery"; if(d->discoveryAgent) { d->discoveryAgent->stop(); -- cgit v1.2.3 From 98aa6ba02628eb29cc82361fad6d2d8b18ae0488 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 24 Jul 2018 13:28:55 +0200 Subject: Mark classes derived from QLowEnergyControllerPrivate as final Fixes missing overrides for the dtor in the process. Change-Id: Iea3d010c1cebddaf8ea6ea392a7f13e4d87f67da Reviewed-by: Timur Pocheptsov --- src/bluetooth/qlowenergycontroller_android_p.h | 4 ++-- src/bluetooth/qlowenergycontroller_bluez_p.h | 4 ++-- src/bluetooth/qlowenergycontroller_bluezdbus_p.h | 4 ++-- src/bluetooth/qlowenergycontroller_p.h | 4 ++-- src/bluetooth/qlowenergycontroller_winrt_p.h | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/bluetooth/qlowenergycontroller_android_p.h b/src/bluetooth/qlowenergycontroller_android_p.h index e575d96e..3f97e363 100644 --- a/src/bluetooth/qlowenergycontroller_android_p.h +++ b/src/bluetooth/qlowenergycontroller_android_p.h @@ -92,12 +92,12 @@ extern void registerQLowEnergyControllerMetaType(); class QLeAdvertiser; -class QLowEnergyControllerPrivateAndroid : public QLowEnergyControllerPrivate +class QLowEnergyControllerPrivateAndroid final : public QLowEnergyControllerPrivate { Q_OBJECT public: QLowEnergyControllerPrivateAndroid(); - ~QLowEnergyControllerPrivateAndroid(); + ~QLowEnergyControllerPrivateAndroid() override; void init() override; diff --git a/src/bluetooth/qlowenergycontroller_bluez_p.h b/src/bluetooth/qlowenergycontroller_bluez_p.h index 55a8a482..66c048be 100644 --- a/src/bluetooth/qlowenergycontroller_bluez_p.h +++ b/src/bluetooth/qlowenergycontroller_bluez_p.h @@ -76,12 +76,12 @@ extern void registerQLowEnergyControllerMetaType(); class QLeAdvertiser; -class QLowEnergyControllerPrivateBluez : public QLowEnergyControllerPrivate +class QLowEnergyControllerPrivateBluez final: public QLowEnergyControllerPrivate { Q_OBJECT public: QLowEnergyControllerPrivateBluez(); - ~QLowEnergyControllerPrivateBluez(); + ~QLowEnergyControllerPrivateBluez() override; void init() override; diff --git a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h index 7ac1808f..0e0bfcb5 100644 --- a/src/bluetooth/qlowenergycontroller_bluezdbus_p.h +++ b/src/bluetooth/qlowenergycontroller_bluezdbus_p.h @@ -69,12 +69,12 @@ QT_BEGIN_NAMESPACE class QDBusPendingCallWatcher; -class QLowEnergyControllerPrivateBluezDBus : public QLowEnergyControllerPrivate +class QLowEnergyControllerPrivateBluezDBus final : public QLowEnergyControllerPrivate { Q_OBJECT public: QLowEnergyControllerPrivateBluezDBus(); - ~QLowEnergyControllerPrivateBluezDBus(); + ~QLowEnergyControllerPrivateBluezDBus() override; void init() override; void connectToDevice() override; diff --git a/src/bluetooth/qlowenergycontroller_p.h b/src/bluetooth/qlowenergycontroller_p.h index 623c71a2..54a49b53 100644 --- a/src/bluetooth/qlowenergycontroller_p.h +++ b/src/bluetooth/qlowenergycontroller_p.h @@ -65,12 +65,12 @@ class QLowEnergyServiceData; extern void registerQLowEnergyControllerMetaType(); -class QLowEnergyControllerPrivateCommon : public QLowEnergyControllerPrivate +class QLowEnergyControllerPrivateCommon final : public QLowEnergyControllerPrivate { Q_OBJECT public: QLowEnergyControllerPrivateCommon(); - ~QLowEnergyControllerPrivateCommon(); + ~QLowEnergyControllerPrivateCommon() override; void init() override; diff --git a/src/bluetooth/qlowenergycontroller_winrt_p.h b/src/bluetooth/qlowenergycontroller_winrt_p.h index 7edc4702..783a71fa 100644 --- a/src/bluetooth/qlowenergycontroller_winrt_p.h +++ b/src/bluetooth/qlowenergycontroller_winrt_p.h @@ -73,12 +73,12 @@ class QWinRTLowEnergyServiceHandler; extern void registerQLowEnergyControllerMetaType(); -class QLowEnergyControllerPrivateWinRT : public QLowEnergyControllerPrivate +class QLowEnergyControllerPrivateWinRT final : public QLowEnergyControllerPrivate { Q_OBJECT public: QLowEnergyControllerPrivateWinRT(); - ~QLowEnergyControllerPrivateWinRT(); + ~QLowEnergyControllerPrivateWinRT() override; void init() override; -- cgit v1.2.3 From 28eeb7afc27e99deeb52eefe10cdd458c7621698 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Wed, 18 Jul 2018 11:03:53 +0200 Subject: Add runtime polymorphism for QBluetoothSocketPrivate This patch introduces a generic interface towards QBluetoothSocketPrivate. Later on, the QBluetoothSocketPrivate class will be split into platform specific overloads/interfaces. Ultimately, this will be needed to support runtime selection of the QBluetootSocket d-pointer on Linux. The Linux Bluez5 implementation is significantly different from the Bluez4 (raw socket) implementation. Since recent Bluez5 releases the raw socket implementation is no longer functional and/or the user has to have root permission and enable bluetooth --compat mode. Therefore a second QBluetoothSocket for the dbus socket API is needed. QBLuetoothSocket has to choose at runtime (during its instanciation) which implementation to use. Task-number: QTBUG-68550 Change-Id: I5d0b8e24b8acd1b149b897f52f0d82eade7f3823 Reviewed-by: Oliver Wolff Reviewed-by: Timur Pocheptsov Reviewed-by: Lubomir I. Ivanov --- src/bluetooth/bluetooth.pro | 5 + src/bluetooth/qbluetoothserver_osx.mm | 2 +- src/bluetooth/qbluetoothsocket.cpp | 66 +++++----- src/bluetooth/qbluetoothsocket.h | 14 +++ src/bluetooth/qbluetoothsocket_android.cpp | 9 +- src/bluetooth/qbluetoothsocket_bluez.cpp | 12 +- src/bluetooth/qbluetoothsocket_osx.mm | 8 +- src/bluetooth/qbluetoothsocket_osx_p.h | 5 +- src/bluetooth/qbluetoothsocket_p.cpp | 7 +- src/bluetooth/qbluetoothsocket_p.h | 149 +++++----------------- src/bluetooth/qbluetoothsocket_winrt.cpp | 9 +- src/bluetooth/qbluetoothsocketbase.cpp | 54 ++++++++ src/bluetooth/qbluetoothsocketbase_p.h | 193 +++++++++++++++++++++++++++++ 13 files changed, 343 insertions(+), 190 deletions(-) create mode 100644 src/bluetooth/qbluetoothsocketbase.cpp create mode 100644 src/bluetooth/qbluetoothsocketbase_p.h diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index ee548208..28470835 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -41,6 +41,7 @@ PRIVATE_HEADERS += \ qbluetoothdevicediscoveryagent_p.h\ qbluetoothservicediscoveryagent_p.h\ qbluetoothsocket_p.h\ + qbluetoothsocketbase_p.h \ qbluetoothserver_p.h\ qbluetoothtransferreply_p.h \ qbluetoothtransferrequest_p.h \ @@ -60,6 +61,7 @@ SOURCES += \ qbluetoothdevicediscoveryagent.cpp\ qbluetoothservicediscoveryagent.cpp\ qbluetoothsocket.cpp\ + qbluetoothsocketbase.cpp \ qbluetoothserver.cpp \ qbluetoothlocaldevice.cpp \ qbluetooth.cpp \ @@ -173,10 +175,13 @@ qtConfig(bluez) { qbluetoothtransferreply_osx_p.h \ qlowenergycontroller_osx_p.h + PRIVATE_HEADERS -= qbluetoothsocket_p.h + SOURCES -= qbluetoothdevicediscoveryagent.cpp SOURCES -= qbluetoothserviceinfo.cpp SOURCES -= qbluetoothservicediscoveryagent.cpp SOURCES -= qbluetoothsocket.cpp + SOURCES -= qbluetoothsocketbase.cpp SOURCES -= qbluetoothserver.cpp SOURCES -= qlowenergyservice_p.cpp SOURCES -= qlowenergyservice.cpp diff --git a/src/bluetooth/qbluetoothserver_osx.mm b/src/bluetooth/qbluetoothserver_osx.mm index a1774d14..d7f29ed3 100644 --- a/src/bluetooth/qbluetoothserver_osx.mm +++ b/src/bluetooth/qbluetoothserver_osx.mm @@ -43,7 +43,7 @@ // The order is important: a workround for // a private header included by private header // (incorrectly handled dependencies). -#include "qbluetoothsocket_p.h" +#include "qbluetoothsocketbase_p.h" #include "qbluetoothsocket_osx_p.h" #include "qbluetoothlocaldevice.h" diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index 214201b9..6a5178db 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -250,11 +250,12 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT) Constructs a Bluetooth socket of \a socketType type, with \a parent. */ QBluetoothSocket::QBluetoothSocket(QBluetoothServiceInfo::Protocol socketType, QObject *parent) -: QIODevice(parent), d_ptr(new QBluetoothSocketPrivate) +: QIODevice(parent) { + d_ptr = new QBluetoothSocketPrivate(); d_ptr->q_ptr = this; - Q_D(QBluetoothSocket); + Q_D(QBluetoothSocketBase); d->ensureNativeSocket(socketType); setOpenMode(QIODevice::NotOpen); @@ -264,8 +265,9 @@ QBluetoothSocket::QBluetoothSocket(QBluetoothServiceInfo::Protocol socketType, Q Constructs a Bluetooth socket with \a parent. */ QBluetoothSocket::QBluetoothSocket(QObject *parent) - : QIODevice(parent), d_ptr(new QBluetoothSocketPrivate) + : QIODevice(parent) { + d_ptr = new QBluetoothSocketPrivate(); d_ptr->q_ptr = this; setOpenMode(QIODevice::NotOpen); } @@ -294,7 +296,7 @@ bool QBluetoothSocket::isSequential() const */ qint64 QBluetoothSocket::bytesAvailable() const { - Q_D(const QBluetoothSocket); + Q_D(const QBluetoothSocketBase); return QIODevice::bytesAvailable() + d->bytesAvailable(); } @@ -304,7 +306,7 @@ qint64 QBluetoothSocket::bytesAvailable() const */ qint64 QBluetoothSocket::bytesToWrite() const { - Q_D(const QBluetoothSocket); + Q_D(const QBluetoothSocketBase); return d->bytesToWrite(); } @@ -327,7 +329,7 @@ qint64 QBluetoothSocket::bytesToWrite() const */ void QBluetoothSocket::connectToService(const QBluetoothServiceInfo &service, OpenMode openMode) { - Q_D(QBluetoothSocket); + Q_D(QBluetoothSocketBase); if (state() != QBluetoothSocket::UnconnectedState && state() != QBluetoothSocket::ServiceLookupState) { qCWarning(QT_BT) << "QBluetoothSocket::connectToService called on busy socket"; @@ -419,7 +421,7 @@ void QBluetoothSocket::connectToService(const QBluetoothServiceInfo &service, Op */ void QBluetoothSocket::connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, OpenMode openMode) { - Q_D(QBluetoothSocket); + Q_D(QBluetoothSocketBase); if (state() != QBluetoothSocket::UnconnectedState) { qCWarning(QT_BT) << "QBluetoothSocket::connectToService called on busy socket"; @@ -480,7 +482,7 @@ void QBluetoothSocket::connectToService(const QBluetoothAddress &address, const */ void QBluetoothSocket::connectToService(const QBluetoothAddress &address, quint16 port, OpenMode openMode) { - Q_D(QBluetoothSocket); + Q_D(QBluetoothSocketBase); #if defined(QT_ANDROID_BLUETOOTH) Q_UNUSED(port); Q_UNUSED(openMode); @@ -526,7 +528,7 @@ void QBluetoothSocket::connectToService(const QBluetoothAddress &address, quint1 */ QBluetoothServiceInfo::Protocol QBluetoothSocket::socketType() const { - Q_D(const QBluetoothSocket); + Q_D(const QBluetoothSocketBase); return d->socketType; } @@ -535,7 +537,7 @@ QBluetoothServiceInfo::Protocol QBluetoothSocket::socketType() const */ QBluetoothSocket::SocketState QBluetoothSocket::state() const { - Q_D(const QBluetoothSocket); + Q_D(const QBluetoothSocketBase); return d->state; } @@ -544,7 +546,7 @@ QBluetoothSocket::SocketState QBluetoothSocket::state() const */ QBluetoothSocket::SocketError QBluetoothSocket::error() const { - Q_D(const QBluetoothSocket); + Q_D(const QBluetoothSocketBase); return d->socketError; } @@ -553,7 +555,7 @@ QBluetoothSocket::SocketError QBluetoothSocket::error() const */ QString QBluetoothSocket::errorString() const { - Q_D(const QBluetoothSocket); + Q_D(const QBluetoothSocketBase); return d->errorString; } @@ -586,7 +588,7 @@ QString QBluetoothSocket::errorString() const */ void QBluetoothSocket::setPreferredSecurityFlags(QBluetooth::SecurityFlags flags) { - Q_D(QBluetoothSocket); + Q_D(QBluetoothSocketBase); if (d->secFlags != flags) d->secFlags = flags; } @@ -607,7 +609,7 @@ void QBluetoothSocket::setPreferredSecurityFlags(QBluetooth::SecurityFlags flags */ QBluetooth::SecurityFlags QBluetoothSocket::preferredSecurityFlags() const { - Q_D(const QBluetoothSocket); + Q_D(const QBluetoothSocketBase); return d->secFlags; } @@ -616,7 +618,7 @@ QBluetooth::SecurityFlags QBluetoothSocket::preferredSecurityFlags() const */ void QBluetoothSocket::setSocketState(QBluetoothSocket::SocketState state) { - Q_D(QBluetoothSocket); + Q_D(QBluetoothSocketBase); SocketState old = d->state; d->state = state; if(old != d->state) @@ -636,7 +638,7 @@ void QBluetoothSocket::setSocketState(QBluetoothSocket::SocketState state) bool QBluetoothSocket::canReadLine() const { - Q_D(const QBluetoothSocket); + Q_D(const QBluetoothSocketBase); return d->canReadLine(); } @@ -645,7 +647,7 @@ bool QBluetoothSocket::canReadLine() const */ void QBluetoothSocket::setSocketError(QBluetoothSocket::SocketError error_) { - Q_D(QBluetoothSocket); + Q_D(QBluetoothSocketBase); d->socketError = error_; emit error(error_); } @@ -658,7 +660,7 @@ void QBluetoothSocket::setSocketError(QBluetoothSocket::SocketError error_) void QBluetoothSocket::doDeviceDiscovery(const QBluetoothServiceInfo &service, OpenMode openMode) { - Q_D(QBluetoothSocket); + Q_D(QBluetoothSocketBase); setSocketState(QBluetoothSocket::ServiceLookupState); qCDebug(QT_BT) << "Starting Bluetooth service discovery"; @@ -697,7 +699,7 @@ void QBluetoothSocket::doDeviceDiscovery(const QBluetoothServiceInfo &service, O void QBluetoothSocket::serviceDiscovered(const QBluetoothServiceInfo &service) { - Q_D(QBluetoothSocket); + Q_D(QBluetoothSocketBase); qCDebug(QT_BT) << "FOUND SERVICE!" << service; if (service.protocolServiceMultiplexer() > 0 || service.serverChannel() > 0) { connectToService(service, d->openMode); @@ -711,7 +713,7 @@ void QBluetoothSocket::serviceDiscovered(const QBluetoothServiceInfo &service) void QBluetoothSocket::discoveryFinished() { qCDebug(QT_BT) << "Socket discovery finished"; - Q_D(QBluetoothSocket); + Q_D(QBluetoothSocketBase); if (d->discoveryAgent){ qCDebug(QT_BT) << "Didn't find any"; d->errorString = tr("Service cannot be found"); @@ -727,7 +729,7 @@ void QBluetoothSocket::abort() if (state() == UnconnectedState) return; - Q_D(QBluetoothSocket); + Q_D(QBluetoothSocketBase); setOpenMode(QIODevice::NotOpen); if (state() == ServiceLookupState && d->discoveryAgent) { @@ -754,43 +756,43 @@ void QBluetoothSocket::disconnectFromService() QString QBluetoothSocket::localName() const { - Q_D(const QBluetoothSocket); + Q_D(const QBluetoothSocketBase); return d->localName(); } QBluetoothAddress QBluetoothSocket::localAddress() const { - Q_D(const QBluetoothSocket); + Q_D(const QBluetoothSocketBase); return d->localAddress(); } quint16 QBluetoothSocket::localPort() const { - Q_D(const QBluetoothSocket); + Q_D(const QBluetoothSocketBase); return d->localPort(); } QString QBluetoothSocket::peerName() const { - Q_D(const QBluetoothSocket); + Q_D(const QBluetoothSocketBase); return d->peerName(); } QBluetoothAddress QBluetoothSocket::peerAddress() const { - Q_D(const QBluetoothSocket); + Q_D(const QBluetoothSocketBase); return d->peerAddress(); } quint16 QBluetoothSocket::peerPort() const { - Q_D(const QBluetoothSocket); + Q_D(const QBluetoothSocketBase); return d->peerPort(); } qint64 QBluetoothSocket::writeData(const char *data, qint64 maxSize) { - Q_D(QBluetoothSocket); + Q_D(QBluetoothSocketBase); if (!data || maxSize <= 0) { d_ptr->errorString = tr("Invalid data/data size"); @@ -803,7 +805,7 @@ qint64 QBluetoothSocket::writeData(const char *data, qint64 maxSize) qint64 QBluetoothSocket::readData(char *data, qint64 maxSize) { - Q_D(QBluetoothSocket); + Q_D(QBluetoothSocketBase); return d->readData(data, maxSize); } @@ -812,7 +814,7 @@ void QBluetoothSocket::close() if (state() == UnconnectedState) return; - Q_D(QBluetoothSocket); + Q_D(QBluetoothSocketBase); setOpenMode(QIODevice::NotOpen); if (state() == ServiceLookupState && d->discoveryAgent) { @@ -844,7 +846,7 @@ void QBluetoothSocket::close() bool QBluetoothSocket::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, SocketState socketState, OpenMode openMode) { - Q_D(QBluetoothSocket); + Q_D(QBluetoothSocketBase); return d->setSocketDescriptor(socketDescriptor, socketType, socketState, openMode); } @@ -855,7 +857,7 @@ bool QBluetoothSocket::setSocketDescriptor(int socketDescriptor, QBluetoothServi int QBluetoothSocket::socketDescriptor() const { - Q_D(const QBluetoothSocket); + Q_D(const QBluetoothSocketBase); return d->socket; } diff --git a/src/bluetooth/qbluetoothsocket.h b/src/bluetooth/qbluetoothsocket.h index a7f43170..e7e59abf 100644 --- a/src/bluetooth/qbluetoothsocket.h +++ b/src/bluetooth/qbluetoothsocket.h @@ -52,15 +52,25 @@ QT_BEGIN_NAMESPACE +#ifndef QT_OSX_BLUETOOTH +class QBluetoothSocketBasePrivate; +#else class QBluetoothSocketPrivate; +#endif class Q_BLUETOOTH_EXPORT QBluetoothSocket : public QIODevice { Q_OBJECT +#ifndef QT_OSX_BLUETOOTH + Q_DECLARE_PRIVATE(QBluetoothSocketBase) +#else Q_DECLARE_PRIVATE(QBluetoothSocket) +#endif + friend class QBluetoothServer; friend class QBluetoothServerPrivate; + friend class QBluetoothSocketPrivate; public: @@ -166,7 +176,11 @@ private Q_SLOTS: protected: +#ifndef QT_OSX_BLUETOOTH + QBluetoothSocketBasePrivate *d_ptr; +#else QBluetoothSocketPrivate *d_ptr; +#endif private: friend class QLowEnergyControllerPrivateBluez; diff --git a/src/bluetooth/qbluetoothsocket_android.cpp b/src/bluetooth/qbluetoothsocket_android.cpp index a70b95a2..9a81fc3a 100644 --- a/src/bluetooth/qbluetoothsocket_android.cpp +++ b/src/bluetooth/qbluetoothsocket_android.cpp @@ -205,15 +205,10 @@ static QBluetoothUuid reverseUuid(const QBluetoothUuid &serviceUuid) } QBluetoothSocketPrivate::QBluetoothSocketPrivate() - : socket(-1), - socketType(QBluetoothServiceInfo::UnknownProtocol), - state(QBluetoothSocket::UnconnectedState), - socketError(QBluetoothSocket::NoSocketError), - connecting(false), - discoveryAgent(0), - secFlags(QBluetooth::Secure), + : inputThread(0) { + secFlags = QBluetooth::Secure; adapter = QAndroidJniObject::callStaticObjectMethod("android/bluetooth/BluetoothAdapter", "getDefaultAdapter", "()Landroid/bluetooth/BluetoothAdapter;"); diff --git a/src/bluetooth/qbluetoothsocket_bluez.cpp b/src/bluetooth/qbluetoothsocket_bluez.cpp index 17b8e738..4fb51567 100644 --- a/src/bluetooth/qbluetoothsocket_bluez.cpp +++ b/src/bluetooth/qbluetoothsocket_bluez.cpp @@ -63,17 +63,9 @@ QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(QT_BT_BLUEZ) QBluetoothSocketPrivate::QBluetoothSocketPrivate() - : socket(-1), - socketType(QBluetoothServiceInfo::UnknownProtocol), - state(QBluetoothSocket::UnconnectedState), - socketError(QBluetoothSocket::NoSocketError), - readNotifier(0), - connectWriteNotifier(0), - connecting(false), - discoveryAgent(0), - secFlags(QBluetooth::Authorization), - lowEnergySocketType(0) + : QBluetoothSocketBasePrivate() { + secFlags = QBluetooth::Authorization; } QBluetoothSocketPrivate::~QBluetoothSocketPrivate() diff --git a/src/bluetooth/qbluetoothsocket_osx.mm b/src/bluetooth/qbluetoothsocket_osx.mm index dec542dd..ea39bb39 100644 --- a/src/bluetooth/qbluetoothsocket_osx.mm +++ b/src/bluetooth/qbluetoothsocket_osx.mm @@ -41,9 +41,7 @@ // The order is important (the first header contains // the base class for a private socket) - workaround for // dependencies problem. -#include "qbluetoothsocket_p.h" -#include "qbluetoothsocket_osx_p.h" -// +#include "qbluetoothsocketbase_p.h" #include "qbluetoothsocket_osx_p.h" #include "qbluetoothlocaldevice.h" #include "qbluetoothdeviceinfo.h" @@ -60,14 +58,14 @@ QT_BEGIN_NAMESPACE QBluetoothSocketPrivate::QBluetoothSocketPrivate() - : q_ptr(nullptr), - writeChunk(std::numeric_limits::max()), + : writeChunk(std::numeric_limits::max()), openMode(QIODevice::NotOpen), // That's what is set in public class' ctors. state(QBluetoothSocket::UnconnectedState), socketType(QBluetoothServiceInfo::UnknownProtocol), socketError(QBluetoothSocket::NoSocketError), isConnecting(false) { + q_ptr = nullptr; } QBluetoothSocketPrivate::~QBluetoothSocketPrivate() diff --git a/src/bluetooth/qbluetoothsocket_osx_p.h b/src/bluetooth/qbluetoothsocket_osx_p.h index ce376702..dcc684b8 100644 --- a/src/bluetooth/qbluetoothsocket_osx_p.h +++ b/src/bluetooth/qbluetoothsocket_osx_p.h @@ -79,10 +79,9 @@ QT_BEGIN_NAMESPACE -class QBluetoothServiceDiscoveryAgent; class QBluetoothAddress; -class QBluetoothSocketPrivate : public QBluetoothSocketPrivateBase, public OSXBluetooth::ChannelDelegate +class QBluetoothSocketPrivate : public QBluetoothSocketBasePrivate, public OSXBluetooth::ChannelDelegate { friend class QBluetoothSocket; friend class QBluetoothServer; @@ -121,8 +120,6 @@ private: qint64 writeData(const char *data, qint64 maxSize); qint64 readData(char *data, qint64 maxSize); - QBluetoothSocket *q_ptr; - QScopedPointer discoveryAgent; QPrivateLinearBuffer buffer; diff --git a/src/bluetooth/qbluetoothsocket_p.cpp b/src/bluetooth/qbluetoothsocket_p.cpp index 4c716005..bd074763 100644 --- a/src/bluetooth/qbluetoothsocket_p.cpp +++ b/src/bluetooth/qbluetoothsocket_p.cpp @@ -46,13 +46,8 @@ QT_BEGIN_NAMESPACE QBluetoothSocketPrivate::QBluetoothSocketPrivate() - : socket(-1), - socketType(QBluetoothServiceInfo::UnknownProtocol), - state(QBluetoothSocket::UnconnectedState), - socketError(QBluetoothSocket::NoSocketError), - discoveryAgent(0), - secFlags(QBluetooth::NoSecurity) { + secFlags = QBluetooth::NoSecurity; #ifndef QT_IOS_BLUETOOTH printDummyWarning(); #endif diff --git a/src/bluetooth/qbluetoothsocket_p.h b/src/bluetooth/qbluetoothsocket_p.h index ae3c6182..6b002959 100644 --- a/src/bluetooth/qbluetoothsocket_p.h +++ b/src/bluetooth/qbluetoothsocket_p.h @@ -52,82 +52,41 @@ // #include "qbluetoothsocket.h" +#include "qbluetoothsocketbase_p.h" +#include -#ifdef QT_ANDROID_BLUETOOTH +#if defined(QT_ANDROID_BLUETOOTH) #include #include #include "android/inputstreamthread_p.h" #include -class WorkerThread; -#endif - -#ifdef QT_WINRT_BLUETOOTH -#include - -#include - -namespace ABI { - namespace Windows { - namespace Networking { - namespace Sockets { - struct IStreamSocket; - } - } - namespace Foundation { - struct IAsyncAction; - enum class AsyncStatus; - } - } -} -#endif // QT_WINRT_BLUETOOTH - -#ifndef QPRIVATELINEARBUFFER_BUFFERSIZE -#define QPRIVATELINEARBUFFER_BUFFERSIZE Q_INT64_C(16384) -#endif -#include "qprivatelinearbuffer_p.h" - -#include +#endif // QT_ANDROID_BLUETOOTH QT_FORWARD_DECLARE_CLASS(QSocketNotifier) -QT_BEGIN_NAMESPACE - #ifdef QT_WINRT_BLUETOOTH -class SocketWorker; +QT_FORWARD_DECLARE_CLASS(SocketWorker) #endif -class QBluetoothServiceDiscoveryAgent; - -class QSocketServerPrivate -{ -public: - QSocketServerPrivate(); - ~QSocketServerPrivate(); -}; - - - -class QBluetoothSocket; -class QBluetoothServiceDiscoveryAgent; +QT_BEGIN_NAMESPACE -#ifndef QT_OSX_BLUETOOTH -class QBluetoothSocketPrivate : public QObject +class QBluetoothSocketPrivate : public QBluetoothSocketBasePrivate { Q_OBJECT - Q_DECLARE_PUBLIC(QBluetoothSocket) friend class QBluetoothServerPrivate; public: - QBluetoothSocketPrivate(); - ~QBluetoothSocketPrivate(); + ~QBluetoothSocketPrivate() override; //On Android we connect using the uuid not the port #if defined(QT_ANDROID_BLUETOOTH) void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; #else - void connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode); + void connectToService(const QBluetoothAddress &address, + quint16 port, + QIODevice::OpenMode openMode) override; #endif #ifdef QT_ANDROID_BLUETOOTH bool fallBackConnect(QAndroidJniObject uuid, int channel); @@ -135,63 +94,39 @@ public: #endif - bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type); + bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type) override; - QString localName() const; - QBluetoothAddress localAddress() const; - quint16 localPort() const; + QString localName() const override; + QBluetoothAddress localAddress() const override; + quint16 localPort() const override; - QString peerName() const; - QBluetoothAddress peerAddress() const; - quint16 peerPort() const; - //QBluetoothServiceInfo peerService() const; + QString peerName() const override; + QBluetoothAddress peerAddress() const override; + quint16 peerPort() const override; - void abort(); - void close(); + void abort() override; + void close() override; - //qint64 readBufferSize() const; - //void setReadBufferSize(qint64 size); - - qint64 writeData(const char *data, qint64 maxSize); - qint64 readData(char *data, qint64 maxSize); + qint64 writeData(const char *data, qint64 maxSize) override; + qint64 readData(char *data, qint64 maxSize) override; #ifdef QT_ANDROID_BLUETOOTH bool setSocketDescriptor(const QAndroidJniObject &socket, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, - QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite); + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override; #elif defined(QT_WINRT_BLUETOOTH) bool setSocketDescriptor(Microsoft::WRL::ComPtr socket, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, - QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite); + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override; #endif bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, - QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite); - - qint64 bytesAvailable() const; - bool canReadLine() const; - qint64 bytesToWrite() const; - -public: - QPrivateLinearBuffer buffer; - QPrivateLinearBuffer txBuffer; - int socket; - QBluetoothServiceInfo::Protocol socketType; - QBluetoothSocket::SocketState state; - QBluetoothSocket::SocketError socketError; - QSocketNotifier *readNotifier; - QSocketNotifier *connectWriteNotifier; - bool connecting; - - QBluetoothServiceDiscoveryAgent *discoveryAgent; - QBluetoothSocket::OpenMode openMode; - QBluetooth::SecurityFlags secFlags; + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override; - -// QByteArray rxBuffer; -// qint64 rxOffset; - QString errorString; + qint64 bytesAvailable() const override; + bool canReadLine() const override; + qint64 bytesToWrite() const override; #ifdef QT_ANDROID_BLUETOOTH QAndroidJniObject adapter; @@ -213,7 +148,6 @@ public slots: signals: void connectJavaSocket(); void closeJavaSocket(); - #endif #ifdef QT_WINRT_BLUETOOTH @@ -240,37 +174,16 @@ private slots: void _q_writeNotify(); #endif -protected: - QBluetoothSocket *q_ptr; - private: #ifdef QT_WINRT_BLUETOOTH - HRESULT handleConnectOpFinished(ABI::Windows::Foundation::IAsyncAction *action, ABI::Windows::Foundation::AsyncStatus status); -#endif - -#if QT_CONFIG(bluez) -public: - quint8 lowEnergySocketType; + HRESULT handleConnectOpFinished(ABI::Windows::Foundation::IAsyncAction *action, + ABI::Windows::Foundation::AsyncStatus status); #endif -}; -#else // QT_OSX_BLUETOOTH -// QBluetoothSocketPrivate on OS X can not contain -// Q_OBJECT (moc does not parse Objective-C syntax). -// But QBluetoothSocket still requires QMetaObject::invokeMethod -// to work. Here's the trick: -class QBluetoothSocketPrivateBase : public QObject -{ -// The most important part of it: - Q_OBJECT -public slots: - virtual void _q_writeNotify() = 0; }; -#endif // QT_OSX_BLUETOOTH - static inline void convertAddress(const quint64 from, quint8 (&to)[6]) { to[0] = (from >> 0) & 0xff; diff --git a/src/bluetooth/qbluetoothsocket_winrt.cpp b/src/bluetooth/qbluetoothsocket_winrt.cpp index 670235fa..22bdbc7e 100644 --- a/src/bluetooth/qbluetoothsocket_winrt.cpp +++ b/src/bluetooth/qbluetoothsocket_winrt.cpp @@ -320,14 +320,9 @@ private: }; QBluetoothSocketPrivate::QBluetoothSocketPrivate() - : socket(-1), - socketType(QBluetoothServiceInfo::UnknownProtocol), - state(QBluetoothSocket::UnconnectedState), - socketError(QBluetoothSocket::NoSocketError), - discoveryAgent(0), - secFlags(QBluetooth::NoSecurity), - m_worker(new SocketWorker()) + : m_worker(new SocketWorker()) { + secFlags = QBluetooth::NoSecurity; connect(m_worker, &SocketWorker::newDataReceived, this, &QBluetoothSocketPrivate::handleNewData, Qt::QueuedConnection); connect(m_worker, &SocketWorker::socketErrorOccured, diff --git a/src/bluetooth/qbluetoothsocketbase.cpp b/src/bluetooth/qbluetoothsocketbase.cpp new file mode 100644 index 00000000..8401a1c3 --- /dev/null +++ b/src/bluetooth/qbluetoothsocketbase.cpp @@ -0,0 +1,54 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qbluetoothsocketbase_p.h" + +QT_BEGIN_NAMESPACE + +QBluetoothSocketBasePrivate::QBluetoothSocketBasePrivate(QObject *parent) : QObject(parent) +{ + +} + +QBluetoothSocketBasePrivate::~QBluetoothSocketBasePrivate() +{ + +} + +QT_END_NAMESPACE diff --git a/src/bluetooth/qbluetoothsocketbase_p.h b/src/bluetooth/qbluetoothsocketbase_p.h new file mode 100644 index 00000000..c2c6a1f7 --- /dev/null +++ b/src/bluetooth/qbluetoothsocketbase_p.h @@ -0,0 +1,193 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QBLUETOOTHSOCKETBASEPRIVATE_P_H +#define QBLUETOOTHSOCKETBASEPRIVATE_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include +#include +#include + +#if defined(QT_ANDROID_BLUETOOTH) +#include +#endif + +#if defined(QT_WINRT_BLUETOOTH) +#include + +#include + +namespace ABI { + namespace Windows { + namespace Networking { + namespace Sockets { + struct IStreamSocket; + } + } + namespace Foundation { + struct IAsyncAction; + enum class AsyncStatus; + } + } +} +#endif // QT_WINRT_BLUETOOTH + +#ifndef QPRIVATELINEARBUFFER_BUFFERSIZE +#define QPRIVATELINEARBUFFER_BUFFERSIZE Q_INT64_C(16384) +#endif +#include "qprivatelinearbuffer_p.h" + +QT_FORWARD_DECLARE_CLASS(QSocketNotifier) +QT_FORWARD_DECLARE_CLASS(QBluetoothServiceDiscoveryAgent) + +QT_BEGIN_NAMESPACE + +#ifndef QT_OSX_BLUETOOTH +class QBluetoothSocketBasePrivate : public QObject +{ + Q_OBJECT + +public: + explicit QBluetoothSocketBasePrivate(QObject *parent = nullptr); + virtual ~QBluetoothSocketBasePrivate(); + + virtual bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type) = 0; + + virtual QString localName() const = 0; + virtual QBluetoothAddress localAddress() const = 0; + virtual quint16 localPort() const = 0; + + virtual QString peerName() const = 0; + virtual QBluetoothAddress peerAddress() const = 0; + virtual quint16 peerPort() const = 0; + + virtual void abort() = 0; + virtual void close() = 0; + + virtual qint64 writeData(const char *data, qint64 maxSize) = 0; + virtual qint64 readData(char *data, qint64 maxSize) = 0; + + virtual qint64 bytesAvailable() const = 0; + virtual bool canReadLine() const = 0; + virtual qint64 bytesToWrite() const = 0; + + virtual bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, + QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) = 0; + +#if defined(QT_ANDROID_BLUETOOTH) + virtual void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, + QIODevice::OpenMode openMode) = 0; +#else + virtual void connectToService(const QBluetoothAddress &address, quint16 port, + QIODevice::OpenMode openMode) = 0; +#endif + +#ifdef QT_ANDROID_BLUETOOTH + virtual bool setSocketDescriptor(const QAndroidJniObject &socket, QBluetoothServiceInfo::Protocol socketType, + QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) = 0; +#elif defined(QT_WINRT_BLUETOOTH) + virtual bool setSocketDescriptor(Microsoft::WRL::ComPtr socket, + QBluetoothServiceInfo::Protocol socketType, + QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) = 0; +#endif + +public: + QPrivateLinearBuffer buffer; + QPrivateLinearBuffer txBuffer; + int socket = -1; + QBluetoothServiceInfo::Protocol socketType = QBluetoothServiceInfo::UnknownProtocol; + QBluetoothSocket::SocketState state = QBluetoothSocket::UnconnectedState; + QBluetoothSocket::SocketError socketError = QBluetoothSocket::NoSocketError; + QSocketNotifier *readNotifier = nullptr; + QSocketNotifier *connectWriteNotifier = nullptr; + bool connecting = false; + + QBluetoothServiceDiscoveryAgent *discoveryAgent = nullptr; + QBluetoothSocket::OpenMode openMode; + QBluetooth::SecurityFlags secFlags; + + QString errorString; + +protected: + Q_DECLARE_PUBLIC(QBluetoothSocket) + QBluetoothSocket *q_ptr; + +#if QT_CONFIG(bluez) +public: + quint8 lowEnergySocketType = 0; +#endif +}; + +#else // QT_OSX_BLUETOOTH + +// QBluetoothSocketPrivate on macOS can not contain +// Q_OBJECT (moc does not parse Objective-C syntax). +// But QBluetoothSocket still requires QMetaObject::invokeMethod +// to work. Here's the trick: +class QBluetoothSocketBasePrivate : public QObject +{ +// The most important part of it: + Q_OBJECT +public slots: + virtual void _q_writeNotify() = 0; + +protected: + Q_DECLARE_PUBLIC(QBluetoothSocket) + QBluetoothSocket *q_ptr; +}; + +#endif // QT_OSX_BLUETOOTH + +QT_END_NAMESPACE + +#endif // QBLUETOOTHSOCKETBASE_P_H -- cgit v1.2.3 From b20db00c080ff87c5b2a4d1fff2eac7cd694539c Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 19 Jul 2018 12:53:30 +0200 Subject: Add separate interfaces for QBluetoothSocketPrivate on Linux Uses the new QBluetoothSocketBasePrivate interface to separate the Linux implementations from other platforms. On Linux, there will be the existing raw socket implementation and a BlueZ5 DBus implementation. The DBus implementation is required for very recent Bluez5 deployments (v5.4x+) which restrict access to traditional SDP discovery means like sdptool. For now the DBus implementation is non-existing/dysfunctional. Task-number: QTBUG-68550 Change-Id: Idd248ecdb2a443a95cde521ced929218d40df3fe Reviewed-by: Lubomir I. Ivanov Reviewed-by: Oliver Wolff --- src/bluetooth/bluetooth.pro | 7 +- src/bluetooth/bluez/bluetoothmanagement.cpp | 2 +- src/bluetooth/bluez/hcimanager.cpp | 2 +- src/bluetooth/qbluetoothsocket.cpp | 12 ++ src/bluetooth/qbluetoothsocket.h | 2 + src/bluetooth/qbluetoothsocket_bluez.cpp | 52 ++++----- src/bluetooth/qbluetoothsocket_bluez_p.h | 101 +++++++++++++++++ src/bluetooth/qbluetoothsocket_bluezdbus.cpp | 159 +++++++++++++++++++++++++++ src/bluetooth/qbluetoothsocket_bluezdbus_p.h | 98 +++++++++++++++++ src/bluetooth/qbluetoothsocket_p.h | 31 ------ src/bluetooth/qbluetoothsocketbase_p.h | 23 ++++ src/bluetooth/qleadvertiser_bluez.cpp | 2 +- src/bluetooth/qlowenergycontroller_bluez.cpp | 2 +- 13 files changed, 431 insertions(+), 62 deletions(-) create mode 100644 src/bluetooth/qbluetoothsocket_bluez_p.h create mode 100644 src/bluetooth/qbluetoothsocket_bluezdbus.cpp create mode 100644 src/bluetooth/qbluetoothsocket_bluezdbus_p.h diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index 28470835..65c46559 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -96,13 +96,18 @@ qtConfig(bluez) { include(bluez/bluez.pri) PRIVATE_HEADERS += \ - qbluetoothtransferreply_bluez_p.h + qbluetoothtransferreply_bluez_p.h \ + qbluetoothsocket_bluez_p.h \ + qbluetoothsocket_bluezdbus_p.h + + PRIVATE_HEADERS -= qbluetoothsocket_p.h SOURCES += \ qbluetoothserviceinfo_bluez.cpp \ qbluetoothdevicediscoveryagent_bluez.cpp\ qbluetoothservicediscoveryagent_bluez.cpp \ qbluetoothsocket_bluez.cpp \ + qbluetoothsocket_bluezdbus.cpp \ qbluetoothserver_bluez.cpp \ qbluetoothlocaldevice_bluez.cpp \ qbluetoothtransferreply_bluez.cpp \ diff --git a/src/bluetooth/bluez/bluetoothmanagement.cpp b/src/bluetooth/bluez/bluetoothmanagement.cpp index 9df74b34..3f97f75c 100644 --- a/src/bluetooth/bluez/bluetoothmanagement.cpp +++ b/src/bluetooth/bluez/bluetoothmanagement.cpp @@ -43,7 +43,7 @@ #include "bluetoothmanagement_p.h" #include "bluez_data_p.h" -#include "../qbluetoothsocket_p.h" +#include "../qbluetoothsocketbase_p.h" #include #include diff --git a/src/bluetooth/bluez/hcimanager.cpp b/src/bluetooth/bluez/hcimanager.cpp index be62c881..bdb74ae0 100644 --- a/src/bluetooth/bluez/hcimanager.cpp +++ b/src/bluetooth/bluez/hcimanager.cpp @@ -40,7 +40,7 @@ #include "hcimanager_p.h" -#include "qbluetoothsocket_p.h" +#include "qbluetoothsocketbase_p.h" #include "qlowenergyconnectionparameters.h" #include diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index 6a5178db..1b187f4f 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -39,7 +39,11 @@ ****************************************************************************/ #include "qbluetoothsocket.h" +#if QT_CONFIG(bluez) +#include "qbluetoothsocket_bluez_p.h" +#else #include "qbluetoothsocket_p.h" +#endif #include "qbluetoothdeviceinfo.h" #include "qbluetoothserviceinfo.h" @@ -252,7 +256,11 @@ Q_DECLARE_LOGGING_CATEGORY(QT_BT) QBluetoothSocket::QBluetoothSocket(QBluetoothServiceInfo::Protocol socketType, QObject *parent) : QIODevice(parent) { +#if QT_CONFIG(bluez) + d_ptr = new QBluetoothSocketPrivateBluez(); +#else d_ptr = new QBluetoothSocketPrivate(); +#endif d_ptr->q_ptr = this; Q_D(QBluetoothSocketBase); @@ -267,7 +275,11 @@ QBluetoothSocket::QBluetoothSocket(QBluetoothServiceInfo::Protocol socketType, Q QBluetoothSocket::QBluetoothSocket(QObject *parent) : QIODevice(parent) { +#if QT_CONFIG(bluez) + d_ptr = new QBluetoothSocketPrivateBluez(); +#else d_ptr = new QBluetoothSocketPrivate(); +#endif d_ptr->q_ptr = this; setOpenMode(QIODevice::NotOpen); } diff --git a/src/bluetooth/qbluetoothsocket.h b/src/bluetooth/qbluetoothsocket.h index e7e59abf..17e046ba 100644 --- a/src/bluetooth/qbluetoothsocket.h +++ b/src/bluetooth/qbluetoothsocket.h @@ -71,6 +71,8 @@ class Q_BLUETOOTH_EXPORT QBluetoothSocket : public QIODevice friend class QBluetoothServer; friend class QBluetoothServerPrivate; friend class QBluetoothSocketPrivate; + friend class QBluetoothSocketPrivateBluez; + friend class QBluetoothSocketPrivateBluezDBus; public: diff --git a/src/bluetooth/qbluetoothsocket_bluez.cpp b/src/bluetooth/qbluetoothsocket_bluez.cpp index 4fb51567..10c31e71 100644 --- a/src/bluetooth/qbluetoothsocket_bluez.cpp +++ b/src/bluetooth/qbluetoothsocket_bluez.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2018 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtBluetooth module of the Qt Toolkit. @@ -38,7 +38,7 @@ ****************************************************************************/ #include "qbluetoothsocket.h" -#include "qbluetoothsocket_p.h" +#include "qbluetoothsocket_bluez_p.h" #include "bluez/manager_p.h" #include "bluez/adapter_p.h" @@ -62,30 +62,30 @@ QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(QT_BT_BLUEZ) -QBluetoothSocketPrivate::QBluetoothSocketPrivate() +QBluetoothSocketPrivateBluez::QBluetoothSocketPrivateBluez() : QBluetoothSocketBasePrivate() { secFlags = QBluetooth::Authorization; } -QBluetoothSocketPrivate::~QBluetoothSocketPrivate() +QBluetoothSocketPrivateBluez::~QBluetoothSocketPrivateBluez() { delete readNotifier; - readNotifier = 0; + readNotifier = nullptr; delete connectWriteNotifier; - connectWriteNotifier = 0; + connectWriteNotifier = nullptr; } -bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothServiceInfo::Protocol type) +bool QBluetoothSocketPrivateBluez::ensureNativeSocket(QBluetoothServiceInfo::Protocol type) { if (socket != -1) { if (socketType == type) return true; delete readNotifier; - readNotifier = 0; + readNotifier = nullptr; delete connectWriteNotifier; - connectWriteNotifier = 0; + connectWriteNotifier = nullptr; QT_CLOSE(socket); } @@ -121,7 +121,7 @@ bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothServiceInfo::Protocol return true; } -void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) +void QBluetoothSocketPrivateBluez::connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) { Q_Q(QBluetoothSocket); int result = -1; @@ -206,7 +206,7 @@ void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, } } -void QBluetoothSocketPrivate::_q_writeNotify() +void QBluetoothSocketPrivateBluez::_q_writeNotify() { Q_Q(QBluetoothSocket); if(connecting && state == QBluetoothSocket::ConnectingState){ @@ -267,7 +267,7 @@ void QBluetoothSocketPrivate::_q_writeNotify() } } -void QBluetoothSocketPrivate::_q_readNotify() +void QBluetoothSocketPrivateBluez::_q_readNotify() { Q_Q(QBluetoothSocket); char *writePointer = buffer.reserve(QPRIVATELINEARBUFFER_BUFFERSIZE); @@ -294,7 +294,7 @@ void QBluetoothSocketPrivate::_q_readNotify() } } -void QBluetoothSocketPrivate::abort() +void QBluetoothSocketPrivateBluez::abort() { delete readNotifier; readNotifier = 0; @@ -308,7 +308,7 @@ void QBluetoothSocketPrivate::abort() socket = -1; } -QString QBluetoothSocketPrivate::localName() const +QString QBluetoothSocketPrivateBluez::localName() const { const QBluetoothAddress address = localAddress(); if (address.isNull()) @@ -318,7 +318,7 @@ QString QBluetoothSocketPrivate::localName() const return device.name(); } -QBluetoothAddress QBluetoothSocketPrivate::localAddress() const +QBluetoothAddress QBluetoothSocketPrivateBluez::localAddress() const { if (socketType == QBluetoothServiceInfo::RfcommProtocol) { sockaddr_rc addr; @@ -337,7 +337,7 @@ QBluetoothAddress QBluetoothSocketPrivate::localAddress() const return QBluetoothAddress(); } -quint16 QBluetoothSocketPrivate::localPort() const +quint16 QBluetoothSocketPrivateBluez::localPort() const { if (socketType == QBluetoothServiceInfo::RfcommProtocol) { sockaddr_rc addr; @@ -356,7 +356,7 @@ quint16 QBluetoothSocketPrivate::localPort() const return 0; } -QString QBluetoothSocketPrivate::peerName() const +QString QBluetoothSocketPrivateBluez::peerName() const { quint64 bdaddr; @@ -444,7 +444,7 @@ QString QBluetoothSocketPrivate::peerName() const } } -QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const +QBluetoothAddress QBluetoothSocketPrivateBluez::peerAddress() const { if (socketType == QBluetoothServiceInfo::RfcommProtocol) { sockaddr_rc addr; @@ -463,7 +463,7 @@ QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const return QBluetoothAddress(); } -quint16 QBluetoothSocketPrivate::peerPort() const +quint16 QBluetoothSocketPrivateBluez::peerPort() const { if (socketType == QBluetoothServiceInfo::RfcommProtocol) { sockaddr_rc addr; @@ -482,7 +482,7 @@ quint16 QBluetoothSocketPrivate::peerPort() const return 0; } -qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize) +qint64 QBluetoothSocketPrivateBluez::writeData(const char *data, qint64 maxSize) { Q_Q(QBluetoothSocket); @@ -527,7 +527,7 @@ qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize) } } -qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize) +qint64 QBluetoothSocketPrivateBluez::readData(char *data, qint64 maxSize) { Q_Q(QBluetoothSocket); @@ -545,7 +545,7 @@ qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize) return 0; } -void QBluetoothSocketPrivate::close() +void QBluetoothSocketPrivateBluez::close() { if (txBuffer.size() > 0) connectWriteNotifier->setEnabled(true); @@ -553,7 +553,7 @@ void QBluetoothSocketPrivate::close() abort(); } -bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType_, +bool QBluetoothSocketPrivateBluez::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType_, QBluetoothSocket::SocketState socketState, QBluetoothSocket::OpenMode openMode) { Q_Q(QBluetoothSocket); @@ -581,17 +581,17 @@ bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoo return true; } -qint64 QBluetoothSocketPrivate::bytesAvailable() const +qint64 QBluetoothSocketPrivateBluez::bytesAvailable() const { return buffer.size(); } -qint64 QBluetoothSocketPrivate::bytesToWrite() const +qint64 QBluetoothSocketPrivateBluez::bytesToWrite() const { return txBuffer.size(); } -bool QBluetoothSocketPrivate::canReadLine() const +bool QBluetoothSocketPrivateBluez::canReadLine() const { return buffer.canReadLine(); } diff --git a/src/bluetooth/qbluetoothsocket_bluez_p.h b/src/bluetooth/qbluetoothsocket_bluez_p.h new file mode 100644 index 00000000..b356ac7b --- /dev/null +++ b/src/bluetooth/qbluetoothsocket_bluez_p.h @@ -0,0 +1,101 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QBLUETOOTHSOCKET_BLUEZ_H +#define QBLUETOOTHSOCKET_BLUEZ_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qbluetoothsocketbase_p.h" + +QT_BEGIN_NAMESPACE + +class QBluetoothSocketPrivateBluez final: public QBluetoothSocketBasePrivate +{ + Q_OBJECT + +public: + QBluetoothSocketPrivateBluez(); + ~QBluetoothSocketPrivateBluez(); + + void connectToService(const QBluetoothAddress &address, + quint16 port, + QIODevice::OpenMode openMode); + + bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type); + + QString localName() const; + QBluetoothAddress localAddress() const; + quint16 localPort() const; + + QString peerName() const; + QBluetoothAddress peerAddress() const; + quint16 peerPort() const; + + void abort(); + void close(); + + qint64 writeData(const char *data, qint64 maxSize); + qint64 readData(char *data, qint64 maxSize); + + bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, + QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite); + + qint64 bytesAvailable() const; + bool canReadLine() const; + qint64 bytesToWrite() const; + +private slots: + void _q_readNotify(); + void _q_writeNotify(); +}; + +QT_END_NAMESPACE + +#endif // QBLUETOOTHSOCKET_BLUEZ_H diff --git a/src/bluetooth/qbluetoothsocket_bluezdbus.cpp b/src/bluetooth/qbluetoothsocket_bluezdbus.cpp new file mode 100644 index 00000000..2dbbd425 --- /dev/null +++ b/src/bluetooth/qbluetoothsocket_bluezdbus.cpp @@ -0,0 +1,159 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qbluetoothsocket.h" +#include "qbluetoothsocket_bluezdbus_p.h" + +QT_BEGIN_NAMESPACE +QBluetoothSocketPrivateBluezDBus::QBluetoothSocketPrivateBluezDBus() +{ + secFlags = QBluetooth::NoSecurity; +} + +QBluetoothSocketPrivateBluezDBus::~QBluetoothSocketPrivateBluezDBus() +{ +} + +bool QBluetoothSocketPrivateBluezDBus::ensureNativeSocket(QBluetoothServiceInfo::Protocol type) +{ + socketType = type; + return false; +} + +void QBluetoothSocketPrivateBluezDBus::connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) +{ + Q_UNUSED(openMode); + Q_UNUSED(address); + Q_UNUSED(port); +} + +void QBluetoothSocketPrivateBluezDBus::abort() +{ +} + +QString QBluetoothSocketPrivateBluezDBus::localName() const +{ + return QString(); +} + +QBluetoothAddress QBluetoothSocketPrivateBluezDBus::localAddress() const +{ + return QBluetoothAddress(); +} + +quint16 QBluetoothSocketPrivateBluezDBus::localPort() const +{ + return 0; +} + +QString QBluetoothSocketPrivateBluezDBus::peerName() const +{ + return QString(); +} + +QBluetoothAddress QBluetoothSocketPrivateBluezDBus::peerAddress() const +{ + return QBluetoothAddress(); +} + +quint16 QBluetoothSocketPrivateBluezDBus::peerPort() const +{ + return 0; +} + +qint64 QBluetoothSocketPrivateBluezDBus::writeData(const char *data, qint64 maxSize) +{ + Q_UNUSED(data); + Q_UNUSED(maxSize); + + Q_Q(QBluetoothSocket); + + if (state != QBluetoothSocket::ConnectedState) { + errorString = QBluetoothSocket::tr("Cannot write while not connected"); + q->setSocketError(QBluetoothSocket::OperationError); + return -1; + } + return -1; +} + +qint64 QBluetoothSocketPrivateBluezDBus::readData(char *data, qint64 maxSize) +{ + Q_UNUSED(data); + Q_UNUSED(maxSize); + + Q_Q(QBluetoothSocket); + + if (state != QBluetoothSocket::ConnectedState) { + errorString = QBluetoothSocket::tr("Cannot read while not connected"); + q->setSocketError(QBluetoothSocket::OperationError); + return -1; + } + + return -1; +} + +void QBluetoothSocketPrivateBluezDBus::close() +{ +} + +bool QBluetoothSocketPrivateBluezDBus::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, + QBluetoothSocket::SocketState socketState, QBluetoothSocket::OpenMode openMode) +{ + Q_UNUSED(socketDescriptor); + Q_UNUSED(socketType) + Q_UNUSED(socketState); + Q_UNUSED(openMode); + return false; +} + +qint64 QBluetoothSocketPrivateBluezDBus::bytesAvailable() const +{ + return 0; +} + +bool QBluetoothSocketPrivateBluezDBus::canReadLine() const +{ + return false; +} + +qint64 QBluetoothSocketPrivateBluezDBus::bytesToWrite() const +{ + return 0; +} +QT_END_NAMESPACE diff --git a/src/bluetooth/qbluetoothsocket_bluezdbus_p.h b/src/bluetooth/qbluetoothsocket_bluezdbus_p.h new file mode 100644 index 00000000..74af8bbe --- /dev/null +++ b/src/bluetooth/qbluetoothsocket_bluezdbus_p.h @@ -0,0 +1,98 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QBLUETOOTHSOCKET_BLUEZDBUS_H +#define QBLUETOOTHSOCKET_BLUEZDBUS_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qbluetoothsocketbase_p.h" + +QT_BEGIN_NAMESPACE + +class QBluetoothSocketPrivateBluezDBus final: public QBluetoothSocketBasePrivate +{ + Q_OBJECT + +public: + QBluetoothSocketPrivateBluezDBus(); + ~QBluetoothSocketPrivateBluezDBus(); + + void connectToService(const QBluetoothAddress &address, + quint16 port, + QIODevice::OpenMode openMode); + + bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type); + + QString localName() const; + QBluetoothAddress localAddress() const; + quint16 localPort() const; + + QString peerName() const; + QBluetoothAddress peerAddress() const; + quint16 peerPort() const; + + void abort(); + void close(); + + qint64 writeData(const char *data, qint64 maxSize); + qint64 readData(char *data, qint64 maxSize); + + bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, + QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite); + + qint64 bytesAvailable() const; + bool canReadLine() const; + qint64 bytesToWrite() const; +}; + + +QT_END_NAMESPACE + +#endif // QBLUETOOTHSOCKET_BLUEZDBUS_H diff --git a/src/bluetooth/qbluetoothsocket_p.h b/src/bluetooth/qbluetoothsocket_p.h index 6b002959..6c3bedf3 100644 --- a/src/bluetooth/qbluetoothsocket_p.h +++ b/src/bluetooth/qbluetoothsocket_p.h @@ -168,44 +168,14 @@ private slots: void handleError(QBluetoothSocket::SocketError error); #endif // QT_WINRT_BLUETOOTH -#if QT_CONFIG(bluez) -private slots: - void _q_readNotify(); - void _q_writeNotify(); -#endif - private: #ifdef QT_WINRT_BLUETOOTH HRESULT handleConnectOpFinished(ABI::Windows::Foundation::IAsyncAction *action, ABI::Windows::Foundation::AsyncStatus status); #endif - - }; -static inline void convertAddress(const quint64 from, quint8 (&to)[6]) -{ - to[0] = (from >> 0) & 0xff; - to[1] = (from >> 8) & 0xff; - to[2] = (from >> 16) & 0xff; - to[3] = (from >> 24) & 0xff; - to[4] = (from >> 32) & 0xff; - to[5] = (from >> 40) & 0xff; -} - -static inline quint64 convertAddress(const quint8 (&from)[6], quint64 *to = 0) -{ - const quint64 result = (quint64(from[0]) << 0) | - (quint64(from[1]) << 8) | - (quint64(from[2]) << 16) | - (quint64(from[3]) << 24) | - (quint64(from[4]) << 32) | - (quint64(from[5]) << 40); - if (to) - *to = result; - return result; -} #ifdef Q_OS_ANDROID // QTBUG-61392 related @@ -218,5 +188,4 @@ extern bool useReverseUuidWorkAroundConnect; QT_END_NAMESPACE - #endif diff --git a/src/bluetooth/qbluetoothsocketbase_p.h b/src/bluetooth/qbluetoothsocketbase_p.h index c2c6a1f7..c393c940 100644 --- a/src/bluetooth/qbluetoothsocketbase_p.h +++ b/src/bluetooth/qbluetoothsocketbase_p.h @@ -168,6 +168,29 @@ public: #endif }; +static inline void convertAddress(const quint64 from, quint8 (&to)[6]) +{ + to[0] = (from >> 0) & 0xff; + to[1] = (from >> 8) & 0xff; + to[2] = (from >> 16) & 0xff; + to[3] = (from >> 24) & 0xff; + to[4] = (from >> 32) & 0xff; + to[5] = (from >> 40) & 0xff; +} + +static inline quint64 convertAddress(const quint8 (&from)[6], quint64 *to = nullptr) +{ + const quint64 result = (quint64(from[0]) << 0) | + (quint64(from[1]) << 8) | + (quint64(from[2]) << 16) | + (quint64(from[3]) << 24) | + (quint64(from[4]) << 32) | + (quint64(from[5]) << 40); + if (to) + *to = result; + return result; +} + #else // QT_OSX_BLUETOOTH // QBluetoothSocketPrivate on macOS can not contain diff --git a/src/bluetooth/qleadvertiser_bluez.cpp b/src/bluetooth/qleadvertiser_bluez.cpp index b964f620..bff5a590 100644 --- a/src/bluetooth/qleadvertiser_bluez.cpp +++ b/src/bluetooth/qleadvertiser_bluez.cpp @@ -41,7 +41,7 @@ #include "bluez/bluez_data_p.h" #include "bluez/hcimanager_p.h" -#include "qbluetoothsocket_p.h" +#include "qbluetoothsocketbase_p.h" #include diff --git a/src/bluetooth/qlowenergycontroller_bluez.cpp b/src/bluetooth/qlowenergycontroller_bluez.cpp index d288f3ad..502f42ad 100644 --- a/src/bluetooth/qlowenergycontroller_bluez.cpp +++ b/src/bluetooth/qlowenergycontroller_bluez.cpp @@ -40,7 +40,7 @@ #include "lecmaccalculator_p.h" #include "qlowenergycontroller_bluez_p.h" -#include "qbluetoothsocket_p.h" +#include "qbluetoothsocketbase_p.h" #include "qleadvertiser_p.h" #include "bluez/bluez_data_p.h" #include "bluez/hcimanager_p.h" -- cgit v1.2.3 From 40beb226dfe8c23f290d554d5449806e91227f7e Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Thu, 19 Jul 2018 17:37:40 +0200 Subject: Add QBluetoothSocketPrivate interface for Android Task-number: QTBUG-68550 Change-Id: Iac05cccd4f6e1b44a30568fb9b6c9171204b53fd Reviewed-by: Lubomir I. Ivanov Reviewed-by: Oliver Wolff --- src/bluetooth/android/inputstreamthread.cpp | 4 +- src/bluetooth/android/inputstreamthread_p.h | 6 +- src/bluetooth/bluetooth.pro | 4 +- src/bluetooth/qbluetoothserver_android.cpp | 2 +- src/bluetooth/qbluetoothsocket.cpp | 6 ++ src/bluetooth/qbluetoothsocket.h | 1 + src/bluetooth/qbluetoothsocket_android.cpp | 68 +++++++------- src/bluetooth/qbluetoothsocket_android_p.h | 138 ++++++++++++++++++++++++++++ src/bluetooth/qbluetoothsocket_p.h | 57 +----------- 9 files changed, 189 insertions(+), 97 deletions(-) create mode 100644 src/bluetooth/qbluetoothsocket_android_p.h diff --git a/src/bluetooth/android/inputstreamthread.cpp b/src/bluetooth/android/inputstreamthread.cpp index 982c477b..1cc353a3 100644 --- a/src/bluetooth/android/inputstreamthread.cpp +++ b/src/bluetooth/android/inputstreamthread.cpp @@ -42,13 +42,13 @@ #include #include "android/inputstreamthread_p.h" -#include "qbluetoothsocket_p.h" +#include "qbluetoothsocket_android_p.h" QT_BEGIN_NAMESPACE Q_DECLARE_LOGGING_CATEGORY(QT_BT_ANDROID) -InputStreamThread::InputStreamThread(QBluetoothSocketPrivate *socket) +InputStreamThread::InputStreamThread(QBluetoothSocketPrivateAndroid *socket) : QObject(), m_socket_p(socket), expectClosure(false) { } diff --git a/src/bluetooth/android/inputstreamthread_p.h b/src/bluetooth/android/inputstreamthread_p.h index a6ee0655..060b2acf 100644 --- a/src/bluetooth/android/inputstreamthread_p.h +++ b/src/bluetooth/android/inputstreamthread_p.h @@ -59,13 +59,13 @@ QT_BEGIN_NAMESPACE -class QBluetoothSocketPrivate; +class QBluetoothSocketPrivateAndroid; class InputStreamThread : public QObject { Q_OBJECT public: - explicit InputStreamThread(QBluetoothSocketPrivate *socket_p); + explicit InputStreamThread(QBluetoothSocketPrivateAndroid *socket_p); qint64 bytesAvailable() const; bool canReadLine() const; @@ -82,7 +82,7 @@ signals: void error(int errorCode); private: - QBluetoothSocketPrivate *m_socket_p; + QBluetoothSocketPrivateAndroid *m_socket_p; QAndroidJniObject javaInputStreamThread; mutable QMutex m_mutex; bool expectClosure; diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index 65c46559..69883613 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -155,8 +155,10 @@ qtConfig(bluez) { qbluetoothserver_android.cpp \ qlowenergycontroller_android.cpp - PRIVATE_HEADERS += qlowenergycontroller_android_p.h + PRIVATE_HEADERS += qlowenergycontroller_android_p.h \ + qbluetoothsocket_android_p.h + PRIVATE_HEADERS -= qbluetoothsocket_p.h } else:osx { QT_PRIVATE = concurrent DEFINES += QT_OSX_BLUETOOTH diff --git a/src/bluetooth/qbluetoothserver_android.cpp b/src/bluetooth/qbluetoothserver_android.cpp index 7d3d3588..b001adb8 100644 --- a/src/bluetooth/qbluetoothserver_android.cpp +++ b/src/bluetooth/qbluetoothserver_android.cpp @@ -41,7 +41,7 @@ #include "qbluetoothserver.h" #include "qbluetoothserver_p.h" #include "qbluetoothsocket.h" -#include "qbluetoothsocket_p.h" +#include "qbluetoothsocket_android_p.h" #include "qbluetoothlocaldevice.h" #include "android/serveracceptancethread_p.h" diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index 1b187f4f..d59b2adb 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -41,6 +41,8 @@ #include "qbluetoothsocket.h" #if QT_CONFIG(bluez) #include "qbluetoothsocket_bluez_p.h" +#elif defined(QT_ANDROID_BLUETOOTH) +#include "qbluetoothsocket_android_p.h" #else #include "qbluetoothsocket_p.h" #endif @@ -258,6 +260,8 @@ QBluetoothSocket::QBluetoothSocket(QBluetoothServiceInfo::Protocol socketType, Q { #if QT_CONFIG(bluez) d_ptr = new QBluetoothSocketPrivateBluez(); +#elif defined(QT_ANDROID_BLUETOOTH) + d_ptr = new QBluetoothSocketPrivateAndroid(); #else d_ptr = new QBluetoothSocketPrivate(); #endif @@ -277,6 +281,8 @@ QBluetoothSocket::QBluetoothSocket(QObject *parent) { #if QT_CONFIG(bluez) d_ptr = new QBluetoothSocketPrivateBluez(); +#elif defined(QT_ANDROID_BLUETOOTH) + d_ptr = new QBluetoothSocketPrivateAndroid(); #else d_ptr = new QBluetoothSocketPrivate(); #endif diff --git a/src/bluetooth/qbluetoothsocket.h b/src/bluetooth/qbluetoothsocket.h index 17e046ba..fc36b9ca 100644 --- a/src/bluetooth/qbluetoothsocket.h +++ b/src/bluetooth/qbluetoothsocket.h @@ -71,6 +71,7 @@ class Q_BLUETOOTH_EXPORT QBluetoothSocket : public QIODevice friend class QBluetoothServer; friend class QBluetoothServerPrivate; friend class QBluetoothSocketPrivate; + friend class QBluetoothSocketPrivateAndroid; friend class QBluetoothSocketPrivateBluez; friend class QBluetoothSocketPrivateBluezDBus; diff --git a/src/bluetooth/qbluetoothsocket_android.cpp b/src/bluetooth/qbluetoothsocket_android.cpp index 9a81fc3a..42fe4ff4 100644 --- a/src/bluetooth/qbluetoothsocket_android.cpp +++ b/src/bluetooth/qbluetoothsocket_android.cpp @@ -39,7 +39,7 @@ ****************************************************************************/ #include "qbluetoothsocket.h" -#include "qbluetoothsocket_p.h" +#include "qbluetoothsocket_android_p.h" #include "qbluetoothaddress.h" #include #include @@ -148,8 +148,8 @@ public: { } - // Runs in same thread as QBluetoothSocketPrivate - void setupWorker(QBluetoothSocketPrivate* d_ptr, const QAndroidJniObject& socketObject, + // Runs in same thread as QBluetoothSocketPrivateAndroid + void setupWorker(QBluetoothSocketPrivateAndroid* d_ptr, const QAndroidJniObject& socketObject, const QAndroidJniObject& uuidObject, bool useFallback, const QBluetoothUuid& qtUuid = QBluetoothUuid()) { @@ -159,18 +159,18 @@ public: connect(this, &QThread::finished, worker, &QObject::deleteLater); connect(this, &QThread::finished, this, &QObject::deleteLater); - connect(d_ptr, &QBluetoothSocketPrivate::connectJavaSocket, + connect(d_ptr, &QBluetoothSocketPrivateAndroid::connectJavaSocket, worker, &SocketConnectWorker::connectSocket); - connect(d_ptr, &QBluetoothSocketPrivate::closeJavaSocket, + connect(d_ptr, &QBluetoothSocketPrivateAndroid::closeJavaSocket, worker, &SocketConnectWorker::closeSocket); connect(worker, &SocketConnectWorker::socketConnectDone, - d_ptr, &QBluetoothSocketPrivate::socketConnectSuccess); + d_ptr, &QBluetoothSocketPrivateAndroid::socketConnectSuccess); if (useFallback) { connect(worker, &SocketConnectWorker::socketConnectFailed, - d_ptr, &QBluetoothSocketPrivate::fallbackSocketConnectFailed); + d_ptr, &QBluetoothSocketPrivateAndroid::fallbackSocketConnectFailed); } else { connect(worker, &SocketConnectWorker::socketConnectFailed, - d_ptr, &QBluetoothSocketPrivate::defaultSocketConnectFailed); + d_ptr, &QBluetoothSocketPrivateAndroid::defaultSocketConnectFailed); } workerPointer = worker; @@ -204,7 +204,7 @@ static QBluetoothUuid reverseUuid(const QBluetoothUuid &serviceUuid) return QBluetoothUuid(reversed); } -QBluetoothSocketPrivate::QBluetoothSocketPrivate() +QBluetoothSocketPrivateAndroid::QBluetoothSocketPrivateAndroid() : inputThread(0) { @@ -216,13 +216,13 @@ QBluetoothSocketPrivate::QBluetoothSocketPrivate() qRegisterMetaType(); } -QBluetoothSocketPrivate::~QBluetoothSocketPrivate() +QBluetoothSocketPrivateAndroid::~QBluetoothSocketPrivateAndroid() { if (state != QBluetoothSocket::UnconnectedState) emit closeJavaSocket(); } -bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothServiceInfo::Protocol type) +bool QBluetoothSocketPrivateAndroid::ensureNativeSocket(QBluetoothServiceInfo::Protocol type) { socketType = type; if (socketType == QBluetoothServiceInfo::RfcommProtocol) @@ -231,7 +231,7 @@ bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothServiceInfo::Protocol return false; } -bool QBluetoothSocketPrivate::fallBackConnect(QAndroidJniObject uuid, int channel) +bool QBluetoothSocketPrivateAndroid::fallBackConnect(QAndroidJniObject uuid, int channel) { qCWarning(QT_BT_ANDROID) << "Falling back to getServiceChannel() workaround."; @@ -350,7 +350,7 @@ bool QBluetoothSocketPrivate::fallBackConnect(QAndroidJniObject uuid, int channe /* * Workaround for QTBUG-61392 */ -bool QBluetoothSocketPrivate::fallBackReversedConnect(const QBluetoothUuid &uuid) +bool QBluetoothSocketPrivateAndroid::fallBackReversedConnect(const QBluetoothUuid &uuid) { Q_Q(QBluetoothSocket); @@ -420,7 +420,7 @@ bool QBluetoothSocketPrivate::fallBackReversedConnect(const QBluetoothUuid &uuid * 8. if threaded connect on fallback channel fails call fallbackSocketConnectFailed() * -> complete failure of entire connectToService() * */ -void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, +void QBluetoothSocketPrivateAndroid::connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODevice::OpenMode openMode) { @@ -503,7 +503,7 @@ void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, emit connectJavaSocket(); } -void QBluetoothSocketPrivate::socketConnectSuccess(const QAndroidJniObject &socket) +void QBluetoothSocketPrivateAndroid::socketConnectSuccess(const QAndroidJniObject &socket) { Q_Q(QBluetoothSocket); QAndroidJniEnvironment env; @@ -563,7 +563,7 @@ void QBluetoothSocketPrivate::socketConnectSuccess(const QAndroidJniObject &sock emit q->connected(); } -void QBluetoothSocketPrivate::defaultSocketConnectFailed( +void QBluetoothSocketPrivateAndroid::defaultSocketConnectFailed( const QAndroidJniObject &socket, const QAndroidJniObject &targetUuid, const QBluetoothUuid &qtTargetUuid) { @@ -592,7 +592,7 @@ void QBluetoothSocketPrivate::defaultSocketConnectFailed( } } -void QBluetoothSocketPrivate::fallbackSocketConnectFailed( +void QBluetoothSocketPrivateAndroid::fallbackSocketConnectFailed( const QAndroidJniObject &socket, const QAndroidJniObject &targetUuid) { Q_UNUSED(targetUuid); @@ -611,7 +611,7 @@ void QBluetoothSocketPrivate::fallbackSocketConnectFailed( q->setSocketState(QBluetoothSocket::UnconnectedState); } -void QBluetoothSocketPrivate::abort() +void QBluetoothSocketPrivateAndroid::abort() { if (state == QBluetoothSocket::UnconnectedState) return; @@ -624,7 +624,7 @@ void QBluetoothSocketPrivate::abort() * thread because inputStream.read() throws IOException * In turn the thread stops and throws an error which sets * new state, error and emits relevant signals. - * See QBluetoothSocketPrivate::inputThreadError() for details + * See QBluetoothSocketPrivateAndroid::inputThreadError() for details */ if (inputThread) @@ -653,7 +653,7 @@ void QBluetoothSocketPrivate::abort() } } -QString QBluetoothSocketPrivate::localName() const +QString QBluetoothSocketPrivateAndroid::localName() const { if (adapter.isValid()) return adapter.callObjectMethod("getName").toString(); @@ -661,7 +661,7 @@ QString QBluetoothSocketPrivate::localName() const return QString(); } -QBluetoothAddress QBluetoothSocketPrivate::localAddress() const +QBluetoothAddress QBluetoothSocketPrivateAndroid::localAddress() const { QString result; if (adapter.isValid()) @@ -670,13 +670,13 @@ QBluetoothAddress QBluetoothSocketPrivate::localAddress() const return QBluetoothAddress(result); } -quint16 QBluetoothSocketPrivate::localPort() const +quint16 QBluetoothSocketPrivateAndroid::localPort() const { // Impossible to get channel number with current Android API (Levels 5 to 19) return 0; } -QString QBluetoothSocketPrivate::peerName() const +QString QBluetoothSocketPrivateAndroid::peerName() const { if (!remoteDevice.isValid()) return QString(); @@ -684,7 +684,7 @@ QString QBluetoothSocketPrivate::peerName() const return remoteDevice.callObjectMethod("getName", "()Ljava/lang/String;").toString(); } -QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const +QBluetoothAddress QBluetoothSocketPrivateAndroid::peerAddress() const { if (!remoteDevice.isValid()) return QBluetoothAddress(); @@ -695,13 +695,13 @@ QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const return QBluetoothAddress(address); } -quint16 QBluetoothSocketPrivate::peerPort() const +quint16 QBluetoothSocketPrivateAndroid::peerPort() const { // Impossible to get channel number with current Android API (Levels 5 to 13) return 0; } -qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize) +qint64 QBluetoothSocketPrivateAndroid::writeData(const char *data, qint64 maxSize) { //TODO implement buffered behavior (so far only unbuffered) Q_Q(QBluetoothSocket); @@ -731,7 +731,7 @@ qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize) return maxSize; } -qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize) +qint64 QBluetoothSocketPrivateAndroid::readData(char *data, qint64 maxSize) { Q_Q(QBluetoothSocket); if (state != QBluetoothSocket::ConnectedState || !inputThread) { @@ -744,7 +744,7 @@ qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize) return inputThread->readData(data, maxSize); } -void QBluetoothSocketPrivate::inputThreadError(int errorCode) +void QBluetoothSocketPrivateAndroid::inputThreadError(int errorCode) { Q_Q(QBluetoothSocket); @@ -778,7 +778,7 @@ void QBluetoothSocketPrivate::inputThreadError(int errorCode) emit q->disconnected(); } -void QBluetoothSocketPrivate::close() +void QBluetoothSocketPrivateAndroid::close() { /* This function is called by QBluetoothSocket::close and softer version QBluetoothSocket::disconnectFromService() which difference I do not quite fully understand. @@ -787,7 +787,7 @@ void QBluetoothSocketPrivate::close() abort(); } -bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, +bool QBluetoothSocketPrivateAndroid::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState, QBluetoothSocket::OpenMode openMode) { Q_UNUSED(socketDescriptor); @@ -798,7 +798,7 @@ bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoo return false; } -bool QBluetoothSocketPrivate::setSocketDescriptor(const QAndroidJniObject &socket, QBluetoothServiceInfo::Protocol socketType_, +bool QBluetoothSocketPrivateAndroid::setSocketDescriptor(const QAndroidJniObject &socket, QBluetoothServiceInfo::Protocol socketType_, QBluetoothSocket::SocketState socketState, QBluetoothSocket::OpenMode openMode) { Q_Q(QBluetoothSocket); @@ -866,7 +866,7 @@ bool QBluetoothSocketPrivate::setSocketDescriptor(const QAndroidJniObject &socke return true; } -qint64 QBluetoothSocketPrivate::bytesAvailable() const +qint64 QBluetoothSocketPrivateAndroid::bytesAvailable() const { //We cannot access buffer directly as it is part of different thread if (inputThread) @@ -875,12 +875,12 @@ qint64 QBluetoothSocketPrivate::bytesAvailable() const return 0; } -qint64 QBluetoothSocketPrivate::bytesToWrite() const +qint64 QBluetoothSocketPrivateAndroid::bytesToWrite() const { return 0; // nothing because always unbuffered } -bool QBluetoothSocketPrivate::canReadLine() const +bool QBluetoothSocketPrivateAndroid::canReadLine() const { // We cannot access buffer directly as it is part of different thread if (inputThread) diff --git a/src/bluetooth/qbluetoothsocket_android_p.h b/src/bluetooth/qbluetoothsocket_android_p.h new file mode 100644 index 00000000..34fd260a --- /dev/null +++ b/src/bluetooth/qbluetoothsocket_android_p.h @@ -0,0 +1,138 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#ifndef QBLUETOOTHSOCKET_ANDROID_P_H +#define QBLUETOOTHSOCKET_ANDROID_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qbluetoothsocketbase_p.h" + +#include +#include +#include "android/inputstreamthread_p.h" +#include + +QT_BEGIN_NAMESPACE + +class QBluetoothSocketPrivateAndroid final : public QBluetoothSocketBasePrivate +{ + Q_OBJECT + friend class QBluetoothServerPrivate; + +public: + QBluetoothSocketPrivateAndroid(); + ~QBluetoothSocketPrivateAndroid(); + + //On Android we connect using the uuid not the port + void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, + QIODevice::OpenMode openMode); + + bool fallBackConnect(QAndroidJniObject uuid, int channel); + bool fallBackReversedConnect(const QBluetoothUuid &uuid); + + bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type); + + QString localName() const; + QBluetoothAddress localAddress() const; + quint16 localPort() const; + + QString peerName() const; + QBluetoothAddress peerAddress() const; + quint16 peerPort() const; + + void abort(); + void close(); + + qint64 writeData(const char *data, qint64 maxSize); + qint64 readData(char *data, qint64 maxSize); + + bool setSocketDescriptor(const QAndroidJniObject &socket, QBluetoothServiceInfo::Protocol socketType, + QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite); + + bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, + QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite); + + qint64 bytesAvailable() const; + bool canReadLine() const; + qint64 bytesToWrite() const; + + QAndroidJniObject adapter; + QAndroidJniObject socketObject; + QAndroidJniObject remoteDevice; + QAndroidJniObject inputStream; + QAndroidJniObject outputStream; + InputStreamThread *inputThread; + +public slots: + void socketConnectSuccess(const QAndroidJniObject &socket); + void defaultSocketConnectFailed(const QAndroidJniObject & socket, + const QAndroidJniObject &targetUuid, + const QBluetoothUuid &qtTargetUuid); + void fallbackSocketConnectFailed(const QAndroidJniObject &socket, + const QAndroidJniObject &targetUuid); + void inputThreadError(int errorCode); + +signals: + void connectJavaSocket(); + void closeJavaSocket(); + +}; + +// QTBUG-61392 related +// Private API to disable the silent behavior to reverse a remote service's +// UUID. In rare cases the workaround behavior might not be desirable as +// it may lead to connects to incorrect services. +extern bool useReverseUuidWorkAroundConnect; + +QT_END_NAMESPACE + +#endif // QBLUETOOTHSOCKET_ANDROID_P_H diff --git a/src/bluetooth/qbluetoothsocket_p.h b/src/bluetooth/qbluetoothsocket_p.h index 6c3bedf3..d4839fb0 100644 --- a/src/bluetooth/qbluetoothsocket_p.h +++ b/src/bluetooth/qbluetoothsocket_p.h @@ -55,13 +55,6 @@ #include "qbluetoothsocketbase_p.h" #include -#if defined(QT_ANDROID_BLUETOOTH) -#include -#include -#include "android/inputstreamthread_p.h" -#include -#endif // QT_ANDROID_BLUETOOTH - QT_FORWARD_DECLARE_CLASS(QSocketNotifier) #ifdef QT_WINRT_BLUETOOTH @@ -79,21 +72,9 @@ public: QBluetoothSocketPrivate(); ~QBluetoothSocketPrivate() override; -//On Android we connect using the uuid not the port -#if defined(QT_ANDROID_BLUETOOTH) - void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, - QIODevice::OpenMode openMode) override; -#else void connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) override; -#endif -#ifdef QT_ANDROID_BLUETOOTH - bool fallBackConnect(QAndroidJniObject uuid, int channel); - bool fallBackReversedConnect(const QBluetoothUuid &uuid); -#endif - - bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type) override; QString localName() const override; @@ -110,11 +91,7 @@ public: qint64 writeData(const char *data, qint64 maxSize) override; qint64 readData(char *data, qint64 maxSize) override; -#ifdef QT_ANDROID_BLUETOOTH - bool setSocketDescriptor(const QAndroidJniObject &socket, QBluetoothServiceInfo::Protocol socketType, - QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, - QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override; -#elif defined(QT_WINRT_BLUETOOTH) +#if defined(QT_WINRT_BLUETOOTH) bool setSocketDescriptor(Microsoft::WRL::ComPtr socket, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, @@ -128,28 +105,6 @@ public: bool canReadLine() const override; qint64 bytesToWrite() const override; -#ifdef QT_ANDROID_BLUETOOTH - QAndroidJniObject adapter; - QAndroidJniObject socketObject; - QAndroidJniObject remoteDevice; - QAndroidJniObject inputStream; - QAndroidJniObject outputStream; - InputStreamThread *inputThread; - -public slots: - void socketConnectSuccess(const QAndroidJniObject &socket); - void defaultSocketConnectFailed(const QAndroidJniObject & socket, - const QAndroidJniObject &targetUuid, - const QBluetoothUuid &qtTargetUuid); - void fallbackSocketConnectFailed(const QAndroidJniObject &socket, - const QAndroidJniObject &targetUuid); - void inputThreadError(int errorCode); - -signals: - void connectJavaSocket(); - void closeJavaSocket(); -#endif - #ifdef QT_WINRT_BLUETOOTH SocketWorker *m_worker; @@ -176,16 +131,6 @@ private: #endif }; - -#ifdef Q_OS_ANDROID -// QTBUG-61392 related -// Private API to disable the silent behavior to reverse a remote service's -// UUID. In rare cases the workaround behavior might not be desirable as -// it may lead to connects to incorrect services. -extern bool useReverseUuidWorkAroundConnect; - -#endif - QT_END_NAMESPACE #endif -- cgit v1.2.3 From 4aa30934473380793fb7bce38c9c8f6f235c9e4a Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 20 Jul 2018 12:15:55 +0200 Subject: Add QBluetoothSocketPrivate interface for WinRT Task-number: QTBUG-68550 Change-Id: I14fe43fcbbbdd6950f05feda900643f6899daa24 Reviewed-by: Oliver Wolff --- src/bluetooth/bluetooth.pro | 5 +- src/bluetooth/qbluetoothserver_winrt.cpp | 2 +- src/bluetooth/qbluetoothsocket.cpp | 6 ++ src/bluetooth/qbluetoothsocket.h | 1 + src/bluetooth/qbluetoothsocket_p.h | 37 --------- src/bluetooth/qbluetoothsocket_winrt.cpp | 63 ++++++++-------- src/bluetooth/qbluetoothsocket_winrt_p.h | 126 +++++++++++++++++++++++++++++++ 7 files changed, 169 insertions(+), 71 deletions(-) create mode 100644 src/bluetooth/qbluetoothsocket_winrt_p.h diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index 69883613..d310dd64 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -237,7 +237,10 @@ qtConfig(bluez) { qbluetoothsocket_winrt.cpp \ qlowenergycontroller_winrt.cpp - PRIVATE_HEADERS += qlowenergycontroller_winrt_p.h + PRIVATE_HEADERS += qlowenergycontroller_winrt_p.h \ + qbluetoothsocket_winrt_p.h + + PRIVATE_HEADERS -= qbluetoothsocket_p.h lessThan(WINDOWS_SDK_VERSION, 14393) { DEFINES += QT_WINRT_LIMITED_SERVICEDISCOVERY diff --git a/src/bluetooth/qbluetoothserver_winrt.cpp b/src/bluetooth/qbluetoothserver_winrt.cpp index 08aa45b4..a53ef110 100644 --- a/src/bluetooth/qbluetoothserver_winrt.cpp +++ b/src/bluetooth/qbluetoothserver_winrt.cpp @@ -40,7 +40,7 @@ #include "qbluetoothserver.h" #include "qbluetoothserver_p.h" #include "qbluetoothsocket.h" -#include "qbluetoothsocket_p.h" +#include "qbluetoothsocket_winrt_p.h" #include #include diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index d59b2adb..feb52684 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -43,6 +43,8 @@ #include "qbluetoothsocket_bluez_p.h" #elif defined(QT_ANDROID_BLUETOOTH) #include "qbluetoothsocket_android_p.h" +#elif defined(QT_WINRT_BLUETOOTH) +#include "qbluetoothsocket_winrt_p.h" #else #include "qbluetoothsocket_p.h" #endif @@ -262,6 +264,8 @@ QBluetoothSocket::QBluetoothSocket(QBluetoothServiceInfo::Protocol socketType, Q d_ptr = new QBluetoothSocketPrivateBluez(); #elif defined(QT_ANDROID_BLUETOOTH) d_ptr = new QBluetoothSocketPrivateAndroid(); +#elif defined(QT_WINRT_BLUETOOTH) + d_ptr = new QBluetoothSocketPrivateWinRT(); #else d_ptr = new QBluetoothSocketPrivate(); #endif @@ -283,6 +287,8 @@ QBluetoothSocket::QBluetoothSocket(QObject *parent) d_ptr = new QBluetoothSocketPrivateBluez(); #elif defined(QT_ANDROID_BLUETOOTH) d_ptr = new QBluetoothSocketPrivateAndroid(); +#elif defined(QT_WINRT_BLUETOOTH) + d_ptr = new QBluetoothSocketPrivateWinRT(); #else d_ptr = new QBluetoothSocketPrivate(); #endif diff --git a/src/bluetooth/qbluetoothsocket.h b/src/bluetooth/qbluetoothsocket.h index fc36b9ca..7f77d2a8 100644 --- a/src/bluetooth/qbluetoothsocket.h +++ b/src/bluetooth/qbluetoothsocket.h @@ -74,6 +74,7 @@ class Q_BLUETOOTH_EXPORT QBluetoothSocket : public QIODevice friend class QBluetoothSocketPrivateAndroid; friend class QBluetoothSocketPrivateBluez; friend class QBluetoothSocketPrivateBluezDBus; + friend class QBluetoothSocketPrivateWinRT; public: diff --git a/src/bluetooth/qbluetoothsocket_p.h b/src/bluetooth/qbluetoothsocket_p.h index d4839fb0..6eef56fb 100644 --- a/src/bluetooth/qbluetoothsocket_p.h +++ b/src/bluetooth/qbluetoothsocket_p.h @@ -55,12 +55,6 @@ #include "qbluetoothsocketbase_p.h" #include -QT_FORWARD_DECLARE_CLASS(QSocketNotifier) - -#ifdef QT_WINRT_BLUETOOTH -QT_FORWARD_DECLARE_CLASS(SocketWorker) -#endif - QT_BEGIN_NAMESPACE class QBluetoothSocketPrivate : public QBluetoothSocketBasePrivate @@ -91,12 +85,6 @@ public: qint64 writeData(const char *data, qint64 maxSize) override; qint64 readData(char *data, qint64 maxSize) override; -#if defined(QT_WINRT_BLUETOOTH) - bool setSocketDescriptor(Microsoft::WRL::ComPtr socket, - QBluetoothServiceInfo::Protocol socketType, - QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, - QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override; -#endif bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override; @@ -104,31 +92,6 @@ public: qint64 bytesAvailable() const override; bool canReadLine() const override; qint64 bytesToWrite() const override; - -#ifdef QT_WINRT_BLUETOOTH - SocketWorker *m_worker; - - Microsoft::WRL::ComPtr m_socketObject; - Microsoft::WRL::ComPtr m_connectOp; - - QMutex m_readMutex; - - // Protected by m_readMutex. Written in addToPendingData (native callback) - QVector m_pendingData; - - Q_INVOKABLE void addToPendingData(const QVector &data); - -private slots: - void handleNewData(const QVector &data); - void handleError(QBluetoothSocket::SocketError error); -#endif // QT_WINRT_BLUETOOTH - -private: - -#ifdef QT_WINRT_BLUETOOTH - HRESULT handleConnectOpFinished(ABI::Windows::Foundation::IAsyncAction *action, - ABI::Windows::Foundation::AsyncStatus status); -#endif }; QT_END_NAMESPACE diff --git a/src/bluetooth/qbluetoothsocket_winrt.cpp b/src/bluetooth/qbluetoothsocket_winrt.cpp index 22bdbc7e..46b46c4e 100644 --- a/src/bluetooth/qbluetoothsocket_winrt.cpp +++ b/src/bluetooth/qbluetoothsocket_winrt.cpp @@ -37,8 +37,7 @@ ** ****************************************************************************/ -#include "qbluetoothsocket.h" -#include "qbluetoothsocket_p.h" +#include "qbluetoothsocket_winrt_p.h" #ifdef CLASSIC_APP_BUILD #define Q_OS_WINRT @@ -319,22 +318,22 @@ private: ComPtr> m_readOp; }; -QBluetoothSocketPrivate::QBluetoothSocketPrivate() +QBluetoothSocketPrivateWinRT::QBluetoothSocketPrivateWinRT() : m_worker(new SocketWorker()) { secFlags = QBluetooth::NoSecurity; connect(m_worker, &SocketWorker::newDataReceived, - this, &QBluetoothSocketPrivate::handleNewData, Qt::QueuedConnection); + this, &QBluetoothSocketPrivateWinRT::handleNewData, Qt::QueuedConnection); connect(m_worker, &SocketWorker::socketErrorOccured, - this, &QBluetoothSocketPrivate::handleError, Qt::QueuedConnection); + this, &QBluetoothSocketPrivateWinRT::handleError, Qt::QueuedConnection); } -QBluetoothSocketPrivate::~QBluetoothSocketPrivate() +QBluetoothSocketPrivateWinRT::~QBluetoothSocketPrivateWinRT() { abort(); } -bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothServiceInfo::Protocol type) +bool QBluetoothSocketPrivateWinRT::ensureNativeSocket(QBluetoothServiceInfo::Protocol type) { if (socket != -1) { if (type == socketType) @@ -358,7 +357,7 @@ bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothServiceInfo::Protocol return true; } -void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) +void QBluetoothSocketPrivateWinRT::connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) { Q_Q(QBluetoothSocket); Q_UNUSED(openMode); @@ -377,14 +376,14 @@ void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, Q_ASSERT_SUCCEEDED(hr); ComPtr remoteHost; hr = hostNameFactory->CreateHostName(hostNameRef.Get(), &remoteHost); - RETURN_VOID_IF_FAILED("QBluetoothSocketPrivate::connectToService: Could not create hostname."); + RETURN_VOID_IF_FAILED("QBluetoothSocketPrivateWinRT::connectToService: Could not create hostname."); const QString portString = QString::number(port); HStringReference portReference(reinterpret_cast(portString.utf16())); hr = m_socketObject->ConnectAsync(remoteHost.Get(), portReference.Get(), &m_connectOp); if (hr == E_ACCESSDENIED) { - qErrnoWarning(hr, "QBluetoothSocketPrivate::connectToService: Unable to connect to bluetooth socket." + qErrnoWarning(hr, "QBluetoothSocketPrivateWinRT::connectToService: Unable to connect to bluetooth socket." "Please check your manifest capabilities."); q->setSocketState(QBluetoothSocket::UnconnectedState); return; @@ -396,22 +395,22 @@ void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, QEventDispatcherWinRT::runOnXamlThread([this]() { HRESULT hr; hr = m_connectOp->put_Completed(Callback( - this, &QBluetoothSocketPrivate::handleConnectOpFinished).Get()); + this, &QBluetoothSocketPrivateWinRT::handleConnectOpFinished).Get()); RETURN_HR_IF_FAILED("connectToHostByName: Could not register \"connectOp\" callback"); return S_OK; }); } -void QBluetoothSocketPrivate::abort() +void QBluetoothSocketPrivateWinRT::abort() { Q_Q(QBluetoothSocket); if (state == QBluetoothSocket::UnconnectedState) return; disconnect(m_worker, &SocketWorker::newDataReceived, - this, &QBluetoothSocketPrivate::handleNewData); + this, &QBluetoothSocketPrivateWinRT::handleNewData); disconnect(m_worker, &SocketWorker::socketErrorOccured, - this, &QBluetoothSocketPrivate::handleError); + this, &QBluetoothSocketPrivateWinRT::handleError); m_worker->close(); m_worker->deleteLater(); @@ -422,7 +421,7 @@ void QBluetoothSocketPrivate::abort() q->setSocketState(QBluetoothSocket::UnconnectedState); } -QString QBluetoothSocketPrivate::localName() const +QString QBluetoothSocketPrivateWinRT::localName() const { const QBluetoothAddress address = localAddress(); if (address.isNull()) @@ -432,7 +431,7 @@ QString QBluetoothSocketPrivate::localName() const return device.name(); } -QBluetoothAddress QBluetoothSocketPrivate::localAddress() const +QBluetoothAddress QBluetoothSocketPrivateWinRT::localAddress() const { if (!m_socketObject) return QBluetoothAddress(); @@ -450,7 +449,7 @@ QBluetoothAddress QBluetoothSocketPrivate::localAddress() const return QBluetoothAddress(qt_QStringFromHString(localAddress)); } -quint16 QBluetoothSocketPrivate::localPort() const +quint16 QBluetoothSocketPrivateWinRT::localPort() const { if (!m_socketObject) return 0; @@ -465,7 +464,7 @@ quint16 QBluetoothSocketPrivate::localPort() const return qt_QStringFromHString(localPortString).toInt(); } -QString QBluetoothSocketPrivate::peerName() const +QString QBluetoothSocketPrivateWinRT::peerName() const { if (!m_socketObject) return QString(); @@ -483,7 +482,7 @@ QString QBluetoothSocketPrivate::peerName() const return qt_QStringFromHString(remoteHostName); } -QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const +QBluetoothAddress QBluetoothSocketPrivateWinRT::peerAddress() const { if (!m_socketObject) return QBluetoothAddress(); @@ -501,7 +500,7 @@ QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const return QBluetoothAddress(qt_QStringFromHString(remoteAddress)); } -quint16 QBluetoothSocketPrivate::peerPort() const +quint16 QBluetoothSocketPrivateWinRT::peerPort() const { if (!m_socketObject) return 0; @@ -516,7 +515,7 @@ quint16 QBluetoothSocketPrivate::peerPort() const return qt_QStringFromHString(remotePortString).toInt(); } -qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize) +qint64 QBluetoothSocketPrivateWinRT::writeData(const char *data, qint64 maxSize) { Q_Q(QBluetoothSocket); @@ -542,7 +541,7 @@ qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize) return bytesWritten; } -qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize) +qint64 QBluetoothSocketPrivateWinRT::readData(char *data, qint64 maxSize) { Q_Q(QBluetoothSocket); @@ -558,12 +557,12 @@ qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize) return 0; } -void QBluetoothSocketPrivate::close() +void QBluetoothSocketPrivateWinRT::close() { abort(); } -bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, +bool QBluetoothSocketPrivateWinRT::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState, QBluetoothSocket::OpenMode openMode) { Q_UNUSED(socketDescriptor); @@ -574,7 +573,7 @@ bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoo return false; } -bool QBluetoothSocketPrivate::setSocketDescriptor(ComPtr socketPtr, QBluetoothServiceInfo::Protocol socketType, +bool QBluetoothSocketPrivateWinRT::setSocketDescriptor(ComPtr socketPtr, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState, QBluetoothSocket::OpenMode openMode) { Q_Q(QBluetoothSocket); @@ -591,22 +590,22 @@ bool QBluetoothSocketPrivate::setSocketDescriptor(ComPtr socketPt return true; } -qint64 QBluetoothSocketPrivate::bytesAvailable() const +qint64 QBluetoothSocketPrivateWinRT::bytesAvailable() const { return buffer.size(); } -qint64 QBluetoothSocketPrivate::bytesToWrite() const +qint64 QBluetoothSocketPrivateWinRT::bytesToWrite() const { return 0; // nothing because always unbuffered } -bool QBluetoothSocketPrivate::canReadLine() const +bool QBluetoothSocketPrivateWinRT::canReadLine() const { return buffer.canReadLine(); } -void QBluetoothSocketPrivate::handleNewData(const QVector &data) +void QBluetoothSocketPrivateWinRT::handleNewData(const QVector &data) { // Defer putting the data into the list until the next event loop iteration // (where the readyRead signal is emitted as well) @@ -614,7 +613,7 @@ void QBluetoothSocketPrivate::handleNewData(const QVector &data) Q_ARG(QVector, data)); } -void QBluetoothSocketPrivate::handleError(QBluetoothSocket::SocketError error) +void QBluetoothSocketPrivateWinRT::handleError(QBluetoothSocket::SocketError error) { Q_Q(QBluetoothSocket); switch (error) { @@ -632,7 +631,7 @@ void QBluetoothSocketPrivate::handleError(QBluetoothSocket::SocketError error) q->setSocketState(QBluetoothSocket::UnconnectedState); } -void QBluetoothSocketPrivate::addToPendingData(const QVector &data) +void QBluetoothSocketPrivateWinRT::addToPendingData(const QVector &data) { Q_Q(QBluetoothSocket); QMutexLocker locker(&m_readMutex); @@ -645,7 +644,7 @@ void QBluetoothSocketPrivate::addToPendingData(const QVector &data) emit q->readyRead(); } -HRESULT QBluetoothSocketPrivate::handleConnectOpFinished(ABI::Windows::Foundation::IAsyncAction *action, ABI::Windows::Foundation::AsyncStatus status) +HRESULT QBluetoothSocketPrivateWinRT::handleConnectOpFinished(ABI::Windows::Foundation::IAsyncAction *action, ABI::Windows::Foundation::AsyncStatus status) { Q_Q(QBluetoothSocket); if (status != Completed || !m_connectOp) { // Protect against a late callback diff --git a/src/bluetooth/qbluetoothsocket_winrt_p.h b/src/bluetooth/qbluetoothsocket_winrt_p.h new file mode 100644 index 00000000..a6597009 --- /dev/null +++ b/src/bluetooth/qbluetoothsocket_winrt_p.h @@ -0,0 +1,126 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QBLUETOOTHSOCKET_WINRT_P_H +#define QBLUETOOTHSOCKET_WINRT_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qbluetoothsocket.h" +#include "qbluetoothsocketbase_p.h" +#include + +QT_FORWARD_DECLARE_CLASS(SocketWorker) + +QT_BEGIN_NAMESPACE + +class QBluetoothSocketPrivateWinRT final: public QBluetoothSocketBasePrivate +{ + Q_OBJECT + friend class QBluetoothServerPrivate; + +public: + QBluetoothSocketPrivateWinRT(); + ~QBluetoothSocketPrivateWinRT(); + + void connectToService(const QBluetoothAddress &address, + quint16 port, + QIODevice::OpenMode openMode); + bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type); + + QString localName() const; + QBluetoothAddress localAddress() const; + quint16 localPort() const; + + QString peerName() const; + QBluetoothAddress peerAddress() const; + quint16 peerPort() const; + + void abort(); + void close(); + + qint64 writeData(const char *data, qint64 maxSize); + qint64 readData(char *data, qint64 maxSize); + + bool setSocketDescriptor(Microsoft::WRL::ComPtr socket, + QBluetoothServiceInfo::Protocol socketType, + QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite); + + bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, + QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite); + + qint64 bytesAvailable() const; + bool canReadLine() const; + qint64 bytesToWrite() const; + + SocketWorker *m_worker; + + Microsoft::WRL::ComPtr m_socketObject; + Microsoft::WRL::ComPtr m_connectOp; + + QMutex m_readMutex; + + // Protected by m_readMutex. Written in addToPendingData (native callback) + QVector m_pendingData; + + Q_INVOKABLE void addToPendingData(const QVector &data); + +private slots: + void handleNewData(const QVector &data); + void handleError(QBluetoothSocket::SocketError error); + +private: + HRESULT handleConnectOpFinished(ABI::Windows::Foundation::IAsyncAction *action, + ABI::Windows::Foundation::AsyncStatus status); +}; + +QT_END_NAMESPACE + +#endif -- cgit v1.2.3 From e452269d918655c3aaf0d5759cf2143478661af5 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 20 Jul 2018 12:38:10 +0200 Subject: Rename the final interface for the QBluetoothSocketPrivate dummy At the same time we reshuffle the inclusion of qbluetoothsocket_p.h in bluetooth.pro based on usage pattern. Task-number: QTBUG-68550 Change-Id: I3ae3f61c65e71a57d238f5c67289720ff63a1b0f Reviewed-by: Lubomir I. Ivanov Reviewed-by: Oliver Wolff --- src/bluetooth/bluetooth.pro | 17 +++++----------- src/bluetooth/qbluetoothsocket.cpp | 4 ++-- src/bluetooth/qbluetoothsocket.h | 1 + src/bluetooth/qbluetoothsocket_p.cpp | 36 +++++++++++++++++----------------- src/bluetooth/qbluetoothsocket_p.h | 38 ++++++++++++++++++------------------ 5 files changed, 45 insertions(+), 51 deletions(-) diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index d310dd64..bff367a8 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -40,7 +40,6 @@ PRIVATE_HEADERS += \ qbluetoothserviceinfo_p.h\ qbluetoothdevicediscoveryagent_p.h\ qbluetoothservicediscoveryagent_p.h\ - qbluetoothsocket_p.h\ qbluetoothsocketbase_p.h \ qbluetoothserver_p.h\ qbluetoothtransferreply_p.h \ @@ -100,8 +99,6 @@ qtConfig(bluez) { qbluetoothsocket_bluez_p.h \ qbluetoothsocket_bluezdbus_p.h - PRIVATE_HEADERS -= qbluetoothsocket_p.h - SOURCES += \ qbluetoothserviceinfo_bluez.cpp \ qbluetoothdevicediscoveryagent_bluez.cpp\ @@ -110,7 +107,7 @@ qtConfig(bluez) { qbluetoothsocket_bluezdbus.cpp \ qbluetoothserver_bluez.cpp \ qbluetoothlocaldevice_bluez.cpp \ - qbluetoothtransferreply_bluez.cpp \ + qbluetoothtransferreply_bluez.cpp # old versions of Bluez do not have the required BTLE symbols @@ -157,8 +154,6 @@ qtConfig(bluez) { PRIVATE_HEADERS += qlowenergycontroller_android_p.h \ qbluetoothsocket_android_p.h - - PRIVATE_HEADERS -= qbluetoothsocket_p.h } else:osx { QT_PRIVATE = concurrent DEFINES += QT_OSX_BLUETOOTH @@ -182,8 +177,6 @@ qtConfig(bluez) { qbluetoothtransferreply_osx_p.h \ qlowenergycontroller_osx_p.h - PRIVATE_HEADERS -= qbluetoothsocket_p.h - SOURCES -= qbluetoothdevicediscoveryagent.cpp SOURCES -= qbluetoothserviceinfo.cpp SOURCES -= qbluetoothservicediscoveryagent.cpp @@ -204,7 +197,8 @@ qtConfig(bluez) { qlowenergyservice_osx.mm PRIVATE_HEADERS += \ - qlowenergycontroller_osx_p.h + qlowenergycontroller_osx_p.h \ + qbluetoothsocket_p.h include(osx/osxbt.pri) SOURCES += \ @@ -240,8 +234,6 @@ qtConfig(bluez) { PRIVATE_HEADERS += qlowenergycontroller_winrt_p.h \ qbluetoothsocket_winrt_p.h - PRIVATE_HEADERS -= qbluetoothsocket_p.h - lessThan(WINDOWS_SDK_VERSION, 14393) { DEFINES += QT_WINRT_LIMITED_SERVICEDISCOVERY DEFINES += QT_UCRTVERSION=$$WINDOWS_SDK_VERSION @@ -259,7 +251,8 @@ qtConfig(bluez) { qbluetoothserver_p.cpp \ qlowenergycontroller_p.cpp - PRIVATE_HEADERS += qlowenergycontroller_p.h + PRIVATE_HEADERS += qlowenergycontroller_p.h \ + qbluetoothsocket_p.h } winrt { diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index feb52684..9516a0c4 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -267,7 +267,7 @@ QBluetoothSocket::QBluetoothSocket(QBluetoothServiceInfo::Protocol socketType, Q #elif defined(QT_WINRT_BLUETOOTH) d_ptr = new QBluetoothSocketPrivateWinRT(); #else - d_ptr = new QBluetoothSocketPrivate(); + d_ptr = new QBluetoothSocketPrivateDummy(); #endif d_ptr->q_ptr = this; @@ -290,7 +290,7 @@ QBluetoothSocket::QBluetoothSocket(QObject *parent) #elif defined(QT_WINRT_BLUETOOTH) d_ptr = new QBluetoothSocketPrivateWinRT(); #else - d_ptr = new QBluetoothSocketPrivate(); + d_ptr = new QBluetoothSocketPrivateDummy(); #endif d_ptr->q_ptr = this; setOpenMode(QIODevice::NotOpen); diff --git a/src/bluetooth/qbluetoothsocket.h b/src/bluetooth/qbluetoothsocket.h index 7f77d2a8..cda64dff 100644 --- a/src/bluetooth/qbluetoothsocket.h +++ b/src/bluetooth/qbluetoothsocket.h @@ -74,6 +74,7 @@ class Q_BLUETOOTH_EXPORT QBluetoothSocket : public QIODevice friend class QBluetoothSocketPrivateAndroid; friend class QBluetoothSocketPrivateBluez; friend class QBluetoothSocketPrivateBluezDBus; + friend class QBluetoothSocketPrivateDummy; friend class QBluetoothSocketPrivateWinRT; public: diff --git a/src/bluetooth/qbluetoothsocket_p.cpp b/src/bluetooth/qbluetoothsocket_p.cpp index bd074763..82359ac9 100644 --- a/src/bluetooth/qbluetoothsocket_p.cpp +++ b/src/bluetooth/qbluetoothsocket_p.cpp @@ -45,7 +45,7 @@ QT_BEGIN_NAMESPACE -QBluetoothSocketPrivate::QBluetoothSocketPrivate() +QBluetoothSocketPrivateDummy::QBluetoothSocketPrivateDummy() { secFlags = QBluetooth::NoSecurity; #ifndef QT_IOS_BLUETOOTH @@ -53,58 +53,58 @@ QBluetoothSocketPrivate::QBluetoothSocketPrivate() #endif } -QBluetoothSocketPrivate::~QBluetoothSocketPrivate() +QBluetoothSocketPrivateDummy::~QBluetoothSocketPrivateDummy() { } -bool QBluetoothSocketPrivate::ensureNativeSocket(QBluetoothServiceInfo::Protocol type) +bool QBluetoothSocketPrivateDummy::ensureNativeSocket(QBluetoothServiceInfo::Protocol type) { socketType = type; return false; } -void QBluetoothSocketPrivate::connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) +void QBluetoothSocketPrivateDummy::connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) { Q_UNUSED(openMode); Q_UNUSED(address); Q_UNUSED(port); } -void QBluetoothSocketPrivate::abort() +void QBluetoothSocketPrivateDummy::abort() { } -QString QBluetoothSocketPrivate::localName() const +QString QBluetoothSocketPrivateDummy::localName() const { return QString(); } -QBluetoothAddress QBluetoothSocketPrivate::localAddress() const +QBluetoothAddress QBluetoothSocketPrivateDummy::localAddress() const { return QBluetoothAddress(); } -quint16 QBluetoothSocketPrivate::localPort() const +quint16 QBluetoothSocketPrivateDummy::localPort() const { return 0; } -QString QBluetoothSocketPrivate::peerName() const +QString QBluetoothSocketPrivateDummy::peerName() const { return QString(); } -QBluetoothAddress QBluetoothSocketPrivate::peerAddress() const +QBluetoothAddress QBluetoothSocketPrivateDummy::peerAddress() const { return QBluetoothAddress(); } -quint16 QBluetoothSocketPrivate::peerPort() const +quint16 QBluetoothSocketPrivateDummy::peerPort() const { return 0; } -qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize) +qint64 QBluetoothSocketPrivateDummy::writeData(const char *data, qint64 maxSize) { Q_UNUSED(data); Q_UNUSED(maxSize); @@ -119,7 +119,7 @@ qint64 QBluetoothSocketPrivate::writeData(const char *data, qint64 maxSize) return -1; } -qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize) +qint64 QBluetoothSocketPrivateDummy::readData(char *data, qint64 maxSize) { Q_UNUSED(data); Q_UNUSED(maxSize); @@ -135,11 +135,11 @@ qint64 QBluetoothSocketPrivate::readData(char *data, qint64 maxSize) return -1; } -void QBluetoothSocketPrivate::close() +void QBluetoothSocketPrivateDummy::close() { } -bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, +bool QBluetoothSocketPrivateDummy::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState, QBluetoothSocket::OpenMode openMode) { Q_UNUSED(socketDescriptor); @@ -149,17 +149,17 @@ bool QBluetoothSocketPrivate::setSocketDescriptor(int socketDescriptor, QBluetoo return false; } -qint64 QBluetoothSocketPrivate::bytesAvailable() const +qint64 QBluetoothSocketPrivateDummy::bytesAvailable() const { return 0; } -bool QBluetoothSocketPrivate::canReadLine() const +bool QBluetoothSocketPrivateDummy::canReadLine() const { return false; } -qint64 QBluetoothSocketPrivate::bytesToWrite() const +qint64 QBluetoothSocketPrivateDummy::bytesToWrite() const { return 0; } diff --git a/src/bluetooth/qbluetoothsocket_p.h b/src/bluetooth/qbluetoothsocket_p.h index 6eef56fb..f01467a8 100644 --- a/src/bluetooth/qbluetoothsocket_p.h +++ b/src/bluetooth/qbluetoothsocket_p.h @@ -57,41 +57,41 @@ QT_BEGIN_NAMESPACE -class QBluetoothSocketPrivate : public QBluetoothSocketBasePrivate +class QBluetoothSocketPrivateDummy final : public QBluetoothSocketBasePrivate { Q_OBJECT friend class QBluetoothServerPrivate; public: - QBluetoothSocketPrivate(); - ~QBluetoothSocketPrivate() override; + QBluetoothSocketPrivateDummy(); + ~QBluetoothSocketPrivateDummy(); void connectToService(const QBluetoothAddress &address, quint16 port, - QIODevice::OpenMode openMode) override; - bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type) override; + QIODevice::OpenMode openMode); + bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type); - QString localName() const override; - QBluetoothAddress localAddress() const override; - quint16 localPort() const override; + QString localName() const; + QBluetoothAddress localAddress() const; + quint16 localPort() const; - QString peerName() const override; - QBluetoothAddress peerAddress() const override; - quint16 peerPort() const override; + QString peerName() const; + QBluetoothAddress peerAddress() const; + quint16 peerPort() const; - void abort() override; - void close() override; + void abort(); + void close(); - qint64 writeData(const char *data, qint64 maxSize) override; - qint64 readData(char *data, qint64 maxSize) override; + qint64 writeData(const char *data, qint64 maxSize); + qint64 readData(char *data, qint64 maxSize); bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, - QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override; + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite); - qint64 bytesAvailable() const override; - bool canReadLine() const override; - qint64 bytesToWrite() const override; + qint64 bytesAvailable() const; + bool canReadLine() const; + qint64 bytesToWrite() const; }; QT_END_NAMESPACE -- cgit v1.2.3 From 81de083e4f9fdee7f1ef7d2fffc7d2147ddbc1b0 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Fri, 20 Jul 2018 16:19:13 +0200 Subject: Rename QBluetoothSocketBasePrivate::connectToService() The goal is to move the various QBluetoothSocket::connectoService() implementations into the private classes. Common parts can be split into QBluetoothSocketBasePrivate and the platform specific code. The code becomes cleaner and has less ifdefs. However this creates a symbol clash with the currently existing private implementation as it has a function with the same signature but different purpose. This rename provides the foundation for future changes. Task-number: QTBUG-68550 Change-Id: I121f08d93e00790c1619c0449629f47bca8a964d Reviewed-by: Lubomir I. Ivanov Reviewed-by: Oliver Wolff --- src/bluetooth/qbluetoothsocket.cpp | 10 +++++----- src/bluetooth/qbluetoothsocket_android.cpp | 14 +++++++------- src/bluetooth/qbluetoothsocket_android_p.h | 2 +- src/bluetooth/qbluetoothsocket_bluez.cpp | 2 +- src/bluetooth/qbluetoothsocket_bluez_p.h | 2 +- src/bluetooth/qbluetoothsocket_bluezdbus.cpp | 2 +- src/bluetooth/qbluetoothsocket_bluezdbus_p.h | 2 +- src/bluetooth/qbluetoothsocket_p.cpp | 2 +- src/bluetooth/qbluetoothsocket_p.h | 2 +- src/bluetooth/qbluetoothsocket_winrt.cpp | 2 +- src/bluetooth/qbluetoothsocket_winrt_p.h | 2 +- src/bluetooth/qbluetoothsocketbase_p.h | 4 ++-- 12 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index 9516a0c4..1849844e 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -367,7 +367,7 @@ void QBluetoothSocket::connectToService(const QBluetoothServiceInfo &service, Op setSocketError(QBluetoothSocket::UnsupportedProtocolError); return; } - d->connectToService(service.device().address(), service.serviceUuid(), openMode); + d->connectToServiceHelper(service.device().address(), service.serviceUuid(), openMode); #else #if defined(QT_WINRT_BLUETOOTH) // Report these problems early: @@ -391,14 +391,14 @@ void QBluetoothSocket::connectToService(const QBluetoothServiceInfo &service, Op setSocketError(UnknownSocketError); return; } - d->connectToService(service.device().address(), service.protocolServiceMultiplexer(), openMode); + d->connectToServiceHelper(service.device().address(), service.protocolServiceMultiplexer(), openMode); } else if (service.serverChannel() > 0) { if (!d->ensureNativeSocket(QBluetoothServiceInfo::RfcommProtocol)) { d->errorString = tr("Unknown socket error"); setSocketError(UnknownSocketError); return; } - d->connectToService(service.device().address(), service.serverChannel(), openMode); + d->connectToServiceHelper(service.device().address(), service.serverChannel(), openMode); } else { // try doing service discovery to see if we can find the socket if (service.serviceUuid().isNull() @@ -460,7 +460,7 @@ void QBluetoothSocket::connectToService(const QBluetoothAddress &address, const setSocketError(QBluetoothSocket::UnsupportedProtocolError); return; } - d->connectToService(address, uuid, openMode); + d->connectToServiceHelper(address, uuid, openMode); #else #if defined(QT_WINRT_BLUETOOTH) // Report these problems early, prevent device discovery: @@ -539,7 +539,7 @@ void QBluetoothSocket::connectToService(const QBluetoothAddress &address, quint1 } setOpenMode(openMode); - d->connectToService(address, port, openMode); + d->connectToServiceHelper(address, port, openMode); #endif } diff --git a/src/bluetooth/qbluetoothsocket_android.cpp b/src/bluetooth/qbluetoothsocket_android.cpp index 42fe4ff4..109d3141 100644 --- a/src/bluetooth/qbluetoothsocket_android.cpp +++ b/src/bluetooth/qbluetoothsocket_android.cpp @@ -403,31 +403,31 @@ bool QBluetoothSocketPrivateAndroid::fallBackReversedConnect(const QBluetoothUui } /* - * The call order during a connectToService() is as follows: + * The call order during a connectToServiceHelper() is as follows: * - * 1. call connectToService() + * 1. call connectToServiceHelper() * 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() if Android version 22 or below - * -> Android 23+ complete failure of entire connectToService() + * -> Android 23+ complete failure of entire connectToServiceHelper() * 6. call fallBackReversedConnect() if Android version 23 or above - * -> if failure entire connectToService() fails + * -> if failure entire connectToServiceHelper() fails * 7. if threaded connect on one of above fallbacks succeeds call socketConnectSuccess() * via signals * -> done * 8. if threaded connect on fallback channel fails call fallbackSocketConnectFailed() - * -> complete failure of entire connectToService() + * -> complete failure of entire connectToServiceHelper() * */ -void QBluetoothSocketPrivateAndroid::connectToService(const QBluetoothAddress &address, +void QBluetoothSocketPrivateAndroid::connectToServiceHelper(const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODevice::OpenMode openMode) { Q_Q(QBluetoothSocket); Q_UNUSED(openMode); - qCDebug(QT_BT_ANDROID) << "connectToService()" << address.toString() << uuid.toString(); + qCDebug(QT_BT_ANDROID) << "connectToServiceHelper()" << address.toString() << uuid.toString(); q->setSocketState(QBluetoothSocket::ConnectingState); diff --git a/src/bluetooth/qbluetoothsocket_android_p.h b/src/bluetooth/qbluetoothsocket_android_p.h index 34fd260a..893b5fe3 100644 --- a/src/bluetooth/qbluetoothsocket_android_p.h +++ b/src/bluetooth/qbluetoothsocket_android_p.h @@ -71,7 +71,7 @@ public: ~QBluetoothSocketPrivateAndroid(); //On Android we connect using the uuid not the port - void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, + void connectToServiceHelper(const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODevice::OpenMode openMode); bool fallBackConnect(QAndroidJniObject uuid, int channel); diff --git a/src/bluetooth/qbluetoothsocket_bluez.cpp b/src/bluetooth/qbluetoothsocket_bluez.cpp index 10c31e71..0e5181f2 100644 --- a/src/bluetooth/qbluetoothsocket_bluez.cpp +++ b/src/bluetooth/qbluetoothsocket_bluez.cpp @@ -121,7 +121,7 @@ bool QBluetoothSocketPrivateBluez::ensureNativeSocket(QBluetoothServiceInfo::Pro return true; } -void QBluetoothSocketPrivateBluez::connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) +void QBluetoothSocketPrivateBluez::connectToServiceHelper(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) { Q_Q(QBluetoothSocket); int result = -1; diff --git a/src/bluetooth/qbluetoothsocket_bluez_p.h b/src/bluetooth/qbluetoothsocket_bluez_p.h index b356ac7b..3d178f85 100644 --- a/src/bluetooth/qbluetoothsocket_bluez_p.h +++ b/src/bluetooth/qbluetoothsocket_bluez_p.h @@ -63,7 +63,7 @@ public: QBluetoothSocketPrivateBluez(); ~QBluetoothSocketPrivateBluez(); - void connectToService(const QBluetoothAddress &address, + void connectToServiceHelper(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode); diff --git a/src/bluetooth/qbluetoothsocket_bluezdbus.cpp b/src/bluetooth/qbluetoothsocket_bluezdbus.cpp index 2dbbd425..17408a9f 100644 --- a/src/bluetooth/qbluetoothsocket_bluezdbus.cpp +++ b/src/bluetooth/qbluetoothsocket_bluezdbus.cpp @@ -56,7 +56,7 @@ bool QBluetoothSocketPrivateBluezDBus::ensureNativeSocket(QBluetoothServiceInfo: return false; } -void QBluetoothSocketPrivateBluezDBus::connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) +void QBluetoothSocketPrivateBluezDBus::connectToServiceHelper(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) { Q_UNUSED(openMode); Q_UNUSED(address); diff --git a/src/bluetooth/qbluetoothsocket_bluezdbus_p.h b/src/bluetooth/qbluetoothsocket_bluezdbus_p.h index 74af8bbe..6a91d25b 100644 --- a/src/bluetooth/qbluetoothsocket_bluezdbus_p.h +++ b/src/bluetooth/qbluetoothsocket_bluezdbus_p.h @@ -63,7 +63,7 @@ public: QBluetoothSocketPrivateBluezDBus(); ~QBluetoothSocketPrivateBluezDBus(); - void connectToService(const QBluetoothAddress &address, + void connectToServiceHelper(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode); diff --git a/src/bluetooth/qbluetoothsocket_p.cpp b/src/bluetooth/qbluetoothsocket_p.cpp index 82359ac9..6781b793 100644 --- a/src/bluetooth/qbluetoothsocket_p.cpp +++ b/src/bluetooth/qbluetoothsocket_p.cpp @@ -63,7 +63,7 @@ bool QBluetoothSocketPrivateDummy::ensureNativeSocket(QBluetoothServiceInfo::Pro return false; } -void QBluetoothSocketPrivateDummy::connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) +void QBluetoothSocketPrivateDummy::connectToServiceHelper(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) { Q_UNUSED(openMode); Q_UNUSED(address); diff --git a/src/bluetooth/qbluetoothsocket_p.h b/src/bluetooth/qbluetoothsocket_p.h index f01467a8..81e540b7 100644 --- a/src/bluetooth/qbluetoothsocket_p.h +++ b/src/bluetooth/qbluetoothsocket_p.h @@ -66,7 +66,7 @@ public: QBluetoothSocketPrivateDummy(); ~QBluetoothSocketPrivateDummy(); - void connectToService(const QBluetoothAddress &address, + void connectToServiceHelper(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode); bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type); diff --git a/src/bluetooth/qbluetoothsocket_winrt.cpp b/src/bluetooth/qbluetoothsocket_winrt.cpp index 46b46c4e..23d6d509 100644 --- a/src/bluetooth/qbluetoothsocket_winrt.cpp +++ b/src/bluetooth/qbluetoothsocket_winrt.cpp @@ -357,7 +357,7 @@ bool QBluetoothSocketPrivateWinRT::ensureNativeSocket(QBluetoothServiceInfo::Pro return true; } -void QBluetoothSocketPrivateWinRT::connectToService(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) +void QBluetoothSocketPrivateWinRT::connectToServiceHelper(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) { Q_Q(QBluetoothSocket); Q_UNUSED(openMode); diff --git a/src/bluetooth/qbluetoothsocket_winrt_p.h b/src/bluetooth/qbluetoothsocket_winrt_p.h index a6597009..76c2ded9 100644 --- a/src/bluetooth/qbluetoothsocket_winrt_p.h +++ b/src/bluetooth/qbluetoothsocket_winrt_p.h @@ -68,7 +68,7 @@ public: QBluetoothSocketPrivateWinRT(); ~QBluetoothSocketPrivateWinRT(); - void connectToService(const QBluetoothAddress &address, + void connectToServiceHelper(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode); bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type); diff --git a/src/bluetooth/qbluetoothsocketbase_p.h b/src/bluetooth/qbluetoothsocketbase_p.h index c393c940..c223350d 100644 --- a/src/bluetooth/qbluetoothsocketbase_p.h +++ b/src/bluetooth/qbluetoothsocketbase_p.h @@ -123,10 +123,10 @@ public: QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) = 0; #if defined(QT_ANDROID_BLUETOOTH) - virtual void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, + virtual void connectToServiceHelper(const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODevice::OpenMode openMode) = 0; #else - virtual void connectToService(const QBluetoothAddress &address, quint16 port, + virtual void connectToServiceHelper(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) = 0; #endif -- cgit v1.2.3 From e84d9f24cbb7c686535cbe7e13f28a1c0baaa48d Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Mon, 23 Jul 2018 13:13:49 +0200 Subject: Move QBluetoothSocket::connectToService() to private implementations This permits each platform to customize the implementations without the need for ifdefs. Upcoming changes such as the BLuez DBuS addition will increase the platform differences. Task-number: QTBUG-68550 Change-Id: I8fc9a74d3ce704466f0bf2c16287e32f222c4376 Reviewed-by: Lubomir I. Ivanov Reviewed-by: Oliver Wolff --- src/bluetooth/qbluetoothsocket.cpp | 140 ++------------------------- src/bluetooth/qbluetoothsocket_android.cpp | 66 +++++++++++++ src/bluetooth/qbluetoothsocket_android_p.h | 7 ++ src/bluetooth/qbluetoothsocket_bluez.cpp | 105 ++++++++++++++++++++ src/bluetooth/qbluetoothsocket_bluez_p.h | 7 ++ src/bluetooth/qbluetoothsocket_bluezdbus.cpp | 23 +++++ src/bluetooth/qbluetoothsocket_bluezdbus_p.h | 7 ++ src/bluetooth/qbluetoothsocket_p.cpp | 41 ++++++++ src/bluetooth/qbluetoothsocket_p.h | 8 ++ src/bluetooth/qbluetoothsocket_winrt.cpp | 99 +++++++++++++++++++ src/bluetooth/qbluetoothsocket_winrt_p.h | 8 ++ src/bluetooth/qbluetoothsocketbase_p.h | 7 ++ 12 files changed, 384 insertions(+), 134 deletions(-) diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index 1849844e..5f54da12 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -49,11 +49,8 @@ #include "qbluetoothsocket_p.h" #endif -#include "qbluetoothdeviceinfo.h" -#include "qbluetoothserviceinfo.h" #include "qbluetoothservicediscoveryagent.h" - #include #include @@ -354,62 +351,7 @@ qint64 QBluetoothSocket::bytesToWrite() const void QBluetoothSocket::connectToService(const QBluetoothServiceInfo &service, OpenMode openMode) { Q_D(QBluetoothSocketBase); - - if (state() != QBluetoothSocket::UnconnectedState && state() != QBluetoothSocket::ServiceLookupState) { - qCWarning(QT_BT) << "QBluetoothSocket::connectToService called on busy socket"; - d->errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress"); - setSocketError(QBluetoothSocket::OperationError); - return; - } -#if defined(QT_ANDROID_BLUETOOTH) - if (!d->ensureNativeSocket(service.socketProtocol())) { - d->errorString = tr("Socket type not supported"); - setSocketError(QBluetoothSocket::UnsupportedProtocolError); - return; - } - d->connectToServiceHelper(service.device().address(), service.serviceUuid(), openMode); -#else -#if defined(QT_WINRT_BLUETOOTH) - // Report these problems early: - if (socketType() != QBluetoothServiceInfo::RfcommProtocol) { - d->errorString = tr("Socket type not supported"); - setSocketError(QBluetoothSocket::UnsupportedProtocolError); - return; - } -#endif // QT_WINRT_BLUETOOTH - if (socketType() == QBluetoothServiceInfo::UnknownProtocol) { - qCWarning(QT_BT) << "QBluetoothSocket::connectToService cannot " - "connect with 'UnknownProtocol' type"; - d->errorString = tr("Socket type not supported"); - setSocketError(QBluetoothSocket::UnsupportedProtocolError); - return; - } - - if (service.protocolServiceMultiplexer() > 0) { - if (!d->ensureNativeSocket(QBluetoothServiceInfo::L2capProtocol)) { - d->errorString = tr("Unknown socket error"); - setSocketError(UnknownSocketError); - return; - } - d->connectToServiceHelper(service.device().address(), service.protocolServiceMultiplexer(), openMode); - } else if (service.serverChannel() > 0) { - if (!d->ensureNativeSocket(QBluetoothServiceInfo::RfcommProtocol)) { - d->errorString = tr("Unknown socket error"); - setSocketError(UnknownSocketError); - return; - } - d->connectToServiceHelper(service.device().address(), service.serverChannel(), openMode); - } else { - // try doing service discovery to see if we can find the socket - if (service.serviceUuid().isNull() - && !service.serviceClassUuids().contains(QBluetoothUuid::SerialPort)) { - qCWarning(QT_BT) << "No port, no PSM, and no UUID provided, unable to connect"; - return; - } - qCDebug(QT_BT) << "Need a port/psm, doing discovery"; - doDeviceDiscovery(service, openMode); - } -#endif + d->connectToService(service, openMode); } /*! @@ -429,10 +371,10 @@ void QBluetoothSocket::connectToService(const QBluetoothServiceInfo &service, Op For BlueZ, the socket first enters the \l ServiceLookupState and queries the connection parameters for \a uuid. If the service parameters are successfully retrieved the socket enters ConnectingState, and attempts to connect to \a address. If a connection is established, - QBluetoothSocket enters Connected State and emits connected(). + QBluetoothSocket enters \l ConnectedState and emits connected(). On Android, the service connection can directly be established - using the UUID of the remote service. Therefore the platforms does not require + using the UUID of the remote service. Therefore the platform does not require the \l ServiceLookupState and \l socketType() is always set to \l QBluetoothServiceInfo::RfcommProtocol. @@ -446,44 +388,7 @@ void QBluetoothSocket::connectToService(const QBluetoothServiceInfo &service, Op void QBluetoothSocket::connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, OpenMode openMode) { Q_D(QBluetoothSocketBase); - - if (state() != QBluetoothSocket::UnconnectedState) { - qCWarning(QT_BT) << "QBluetoothSocket::connectToService called on busy socket"; - d->errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress"); - setSocketError(QBluetoothSocket::OperationError); - return; - } - -#if defined(QT_ANDROID_BLUETOOTH) - if (!d->ensureNativeSocket(QBluetoothServiceInfo::RfcommProtocol)) { - d->errorString = tr("Socket type not supported"); - setSocketError(QBluetoothSocket::UnsupportedProtocolError); - return; - } - d->connectToServiceHelper(address, uuid, openMode); -#else -#if defined(QT_WINRT_BLUETOOTH) - // Report these problems early, prevent device discovery: - if (socketType() != QBluetoothServiceInfo::RfcommProtocol) { - d->errorString = tr("Socket type not supported"); - setSocketError(QBluetoothSocket::UnsupportedProtocolError); - return; - } -#endif // QT_WINRT_BLUETOOTH - if (socketType() == QBluetoothServiceInfo::UnknownProtocol) { - qCWarning(QT_BT) << "QBluetoothSocket::connectToService cannot " - "connect with 'UnknownProtocol' type"; - d->errorString = tr("Socket type not supported"); - setSocketError(QBluetoothSocket::UnsupportedProtocolError); - return; - } - - QBluetoothServiceInfo service; - QBluetoothDeviceInfo device(address, QString(), QBluetoothDeviceInfo::MiscellaneousDevice); - service.setDevice(device); - service.setServiceUuid(uuid); - doDeviceDiscovery(service, openMode); -#endif + d->connectToService(address, uuid, openMode); } /*! @@ -497,7 +402,7 @@ void QBluetoothSocket::connectToService(const QBluetoothAddress &address, const At any point, the socket can emit error() to signal that an error occurred. On Android, a connection to a service can not be established using a port. Calling this function - will emit a \l {QBluetoothSocket::ServiceNotFoundError}{ServiceNotFoundError} + will emit a \l {QBluetoothSocket::ServiceNotFoundError}{ServiceNotFoundError}. Note that most platforms require a pairing prior to connecting to the remote device. Otherwise the connection process may fail. @@ -507,40 +412,7 @@ void QBluetoothSocket::connectToService(const QBluetoothAddress &address, const void QBluetoothSocket::connectToService(const QBluetoothAddress &address, quint16 port, OpenMode openMode) { Q_D(QBluetoothSocketBase); -#if defined(QT_ANDROID_BLUETOOTH) - Q_UNUSED(port); - Q_UNUSED(openMode); - Q_UNUSED(address); - d->errorString = tr("Connecting to port is not supported"); - setSocketError(QBluetoothSocket::ServiceNotFoundError); - qCWarning(QT_BT) << "Connecting to port is not supported"; -#else -#if defined(QT_WINRT_BLUETOOTH) - // Report these problems early - if (socketType() != QBluetoothServiceInfo::RfcommProtocol) { - d->errorString = tr("Socket type not supported"); - setSocketError(QBluetoothSocket::UnsupportedProtocolError); - return; - } -#endif // QT_WINRT_BLUETOOTH - if (socketType() == QBluetoothServiceInfo::UnknownProtocol) { - qCWarning(QT_BT) << "QBluetoothSocket::connectToService cannot " - "connect with 'UnknownProtocol' type"; - d->errorString = tr("Socket type not supported"); - setSocketError(QBluetoothSocket::UnsupportedProtocolError); - return; - } - - if (state() != QBluetoothSocket::UnconnectedState) { - qCWarning(QT_BT) << "QBluetoothSocket::connectToService called on busy socket"; - d->errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress"); - setSocketError(QBluetoothSocket::OperationError); - return; - } - - setOpenMode(openMode); - d->connectToServiceHelper(address, port, openMode); -#endif + d->connectToService(address, port, openMode); } /*! diff --git a/src/bluetooth/qbluetoothsocket_android.cpp b/src/bluetooth/qbluetoothsocket_android.cpp index 109d3141..9047bb31 100644 --- a/src/bluetooth/qbluetoothsocket_android.cpp +++ b/src/bluetooth/qbluetoothsocket_android.cpp @@ -41,6 +41,8 @@ #include "qbluetoothsocket.h" #include "qbluetoothsocket_android_p.h" #include "qbluetoothaddress.h" +#include "qbluetoothdeviceinfo.h" +#include "qbluetoothserviceinfo.h" #include #include #include @@ -503,6 +505,70 @@ void QBluetoothSocketPrivateAndroid::connectToServiceHelper(const QBluetoothAddr emit connectJavaSocket(); } +void QBluetoothSocketPrivateAndroid::connectToService( + const QBluetoothServiceInfo &service, QIODevice::OpenMode openMode) +{ + Q_Q(QBluetoothSocket); + + if (q->state() != QBluetoothSocket::UnconnectedState + && q->state() != QBluetoothSocket::ServiceLookupState) { + qCWarning(QT_BT_ANDROID) << "QBluetoothSocketPrivateAndroid::connectToService called on busy socket"; + errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress"); + q->setSocketError(QBluetoothSocket::OperationError); + return; + } + + if (!ensureNativeSocket(service.socketProtocol())) { + errorString = QBluetoothSocket::tr("Socket type not supported"); + q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); + return; + } + connectToServiceHelper(service.device().address(), service.serviceUuid(), openMode); +} + +void QBluetoothSocketPrivateAndroid::connectToService( + const QBluetoothAddress &address, const QBluetoothUuid &uuid, + QIODevice::OpenMode openMode) +{ + Q_Q(QBluetoothSocket); + + if (q->state() != QBluetoothSocket::UnconnectedState) { + qCWarning(QT_BT_ANDROID) << "QBluetoothSocketPrivateAndroid::connectToService called on busy socket"; + errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress"); + q->setSocketError(QBluetoothSocket::OperationError); + return; + } + + if (q->socketType() == QBluetoothServiceInfo::UnknownProtocol) { + qCWarning(QT_BT_ANDROID) << "QBluetoothSocketPrivateAndroid::connectToService cannot " + "connect with 'UnknownProtocol' (type provided by given service)"; + errorString = QBluetoothSocket::tr("Socket type not supported"); + q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); + return; + } + + if (!ensureNativeSocket(q->socketType())) { + errorString = QBluetoothSocket::tr("Socket type not supported"); + q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); + return; + } + connectToServiceHelper(address, uuid, openMode); +} + +void QBluetoothSocketPrivateAndroid::connectToService( + const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) +{ + Q_UNUSED(port); + Q_UNUSED(openMode); + Q_UNUSED(address); + + Q_Q(QBluetoothSocket); + + errorString = tr("Connecting to port is not supported"); + q->setSocketError(QBluetoothSocket::ServiceNotFoundError); + qCWarning(QT_BT_ANDROID) << "Connecting to port is not supported"; +} + void QBluetoothSocketPrivateAndroid::socketConnectSuccess(const QAndroidJniObject &socket) { Q_Q(QBluetoothSocket); diff --git a/src/bluetooth/qbluetoothsocket_android_p.h b/src/bluetooth/qbluetoothsocket_android_p.h index 893b5fe3..14872cde 100644 --- a/src/bluetooth/qbluetoothsocket_android_p.h +++ b/src/bluetooth/qbluetoothsocket_android_p.h @@ -74,6 +74,13 @@ public: void connectToServiceHelper(const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODevice::OpenMode openMode); + void connectToService(const QBluetoothServiceInfo &service, + QIODevice::OpenMode openMode); + void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, + QIODevice::OpenMode openMode); + void connectToService(const QBluetoothAddress &address, quint16 port, + QIODevice::OpenMode openMode); + bool fallBackConnect(QAndroidJniObject uuid, int channel); bool fallBackReversedConnect(const QBluetoothUuid &uuid); diff --git a/src/bluetooth/qbluetoothsocket_bluez.cpp b/src/bluetooth/qbluetoothsocket_bluez.cpp index 0e5181f2..ccf34e7b 100644 --- a/src/bluetooth/qbluetoothsocket_bluez.cpp +++ b/src/bluetooth/qbluetoothsocket_bluez.cpp @@ -39,6 +39,7 @@ #include "qbluetoothsocket.h" #include "qbluetoothsocket_bluez_p.h" +#include "qbluetoothdeviceinfo.h" #include "bluez/manager_p.h" #include "bluez/adapter_p.h" @@ -206,6 +207,110 @@ void QBluetoothSocketPrivateBluez::connectToServiceHelper(const QBluetoothAddres } } +void QBluetoothSocketPrivateBluez::connectToService( + const QBluetoothServiceInfo &service, QIODevice::OpenMode openMode) +{ + Q_Q(QBluetoothSocket); + + if (q->state() != QBluetoothSocket::UnconnectedState + && q->state() != QBluetoothSocket::ServiceLookupState) { + qCWarning(QT_BT_BLUEZ) << "QBluetoothSocketPrivateBluez::connectToService called on busy socket"; + errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress"); + q->setSocketError(QBluetoothSocket::OperationError); + return; + } + + // we are checking the service protocol and not socketType() + // socketType will change in ensureNativeSocket() + if (service.socketProtocol() == QBluetoothServiceInfo::UnknownProtocol) { + qCWarning(QT_BT_BLUEZ) << "QBluetoothSocket::connectToService cannot " + "connect with 'UnknownProtocol' (type provided by given service)"; + errorString = QBluetoothSocket::tr("Socket type not supported"); + q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); + return; + } + + if (service.protocolServiceMultiplexer() > 0) { + Q_ASSERT(service.socketProtocol() == QBluetoothServiceInfo::L2capProtocol); + + if (!ensureNativeSocket(QBluetoothServiceInfo::L2capProtocol)) { + errorString = QBluetoothSocket::tr("Unknown socket error"); + q->setSocketError(QBluetoothSocket::UnknownSocketError); + return; + } + connectToServiceHelper(service.device().address(), service.protocolServiceMultiplexer(), + openMode); + } else if (service.serverChannel() > 0) { + Q_ASSERT(service.socketProtocol() == QBluetoothServiceInfo::RfcommProtocol); + + if (!ensureNativeSocket(QBluetoothServiceInfo::RfcommProtocol)) { + errorString = QBluetoothSocket::tr("Unknown socket error"); + q->setSocketError(QBluetoothSocket::UnknownSocketError); + return; + } + connectToServiceHelper(service.device().address(), service.serverChannel(), openMode); + } else { + // try doing service discovery to see if we can find the socket + if (service.serviceUuid().isNull() + && !service.serviceClassUuids().contains(QBluetoothUuid::SerialPort)) { + qCWarning(QT_BT_BLUEZ) << "No port, no PSM, and no UUID provided. Unable to connect"; + return; + } + qCDebug(QT_BT_BLUEZ) << "Need a port/psm, doing discovery"; + q->doDeviceDiscovery(service, openMode); + } +} + +void QBluetoothSocketPrivateBluez::connectToService( + const QBluetoothAddress &address, const QBluetoothUuid &uuid, + QIODevice::OpenMode openMode) +{ + Q_Q(QBluetoothSocket); + + if (q->state() != QBluetoothSocket::UnconnectedState) { + qCWarning(QT_BT_BLUEZ) << "QBluetoothSocketPrivateBluez::connectToService called on busy socket"; + errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress"); + q->setSocketError(QBluetoothSocket::OperationError); + return; + } + + if (q->socketType() == QBluetoothServiceInfo::UnknownProtocol) { + qCWarning(QT_BT_BLUEZ) << "QBluetoothSocketPrivateBluez::connectToService cannot " + "connect with 'UnknownProtocol' (type provided by given service)"; + errorString = QBluetoothSocket::tr("Socket type not supported"); + q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); + return; + } + + QBluetoothServiceInfo service; + QBluetoothDeviceInfo device(address, QString(), QBluetoothDeviceInfo::MiscellaneousDevice); + service.setDevice(device); + service.setServiceUuid(uuid); + q->doDeviceDiscovery(service, openMode); +} + +void QBluetoothSocketPrivateBluez::connectToService( + const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) +{ + Q_Q(QBluetoothSocket); + + if (q->socketType() == QBluetoothServiceInfo::UnknownProtocol) { + qCWarning(QT_BT_BLUEZ) << "QBluetoothSocketPrivateBluez::connectToService cannot " + "connect with 'UnknownProtocol' (type provided by given service)"; + errorString = QBluetoothSocket::tr("Socket type not supported"); + q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); + return; + } + + if (q->state() != QBluetoothSocket::UnconnectedState) { + qCWarning(QT_BT_BLUEZ) << "QBluetoothSocketPrivateBluez::connectToService called on busy socket"; + errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress"); + q->setSocketError(QBluetoothSocket::OperationError); + return; + } + connectToServiceHelper(address, port, openMode); +} + void QBluetoothSocketPrivateBluez::_q_writeNotify() { Q_Q(QBluetoothSocket); diff --git a/src/bluetooth/qbluetoothsocket_bluez_p.h b/src/bluetooth/qbluetoothsocket_bluez_p.h index 3d178f85..9aaa56b3 100644 --- a/src/bluetooth/qbluetoothsocket_bluez_p.h +++ b/src/bluetooth/qbluetoothsocket_bluez_p.h @@ -67,6 +67,13 @@ public: quint16 port, QIODevice::OpenMode openMode); + void connectToService(const QBluetoothServiceInfo &service, + QIODevice::OpenMode openMode); + void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, + QIODevice::OpenMode openMode); + void connectToService(const QBluetoothAddress &address, quint16 port, + QIODevice::OpenMode openMode); + bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type); QString localName() const; diff --git a/src/bluetooth/qbluetoothsocket_bluezdbus.cpp b/src/bluetooth/qbluetoothsocket_bluezdbus.cpp index 17408a9f..bdcc89ef 100644 --- a/src/bluetooth/qbluetoothsocket_bluezdbus.cpp +++ b/src/bluetooth/qbluetoothsocket_bluezdbus.cpp @@ -63,6 +63,29 @@ void QBluetoothSocketPrivateBluezDBus::connectToServiceHelper(const QBluetoothAd Q_UNUSED(port); } +void QBluetoothSocketPrivateBluezDBus::connectToService( + const QBluetoothServiceInfo &service, QIODevice::OpenMode openMode) +{ + Q_UNUSED(openMode); + Q_UNUSED(service); +} + +void QBluetoothSocketPrivateBluezDBus::connectToService( + const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODevice::OpenMode openMode) +{ + Q_UNUSED(openMode); + Q_UNUSED(address); + Q_UNUSED(uuid); +} + +void QBluetoothSocketPrivateBluezDBus::connectToService( + const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) +{ + Q_UNUSED(openMode); + Q_UNUSED(address); + Q_UNUSED(port); +} + void QBluetoothSocketPrivateBluezDBus::abort() { } diff --git a/src/bluetooth/qbluetoothsocket_bluezdbus_p.h b/src/bluetooth/qbluetoothsocket_bluezdbus_p.h index 6a91d25b..3390566d 100644 --- a/src/bluetooth/qbluetoothsocket_bluezdbus_p.h +++ b/src/bluetooth/qbluetoothsocket_bluezdbus_p.h @@ -67,6 +67,13 @@ public: quint16 port, QIODevice::OpenMode openMode); + void connectToService(const QBluetoothServiceInfo &service, + QIODevice::OpenMode openMode); + void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, + QIODevice::OpenMode openMode); + void connectToService(const QBluetoothAddress &address, quint16 port, + QIODevice::OpenMode openMode); + bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type); QString localName() const; diff --git a/src/bluetooth/qbluetoothsocket_p.cpp b/src/bluetooth/qbluetoothsocket_p.cpp index 6781b793..22f1655b 100644 --- a/src/bluetooth/qbluetoothsocket_p.cpp +++ b/src/bluetooth/qbluetoothsocket_p.cpp @@ -70,6 +70,47 @@ void QBluetoothSocketPrivateDummy::connectToServiceHelper(const QBluetoothAddres Q_UNUSED(port); } +void QBluetoothSocketPrivateDummy::connectToService( + const QBluetoothServiceInfo &service, QIODevice::OpenMode openMode) +{ + Q_UNUSED(service); + Q_UNUSED(openMode); + + Q_Q(QBluetoothSocket); + + qWarning() << "Using non-functional QBluetoothSocketPrivateDummy"; + errorString = QBluetoothSocket::tr("Socket type not supported"); + q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); +} + +void QBluetoothSocketPrivateDummy::connectToService( + const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODevice::OpenMode openMode) +{ + Q_UNUSED(address); + Q_UNUSED(uuid); + Q_UNUSED(openMode); + + Q_Q(QBluetoothSocket); + + qWarning() << "Using non-functional QBluetoothSocketPrivateDummy"; + errorString = QBluetoothSocket::tr("Socket type not supported"); + q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); +} + +void QBluetoothSocketPrivateDummy::connectToService( + const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) +{ + Q_UNUSED(address); + Q_UNUSED(port); + Q_UNUSED(openMode); + + Q_Q(QBluetoothSocket); + + qWarning() << "Using non-functional QBluetoothSocketPrivateDummy"; + errorString = QBluetoothSocket::tr("Socket type not supported"); + q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); +} + void QBluetoothSocketPrivateDummy::abort() { } diff --git a/src/bluetooth/qbluetoothsocket_p.h b/src/bluetooth/qbluetoothsocket_p.h index 81e540b7..f3f46d26 100644 --- a/src/bluetooth/qbluetoothsocket_p.h +++ b/src/bluetooth/qbluetoothsocket_p.h @@ -69,6 +69,14 @@ public: void connectToServiceHelper(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode); + + void connectToService(const QBluetoothServiceInfo &service, + QIODevice::OpenMode openMode); + void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, + QIODevice::OpenMode openMode); + void connectToService(const QBluetoothAddress &address, quint16 port, + QIODevice::OpenMode openMode); + bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type); QString localName() const; diff --git a/src/bluetooth/qbluetoothsocket_winrt.cpp b/src/bluetooth/qbluetoothsocket_winrt.cpp index 23d6d509..556d9fc5 100644 --- a/src/bluetooth/qbluetoothsocket_winrt.cpp +++ b/src/bluetooth/qbluetoothsocket_winrt.cpp @@ -47,6 +47,8 @@ #include #include +#include +#include #include #include @@ -401,6 +403,103 @@ void QBluetoothSocketPrivateWinRT::connectToServiceHelper(const QBluetoothAddres }); } +void QBluetoothSocketPrivateWinRT::connectToService( + const QBluetoothServiceInfo &service, QIODevice::OpenMode openMode) +{ + Q_Q(QBluetoothSocket); + + if (q->state() != QBluetoothSocket::UnconnectedState + && q->state() != QBluetoothSocket::ServiceLookupState) { + qCWarning(QT_BT_WINRT) << "QBluetoothSocket::connectToService called on busy socket"; + errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress"); + q->setSocketError(QBluetoothSocket::OperationError); + return; + } + + // we are checking the service protocol and not socketType() + // socketType will change in ensureNativeSocket() + if (service.socketProtocol() != QBluetoothServiceInfo::RfcommProtocol) { + errorString = QBluetoothSocket::tr("Socket type not supported"); + q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); + return; + } + + if (service.protocolServiceMultiplexer() > 0) { + Q_ASSERT(service.socketProtocol() == QBluetoothServiceInfo::L2capProtocol); + + if (!ensureNativeSocket(QBluetoothServiceInfo::L2capProtocol)) { + errorString = QBluetoothSocket::tr("Unknown socket error"); + q->setSocketError(QBluetoothSocket::UnknownSocketError); + return; + } + connectToServiceHelper(service.device().address(), service.protocolServiceMultiplexer(), openMode); + } else if (service.serverChannel() > 0) { + Q_ASSERT(service.socketProtocol() == QBluetoothServiceInfo::RfcommProtocol); + + if (!ensureNativeSocket(QBluetoothServiceInfo::RfcommProtocol)) { + errorString = QBluetoothSocket::tr("Unknown socket error"); + q->setSocketError(QBluetoothSocket::UnknownSocketError); + return; + } + connectToServiceHelper(service.device().address(), service.serverChannel(), openMode); + } else { + // try doing service discovery to see if we can find the socket + if (service.serviceUuid().isNull() + && !service.serviceClassUuids().contains(QBluetoothUuid::SerialPort)) { + qCWarning(QT_BT_WINRT) << "No port, no PSM, and no UUID provided. Unable to connect"; + return; + } + qCDebug(QT_BT_WINRT) << "Need a port/psm, doing discovery"; + q->doDeviceDiscovery(service, openMode); + } +} + +void QBluetoothSocketPrivateWinRT::connectToService( + const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODevice::OpenMode openMode) +{ + Q_Q(QBluetoothSocket); + + if (q->state() != QBluetoothSocket::UnconnectedState) { + qCWarning(QT_BT_WINRT) << "QBluetoothSocketPrivateWinRT::connectToService called on busy socket"; + errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress"); + q->setSocketError(QBluetoothSocket::OperationError); + return; + } + + if (q->socketType() != QBluetoothServiceInfo::RfcommProtocol) { + errorString = QBluetoothSocket::tr("Socket type not supported"); + q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); + return; + } + + QBluetoothServiceInfo service; + QBluetoothDeviceInfo device(address, QString(), QBluetoothDeviceInfo::MiscellaneousDevice); + service.setDevice(device); + service.setServiceUuid(uuid); + q->doDeviceDiscovery(service, openMode); +} + +void QBluetoothSocketPrivateWinRT::connectToService( + const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) +{ + Q_Q(QBluetoothSocket); + + if (q->state() != QBluetoothSocket::UnconnectedState) { + qCWarning(QT_BT_WINRT) << "QBluetoothSocketPrivateWinRT::connectToService called on busy socket"; + errorString = QBluetoothSocket::tr("Trying to connect while connection is in progress"); + q->setSocketError(QBluetoothSocket::OperationError); + return; + } + + if (q->socketType() != QBluetoothServiceInfo::RfcommProtocol) { + errorString = QBluetoothSocket::tr("Socket type not supported"); + q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); + return; + } + + connectToServiceHelper(address, port, openMode); +} + void QBluetoothSocketPrivateWinRT::abort() { Q_Q(QBluetoothSocket); diff --git a/src/bluetooth/qbluetoothsocket_winrt_p.h b/src/bluetooth/qbluetoothsocket_winrt_p.h index 76c2ded9..17f0fa0d 100644 --- a/src/bluetooth/qbluetoothsocket_winrt_p.h +++ b/src/bluetooth/qbluetoothsocket_winrt_p.h @@ -71,6 +71,14 @@ public: void connectToServiceHelper(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode); + + void connectToService(const QBluetoothServiceInfo &service, + QIODevice::OpenMode openMode); + void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, + QIODevice::OpenMode openMode); + void connectToService(const QBluetoothAddress &address, quint16 port, + QIODevice::OpenMode openMode); + bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type); QString localName() const; diff --git a/src/bluetooth/qbluetoothsocketbase_p.h b/src/bluetooth/qbluetoothsocketbase_p.h index c223350d..410dcbbd 100644 --- a/src/bluetooth/qbluetoothsocketbase_p.h +++ b/src/bluetooth/qbluetoothsocketbase_p.h @@ -122,6 +122,7 @@ public: QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) = 0; + #if defined(QT_ANDROID_BLUETOOTH) virtual void connectToServiceHelper(const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODevice::OpenMode openMode) = 0; @@ -129,6 +130,12 @@ public: virtual void connectToServiceHelper(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) = 0; #endif + virtual void connectToService(const QBluetoothServiceInfo &service, + QIODevice::OpenMode openMode) = 0; + virtual void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, + QIODevice::OpenMode openMode) = 0; + virtual void connectToService(const QBluetoothAddress &address, quint16 port, + QIODevice::OpenMode openMode) = 0; #ifdef QT_ANDROID_BLUETOOTH virtual bool setSocketDescriptor(const QAndroidJniObject &socket, QBluetoothServiceInfo::Protocol socketType, -- cgit v1.2.3 From 8ee3254a18afd3bf06955091e6392570aff15659 Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 24 Jul 2018 12:50:33 +0200 Subject: Add override to all overridden QBluetoothSocketPrivate functions Task-number: QTBUG-68550 Change-Id: Ie8a21d2f239c9aa63635a07e3ff6ee27d2ec4b46 Reviewed-by: Timur Pocheptsov Reviewed-by: Lubomir I. Ivanov --- src/bluetooth/qbluetoothsocket_android_p.h | 42 ++++++++++++++-------------- src/bluetooth/qbluetoothsocket_bluez_p.h | 40 +++++++++++++------------- src/bluetooth/qbluetoothsocket_bluezdbus_p.h | 41 +++++++++++++-------------- src/bluetooth/qbluetoothsocket_p.h | 40 +++++++++++++------------- src/bluetooth/qbluetoothsocket_winrt_p.h | 42 ++++++++++++++-------------- 5 files changed, 102 insertions(+), 103 deletions(-) diff --git a/src/bluetooth/qbluetoothsocket_android_p.h b/src/bluetooth/qbluetoothsocket_android_p.h index 14872cde..7bf42e32 100644 --- a/src/bluetooth/qbluetoothsocket_android_p.h +++ b/src/bluetooth/qbluetoothsocket_android_p.h @@ -68,49 +68,49 @@ class QBluetoothSocketPrivateAndroid final : public QBluetoothSocketBasePrivate public: QBluetoothSocketPrivateAndroid(); - ~QBluetoothSocketPrivateAndroid(); + ~QBluetoothSocketPrivateAndroid() override; //On Android we connect using the uuid not the port void connectToServiceHelper(const QBluetoothAddress &address, const QBluetoothUuid &uuid, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; void connectToService(const QBluetoothServiceInfo &service, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; void connectToService(const QBluetoothAddress &address, quint16 port, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; bool fallBackConnect(QAndroidJniObject uuid, int channel); bool fallBackReversedConnect(const QBluetoothUuid &uuid); - bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type); + bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type) override; - QString localName() const; - QBluetoothAddress localAddress() const; - quint16 localPort() const; + QString localName() const override; + QBluetoothAddress localAddress() const override; + quint16 localPort() const override; - QString peerName() const; - QBluetoothAddress peerAddress() const; - quint16 peerPort() const; + QString peerName() const override; + QBluetoothAddress peerAddress() const override; + quint16 peerPort() const override; - void abort(); - void close(); + void abort() override; + void close() override; - qint64 writeData(const char *data, qint64 maxSize); - qint64 readData(char *data, qint64 maxSize); + qint64 writeData(const char *data, qint64 maxSize) override; + qint64 readData(char *data, qint64 maxSize) override; bool setSocketDescriptor(const QAndroidJniObject &socket, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, - QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite); + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override; bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, - QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite); + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override; - qint64 bytesAvailable() const; - bool canReadLine() const; - qint64 bytesToWrite() const; + qint64 bytesAvailable() const override; + bool canReadLine() const override; + qint64 bytesToWrite() const override; QAndroidJniObject adapter; QAndroidJniObject socketObject; diff --git a/src/bluetooth/qbluetoothsocket_bluez_p.h b/src/bluetooth/qbluetoothsocket_bluez_p.h index 9aaa56b3..67c04b3d 100644 --- a/src/bluetooth/qbluetoothsocket_bluez_p.h +++ b/src/bluetooth/qbluetoothsocket_bluez_p.h @@ -61,42 +61,42 @@ class QBluetoothSocketPrivateBluez final: public QBluetoothSocketBasePrivate public: QBluetoothSocketPrivateBluez(); - ~QBluetoothSocketPrivateBluez(); + ~QBluetoothSocketPrivateBluez() override; void connectToServiceHelper(const QBluetoothAddress &address, quint16 port, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; void connectToService(const QBluetoothServiceInfo &service, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; void connectToService(const QBluetoothAddress &address, quint16 port, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; - bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type); + bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type) override; - QString localName() const; - QBluetoothAddress localAddress() const; - quint16 localPort() const; + QString localName() const override; + QBluetoothAddress localAddress() const override; + quint16 localPort() const override; - QString peerName() const; - QBluetoothAddress peerAddress() const; - quint16 peerPort() const; + QString peerName() const override; + QBluetoothAddress peerAddress() const override; + quint16 peerPort() const override; - void abort(); - void close(); + void abort() override; + void close() override; - qint64 writeData(const char *data, qint64 maxSize); - qint64 readData(char *data, qint64 maxSize); + qint64 writeData(const char *data, qint64 maxSize) override; + qint64 readData(char *data, qint64 maxSize) override; bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, - QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite); + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override; - qint64 bytesAvailable() const; - bool canReadLine() const; - qint64 bytesToWrite() const; + qint64 bytesAvailable() const override; + bool canReadLine() const override; + qint64 bytesToWrite() const override; private slots: void _q_readNotify(); diff --git a/src/bluetooth/qbluetoothsocket_bluezdbus_p.h b/src/bluetooth/qbluetoothsocket_bluezdbus_p.h index 3390566d..c7279555 100644 --- a/src/bluetooth/qbluetoothsocket_bluezdbus_p.h +++ b/src/bluetooth/qbluetoothsocket_bluezdbus_p.h @@ -61,45 +61,44 @@ class QBluetoothSocketPrivateBluezDBus final: public QBluetoothSocketBasePrivate public: QBluetoothSocketPrivateBluezDBus(); - ~QBluetoothSocketPrivateBluezDBus(); + ~QBluetoothSocketPrivateBluezDBus() override; void connectToServiceHelper(const QBluetoothAddress &address, quint16 port, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; void connectToService(const QBluetoothServiceInfo &service, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; void connectToService(const QBluetoothAddress &address, quint16 port, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; - bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type); + bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type) override; - QString localName() const; - QBluetoothAddress localAddress() const; - quint16 localPort() const; + QString localName() const override; + QBluetoothAddress localAddress() const override; + quint16 localPort() const override; - QString peerName() const; - QBluetoothAddress peerAddress() const; - quint16 peerPort() const; + QString peerName() const override; + QBluetoothAddress peerAddress() const override; + quint16 peerPort() const override; - void abort(); - void close(); + void abort() override; + void close() override; - qint64 writeData(const char *data, qint64 maxSize); - qint64 readData(char *data, qint64 maxSize); + qint64 writeData(const char *data, qint64 maxSize) override; + qint64 readData(char *data, qint64 maxSize) override; bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, - QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite); + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override; - qint64 bytesAvailable() const; - bool canReadLine() const; - qint64 bytesToWrite() const; + qint64 bytesAvailable() const override; + bool canReadLine() const override; + qint64 bytesToWrite() const override; }; - QT_END_NAMESPACE #endif // QBLUETOOTHSOCKET_BLUEZDBUS_H diff --git a/src/bluetooth/qbluetoothsocket_p.h b/src/bluetooth/qbluetoothsocket_p.h index f3f46d26..9485977f 100644 --- a/src/bluetooth/qbluetoothsocket_p.h +++ b/src/bluetooth/qbluetoothsocket_p.h @@ -64,42 +64,42 @@ class QBluetoothSocketPrivateDummy final : public QBluetoothSocketBasePrivate public: QBluetoothSocketPrivateDummy(); - ~QBluetoothSocketPrivateDummy(); + ~QBluetoothSocketPrivateDummy() override; void connectToServiceHelper(const QBluetoothAddress &address, quint16 port, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; void connectToService(const QBluetoothServiceInfo &service, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; void connectToService(const QBluetoothAddress &address, quint16 port, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; - bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type); + bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type) override; - QString localName() const; - QBluetoothAddress localAddress() const; - quint16 localPort() const; + QString localName() const override; + QBluetoothAddress localAddress() const override; + quint16 localPort() const override; - QString peerName() const; - QBluetoothAddress peerAddress() const; - quint16 peerPort() const; + QString peerName() const override; + QBluetoothAddress peerAddress() const override; + quint16 peerPort() const override; - void abort(); - void close(); + void abort() override; + void close() override; - qint64 writeData(const char *data, qint64 maxSize); - qint64 readData(char *data, qint64 maxSize); + qint64 writeData(const char *data, qint64 maxSize) override; + qint64 readData(char *data, qint64 maxSize) override; bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, - QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite); + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override; - qint64 bytesAvailable() const; - bool canReadLine() const; - qint64 bytesToWrite() const; + qint64 bytesAvailable() const override; + bool canReadLine() const override; + qint64 bytesToWrite() const override; }; QT_END_NAMESPACE diff --git a/src/bluetooth/qbluetoothsocket_winrt_p.h b/src/bluetooth/qbluetoothsocket_winrt_p.h index 17f0fa0d..6a740206 100644 --- a/src/bluetooth/qbluetoothsocket_winrt_p.h +++ b/src/bluetooth/qbluetoothsocket_winrt_p.h @@ -66,47 +66,47 @@ class QBluetoothSocketPrivateWinRT final: public QBluetoothSocketBasePrivate public: QBluetoothSocketPrivateWinRT(); - ~QBluetoothSocketPrivateWinRT(); + ~QBluetoothSocketPrivateWinRT() override; void connectToServiceHelper(const QBluetoothAddress &address, quint16 port, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; void connectToService(const QBluetoothServiceInfo &service, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; void connectToService(const QBluetoothAddress &address, quint16 port, - QIODevice::OpenMode openMode); + QIODevice::OpenMode openMode) override; - bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type); + bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type) override; - QString localName() const; - QBluetoothAddress localAddress() const; - quint16 localPort() const; + QString localName() const override; + QBluetoothAddress localAddress() const override; + quint16 localPort() const override; - QString peerName() const; - QBluetoothAddress peerAddress() const; - quint16 peerPort() const; + QString peerName() const override; + QBluetoothAddress peerAddress() const override; + quint16 peerPort() const override; - void abort(); - void close(); + void abort() override; + void close() override; - qint64 writeData(const char *data, qint64 maxSize); - qint64 readData(char *data, qint64 maxSize); + qint64 writeData(const char *data, qint64 maxSize) override; + qint64 readData(char *data, qint64 maxSize) override; bool setSocketDescriptor(Microsoft::WRL::ComPtr socket, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, - QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite); + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override; bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, - QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite); + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override; - qint64 bytesAvailable() const; - bool canReadLine() const; - qint64 bytesToWrite() const; + qint64 bytesAvailable() const override; + bool canReadLine() const override; + qint64 bytesToWrite() const override; SocketWorker *m_worker; -- cgit v1.2.3 From b19148f9a0f820630bd83432d96117e9598c315d Mon Sep 17 00:00:00 2001 From: Alex Blasche Date: Tue, 24 Jul 2018 12:56:55 +0200 Subject: Rename qbluetoothsocket_p files to qbluetoothsocket_dummy The new name fits the class better. Task-number: QTBUG-68550 Change-Id: I7445f48134f8a9fe8b6b6291184f404b3b2faa89 Reviewed-by: Timur Pocheptsov Reviewed-by: Lubomir I. Ivanov --- src/bluetooth/bluetooth.pro | 8 +- src/bluetooth/qbluetoothsocket.cpp | 2 +- src/bluetooth/qbluetoothsocket_dummy.cpp | 208 +++++++++++++++++++++++++++++++ src/bluetooth/qbluetoothsocket_dummy_p.h | 107 ++++++++++++++++ src/bluetooth/qbluetoothsocket_p.cpp | 208 ------------------------------- src/bluetooth/qbluetoothsocket_p.h | 107 ---------------- 6 files changed, 320 insertions(+), 320 deletions(-) create mode 100644 src/bluetooth/qbluetoothsocket_dummy.cpp create mode 100644 src/bluetooth/qbluetoothsocket_dummy_p.h delete mode 100644 src/bluetooth/qbluetoothsocket_p.cpp delete mode 100644 src/bluetooth/qbluetoothsocket_p.h diff --git a/src/bluetooth/bluetooth.pro b/src/bluetooth/bluetooth.pro index bff367a8..884dbebf 100644 --- a/src/bluetooth/bluetooth.pro +++ b/src/bluetooth/bluetooth.pro @@ -198,14 +198,14 @@ qtConfig(bluez) { PRIVATE_HEADERS += \ qlowenergycontroller_osx_p.h \ - qbluetoothsocket_p.h + qbluetoothsocket_dummy_p.h include(osx/osxbt.pri) SOURCES += \ qbluetoothlocaldevice_p.cpp \ qbluetoothserviceinfo_p.cpp \ qbluetoothservicediscoveryagent_p.cpp \ - qbluetoothsocket_p.cpp \ + qbluetoothsocket_dummy.cpp \ qbluetoothserver_p.cpp SOURCES -= qbluetoothdevicediscoveryagent.cpp @@ -247,12 +247,12 @@ qtConfig(bluez) { qbluetoothlocaldevice_p.cpp \ qbluetoothserviceinfo_p.cpp \ qbluetoothservicediscoveryagent_p.cpp \ - qbluetoothsocket_p.cpp \ + qbluetoothsocket_dummy.cpp \ qbluetoothserver_p.cpp \ qlowenergycontroller_p.cpp PRIVATE_HEADERS += qlowenergycontroller_p.h \ - qbluetoothsocket_p.h + qbluetoothsocket_dummy_p.h } winrt { diff --git a/src/bluetooth/qbluetoothsocket.cpp b/src/bluetooth/qbluetoothsocket.cpp index 5f54da12..dae844d7 100644 --- a/src/bluetooth/qbluetoothsocket.cpp +++ b/src/bluetooth/qbluetoothsocket.cpp @@ -46,7 +46,7 @@ #elif defined(QT_WINRT_BLUETOOTH) #include "qbluetoothsocket_winrt_p.h" #else -#include "qbluetoothsocket_p.h" +#include "qbluetoothsocket_dummy_p.h" #endif #include "qbluetoothservicediscoveryagent.h" diff --git a/src/bluetooth/qbluetoothsocket_dummy.cpp b/src/bluetooth/qbluetoothsocket_dummy.cpp new file mode 100644 index 00000000..82da46c2 --- /dev/null +++ b/src/bluetooth/qbluetoothsocket_dummy.cpp @@ -0,0 +1,208 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qbluetoothsocket.h" +#include "qbluetoothsocket_dummy_p.h" +#ifndef QT_IOS_BLUETOOTH +#include "dummy/dummy_helper_p.h" +#endif + +QT_BEGIN_NAMESPACE + +QBluetoothSocketPrivateDummy::QBluetoothSocketPrivateDummy() +{ + secFlags = QBluetooth::NoSecurity; +#ifndef QT_IOS_BLUETOOTH + printDummyWarning(); +#endif +} + +QBluetoothSocketPrivateDummy::~QBluetoothSocketPrivateDummy() +{ +} + +bool QBluetoothSocketPrivateDummy::ensureNativeSocket(QBluetoothServiceInfo::Protocol type) +{ + socketType = type; + return false; +} + +void QBluetoothSocketPrivateDummy::connectToServiceHelper(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) +{ + Q_UNUSED(openMode); + Q_UNUSED(address); + Q_UNUSED(port); +} + +void QBluetoothSocketPrivateDummy::connectToService( + const QBluetoothServiceInfo &service, QIODevice::OpenMode openMode) +{ + Q_UNUSED(service); + Q_UNUSED(openMode); + + Q_Q(QBluetoothSocket); + + qWarning() << "Using non-functional QBluetoothSocketPrivateDummy"; + errorString = QBluetoothSocket::tr("Socket type not supported"); + q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); +} + +void QBluetoothSocketPrivateDummy::connectToService( + const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODevice::OpenMode openMode) +{ + Q_UNUSED(address); + Q_UNUSED(uuid); + Q_UNUSED(openMode); + + Q_Q(QBluetoothSocket); + + qWarning() << "Using non-functional QBluetoothSocketPrivateDummy"; + errorString = QBluetoothSocket::tr("Socket type not supported"); + q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); +} + +void QBluetoothSocketPrivateDummy::connectToService( + const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) +{ + Q_UNUSED(address); + Q_UNUSED(port); + Q_UNUSED(openMode); + + Q_Q(QBluetoothSocket); + + qWarning() << "Using non-functional QBluetoothSocketPrivateDummy"; + errorString = QBluetoothSocket::tr("Socket type not supported"); + q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); +} + +void QBluetoothSocketPrivateDummy::abort() +{ +} + +QString QBluetoothSocketPrivateDummy::localName() const +{ + return QString(); +} + +QBluetoothAddress QBluetoothSocketPrivateDummy::localAddress() const +{ + return QBluetoothAddress(); +} + +quint16 QBluetoothSocketPrivateDummy::localPort() const +{ + return 0; +} + +QString QBluetoothSocketPrivateDummy::peerName() const +{ + return QString(); +} + +QBluetoothAddress QBluetoothSocketPrivateDummy::peerAddress() const +{ + return QBluetoothAddress(); +} + +quint16 QBluetoothSocketPrivateDummy::peerPort() const +{ + return 0; +} + +qint64 QBluetoothSocketPrivateDummy::writeData(const char *data, qint64 maxSize) +{ + Q_UNUSED(data); + Q_UNUSED(maxSize); + + Q_Q(QBluetoothSocket); + + if (state != QBluetoothSocket::ConnectedState) { + errorString = QBluetoothSocket::tr("Cannot write while not connected"); + q->setSocketError(QBluetoothSocket::OperationError); + return -1; + } + return -1; +} + +qint64 QBluetoothSocketPrivateDummy::readData(char *data, qint64 maxSize) +{ + Q_UNUSED(data); + Q_UNUSED(maxSize); + + Q_Q(QBluetoothSocket); + + if (state != QBluetoothSocket::ConnectedState) { + errorString = QBluetoothSocket::tr("Cannot read while not connected"); + q->setSocketError(QBluetoothSocket::OperationError); + return -1; + } + + return -1; +} + +void QBluetoothSocketPrivateDummy::close() +{ +} + +bool QBluetoothSocketPrivateDummy::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, + QBluetoothSocket::SocketState socketState, QBluetoothSocket::OpenMode openMode) +{ + Q_UNUSED(socketDescriptor); + Q_UNUSED(socketType) + Q_UNUSED(socketState); + Q_UNUSED(openMode); + return false; +} + +qint64 QBluetoothSocketPrivateDummy::bytesAvailable() const +{ + return 0; +} + +bool QBluetoothSocketPrivateDummy::canReadLine() const +{ + return false; +} + +qint64 QBluetoothSocketPrivateDummy::bytesToWrite() const +{ + return 0; +} + +QT_END_NAMESPACE diff --git a/src/bluetooth/qbluetoothsocket_dummy_p.h b/src/bluetooth/qbluetoothsocket_dummy_p.h new file mode 100644 index 00000000..23bed109 --- /dev/null +++ b/src/bluetooth/qbluetoothsocket_dummy_p.h @@ -0,0 +1,107 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QBLUETOOTHSOCKET_DUMMY_H +#define QBLUETOOTHSOCKET_DUMMY_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include "qbluetoothsocket.h" +#include "qbluetoothsocketbase_p.h" +#include + +QT_BEGIN_NAMESPACE + +class QBluetoothSocketPrivateDummy final : public QBluetoothSocketBasePrivate +{ + Q_OBJECT + friend class QBluetoothServerPrivate; + +public: + QBluetoothSocketPrivateDummy(); + ~QBluetoothSocketPrivateDummy() override; + + void connectToServiceHelper(const QBluetoothAddress &address, + quint16 port, + QIODevice::OpenMode openMode) override; + + void connectToService(const QBluetoothServiceInfo &service, + QIODevice::OpenMode openMode) override; + void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, + QIODevice::OpenMode openMode) override; + void connectToService(const QBluetoothAddress &address, quint16 port, + QIODevice::OpenMode openMode) override; + + bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type) override; + + QString localName() const override; + QBluetoothAddress localAddress() const override; + quint16 localPort() const override; + + QString peerName() const override; + QBluetoothAddress peerAddress() const override; + quint16 peerPort() const override; + + void abort() override; + void close() override; + + qint64 writeData(const char *data, qint64 maxSize) override; + qint64 readData(char *data, qint64 maxSize) override; + + bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, + QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, + QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override; + + qint64 bytesAvailable() const override; + bool canReadLine() const override; + qint64 bytesToWrite() const override; +}; + +QT_END_NAMESPACE // QBLUETOOTHSOCKET_DUMMY_H + +#endif diff --git a/src/bluetooth/qbluetoothsocket_p.cpp b/src/bluetooth/qbluetoothsocket_p.cpp deleted file mode 100644 index 22f1655b..00000000 --- a/src/bluetooth/qbluetoothsocket_p.cpp +++ /dev/null @@ -1,208 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qbluetoothsocket.h" -#include "qbluetoothsocket_p.h" -#ifndef QT_IOS_BLUETOOTH -#include "dummy/dummy_helper_p.h" -#endif - -QT_BEGIN_NAMESPACE - -QBluetoothSocketPrivateDummy::QBluetoothSocketPrivateDummy() -{ - secFlags = QBluetooth::NoSecurity; -#ifndef QT_IOS_BLUETOOTH - printDummyWarning(); -#endif -} - -QBluetoothSocketPrivateDummy::~QBluetoothSocketPrivateDummy() -{ -} - -bool QBluetoothSocketPrivateDummy::ensureNativeSocket(QBluetoothServiceInfo::Protocol type) -{ - socketType = type; - return false; -} - -void QBluetoothSocketPrivateDummy::connectToServiceHelper(const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) -{ - Q_UNUSED(openMode); - Q_UNUSED(address); - Q_UNUSED(port); -} - -void QBluetoothSocketPrivateDummy::connectToService( - const QBluetoothServiceInfo &service, QIODevice::OpenMode openMode) -{ - Q_UNUSED(service); - Q_UNUSED(openMode); - - Q_Q(QBluetoothSocket); - - qWarning() << "Using non-functional QBluetoothSocketPrivateDummy"; - errorString = QBluetoothSocket::tr("Socket type not supported"); - q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); -} - -void QBluetoothSocketPrivateDummy::connectToService( - const QBluetoothAddress &address, const QBluetoothUuid &uuid, QIODevice::OpenMode openMode) -{ - Q_UNUSED(address); - Q_UNUSED(uuid); - Q_UNUSED(openMode); - - Q_Q(QBluetoothSocket); - - qWarning() << "Using non-functional QBluetoothSocketPrivateDummy"; - errorString = QBluetoothSocket::tr("Socket type not supported"); - q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); -} - -void QBluetoothSocketPrivateDummy::connectToService( - const QBluetoothAddress &address, quint16 port, QIODevice::OpenMode openMode) -{ - Q_UNUSED(address); - Q_UNUSED(port); - Q_UNUSED(openMode); - - Q_Q(QBluetoothSocket); - - qWarning() << "Using non-functional QBluetoothSocketPrivateDummy"; - errorString = QBluetoothSocket::tr("Socket type not supported"); - q->setSocketError(QBluetoothSocket::UnsupportedProtocolError); -} - -void QBluetoothSocketPrivateDummy::abort() -{ -} - -QString QBluetoothSocketPrivateDummy::localName() const -{ - return QString(); -} - -QBluetoothAddress QBluetoothSocketPrivateDummy::localAddress() const -{ - return QBluetoothAddress(); -} - -quint16 QBluetoothSocketPrivateDummy::localPort() const -{ - return 0; -} - -QString QBluetoothSocketPrivateDummy::peerName() const -{ - return QString(); -} - -QBluetoothAddress QBluetoothSocketPrivateDummy::peerAddress() const -{ - return QBluetoothAddress(); -} - -quint16 QBluetoothSocketPrivateDummy::peerPort() const -{ - return 0; -} - -qint64 QBluetoothSocketPrivateDummy::writeData(const char *data, qint64 maxSize) -{ - Q_UNUSED(data); - Q_UNUSED(maxSize); - - Q_Q(QBluetoothSocket); - - if (state != QBluetoothSocket::ConnectedState) { - errorString = QBluetoothSocket::tr("Cannot write while not connected"); - q->setSocketError(QBluetoothSocket::OperationError); - return -1; - } - return -1; -} - -qint64 QBluetoothSocketPrivateDummy::readData(char *data, qint64 maxSize) -{ - Q_UNUSED(data); - Q_UNUSED(maxSize); - - Q_Q(QBluetoothSocket); - - if (state != QBluetoothSocket::ConnectedState) { - errorString = QBluetoothSocket::tr("Cannot read while not connected"); - q->setSocketError(QBluetoothSocket::OperationError); - return -1; - } - - return -1; -} - -void QBluetoothSocketPrivateDummy::close() -{ -} - -bool QBluetoothSocketPrivateDummy::setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, - QBluetoothSocket::SocketState socketState, QBluetoothSocket::OpenMode openMode) -{ - Q_UNUSED(socketDescriptor); - Q_UNUSED(socketType) - Q_UNUSED(socketState); - Q_UNUSED(openMode); - return false; -} - -qint64 QBluetoothSocketPrivateDummy::bytesAvailable() const -{ - return 0; -} - -bool QBluetoothSocketPrivateDummy::canReadLine() const -{ - return false; -} - -qint64 QBluetoothSocketPrivateDummy::bytesToWrite() const -{ - return 0; -} - -QT_END_NAMESPACE diff --git a/src/bluetooth/qbluetoothsocket_p.h b/src/bluetooth/qbluetoothsocket_p.h deleted file mode 100644 index 9485977f..00000000 --- a/src/bluetooth/qbluetoothsocket_p.h +++ /dev/null @@ -1,107 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** 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 The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#ifndef QBLUETOOTHSOCKET_P_H -#define QBLUETOOTHSOCKET_P_H - -// -// W A R N I N G -// ------------- -// -// This file is not part of the Qt API. It exists purely as an -// implementation detail. This header file may change from version to -// version without notice, or even be removed. -// -// We mean it. -// - -#include "qbluetoothsocket.h" -#include "qbluetoothsocketbase_p.h" -#include - -QT_BEGIN_NAMESPACE - -class QBluetoothSocketPrivateDummy final : public QBluetoothSocketBasePrivate -{ - Q_OBJECT - friend class QBluetoothServerPrivate; - -public: - QBluetoothSocketPrivateDummy(); - ~QBluetoothSocketPrivateDummy() override; - - void connectToServiceHelper(const QBluetoothAddress &address, - quint16 port, - QIODevice::OpenMode openMode) override; - - void connectToService(const QBluetoothServiceInfo &service, - QIODevice::OpenMode openMode) override; - void connectToService(const QBluetoothAddress &address, const QBluetoothUuid &uuid, - QIODevice::OpenMode openMode) override; - void connectToService(const QBluetoothAddress &address, quint16 port, - QIODevice::OpenMode openMode) override; - - bool ensureNativeSocket(QBluetoothServiceInfo::Protocol type) override; - - QString localName() const override; - QBluetoothAddress localAddress() const override; - quint16 localPort() const override; - - QString peerName() const override; - QBluetoothAddress peerAddress() const override; - quint16 peerPort() const override; - - void abort() override; - void close() override; - - qint64 writeData(const char *data, qint64 maxSize) override; - qint64 readData(char *data, qint64 maxSize) override; - - bool setSocketDescriptor(int socketDescriptor, QBluetoothServiceInfo::Protocol socketType, - QBluetoothSocket::SocketState socketState = QBluetoothSocket::ConnectedState, - QBluetoothSocket::OpenMode openMode = QBluetoothSocket::ReadWrite) override; - - qint64 bytesAvailable() const override; - bool canReadLine() const override; - qint64 bytesToWrite() const override; -}; - -QT_END_NAMESPACE - -#endif -- cgit v1.2.3