summaryrefslogtreecommitdiffstats
path: root/tests/auto
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto')
-rw-r--r--tests/auto/CMakeLists.txt32
-rw-r--r--tests/auto/auto.pro35
-rw-r--r--tests/auto/bic/data/QtBluetooth.5.14.0.linux-gcc-amd64.txt5462
-rw-r--r--tests/auto/bic/data/QtNfc.5.14.0.linux-gcc-amd64.txt5228
-rw-r--r--tests/auto/cmake/CMakeLists.txt45
-rw-r--r--tests/auto/cmake/cmake.pro7
-rw-r--r--tests/auto/nfccommons/qnearfieldmanager_emulator.cpp90
-rw-r--r--tests/auto/nfccommons/qnearfieldmanager_emulator_p.h61
-rw-r--r--tests/auto/nfccommons/qnearfieldtagtype1.cpp697
-rw-r--r--tests/auto/nfccommons/qnearfieldtagtype1_p.h72
-rw-r--r--tests/auto/nfccommons/qnearfieldtagtype2.cpp292
-rw-r--r--tests/auto/nfccommons/qnearfieldtagtype2_p.h58
-rw-r--r--tests/auto/nfccommons/qnearfieldtarget_emulator.cpp279
-rw-r--r--tests/auto/nfccommons/qnearfieldtarget_emulator_p.h96
-rw-r--r--tests/auto/nfccommons/qtlv.cpp496
-rw-r--r--tests/auto/nfccommons/qtlv_p.h96
-rw-r--r--tests/auto/nfccommons/targetemulator.cpp345
-rw-r--r--tests/auto/nfccommons/targetemulator_p.h88
-rw-r--r--tests/auto/qbluetoothaddress/CMakeLists.txt19
-rw-r--r--tests/auto/qbluetoothaddress/qbluetoothaddress.pro6
-rw-r--r--tests/auto/qbluetoothaddress/tst_qbluetoothaddress.cpp29
-rw-r--r--tests/auto/qbluetoothdevicediscoveryagent/CMakeLists.txt39
-rw-r--r--tests/auto/qbluetoothdevicediscoveryagent/qbluetoothdevicediscoveryagent.pro6
-rw-r--r--tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp329
-rw-r--r--tests/auto/qbluetoothdeviceinfo/CMakeLists.txt19
-rw-r--r--tests/auto/qbluetoothdeviceinfo/qbluetoothdeviceinfo.pro5
-rw-r--r--tests/auto/qbluetoothdeviceinfo/tst_qbluetoothdeviceinfo.cpp51
-rw-r--r--tests/auto/qbluetoothhostinfo/CMakeLists.txt19
-rw-r--r--tests/auto/qbluetoothhostinfo/qbluetoothhostinfo.pro6
-rw-r--r--tests/auto/qbluetoothhostinfo/tst_qbluetoothhostinfo.cpp29
-rw-r--r--tests/auto/qbluetoothlocaldevice/CMakeLists.txt27
-rw-r--r--tests/auto/qbluetoothlocaldevice/qbluetoothlocaldevice.pro6
-rw-r--r--tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp345
-rw-r--r--tests/auto/qbluetoothserver/CMakeLists.txt30
-rw-r--r--tests/auto/qbluetoothserver/qbluetoothserver.pro10
-rw-r--r--tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp70
-rw-r--r--tests/auto/qbluetoothservicediscoveryagent/CMakeLists.txt39
-rw-r--r--tests/auto/qbluetoothservicediscoveryagent/qbluetoothservicediscoveryagent.pro7
-rw-r--r--tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp171
-rw-r--r--tests/auto/qbluetoothserviceinfo/CMakeLists.txt32
-rw-r--r--tests/auto/qbluetoothserviceinfo/qbluetoothserviceinfo.pro11
-rw-r--r--tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp158
-rw-r--r--tests/auto/qbluetoothsocket/CMakeLists.txt39
-rw-r--r--tests/auto/qbluetoothsocket/qbluetoothsocket.pro16
-rw-r--r--tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp200
-rw-r--r--tests/auto/qbluetoothtransfermanager/qbluetoothtransfermanager.pro8
-rw-r--r--tests/auto/qbluetoothtransfermanager/testfile.txt1
-rw-r--r--tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp360
-rw-r--r--tests/auto/qbluetoothtransferrequest/qbluetoothtransferrequest.pro5
-rw-r--r--tests/auto/qbluetoothtransferrequest/tst_qbluetoothtransferrequest.cpp164
-rw-r--r--tests/auto/qbluetoothuuid/CMakeLists.txt20
-rw-r--r--tests/auto/qbluetoothuuid/qbluetoothuuid.pro5
-rw-r--r--tests/auto/qbluetoothuuid/tst_qbluetoothuuid.cpp200
-rw-r--r--tests/auto/qlowenergycharacteristic/CMakeLists.txt31
-rw-r--r--tests/auto/qlowenergycharacteristic/qlowenergycharacteristic.pro7
-rw-r--r--tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp127
-rw-r--r--tests/auto/qlowenergycontroller-gattserver/CMakeLists.txt2
-rw-r--r--tests/auto/qlowenergycontroller-gattserver/qlowenergycontroller-gattserver.pro2
-rw-r--r--tests/auto/qlowenergycontroller-gattserver/server/CMakeLists.txt15
-rw-r--r--tests/auto/qlowenergycontroller-gattserver/server/qlowenergycontroller-gattserver.cpp52
-rw-r--r--tests/auto/qlowenergycontroller-gattserver/server/server.pro5
-rw-r--r--tests/auto/qlowenergycontroller-gattserver/test/CMakeLists.txt38
-rw-r--r--tests/auto/qlowenergycontroller-gattserver/test/test.pro12
-rw-r--r--tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp194
-rw-r--r--tests/auto/qlowenergycontroller/CMakeLists.txt44
-rw-r--r--tests/auto/qlowenergycontroller/qlowenergycontroller.pro13
-rw-r--r--tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp1197
-rw-r--r--tests/auto/qlowenergydescriptor/CMakeLists.txt31
-rw-r--r--tests/auto/qlowenergydescriptor/qlowenergydescriptor.pro6
-rw-r--r--tests/auto/qlowenergydescriptor/tst_qlowenergydescriptor.cpp128
-rw-r--r--tests/auto/qlowenergyservice/CMakeLists.txt19
-rw-r--r--tests/auto/qlowenergyservice/qlowenergyservice.pro6
-rw-r--r--tests/auto/qlowenergyservice/tst_qlowenergyservice.cpp29
-rw-r--r--tests/auto/qndeffilter/CMakeLists.txt15
-rw-r--r--tests/auto/qndeffilter/tst_qndeffilter.cpp485
-rw-r--r--tests/auto/qndefmessage/CMakeLists.txt19
-rw-r--r--tests/auto/qndefmessage/qndefmessage.pro5
-rw-r--r--tests/auto/qndefmessage/tst_qndefmessage.cpp416
-rw-r--r--tests/auto/qndefnfcsmartposterrecord/CMakeLists.txt19
-rw-r--r--tests/auto/qndefnfcsmartposterrecord/qndefnfcsmartposterrecord.pro5
-rw-r--r--tests/auto/qndefnfcsmartposterrecord/tst_qndefnfcsmartposterrecord.cpp91
-rw-r--r--tests/auto/qndefrecord/CMakeLists.txt19
-rw-r--r--tests/auto/qndefrecord/qndefrecord.pro5
-rw-r--r--tests/auto/qndefrecord/tst_qndefrecord.cpp268
-rw-r--r--tests/auto/qnearfieldmanager/CMakeLists.txt49
-rw-r--r--tests/auto/qnearfieldmanager/qnearfieldmanager.pro29
-rw-r--r--tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp268
-rw-r--r--tests/auto/qnearfieldtagtype1/CMakeLists.txt48
-rw-r--r--tests/auto/qnearfieldtagtype1/qnearfieldtagtype1.pro29
-rw-r--r--tests/auto/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp104
-rw-r--r--tests/auto/qnearfieldtagtype2/CMakeLists.txt48
-rw-r--r--tests/auto/qnearfieldtagtype2/qnearfieldtagtype2.pro29
-rw-r--r--tests/auto/qnearfieldtagtype2/tst_qnearfieldtagtype2.cpp85
93 files changed, 16805 insertions, 3149 deletions
diff --git a/tests/auto/CMakeLists.txt b/tests/auto/CMakeLists.txt
new file mode 100644
index 00000000..3b32a869
--- /dev/null
+++ b/tests/auto/CMakeLists.txt
@@ -0,0 +1,32 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+if(TARGET Qt::Bluetooth)
+ add_subdirectory(qbluetoothaddress)
+ add_subdirectory(qbluetoothdevicediscoveryagent)
+ add_subdirectory(qbluetoothdeviceinfo)
+ add_subdirectory(qbluetoothlocaldevice)
+ add_subdirectory(qbluetoothhostinfo)
+ add_subdirectory(qbluetoothservicediscoveryagent)
+ add_subdirectory(qbluetoothserviceinfo)
+ add_subdirectory(qbluetoothsocket)
+ add_subdirectory(qbluetoothuuid)
+ add_subdirectory(qbluetoothserver)
+ add_subdirectory(qlowenergycharacteristic)
+ add_subdirectory(qlowenergydescriptor)
+ add_subdirectory(qlowenergycontroller)
+ add_subdirectory(qlowenergycontroller-gattserver)
+ add_subdirectory(qlowenergyservice)
+endif()
+if(TARGET Qt::Nfc)
+ add_subdirectory(qndefmessage)
+ add_subdirectory(qndefrecord)
+ add_subdirectory(qnearfieldmanager)
+ add_subdirectory(qnearfieldtagtype1)
+ add_subdirectory(qnearfieldtagtype2)
+ add_subdirectory(qndefnfcsmartposterrecord)
+ add_subdirectory(qndeffilter)
+endif()
+if(TARGET Qt::Bluetooth AND TARGET Qt::Nfc)
+ add_subdirectory(cmake)
+endif()
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro
deleted file mode 100644
index f1112240..00000000
--- a/tests/auto/auto.pro
+++ /dev/null
@@ -1,35 +0,0 @@
-TEMPLATE = subdirs
-
-SUBDIRS += \
- cmake
-
-qtHaveModule(bluetooth) {
- SUBDIRS += \
- qbluetoothaddress \
- qbluetoothdevicediscoveryagent \
- qbluetoothdeviceinfo \
- qbluetoothlocaldevice \
- qbluetoothhostinfo \
- qbluetoothservicediscoveryagent \
- qbluetoothserviceinfo \
- qbluetoothsocket \
- qbluetoothtransfermanager \
- qbluetoothtransferrequest \
- qbluetoothuuid \
- qbluetoothserver \
- qlowenergycharacteristic \
- qlowenergydescriptor \
- qlowenergycontroller \
- qlowenergycontroller-gattserver \
- qlowenergyservice
-}
-
-qtHaveModule(nfc) {
- SUBDIRS += \
- qndefmessage \
- qndefrecord \
- qnearfieldmanager \
- qnearfieldtagtype1 \
- qnearfieldtagtype2 \
- qndefnfcsmartposterrecord
-}
diff --git a/tests/auto/bic/data/QtBluetooth.5.14.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtBluetooth.5.14.0.linux-gcc-amd64.txt
new file mode 100644
index 00000000..d69a6b77
--- /dev/null
+++ b/tests/auto/bic/data/QtBluetooth.5.14.0.linux-gcc-amd64.txt
@@ -0,0 +1,5462 @@
+Class std::__failure_type
+ size=1 align=1
+ base size=0 base align=1
+std::__failure_type (0x0x7faa71123720) 0 empty
+
+Class std::__do_is_destructible_impl
+ size=1 align=1
+ base size=0 base align=1
+std::__do_is_destructible_impl (0x0x7faa7117eea0) 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 (0x0x7faa711a7120) 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 (0x0x7faa711a7360) 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 (0x0x7faa711a75a0) 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 (0x0x7faa711a7720) 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 (0x0x7faa711a7ae0) 0 empty
+
+Class std::__do_is_implicitly_default_constructible_impl
+ size=1 align=1
+ base size=0 base align=1
+std::__do_is_implicitly_default_constructible_impl (0x0x7faa711e1c00) 0 empty
+
+Class std::__do_common_type_impl
+ size=1 align=1
+ base size=0 base align=1
+std::__do_common_type_impl (0x0x7faa71268300) 0 empty
+
+Class std::__do_member_type_wrapper
+ size=1 align=1
+ base size=0 base align=1
+std::__do_member_type_wrapper (0x0x7faa712683c0) 0 empty
+
+Class std::__invoke_memfun_ref
+ size=1 align=1
+ base size=0 base align=1
+std::__invoke_memfun_ref (0x0x7faa71268780) 0 empty
+
+Class std::__invoke_memfun_deref
+ size=1 align=1
+ base size=0 base align=1
+std::__invoke_memfun_deref (0x0x7faa712687e0) 0 empty
+
+Class std::__invoke_memobj_ref
+ size=1 align=1
+ base size=0 base align=1
+std::__invoke_memobj_ref (0x0x7faa71268840) 0 empty
+
+Class std::__invoke_memobj_deref
+ size=1 align=1
+ base size=0 base align=1
+std::__invoke_memobj_deref (0x0x7faa712688a0) 0 empty
+
+Class std::__invoke_other
+ size=1 align=1
+ base size=0 base align=1
+std::__invoke_other (0x0x7faa71268900) 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 (0x0x7faa712689c0) 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 (0x0x7faa71268a80) 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 (0x0x7faa71268b40) 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 (0x0x7faa71268c00) 0 empty
+
+Class std::__result_of_other_impl
+ size=1 align=1
+ base size=0 base align=1
+std::__result_of_other_impl (0x0x7faa71268f60) 0 empty
+
+Class std::__swappable_details::__do_is_swappable_impl
+ size=1 align=1
+ base size=0 base align=1
+std::__swappable_details::__do_is_swappable_impl (0x0x7faa70ea2300) 0 empty
+
+Class std::__swappable_details::__do_is_nothrow_swappable_impl
+ size=1 align=1
+ base size=0 base align=1
+std::__swappable_details::__do_is_nothrow_swappable_impl (0x0x7faa70ea2360) 0 empty
+
+Class std::__nonesuch
+ size=1 align=1
+ base size=0 base align=1
+std::__nonesuch (0x0x7faa70ea2900) 0 empty
+
+Class std::piecewise_construct_t
+ size=1 align=1
+ base size=0 base align=1
+std::piecewise_construct_t (0x0x7faa70ea2f60) 0 empty
+
+Class std::__nonesuch_no_braces
+ size=1 align=1
+ base size=1 base align=1
+std::__nonesuch_no_braces (0x0x7faa70ea5618) 0 empty
+ std::__nonesuch (0x0x7faa70ee7480) 0 empty
+
+Class std::__true_type
+ size=1 align=1
+ base size=0 base align=1
+std::__true_type (0x0x7faa70f36de0) 0 empty
+
+Class std::__false_type
+ size=1 align=1
+ base size=0 base align=1
+std::__false_type (0x0x7faa70f36e40) 0 empty
+
+Class std::input_iterator_tag
+ size=1 align=1
+ base size=0 base align=1
+std::input_iterator_tag (0x0x7faa70f96b40) 0 empty
+
+Class std::output_iterator_tag
+ size=1 align=1
+ base size=0 base align=1
+std::output_iterator_tag (0x0x7faa70f96ba0) 0 empty
+
+Class std::forward_iterator_tag
+ size=1 align=1
+ base size=1 base align=1
+std::forward_iterator_tag (0x0x7faa70ea5af8) 0 empty
+ std::input_iterator_tag (0x0x7faa70f96c00) 0 empty
+
+Class std::bidirectional_iterator_tag
+ size=1 align=1
+ base size=1 base align=1
+std::bidirectional_iterator_tag (0x0x7faa70ea5b60) 0 empty
+ std::forward_iterator_tag (0x0x7faa70ea5bc8) 0 empty
+ std::input_iterator_tag (0x0x7faa70f96c60) 0 empty
+
+Class std::random_access_iterator_tag
+ size=1 align=1
+ base size=1 base align=1
+std::random_access_iterator_tag (0x0x7faa70ea5c30) 0 empty
+ std::bidirectional_iterator_tag (0x0x7faa70ea5c98) 0 empty
+ std::forward_iterator_tag (0x0x7faa70ea5d00) 0 empty
+ std::input_iterator_tag (0x0x7faa70f96cc0) 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 (0x0x7faa710467e0) 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 (0x0x7faa71046900) 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 (0x0x7faa71046c00) 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 (0x0x7faa71046f00) 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 (0x0x7faa71077060) 0 empty
+
+Class __locale_struct
+ size=232 align=8
+ base size=232 base align=8
+__locale_struct (0x0x7faa70d01360) 0
+
+Class timeval
+ size=16 align=8
+ base size=16 base align=8
+timeval (0x0x7faa70d01660) 0
+
+Class timespec
+ size=16 align=8
+ base size=16 base align=8
+timespec (0x0x7faa70d016c0) 0
+
+Class __pthread_rwlock_arch_t
+ size=56 align=8
+ base size=56 base align=8
+__pthread_rwlock_arch_t (0x0x7faa70d01780) 0
+
+Class __pthread_internal_list
+ size=16 align=8
+ base size=16 base align=8
+__pthread_internal_list (0x0x7faa70d017e0) 0
+
+Class __pthread_mutex_s
+ size=40 align=8
+ base size=40 base align=8
+__pthread_mutex_s (0x0x7faa70d01840) 0
+
+Class __pthread_cond_s
+ size=48 align=8
+ base size=48 base align=8
+__pthread_cond_s (0x0x7faa70d018a0) 0
+
+Class pthread_attr_t
+ size=56 align=8
+ base size=56 base align=8
+pthread_attr_t (0x0x7faa70d01b40) 0
+
+Class random_data
+ size=48 align=8
+ base size=48 base align=8
+random_data (0x0x7faa70d01de0) 0
+
+Class drand48_data
+ size=24 align=8
+ base size=24 base align=8
+drand48_data (0x0x7faa70d01e40) 0
+
+Vtable for std::exception
+std::exception::_ZTVSt9exception: 5 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 (0x0x7faa70d5cc00) 0 nearly-empty
+ vptr=((& std::exception::_ZTVSt9exception) + 16)
+
+Vtable for std::bad_exception
+std::bad_exception::_ZTVSt13bad_exception: 5 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 (0x0x7faa71012068) 0 nearly-empty
+ vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16)
+ std::exception (0x0x7faa70d5cde0) 0 nearly-empty
+ primary-for std::bad_exception (0x0x7faa71012068)
+
+Vtable for std::type_info
+std::type_info::_ZTVSt9type_info: 8 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 (0x0x7faa70dfd000) 0
+ vptr=((& std::type_info::_ZTVSt9type_info) + 16)
+
+Vtable for std::bad_cast
+std::bad_cast::_ZTVSt8bad_cast: 5 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 (0x0x7faa710120d0) 0 nearly-empty
+ vptr=((& std::bad_cast::_ZTVSt8bad_cast) + 16)
+ std::exception (0x0x7faa70dfd3c0) 0 nearly-empty
+ primary-for std::bad_cast (0x0x7faa710120d0)
+
+Vtable for std::bad_typeid
+std::bad_typeid::_ZTVSt10bad_typeid: 5 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 (0x0x7faa71012138) 0 nearly-empty
+ vptr=((& std::bad_typeid::_ZTVSt10bad_typeid) + 16)
+ std::exception (0x0x7faa70dfd5a0) 0 nearly-empty
+ primary-for std::bad_typeid (0x0x7faa71012138)
+
+Class std::__exception_ptr::exception_ptr
+ size=8 align=8
+ base size=8 base align=8
+std::__exception_ptr::exception_ptr (0x0x7faa70dfd780) 0
+
+Vtable for std::nested_exception
+std::nested_exception::_ZTVSt16nested_exception: 4 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 (0x0x7faa70dfdd20) 0
+ vptr=((& std::nested_exception::_ZTVSt16nested_exception) + 16)
+
+Vtable for std::bad_alloc
+std::bad_alloc::_ZTVSt9bad_alloc: 5 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 (0x0x7faa710121a0) 0 nearly-empty
+ vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16)
+ std::exception (0x0x7faa70e34420) 0 nearly-empty
+ primary-for std::bad_alloc (0x0x7faa710121a0)
+
+Vtable for std::bad_array_new_length
+std::bad_array_new_length::_ZTVSt20bad_array_new_length: 5 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 (0x0x7faa71012208) 0 nearly-empty
+ vptr=((& std::bad_array_new_length::_ZTVSt20bad_array_new_length) + 16)
+ std::bad_alloc (0x0x7faa71012270) 0 nearly-empty
+ primary-for std::bad_array_new_length (0x0x7faa71012208)
+ std::exception (0x0x7faa70e34600) 0 nearly-empty
+ primary-for std::bad_alloc (0x0x7faa71012270)
+
+Class std::nothrow_t
+ size=1 align=1
+ base size=0 base align=1
+std::nothrow_t (0x0x7faa70e347e0) 0 empty
+
+Class std::__allocator_traits_base
+ size=1 align=1
+ base size=0 base align=1
+std::__allocator_traits_base (0x0x7faa70e349c0) 0 empty
+
+Class std::__numeric_limits_base
+ size=1 align=1
+ base size=0 base align=1
+std::__numeric_limits_base (0x0x7faa70aafea0) 0 empty
+
+Class QSysInfo
+ size=1 align=1
+ base size=0 base align=1
+QSysInfo (0x0x7faa70746420) 0 empty
+
+Class QMessageLogContext
+ size=32 align=8
+ base size=32 base align=8
+QMessageLogContext (0x0x7faa70746540) 0
+
+Class QMessageLogger
+ size=32 align=8
+ base size=32 base align=8
+QMessageLogger (0x0x7faa70746720) 0
+
+Class QFlag
+ size=4 align=4
+ base size=4 base align=4
+QFlag (0x0x7faa70746de0) 0
+
+Class QIncompatibleFlag
+ size=4 align=4
+ base size=4 base align=4
+QIncompatibleFlag (0x0x7faa707c35a0) 0
+
+Class std::__atomic_flag_base
+ size=1 align=1
+ base size=1 base align=1
+std::__atomic_flag_base (0x0x7faa7085aa80) 0
+
+Class std::atomic_flag
+ size=1 align=1
+ base size=1 base align=1
+std::atomic_flag (0x0x7faa7080b0d0) 0
+ std::__atomic_flag_base (0x0x7faa7085aae0) 0
+
+Class QAtomicInt
+ size=4 align=4
+ base size=4 base align=4
+QAtomicInt (0x0x7faa7080b820) 0
+ QAtomicInteger<int> (0x0x7faa7080b888) 0
+ QBasicAtomicInteger<int> (0x0x7faa70393d20) 0
+
+Class QInternal
+ size=1 align=1
+ base size=0 base align=1
+QInternal (0x0x7faa6ffe78a0) 0 empty
+
+Class QtPrivate::QSlotObjectBase
+ size=16 align=8
+ base size=16 base align=8
+QtPrivate::QSlotObjectBase (0x0x7faa70015e40) 0
+
+Class QGenericArgument
+ size=16 align=8
+ base size=16 base align=8
+QGenericArgument (0x0x7faa700635a0) 0
+
+Class QGenericReturnArgument
+ size=16 align=8
+ base size=16 base align=8
+QGenericReturnArgument (0x0x7faa700174e0) 0
+ QGenericArgument (0x0x7faa70063840) 0
+
+Class QMetaObject::SuperData
+ size=8 align=8
+ base size=8 base align=8
+QMetaObject::SuperData (0x0x7faa70063cc0) 0
+
+Class QMetaObject
+ size=48 align=8
+ base size=48 base align=8
+QMetaObject (0x0x7faa70063c60) 0
+
+Class QMetaObject::Connection
+ size=8 align=8
+ base size=8 base align=8
+QMetaObject::Connection (0x0x7faa6fcb75a0) 0
+
+Class QLatin1Char
+ size=1 align=1
+ base size=1 base align=1
+QLatin1Char (0x0x7faa6fd380c0) 0
+
+Class QChar
+ size=2 align=2
+ base size=2 base align=2
+QChar (0x0x7faa6fd387e0) 0
+
+Class QtPrivate::RefCount
+ size=4 align=4
+ base size=4 base align=4
+QtPrivate::RefCount (0x0x7faa6fe08600) 0
+
+Class QArrayData
+ size=24 align=8
+ base size=24 base align=8
+QArrayData (0x0x7faa6fe08960) 0
+
+Class QtPrivate::QContainerImplHelper
+ size=1 align=1
+ base size=0 base align=1
+QtPrivate::QContainerImplHelper (0x0x7faa6fe66c60) 0 empty
+
+Class lconv
+ size=96 align=8
+ base size=96 base align=8
+lconv (0x0x7faa6fb5c4e0) 0
+
+Vtable for __cxxabiv1::__forced_unwind
+__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE)
+16 0
+24 0
+32 (int (*)(...))__cxa_pure_virtual
+
+Class __cxxabiv1::__forced_unwind
+ size=8 align=8
+ base size=8 base align=8
+__cxxabiv1::__forced_unwind (0x0x7faa6fb5c5a0) 0 nearly-empty
+ vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16)
+
+Class sched_param
+ size=4 align=4
+ base size=4 base align=4
+sched_param (0x0x7faa6fc116c0) 0
+
+Class timex
+ size=208 align=8
+ base size=208 base align=8
+timex (0x0x7faa6fc11780) 0
+
+Class tm
+ size=56 align=8
+ base size=56 base align=8
+tm (0x0x7faa6fc117e0) 0
+
+Class itimerspec
+ size=32 align=8
+ base size=32 base align=8
+itimerspec (0x0x7faa6fc11840) 0
+
+Class _pthread_cleanup_buffer
+ size=32 align=8
+ base size=32 base align=8
+_pthread_cleanup_buffer (0x0x7faa6fc118a0) 0
+
+Class __pthread_cleanup_frame
+ size=24 align=8
+ base size=24 base align=8
+__pthread_cleanup_frame (0x0x7faa6fc119c0) 0
+
+Class __pthread_cleanup_class
+ size=24 align=8
+ base size=24 base align=8
+__pthread_cleanup_class (0x0x7faa6fc11a20) 0
+
+Class _IO_marker
+ size=24 align=8
+ base size=24 base align=8
+_IO_marker (0x0x7faa6f9519c0) 0
+
+Class _IO_FILE
+ size=216 align=8
+ base size=216 base align=8
+_IO_FILE (0x0x7faa6f951a20) 0
+
+Class std::_Hash_impl
+ size=1 align=1
+ base size=0 base align=1
+std::_Hash_impl (0x0x7faa6f70ea80) 0 empty
+
+Class std::_Fnv_hash_impl
+ size=1 align=1
+ base size=0 base align=1
+std::_Fnv_hash_impl (0x0x7faa6f70ec00) 0 empty
+
+Class std::locale
+ size=8 align=8
+ base size=8 base align=8
+std::locale (0x0x7faa6f880d80) 0
+
+Vtable for std::locale::facet
+std::locale::facet::_ZTVNSt6locale5facetE: 4 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 (0x0x7faa6f4d0180) 0
+ vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16)
+
+Class std::locale::id
+ size=8 align=8
+ base size=8 base align=8
+std::locale::id (0x0x7faa6f4d0420) 0
+
+Class std::locale::_Impl
+ size=40 align=8
+ base size=40 base align=8
+std::locale::_Impl (0x0x7faa6f4d0600) 0
+
+Class std::__cow_string
+ size=8 align=8
+ base size=8 base align=8
+std::__cow_string (0x0x7faa6f519600) 0
+
+Vtable for std::logic_error
+std::logic_error::_ZTVSt11logic_error: 5 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 (0x0x7faa6f4f2478) 0
+ vptr=((& std::logic_error::_ZTVSt11logic_error) + 16)
+ std::exception (0x0x7faa6f5196c0) 0 nearly-empty
+ primary-for std::logic_error (0x0x7faa6f4f2478)
+
+Vtable for std::domain_error
+std::domain_error::_ZTVSt12domain_error: 5 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 (0x0x7faa6f4f24e0) 0
+ vptr=((& std::domain_error::_ZTVSt12domain_error) + 16)
+ std::logic_error (0x0x7faa6f4f2548) 0
+ primary-for std::domain_error (0x0x7faa6f4f24e0)
+ std::exception (0x0x7faa6f519720) 0 nearly-empty
+ primary-for std::logic_error (0x0x7faa6f4f2548)
+
+Vtable for std::invalid_argument
+std::invalid_argument::_ZTVSt16invalid_argument: 5 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 (0x0x7faa6f4f25b0) 0
+ vptr=((& std::invalid_argument::_ZTVSt16invalid_argument) + 16)
+ std::logic_error (0x0x7faa6f4f2618) 0
+ primary-for std::invalid_argument (0x0x7faa6f4f25b0)
+ std::exception (0x0x7faa6f519780) 0 nearly-empty
+ primary-for std::logic_error (0x0x7faa6f4f2618)
+
+Vtable for std::length_error
+std::length_error::_ZTVSt12length_error: 5 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 (0x0x7faa6f4f2680) 0
+ vptr=((& std::length_error::_ZTVSt12length_error) + 16)
+ std::logic_error (0x0x7faa6f4f26e8) 0
+ primary-for std::length_error (0x0x7faa6f4f2680)
+ std::exception (0x0x7faa6f5197e0) 0 nearly-empty
+ primary-for std::logic_error (0x0x7faa6f4f26e8)
+
+Vtable for std::out_of_range
+std::out_of_range::_ZTVSt12out_of_range: 5 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 (0x0x7faa6f4f2750) 0
+ vptr=((& std::out_of_range::_ZTVSt12out_of_range) + 16)
+ std::logic_error (0x0x7faa6f4f27b8) 0
+ primary-for std::out_of_range (0x0x7faa6f4f2750)
+ std::exception (0x0x7faa6f519840) 0 nearly-empty
+ primary-for std::logic_error (0x0x7faa6f4f27b8)
+
+Vtable for std::runtime_error
+std::runtime_error::_ZTVSt13runtime_error: 5 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 (0x0x7faa6f4f2820) 0
+ vptr=((& std::runtime_error::_ZTVSt13runtime_error) + 16)
+ std::exception (0x0x7faa6f5198a0) 0 nearly-empty
+ primary-for std::runtime_error (0x0x7faa6f4f2820)
+
+Vtable for std::range_error
+std::range_error::_ZTVSt11range_error: 5 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 (0x0x7faa6f4f2888) 0
+ vptr=((& std::range_error::_ZTVSt11range_error) + 16)
+ std::runtime_error (0x0x7faa6f4f28f0) 0
+ primary-for std::range_error (0x0x7faa6f4f2888)
+ std::exception (0x0x7faa6f519900) 0 nearly-empty
+ primary-for std::runtime_error (0x0x7faa6f4f28f0)
+
+Vtable for std::overflow_error
+std::overflow_error::_ZTVSt14overflow_error: 5 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 (0x0x7faa6f4f2958) 0
+ vptr=((& std::overflow_error::_ZTVSt14overflow_error) + 16)
+ std::runtime_error (0x0x7faa6f4f29c0) 0
+ primary-for std::overflow_error (0x0x7faa6f4f2958)
+ std::exception (0x0x7faa6f519960) 0 nearly-empty
+ primary-for std::runtime_error (0x0x7faa6f4f29c0)
+
+Vtable for std::underflow_error
+std::underflow_error::_ZTVSt15underflow_error: 5 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 (0x0x7faa6f4f2a28) 0
+ vptr=((& std::underflow_error::_ZTVSt15underflow_error) + 16)
+ std::runtime_error (0x0x7faa6f4f2a90) 0
+ primary-for std::underflow_error (0x0x7faa6f4f2a28)
+ std::exception (0x0x7faa6f5199c0) 0 nearly-empty
+ primary-for std::runtime_error (0x0x7faa6f4f2a90)
+
+Vtable for std::_V2::error_category
+std::_V2::error_category::_ZTVNSt3_V214error_categoryE: 10 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTINSt3_V214error_categoryE)
+16 0
+24 0
+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 (0x0x7faa6f519b40) 0 nearly-empty
+ vptr=((& std::_V2::error_category::_ZTVNSt3_V214error_categoryE) + 16)
+
+Class std::error_code
+ size=16 align=8
+ base size=16 base align=8
+std::error_code (0x0x7faa6f519ea0) 0
+
+Class std::error_condition
+ size=16 align=8
+ base size=16 base align=8
+std::error_condition (0x0x7faa6f577720) 0
+
+Vtable for std::system_error
+std::system_error::_ZTVSt12system_error: 5 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 (0x0x7faa6f4f2ea0) 0
+ vptr=((& std::system_error::_ZTVSt12system_error) + 16)
+ std::runtime_error (0x0x7faa6f4f2f08) 0
+ primary-for std::system_error (0x0x7faa6f4f2ea0)
+ std::exception (0x0x7faa6f5a2300) 0 nearly-empty
+ primary-for std::runtime_error (0x0x7faa6f4f2f08)
+
+Vtable for std::ios_base::failure
+std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E: 5 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 (0x0x7faa6f5cb1a0) 0
+ vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E) + 16)
+ std::system_error (0x0x7faa6f5cb208) 0
+ primary-for std::ios_base::failure (0x0x7faa6f5cb1a0)
+ std::runtime_error (0x0x7faa6f5cb270) 0
+ primary-for std::system_error (0x0x7faa6f5cb208)
+ std::exception (0x0x7faa6f5d48a0) 0 nearly-empty
+ primary-for std::runtime_error (0x0x7faa6f5cb270)
+
+Class std::ios_base::_Callback_list
+ size=24 align=8
+ base size=24 base align=8
+std::ios_base::_Callback_list (0x0x7faa6f5d4900) 0
+
+Class std::ios_base::_Words
+ size=16 align=8
+ base size=16 base align=8
+std::ios_base::_Words (0x0x7faa6f5d4960) 0
+
+Class std::ios_base::Init
+ size=1 align=1
+ base size=0 base align=1
+std::ios_base::Init (0x0x7faa6f5d49c0) 0 empty
+
+Vtable for std::ios_base
+std::ios_base::_ZTVSt8ios_base: 4 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 (0x0x7faa6f5d4840) 0
+ vptr=((& std::ios_base::_ZTVSt8ios_base) + 16)
+
+Class std::ctype_base
+ size=1 align=1
+ base size=0 base align=1
+std::ctype_base (0x0x7faa6f2c4300) 0 empty
+
+Class std::__num_base
+ size=1 align=1
+ base size=0 base align=1
+std::__num_base (0x0x7faa6f38f4e0) 0 empty
+
+VTT for std::basic_ostream<char>
+std::basic_ostream<char>::_ZTTSo: 2 entries
+0 ((& std::basic_ostream<char>::_ZTVSo) + 24)
+8 ((& std::basic_ostream<char>::_ZTVSo) + 64)
+
+VTT for std::basic_ostream<wchar_t>
+std::basic_ostream<wchar_t>::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2 entries
+0 ((& std::basic_ostream<wchar_t>::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24)
+8 ((& std::basic_ostream<wchar_t>::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64)
+
+VTT for std::basic_istream<char>
+std::basic_istream<char>::_ZTTSi: 2 entries
+0 ((& std::basic_istream<char>::_ZTVSi) + 24)
+8 ((& std::basic_istream<char>::_ZTVSi) + 64)
+
+VTT for std::basic_istream<wchar_t>
+std::basic_istream<wchar_t>::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2 entries
+0 ((& std::basic_istream<wchar_t>::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24)
+8 ((& std::basic_istream<wchar_t>::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64)
+
+Construction vtable for std::basic_istream<char> (0x0x7faa6ef25958 instance) in std::basic_iostream<char>
+std::basic_iostream<char>::_ZTCSd0_Si: 10 entries
+0 24
+8 (int (*)(...))0
+16 (int (*)(...))(& _ZTISi)
+24 0
+32 0
+40 18446744073709551592
+48 (int (*)(...))-24
+56 (int (*)(...))(& _ZTISi)
+64 0
+72 0
+
+Construction vtable for std::basic_ostream<char> (0x0x7faa6ef25a28 instance) in std::basic_iostream<char>
+std::basic_iostream<char>::_ZTCSd16_So: 10 entries
+0 8
+8 (int (*)(...))0
+16 (int (*)(...))(& _ZTISo)
+24 0
+32 0
+40 18446744073709551608
+48 (int (*)(...))-8
+56 (int (*)(...))(& _ZTISo)
+64 0
+72 0
+
+VTT for std::basic_iostream<char>
+std::basic_iostream<char>::_ZTTSd: 7 entries
+0 ((& std::basic_iostream<char>::_ZTVSd) + 24)
+8 ((& std::basic_iostream<char>::_ZTCSd0_Si) + 24)
+16 ((& std::basic_iostream<char>::_ZTCSd0_Si) + 64)
+24 ((& std::basic_iostream<char>::_ZTCSd16_So) + 24)
+32 ((& std::basic_iostream<char>::_ZTCSd16_So) + 64)
+40 ((& std::basic_iostream<char>::_ZTVSd) + 104)
+48 ((& std::basic_iostream<char>::_ZTVSd) + 64)
+
+Construction vtable for std::basic_istream<wchar_t> (0x0x7faa6ef666e8 instance) in std::basic_iostream<wchar_t>
+std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10 entries
+0 24
+8 (int (*)(...))0
+16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE)
+24 0
+32 0
+40 18446744073709551592
+48 (int (*)(...))-24
+56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE)
+64 0
+72 0
+
+Construction vtable for std::basic_ostream<wchar_t> (0x0x7faa6ef667b8 instance) in std::basic_iostream<wchar_t>
+std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10 entries
+0 8
+8 (int (*)(...))0
+16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE)
+24 0
+32 0
+40 18446744073709551608
+48 (int (*)(...))-8
+56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE)
+64 0
+72 0
+
+VTT for std::basic_iostream<wchar_t>
+std::basic_iostream<wchar_t>::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7 entries
+0 ((& std::basic_iostream<wchar_t>::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24)
+8 ((& std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24)
+16 ((& std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64)
+24 ((& std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24)
+32 ((& std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64)
+40 ((& std::basic_iostream<wchar_t>::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104)
+48 ((& std::basic_iostream<wchar_t>::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64)
+
+Class QByteArrayDataPtr
+ size=8 align=8
+ base size=8 base align=8
+QByteArrayDataPtr (0x0x7faa6ef6ae40) 0
+
+Class QByteArray
+ size=8 align=8
+ base size=8 base align=8
+QByteArray (0x0x7faa6ef6aea0) 0
+
+Class QByteRef
+ size=16 align=8
+ base size=12 base align=8
+QByteRef (0x0x7faa6ecd52a0) 0
+
+Class QStringDataPtr
+ size=8 align=8
+ base size=8 base align=8
+QStringDataPtr (0x0x7faa6ed71120) 0
+
+Class QStringView
+ size=16 align=8
+ base size=16 base align=8
+QStringView (0x0x7faa6ed715a0) 0
+
+Class QLatin1String
+ size=16 align=8
+ base size=16 base align=8
+QLatin1String (0x0x7faa6ee5c660) 0
+
+Class QString::Null
+ size=1 align=1
+ base size=0 base align=1
+QString::Null (0x0x7faa6eb07600) 0 empty
+
+Class QString
+ size=8 align=8
+ base size=8 base align=8
+QString (0x0x7faa6eb074e0) 0
+
+Class QCharRef
+ size=16 align=8
+ base size=12 base align=8
+QCharRef (0x0x7faa6e9e4480) 0
+
+Class QStringRef
+ size=16 align=8
+ base size=16 base align=8
+QStringRef (0x0x7faa6e765060) 0
+
+Class QtPrivate::ArgBase
+ size=1 align=1
+ base size=1 base align=1
+QtPrivate::ArgBase (0x0x7faa6e4c6e40) 0
+
+Class QtPrivate::QStringViewArg
+ size=24 align=8
+ base size=24 base align=8
+QtPrivate::QStringViewArg (0x0x7faa6e7f7618) 0
+ QtPrivate::ArgBase (0x0x7faa6e4c6ea0) 0
+
+Class QtPrivate::QLatin1StringArg
+ size=24 align=8
+ base size=24 base align=8
+QtPrivate::QLatin1StringArg (0x0x7faa6e7f7680) 0
+ QtPrivate::ArgBase (0x0x7faa6e5010c0) 0
+
+Class std::__erased_type
+ size=1 align=1
+ base size=0 base align=1
+std::__erased_type (0x0x7faa6e5c5000) 0 empty
+
+Class std::allocator_arg_t
+ size=1 align=1
+ base size=0 base align=1
+std::allocator_arg_t (0x0x7faa6e5c5060) 0 empty
+
+Class std::__uses_alloc_base
+ size=1 align=1
+ base size=0 base align=1
+std::__uses_alloc_base (0x0x7faa6e5c51e0) 0 empty
+
+Class std::__uses_alloc0::_Sink
+ size=1 align=1
+ base size=0 base align=1
+std::__uses_alloc0::_Sink (0x0x7faa6e5c52a0) 0 empty
+
+Class std::__uses_alloc0
+ size=1 align=1
+ base size=1 base align=1
+std::__uses_alloc0 (0x0x7faa6e7f7a28) 0
+ std::__uses_alloc_base (0x0x7faa6e5c5240) 0 empty
+
+Class std::_Swallow_assign
+ size=1 align=1
+ base size=0 base align=1
+std::_Swallow_assign (0x0x7faa6e32f600) 0 empty
+
+Vtable for std::bad_function_call
+std::bad_function_call::_ZTVSt17bad_function_call: 5 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 (0x0x7faa6e2c3c98) 0 nearly-empty
+ vptr=((& std::bad_function_call::_ZTVSt17bad_function_call) + 16)
+ std::exception (0x0x7faa6e372f00) 0 nearly-empty
+ primary-for std::bad_function_call (0x0x7faa6e2c3c98)
+
+Class std::_Nocopy_types
+ size=16 align=8
+ base size=16 base align=8
+std::_Nocopy_types (0x0x7faa6e3a5000) 0
+
+Class std::_Any_data
+ size=16 align=8
+ base size=16 base align=8
+std::_Any_data (0x0x7faa6e3a5060) 0
+
+Class std::_Function_base
+ size=24 align=8
+ base size=24 base align=8
+std::_Function_base (0x0x7faa6e3a5360) 0
+
+Class QtPrivate::QHashCombine
+ size=1 align=1
+ base size=0 base align=1
+QtPrivate::QHashCombine (0x0x7faa6e1987e0) 0 empty
+
+Class QtPrivate::QHashCombineCommutative
+ size=1 align=1
+ base size=0 base align=1
+QtPrivate::QHashCombineCommutative (0x0x7faa6e1988a0) 0 empty
+
+Class std::_Bit_reference
+ size=16 align=8
+ base size=16 base align=8
+std::_Bit_reference (0x0x7faa6deca000) 0
+
+Class std::_Bit_iterator_base
+ size=16 align=8
+ base size=12 base align=8
+std::_Bit_iterator_base (0x0x7faa6e1eb820) 0
+ std::iterator<std::random_access_iterator_tag, bool> (0x0x7faa6deca720) 0 empty
+
+Class std::_Bit_iterator
+ size=16 align=8
+ base size=12 base align=8
+std::_Bit_iterator (0x0x7faa6e1eb958) 0
+ std::_Bit_iterator_base (0x0x7faa6e1eb9c0) 0
+ std::iterator<std::random_access_iterator_tag, bool> (0x0x7faa6decad80) 0 empty
+
+Class std::_Bit_const_iterator
+ size=16 align=8
+ base size=12 base align=8
+std::_Bit_const_iterator (0x0x7faa6e1eba28) 0
+ std::_Bit_iterator_base (0x0x7faa6e1eba90) 0
+ std::iterator<std::random_access_iterator_tag, bool> (0x0x7faa6df025a0) 0 empty
+
+Class std::__detail::_List_node_base
+ size=16 align=8
+ base size=16 base align=8
+std::__detail::_List_node_base (0x0x7faa6dd4c120) 0
+
+Class QListData::NotArrayCompatibleLayout
+ size=1 align=1
+ base size=0 base align=1
+QListData::NotArrayCompatibleLayout (0x0x7faa6ddfbea0) 0 empty
+
+Class QListData::NotIndirectLayout
+ size=1 align=1
+ base size=0 base align=1
+QListData::NotIndirectLayout (0x0x7faa6ddfbf00) 0 empty
+
+Class QListData::ArrayCompatibleLayout
+ size=1 align=1
+ base size=1 base align=1
+QListData::ArrayCompatibleLayout (0x0x7faa6e0265b0) 0 empty
+ QListData::NotIndirectLayout (0x0x7faa6ddfbf60) 0 empty
+
+Class QListData::InlineWithPaddingLayout
+ size=1 align=1
+ base size=1 base align=1
+QListData::InlineWithPaddingLayout (0x0x7faa6dd668c0) 0 empty
+ QListData::NotArrayCompatibleLayout (0x0x7faa6de12000) 0 empty
+ QListData::NotIndirectLayout (0x0x7faa6de12060) 0 empty
+
+Class QListData::IndirectLayout
+ size=1 align=1
+ base size=1 base align=1
+QListData::IndirectLayout (0x0x7faa6e026618) 0 empty
+ QListData::NotArrayCompatibleLayout (0x0x7faa6de120c0) 0 empty
+
+Class QListData::Data
+ size=24 align=8
+ base size=24 base align=8
+QListData::Data (0x0x7faa6de12120) 0
+
+Class QListData
+ size=8 align=8
+ base size=8 base align=8
+QListData (0x0x7faa6ddfbe40) 0
+
+Class QRegExp
+ size=8 align=8
+ base size=8 base align=8
+QRegExp (0x0x7faa6db0d2a0) 0
+
+Class QStringMatcher::Data
+ size=272 align=8
+ base size=272 base align=8
+QStringMatcher::Data (0x0x7faa6dbe97e0) 0
+
+Class QStringMatcher
+ size=1048 align=8
+ base size=1048 base align=8
+QStringMatcher (0x0x7faa6dbe9780) 0
+
+Class QStringList
+ size=8 align=8
+ base size=8 base align=8
+QStringList (0x0x7faa6dbee2d8) 0
+ QList<QString> (0x0x7faa6dbee340) 0
+ QListSpecialMethods<QString> (0x0x7faa6dbe9a20) 0 empty
+
+Class QScopedPointerPodDeleter
+ size=1 align=1
+ base size=0 base align=1
+QScopedPointerPodDeleter (0x0x7faa6d8b9960) 0 empty
+
+Class std::_Rb_tree_node_base
+ size=32 align=8
+ base size=32 base align=8
+std::_Rb_tree_node_base (0x0x7faa6d94dba0) 0
+
+Class std::_Rb_tree_header
+ size=40 align=8
+ base size=40 base align=8
+std::_Rb_tree_header (0x0x7faa6d94df00) 0
+
+Class QtPrivate::AbstractDebugStreamFunction
+ size=16 align=8
+ base size=16 base align=8
+QtPrivate::AbstractDebugStreamFunction (0x0x7faa6d6ab540) 0
+
+Class QtPrivate::AbstractComparatorFunction
+ size=24 align=8
+ base size=24 base align=8
+QtPrivate::AbstractComparatorFunction (0x0x7faa6d6ab8a0) 0
+
+Class QtPrivate::AbstractConverterFunction
+ size=8 align=8
+ base size=8 base align=8
+QtPrivate::AbstractConverterFunction (0x0x7faa6d6abde0) 0
+
+Class QMetaType
+ size=80 align=8
+ base size=80 base align=8
+QMetaType (0x0x7faa6d6d2360) 0
+
+Class QtMetaTypePrivate::VariantData
+ size=24 align=8
+ base size=20 base align=8
+QtMetaTypePrivate::VariantData (0x0x7faa6d73b540) 0
+
+Class QtMetaTypePrivate::VectorBoolElements
+ size=1 align=1
+ base size=0 base align=1
+QtMetaTypePrivate::VectorBoolElements (0x0x7faa6d73bc00) 0 empty
+
+Class QtMetaTypePrivate::QSequentialIterableImpl
+ size=104 align=8
+ base size=104 base align=8
+QtMetaTypePrivate::QSequentialIterableImpl (0x0x7faa6d390a80) 0
+
+Class QtMetaTypePrivate::QAssociativeIterableImpl
+ size=112 align=8
+ base size=112 base align=8
+QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7faa6d44d180) 0
+
+Class QtMetaTypePrivate::QPairVariantInterfaceImpl
+ size=40 align=8
+ base size=40 base align=8
+QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7faa6d4a26c0) 0
+
+Class std::chrono::_V2::system_clock
+ size=1 align=1
+ base size=0 base align=1
+std::chrono::_V2::system_clock (0x0x7faa6d337c60) 0 empty
+
+Class std::chrono::_V2::steady_clock
+ size=1 align=1
+ base size=0 base align=1
+std::chrono::_V2::steady_clock (0x0x7faa6d06d720) 0 empty
+
+Vtable for QObjectData
+QObjectData::_ZTV11QObjectData: 4 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 (0x0x7faa6d06d780) 0
+ vptr=((& QObjectData::_ZTV11QObjectData) + 16)
+
+Class QObject::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QObject::QPrivateSignal (0x0x7faa6d06d960) 0 empty
+
+Vtable for QObject
+QObject::_ZTV7QObject: 14 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 (0x0x7faa6d06d900) 0
+ vptr=((& QObject::_ZTV7QObject) + 16)
+
+Vtable for QObjectUserData
+QObjectUserData::_ZTV15QObjectUserData: 4 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 (0x0x7faa6d150780) 0 nearly-empty
+ vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16)
+
+Class QSignalBlocker
+ size=16 align=8
+ base size=10 base align=8
+QSignalBlocker (0x0x7faa6d150900) 0
+
+Class QAbstractAnimation::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAbstractAnimation::QPrivateSignal (0x0x7faa6d1721e0) 0 empty
+
+Vtable for QAbstractAnimation
+QAbstractAnimation::_ZTV18QAbstractAnimation: 18 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI18QAbstractAnimation)
+16 (int (*)(...))QAbstractAnimation::metaObject
+24 (int (*)(...))QAbstractAnimation::qt_metacast
+32 (int (*)(...))QAbstractAnimation::qt_metacall
+40 0
+48 0
+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 (0x0x7faa6d152478) 0
+ vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16)
+ QObject (0x0x7faa6d172180) 0
+ primary-for QAbstractAnimation (0x0x7faa6d152478)
+
+Class QAnimationDriver::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAnimationDriver::QPrivateSignal (0x0x7faa6d1725a0) 0 empty
+
+Vtable for QAnimationDriver
+QAnimationDriver::_ZTV16QAnimationDriver: 18 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 (0x0x7faa6d1524e0) 0
+ vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16)
+ QObject (0x0x7faa6d172540) 0
+ primary-for QAnimationDriver (0x0x7faa6d1524e0)
+
+Class QEventLoop::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QEventLoop::QPrivateSignal (0x0x7faa6d1727e0) 0 empty
+
+Vtable for QEventLoop
+QEventLoop::_ZTV10QEventLoop: 14 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 (0x0x7faa6d152548) 0
+ vptr=((& QEventLoop::_ZTV10QEventLoop) + 16)
+ QObject (0x0x7faa6d172780) 0
+ primary-for QEventLoop (0x0x7faa6d152548)
+
+Class QEventLoopLocker
+ size=8 align=8
+ base size=8 base align=8
+QEventLoopLocker (0x0x7faa6cdcf0c0) 0
+
+Class QAbstractEventDispatcher::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAbstractEventDispatcher::QPrivateSignal (0x0x7faa6cdcf180) 0 empty
+
+Class QAbstractEventDispatcher::TimerInfo
+ size=12 align=4
+ base size=12 base align=4
+QAbstractEventDispatcher::TimerInfo (0x0x7faa6cdcf1e0) 0
+
+Vtable for QAbstractEventDispatcher
+QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher)
+16 (int (*)(...))QAbstractEventDispatcher::metaObject
+24 (int (*)(...))QAbstractEventDispatcher::qt_metacast
+32 (int (*)(...))QAbstractEventDispatcher::qt_metacall
+40 0
+48 0
+56 (int (*)(...))QObject::event
+64 (int (*)(...))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 (0x0x7faa6d152680) 0
+ vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16)
+ QObject (0x0x7faa6cdcf120) 0
+ primary-for QAbstractEventDispatcher (0x0x7faa6d152680)
+
+Class QMapNodeBase
+ size=24 align=8
+ base size=24 base align=8
+QMapNodeBase (0x0x7faa6ce261e0) 0
+
+Class QMapDataBase
+ size=40 align=8
+ base size=40 base align=8
+QMapDataBase (0x0x7faa6ce26e40) 0
+
+Class QHashData::Node
+ size=16 align=8
+ base size=16 base align=8
+QHashData::Node (0x0x7faa6cf1a7e0) 0
+
+Class QHashData
+ size=48 align=8
+ base size=44 base align=8
+QHashData (0x0x7faa6cf1a780) 0
+
+Class QHashDummyValue
+ size=1 align=1
+ base size=0 base align=1
+QHashDummyValue (0x0x7faa6cf1aa80) 0 empty
+
+Class QVariant::PrivateShared
+ size=16 align=8
+ base size=12 base align=8
+QVariant::PrivateShared (0x0x7faa6cc4a1e0) 0
+
+Class QVariant::Private::Data
+ size=8 align=8
+ base size=8 base align=8
+QVariant::Private::Data (0x0x7faa6cc4a2a0) 0
+
+Class QVariant::Private
+ size=16 align=8
+ base size=12 base align=8
+QVariant::Private (0x0x7faa6cc4a240) 0
+
+Class QVariant::Handler
+ size=72 align=8
+ base size=72 base align=8
+QVariant::Handler (0x0x7faa6cc4a300) 0
+
+Class QVariant
+ size=16 align=8
+ base size=16 base align=8
+QVariant (0x0x7faa6cc4a180) 0
+
+Class QVariantComparisonHelper
+ size=8 align=8
+ base size=8 base align=8
+QVariantComparisonHelper (0x0x7faa6c9ac5a0) 0
+
+Class QSequentialIterable::const_iterator
+ size=112 align=8
+ base size=112 base align=8
+QSequentialIterable::const_iterator (0x0x7faa6c9f1c00) 0
+
+Class QSequentialIterable
+ size=104 align=8
+ base size=104 base align=8
+QSequentialIterable (0x0x7faa6c9f1ba0) 0
+
+Class QAssociativeIterable::const_iterator
+ size=120 align=8
+ base size=120 base align=8
+QAssociativeIterable::const_iterator (0x0x7faa6c9f1d20) 0
+
+Class QAssociativeIterable
+ size=112 align=8
+ base size=112 base align=8
+QAssociativeIterable (0x0x7faa6c9f1cc0) 0
+
+Class QModelIndex
+ size=24 align=8
+ base size=24 base align=8
+QModelIndex (0x0x7faa6cabbea0) 0
+
+Class QPersistentModelIndex
+ size=8 align=8
+ base size=8 base align=8
+QPersistentModelIndex (0x0x7faa6cb2dae0) 0
+
+Class QAbstractItemModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAbstractItemModel::QPrivateSignal (0x0x7faa6c7fd900) 0 empty
+
+Vtable for QAbstractItemModel
+QAbstractItemModel::_ZTV18QAbstractItemModel: 48 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI18QAbstractItemModel)
+16 (int (*)(...))QAbstractItemModel::metaObject
+24 (int (*)(...))QAbstractItemModel::qt_metacast
+32 (int (*)(...))QAbstractItemModel::qt_metacall
+40 0
+48 0
+56 (int (*)(...))QObject::event
+64 (int (*)(...))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 (0x0x7faa6c806820) 0
+ vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16)
+ QObject (0x0x7faa6c7fd8a0) 0
+ primary-for QAbstractItemModel (0x0x7faa6c806820)
+
+Class QAbstractTableModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAbstractTableModel::QPrivateSignal (0x0x7faa6c875cc0) 0 empty
+
+Vtable for QAbstractTableModel
+QAbstractTableModel::_ZTV19QAbstractTableModel: 48 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI19QAbstractTableModel)
+16 (int (*)(...))QAbstractTableModel::metaObject
+24 (int (*)(...))QAbstractTableModel::qt_metacast
+32 (int (*)(...))QAbstractTableModel::qt_metacall
+40 0
+48 0
+56 (int (*)(...))QObject::event
+64 (int (*)(...))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 (0x0x7faa6c806e38) 0
+ vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16)
+ QAbstractItemModel (0x0x7faa6c806ea0) 0
+ primary-for QAbstractTableModel (0x0x7faa6c806e38)
+ QObject (0x0x7faa6c875c60) 0
+ primary-for QAbstractItemModel (0x0x7faa6c806ea0)
+
+Class QAbstractListModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAbstractListModel::QPrivateSignal (0x0x7faa6c875e40) 0 empty
+
+Vtable for QAbstractListModel
+QAbstractListModel::_ZTV18QAbstractListModel: 48 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI18QAbstractListModel)
+16 (int (*)(...))QAbstractListModel::metaObject
+24 (int (*)(...))QAbstractListModel::qt_metacast
+32 (int (*)(...))QAbstractListModel::qt_metacall
+40 0
+48 0
+56 (int (*)(...))QObject::event
+64 (int (*)(...))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 (0x0x7faa6c806f08) 0
+ vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16)
+ QAbstractItemModel (0x0x7faa6c806f70) 0
+ primary-for QAbstractListModel (0x0x7faa6c806f08)
+ QObject (0x0x7faa6c875de0) 0
+ primary-for QAbstractItemModel (0x0x7faa6c806f70)
+
+Vtable for QAbstractNativeEventFilter
+QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter)
+16 0
+24 0
+32 (int (*)(...))__cxa_pure_virtual
+
+Class QAbstractNativeEventFilter
+ size=16 align=8
+ base size=16 base align=8
+QAbstractNativeEventFilter (0x0x7faa6c8fc5a0) 0
+ vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16)
+
+Class QAbstractProxyModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAbstractProxyModel::QPrivateSignal (0x0x7faa6c8fc660) 0 empty
+
+Vtable for QAbstractProxyModel
+QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI19QAbstractProxyModel)
+16 (int (*)(...))QAbstractProxyModel::metaObject
+24 (int (*)(...))QAbstractProxyModel::qt_metacast
+32 (int (*)(...))QAbstractProxyModel::qt_metacall
+40 0
+48 0
+56 (int (*)(...))QObject::event
+64 (int (*)(...))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 (0x0x7faa6c90d068) 0
+ vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16)
+ QAbstractItemModel (0x0x7faa6c90d0d0) 0
+ primary-for QAbstractProxyModel (0x0x7faa6c90d068)
+ QObject (0x0x7faa6c8fc600) 0
+ primary-for QAbstractItemModel (0x0x7faa6c90d0d0)
+
+Class QAbstractState::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAbstractState::QPrivateSignal (0x0x7faa6c8fc8a0) 0 empty
+
+Vtable for QAbstractState
+QAbstractState::_ZTV14QAbstractState: 16 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI14QAbstractState)
+16 (int (*)(...))QAbstractState::metaObject
+24 (int (*)(...))QAbstractState::qt_metacast
+32 (int (*)(...))QAbstractState::qt_metacall
+40 0
+48 0
+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 (0x0x7faa6c90d138) 0
+ vptr=((& QAbstractState::_ZTV14QAbstractState) + 16)
+ QObject (0x0x7faa6c8fc840) 0
+ primary-for QAbstractState (0x0x7faa6c90d138)
+
+Class QAbstractTransition::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAbstractTransition::QPrivateSignal (0x0x7faa6c8fcae0) 0 empty
+
+Vtable for QAbstractTransition
+QAbstractTransition::_ZTV19QAbstractTransition: 16 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI19QAbstractTransition)
+16 (int (*)(...))QAbstractTransition::metaObject
+24 (int (*)(...))QAbstractTransition::qt_metacast
+32 (int (*)(...))QAbstractTransition::qt_metacall
+40 0
+48 0
+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 (0x0x7faa6c90d1a0) 0
+ vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16)
+ QObject (0x0x7faa6c8fca80) 0
+ primary-for QAbstractTransition (0x0x7faa6c90d1a0)
+
+Class QAnimationGroup::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAnimationGroup::QPrivateSignal (0x0x7faa6c8fcde0) 0 empty
+
+Vtable for QAnimationGroup
+QAnimationGroup::_ZTV15QAnimationGroup: 18 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI15QAnimationGroup)
+16 (int (*)(...))QAnimationGroup::metaObject
+24 (int (*)(...))QAnimationGroup::qt_metacast
+32 (int (*)(...))QAnimationGroup::qt_metacall
+40 0
+48 0
+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 (0x0x7faa6c90d208) 0
+ vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16)
+ QAbstractAnimation (0x0x7faa6c90d270) 0
+ primary-for QAnimationGroup (0x0x7faa6c90d208)
+ QObject (0x0x7faa6c8fcd80) 0
+ primary-for QAbstractAnimation (0x0x7faa6c90d270)
+
+Class QBasicTimer
+ size=4 align=4
+ base size=4 base align=4
+QBasicTimer (0x0x7faa6c5d0120) 0
+
+Class QBitArray
+ size=8 align=8
+ base size=8 base align=8
+QBitArray (0x0x7faa6c64fa80) 0
+
+Class QBitRef
+ size=16 align=8
+ base size=12 base align=8
+QBitRef (0x0x7faa6c6a1f00) 0
+
+Class QIODevice::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QIODevice::QPrivateSignal (0x0x7faa6c7161e0) 0 empty
+
+Vtable for QIODevice
+QIODevice::_ZTV9QIODevice: 30 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI9QIODevice)
+16 (int (*)(...))QIODevice::metaObject
+24 (int (*)(...))QIODevice::qt_metacast
+32 (int (*)(...))QIODevice::qt_metacall
+40 0
+48 0
+56 (int (*)(...))QObject::event
+64 (int (*)(...))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 (0x0x7faa6c70c820) 0
+ vptr=((& QIODevice::_ZTV9QIODevice) + 16)
+ QObject (0x0x7faa6c716180) 0
+ primary-for QIODevice (0x0x7faa6c70c820)
+
+Class QBuffer::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QBuffer::QPrivateSignal (0x0x7faa6c716b40) 0 empty
+
+Vtable for QBuffer
+QBuffer::_ZTV7QBuffer: 30 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 (0x0x7faa6c70c958) 0
+ vptr=((& QBuffer::_ZTV7QBuffer) + 16)
+ QIODevice (0x0x7faa6c70c9c0) 0
+ primary-for QBuffer (0x0x7faa6c70c958)
+ QObject (0x0x7faa6c716ae0) 0
+ primary-for QIODevice (0x0x7faa6c70c9c0)
+
+Class QByteArrayMatcher::Data
+ size=272 align=8
+ base size=272 base align=8
+QByteArrayMatcher::Data (0x0x7faa6c716de0) 0
+
+Class QByteArrayMatcher
+ size=1040 align=8
+ base size=1040 base align=8
+QByteArrayMatcher (0x0x7faa6c716d80) 0
+
+Class QStaticByteArrayMatcherBase::Skiptable
+ size=256 align=1
+ base size=256 base align=1
+QStaticByteArrayMatcherBase::Skiptable (0x0x7faa6c716f60) 0
+
+Class QStaticByteArrayMatcherBase
+ size=256 align=16
+ base size=256 base align=16
+QStaticByteArrayMatcherBase (0x0x7faa6c716f00) 0
+
+Class QSharedData
+ size=4 align=4
+ base size=4 base align=4
+QSharedData (0x0x7faa6c77ce40) 0
+
+Class QLocale
+ size=8 align=8
+ base size=8 base align=8
+QLocale (0x0x7faa6c3dad20) 0
+
+Class QCalendar::YearMonthDay
+ size=12 align=4
+ base size=12 base align=4
+QCalendar::YearMonthDay (0x0x7faa6c567240) 0
+
+Class QCalendar
+ size=8 align=8
+ base size=8 base align=8
+QCalendar (0x0x7faa6c5671e0) 0
+
+Class QDate
+ size=8 align=8
+ base size=8 base align=8
+QDate (0x0x7faa6c567a20) 0
+
+Class QTime
+ size=4 align=4
+ base size=4 base align=4
+QTime (0x0x7faa6c1ed300) 0
+
+Class QDateTime::ShortData
+ size=8 align=8
+ base size=8 base align=8
+QDateTime::ShortData (0x0x7faa6c23df60) 0
+
+Class QDateTime::Data
+ size=8 align=8
+ base size=8 base align=8
+QDateTime::Data (0x0x7faa6c258000) 0
+
+Class QDateTime
+ size=8 align=8
+ base size=8 base align=8
+QDateTime (0x0x7faa6c23df00) 0
+
+Vtable for QTextStream
+QTextStream::_ZTV11QTextStream: 4 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 (0x0x7faa6c32e6c0) 0
+ vptr=((& QTextStream::_ZTV11QTextStream) + 16)
+
+Class QTextStreamManipulator
+ size=40 align=8
+ base size=38 base align=8
+QTextStreamManipulator (0x0x7faa6c32ef60) 0
+
+Class QContiguousCacheData
+ size=24 align=4
+ base size=24 base align=4
+QContiguousCacheData (0x0x7faa6bffdc00) 0
+
+Vtable for __gnu_cxx::__concurrence_lock_error
+__gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE: 5 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 (0x0x7faa6c32d9c0) 0 nearly-empty
+ vptr=((& __gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE) + 16)
+ std::exception (0x0x7faa6c04ca80) 0 nearly-empty
+ primary-for __gnu_cxx::__concurrence_lock_error (0x0x7faa6c32d9c0)
+
+Vtable for __gnu_cxx::__concurrence_unlock_error
+__gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE: 5 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 (0x0x7faa6c32da28) 0 nearly-empty
+ vptr=((& __gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE) + 16)
+ std::exception (0x0x7faa6c04cba0) 0 nearly-empty
+ primary-for __gnu_cxx::__concurrence_unlock_error (0x0x7faa6c32da28)
+
+Vtable for __gnu_cxx::__concurrence_broadcast_error
+__gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE: 5 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 (0x0x7faa6c32da90) 0 nearly-empty
+ vptr=((& __gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE) + 16)
+ std::exception (0x0x7faa6c04ccc0) 0 nearly-empty
+ primary-for __gnu_cxx::__concurrence_broadcast_error (0x0x7faa6c32da90)
+
+Vtable for __gnu_cxx::__concurrence_wait_error
+__gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE: 5 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 (0x0x7faa6c32db60) 0 nearly-empty
+ vptr=((& __gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE) + 16)
+ std::exception (0x0x7faa6c04cde0) 0 nearly-empty
+ primary-for __gnu_cxx::__concurrence_wait_error (0x0x7faa6c32db60)
+
+Class __gnu_cxx::__mutex
+ size=40 align=8
+ base size=40 base align=8
+__gnu_cxx::__mutex (0x0x7faa6c076e40) 0
+
+Class __gnu_cxx::__recursive_mutex
+ size=40 align=8
+ base size=40 base align=8
+__gnu_cxx::__recursive_mutex (0x0x7faa6c09a180) 0
+
+Class __gnu_cxx::__scoped_lock
+ size=8 align=8
+ base size=8 base align=8
+__gnu_cxx::__scoped_lock (0x0x7faa6c09a480) 0
+
+Class __gnu_cxx::__cond
+ size=48 align=8
+ base size=48 base align=8
+__gnu_cxx::__cond (0x0x7faa6c09a7e0) 0
+
+Vtable for std::bad_weak_ptr
+std::bad_weak_ptr::_ZTVSt12bad_weak_ptr: 5 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 (0x0x7faa6c32dbc8) 0 nearly-empty
+ vptr=((& std::bad_weak_ptr::_ZTVSt12bad_weak_ptr) + 16)
+ std::exception (0x0x7faa6c1119c0) 0 nearly-empty
+ primary-for std::bad_weak_ptr (0x0x7faa6c32dbc8)
+
+Class std::_Sp_make_shared_tag
+ size=1 align=1
+ base size=0 base align=1
+std::_Sp_make_shared_tag (0x0x7faa6c17e960) 0 empty
+
+Class std::__sp_array_delete
+ size=1 align=1
+ base size=0 base align=1
+std::__sp_array_delete (0x0x7faa6c17ed80) 0 empty
+
+Class std::_Sp_locker
+ size=2 align=1
+ base size=2 base align=1
+std::_Sp_locker (0x0x7faa6beb5c00) 0
+
+Class QtSharedPointer::NormalDeleter
+ size=1 align=1
+ base size=0 base align=1
+QtSharedPointer::NormalDeleter (0x0x7faa6bf17120) 0 empty
+
+Class QtSharedPointer::ExternalRefCountData
+ size=16 align=8
+ base size=16 base align=8
+QtSharedPointer::ExternalRefCountData (0x0x7faa6bf172a0) 0
+
+Class QtPrivate::EnableInternalData
+ size=1 align=1
+ base size=0 base align=1
+QtPrivate::EnableInternalData (0x0x7faa6bf77ba0) 0 empty
+
+Class QDebug::Stream
+ size=80 align=8
+ base size=76 base align=8
+QDebug::Stream (0x0x7faa6bbcf2a0) 0
+
+Class QDebug
+ size=8 align=8
+ base size=8 base align=8
+QDebug (0x0x7faa6bbcf240) 0
+
+Class QDebugStateSaver
+ size=8 align=8
+ base size=8 base align=8
+QDebugStateSaver (0x0x7faa6bd3eba0) 0
+
+Class QNoDebug
+ size=1 align=1
+ base size=0 base align=1
+QNoDebug (0x0x7faa6bd3ec60) 0 empty
+
+Class QCborError
+ size=4 align=4
+ base size=4 base align=4
+QCborError (0x0x7faa6b9beea0) 0
+
+Class QRegularExpression
+ size=8 align=8
+ base size=8 base align=8
+QRegularExpression (0x0x7faa6b9f0660) 0
+
+Class QRegularExpressionMatch
+ size=8 align=8
+ base size=8 base align=8
+QRegularExpressionMatch (0x0x7faa6ba9e540) 0
+
+Class QRegularExpressionMatchIterator
+ size=8 align=8
+ base size=8 base align=8
+QRegularExpressionMatchIterator (0x0x7faa6bb06300) 0
+
+Class QUrl
+ size=8 align=8
+ base size=8 base align=8
+QUrl (0x0x7faa6bb59d20) 0
+
+Class QUuid
+ size=16 align=4
+ base size=16 base align=4
+QUuid (0x0x7faa6b89fcc0) 0
+
+Class QCborParserError
+ size=16 align=8
+ base size=12 base align=8
+QCborParserError (0x0x7faa6b933840) 0
+
+Class QCborValue
+ size=24 align=8
+ base size=20 base align=8
+QCborValue (0x0x7faa6b933900) 0
+
+Class QCborValueRef
+ size=16 align=8
+ base size=16 base align=8
+QCborValueRef (0x0x7faa6b3b24e0) 0
+
+Class QCborArray::Iterator
+ size=16 align=8
+ base size=16 base align=8
+QCborArray::Iterator (0x0x7faa6b423f00) 0
+
+Class QCborArray::ConstIterator
+ size=16 align=8
+ base size=16 base align=8
+QCborArray::ConstIterator (0x0x7faa6b423f60) 0
+
+Class QCborArray
+ size=8 align=8
+ base size=8 base align=8
+QCborArray (0x0x7faa6b423ea0) 0
+
+Class QCborMap::Iterator
+ size=16 align=8
+ base size=16 base align=8
+QCborMap::Iterator (0x0x7faa6b1aab40) 0
+
+Class QCborMap::ConstIterator
+ size=16 align=8
+ base size=16 base align=8
+QCborMap::ConstIterator (0x0x7faa6b1aaba0) 0
+
+Class QCborMap
+ size=8 align=8
+ base size=8 base align=8
+QCborMap (0x0x7faa6b1aaae0) 0
+
+Class qfloat16::Wrap
+ size=2 align=2
+ base size=2 base align=2
+qfloat16::Wrap (0x0x7faa6afc8360) 0
+
+Class qfloat16
+ size=2 align=2
+ base size=2 base align=2
+qfloat16 (0x0x7faa6afc8300) 0
+
+Class QCborStreamWriter
+ size=8 align=8
+ base size=8 base align=8
+QCborStreamWriter (0x0x7faa6b0b5000) 0
+
+Class QCborStreamReader
+ size=24 align=8
+ base size=20 base align=8
+QCborStreamReader (0x0x7faa6b0b5d20) 0
+
+Class QCollatorSortKey
+ size=8 align=8
+ base size=8 base align=8
+QCollatorSortKey (0x0x7faa6b14ae40) 0
+
+Class QCollator
+ size=8 align=8
+ base size=8 base align=8
+QCollator (0x0x7faa6b175060) 0
+
+Class QCommandLineOption
+ size=8 align=8
+ base size=8 base align=8
+QCommandLineOption (0x0x7faa6ae64660) 0
+
+Vtable for QEvent
+QEvent::_ZTV6QEvent: 4 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 (0x0x7faa6af26ba0) 0
+ vptr=((& QEvent::_ZTV6QEvent) + 16)
+
+Vtable for QTimerEvent
+QTimerEvent::_ZTV11QTimerEvent: 4 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 (0x0x7faa6af25618) 0
+ vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16)
+ QEvent (0x0x7faa6af26f60) 0
+ primary-for QTimerEvent (0x0x7faa6af25618)
+
+Vtable for QChildEvent
+QChildEvent::_ZTV11QChildEvent: 4 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 (0x0x7faa6af25680) 0
+ vptr=((& QChildEvent::_ZTV11QChildEvent) + 16)
+ QEvent (0x0x7faa6af70060) 0
+ primary-for QChildEvent (0x0x7faa6af25680)
+
+Vtable for QDynamicPropertyChangeEvent
+QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4 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 (0x0x7faa6af25bc8) 0
+ vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16)
+ QEvent (0x0x7faa6af706c0) 0
+ primary-for QDynamicPropertyChangeEvent (0x0x7faa6af25bc8)
+
+Vtable for QDeferredDeleteEvent
+QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4 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 (0x0x7faa6af25c30) 0
+ vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16)
+ QEvent (0x0x7faa6af70780) 0
+ primary-for QDeferredDeleteEvent (0x0x7faa6af25c30)
+
+Class QCoreApplication::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QCoreApplication::QPrivateSignal (0x0x7faa6af708a0) 0 empty
+
+Vtable for QCoreApplication
+QCoreApplication::_ZTV16QCoreApplication: 16 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 (0x0x7faa6af25c98) 0
+ vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16)
+ QObject (0x0x7faa6af70840) 0
+ primary-for QCoreApplication (0x0x7faa6af25c98)
+
+Class QCommandLineParser
+ size=8 align=8
+ base size=8 base align=8
+QCommandLineParser (0x0x7faa6af70ae0) 0
+
+Class QConcatenateTablesProxyModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QConcatenateTablesProxyModel::QPrivateSignal (0x0x7faa6af70c60) 0 empty
+
+Vtable for QConcatenateTablesProxyModel
+QConcatenateTablesProxyModel::_ZTV28QConcatenateTablesProxyModel: 48 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI28QConcatenateTablesProxyModel)
+16 (int (*)(...))QConcatenateTablesProxyModel::metaObject
+24 (int (*)(...))QConcatenateTablesProxyModel::qt_metacast
+32 (int (*)(...))QConcatenateTablesProxyModel::qt_metacall
+40 (int (*)(...))QConcatenateTablesProxyModel::~QConcatenateTablesProxyModel
+48 (int (*)(...))QConcatenateTablesProxyModel::~QConcatenateTablesProxyModel
+56 (int (*)(...))QObject::event
+64 (int (*)(...))QObject::eventFilter
+72 (int (*)(...))QObject::timerEvent
+80 (int (*)(...))QObject::childEvent
+88 (int (*)(...))QObject::customEvent
+96 (int (*)(...))QObject::connectNotify
+104 (int (*)(...))QObject::disconnectNotify
+112 (int (*)(...))QConcatenateTablesProxyModel::index
+120 (int (*)(...))QConcatenateTablesProxyModel::parent
+128 (int (*)(...))QAbstractItemModel::sibling
+136 (int (*)(...))QConcatenateTablesProxyModel::rowCount
+144 (int (*)(...))QConcatenateTablesProxyModel::columnCount
+152 (int (*)(...))QAbstractItemModel::hasChildren
+160 (int (*)(...))QConcatenateTablesProxyModel::data
+168 (int (*)(...))QConcatenateTablesProxyModel::setData
+176 (int (*)(...))QConcatenateTablesProxyModel::headerData
+184 (int (*)(...))QAbstractItemModel::setHeaderData
+192 (int (*)(...))QConcatenateTablesProxyModel::itemData
+200 (int (*)(...))QConcatenateTablesProxyModel::setItemData
+208 (int (*)(...))QConcatenateTablesProxyModel::mimeTypes
+216 (int (*)(...))QConcatenateTablesProxyModel::mimeData
+224 (int (*)(...))QConcatenateTablesProxyModel::canDropMimeData
+232 (int (*)(...))QConcatenateTablesProxyModel::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 (*)(...))QConcatenateTablesProxyModel::flags
+328 (int (*)(...))QAbstractItemModel::sort
+336 (int (*)(...))QAbstractItemModel::buddy
+344 (int (*)(...))QAbstractItemModel::match
+352 (int (*)(...))QConcatenateTablesProxyModel::span
+360 (int (*)(...))QAbstractItemModel::roleNames
+368 (int (*)(...))QAbstractItemModel::submit
+376 (int (*)(...))QAbstractItemModel::revert
+
+Class QConcatenateTablesProxyModel
+ size=16 align=8
+ base size=16 base align=8
+QConcatenateTablesProxyModel (0x0x7faa6af25d00) 0
+ vptr=((& QConcatenateTablesProxyModel::_ZTV28QConcatenateTablesProxyModel) + 16)
+ QAbstractItemModel (0x0x7faa6af25d68) 0
+ primary-for QConcatenateTablesProxyModel (0x0x7faa6af25d00)
+ QObject (0x0x7faa6af70c00) 0
+ primary-for QAbstractItemModel (0x0x7faa6af25d68)
+
+Class QCryptographicHash
+ size=8 align=8
+ base size=8 base align=8
+QCryptographicHash (0x0x7faa6af70e40) 0
+
+Class QDataStream
+ size=32 align=8
+ base size=32 base align=8
+QDataStream (0x0x7faa6af70f60) 0
+
+Class QtPrivate::StreamStateSaver
+ size=16 align=8
+ base size=12 base align=8
+QtPrivate::StreamStateSaver (0x0x7faa6abf3120) 0
+
+Class QElapsedTimer
+ size=16 align=8
+ base size=16 base align=8
+QElapsedTimer (0x0x7faa6ac2f840) 0
+
+Class QDeadlineTimer
+ size=16 align=8
+ base size=16 base align=8
+QDeadlineTimer (0x0x7faa6ac2ff60) 0
+
+Class QFileDevice::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QFileDevice::QPrivateSignal (0x0x7faa6ad81c60) 0 empty
+
+Vtable for QFileDevice
+QFileDevice::_ZTV11QFileDevice: 34 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 (0x0x7faa6ad79f70) 0
+ vptr=((& QFileDevice::_ZTV11QFileDevice) + 16)
+ QIODevice (0x0x7faa6a998000) 0
+ primary-for QFileDevice (0x0x7faa6ad79f70)
+ QObject (0x0x7faa6ad81c00) 0
+ primary-for QIODevice (0x0x7faa6a998000)
+
+Class QFile::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QFile::QPrivateSignal (0x0x7faa6a9cc5a0) 0 empty
+
+Vtable for QFile
+QFile::_ZTV5QFile: 34 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 (0x0x7faa6a998138) 0
+ vptr=((& QFile::_ZTV5QFile) + 16)
+ QFileDevice (0x0x7faa6a9981a0) 0
+ primary-for QFile (0x0x7faa6a998138)
+ QIODevice (0x0x7faa6a998208) 0
+ primary-for QFileDevice (0x0x7faa6a9981a0)
+ QObject (0x0x7faa6a9cc540) 0
+ primary-for QIODevice (0x0x7faa6a998208)
+
+Class QFileInfo
+ size=8 align=8
+ base size=8 base align=8
+QFileInfo (0x0x7faa6a9ccc00) 0
+
+Class QDir
+ size=8 align=8
+ base size=8 base align=8
+QDir (0x0x7faa6aac3ae0) 0
+
+Class QDirIterator
+ size=8 align=8
+ base size=8 base align=8
+QDirIterator (0x0x7faa6a7deae0) 0
+
+Class QEasingCurve
+ size=8 align=8
+ base size=8 base align=8
+QEasingCurve (0x0x7faa6a8352a0) 0
+
+Class QEventTransition::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QEventTransition::QPrivateSignal (0x0x7faa6a9333c0) 0 empty
+
+Vtable for QEventTransition
+QEventTransition::_ZTV16QEventTransition: 16 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 (0x0x7faa6a8e8ea0) 0
+ vptr=((& QEventTransition::_ZTV16QEventTransition) + 16)
+ QAbstractTransition (0x0x7faa6a8e8f08) 0
+ primary-for QEventTransition (0x0x7faa6a8e8ea0)
+ QObject (0x0x7faa6a933360) 0
+ primary-for QAbstractTransition (0x0x7faa6a8e8f08)
+
+Vtable for QException
+QException::_ZTV10QException: 7 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 (0x0x7faa6a8e8f70) 0 nearly-empty
+ vptr=((& QException::_ZTV10QException) + 16)
+ std::exception (0x0x7faa6a9335a0) 0 nearly-empty
+ primary-for QException (0x0x7faa6a8e8f70)
+
+Vtable for QUnhandledException
+QUnhandledException::_ZTV19QUnhandledException: 7 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 (0x0x7faa6a95a000) 0 nearly-empty
+ vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16)
+ QException (0x0x7faa6a95a068) 0 nearly-empty
+ primary-for QUnhandledException (0x0x7faa6a95a000)
+ std::exception (0x0x7faa6a933600) 0 nearly-empty
+ primary-for QException (0x0x7faa6a95a068)
+
+Class QtPrivate::ExceptionHolder
+ size=8 align=8
+ base size=8 base align=8
+QtPrivate::ExceptionHolder (0x0x7faa6a933660) 0
+
+Class QtPrivate::ExceptionStore
+ size=8 align=8
+ base size=8 base align=8
+QtPrivate::ExceptionStore (0x0x7faa6a933720) 0
+
+Vtable for QFactoryInterface
+QFactoryInterface::_ZTV17QFactoryInterface: 5 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI17QFactoryInterface)
+16 0
+24 0
+32 (int (*)(...))__cxa_pure_virtual
+
+Class QFactoryInterface
+ size=8 align=8
+ base size=8 base align=8
+QFactoryInterface (0x0x7faa6a933780) 0 nearly-empty
+ vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16)
+
+Class QFileSelector::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QFileSelector::QPrivateSignal (0x0x7faa6a9339c0) 0 empty
+
+Vtable for QFileSelector
+QFileSelector::_ZTV13QFileSelector: 14 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 (0x0x7faa6a95a0d0) 0
+ vptr=((& QFileSelector::_ZTV13QFileSelector) + 16)
+ QObject (0x0x7faa6a933960) 0
+ primary-for QFileSelector (0x0x7faa6a95a0d0)
+
+Class QFileSystemWatcher::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QFileSystemWatcher::QPrivateSignal (0x0x7faa6a933c00) 0 empty
+
+Vtable for QFileSystemWatcher
+QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14 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 (0x0x7faa6a95a138) 0
+ vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16)
+ QObject (0x0x7faa6a933ba0) 0
+ primary-for QFileSystemWatcher (0x0x7faa6a95a138)
+
+Class QFinalState::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QFinalState::QPrivateSignal (0x0x7faa6a933e40) 0 empty
+
+Vtable for QFinalState
+QFinalState::_ZTV11QFinalState: 16 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 (0x0x7faa6a95a1a0) 0
+ vptr=((& QFinalState::_ZTV11QFinalState) + 16)
+ QAbstractState (0x0x7faa6a95a208) 0
+ primary-for QFinalState (0x0x7faa6a95a1a0)
+ QObject (0x0x7faa6a933de0) 0
+ primary-for QAbstractState (0x0x7faa6a95a208)
+
+Vtable for QRunnable
+QRunnable::_ZTV9QRunnable: 5 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI9QRunnable)
+16 (int (*)(...))__cxa_pure_virtual
+24 0
+32 0
+
+Class QRunnable
+ size=16 align=8
+ base size=12 base align=8
+QRunnable (0x0x7faa6a556060) 0
+ vptr=((& QRunnable::_ZTV9QRunnable) + 16)
+
+Class QBasicMutex
+ size=8 align=8
+ base size=8 base align=8
+QBasicMutex (0x0x7faa6a556300) 0
+
+Class QMutex
+ size=8 align=8
+ base size=8 base align=8
+QMutex (0x0x7faa6a95a2d8) 0
+ QBasicMutex (0x0x7faa6a556f60) 0
+
+Class QRecursiveMutex
+ size=8 align=8
+ base size=8 base align=8
+QRecursiveMutex (0x0x7faa6a95a340) 0
+ QMutex (0x0x7faa6a95a3a8) 0
+ QBasicMutex (0x0x7faa6a5df1e0) 0
+
+Class QMutexLocker
+ size=8 align=8
+ base size=8 base align=8
+QMutexLocker (0x0x7faa6a5df240) 0
+
+Class QtPrivate::ResultItem
+ size=16 align=8
+ base size=16 base align=8
+QtPrivate::ResultItem (0x0x7faa6a5df840) 0
+
+Class QtPrivate::ResultIteratorBase
+ size=16 align=8
+ base size=12 base align=8
+QtPrivate::ResultIteratorBase (0x0x7faa6a5dfe40) 0
+
+Vtable for QtPrivate::ResultStoreBase
+QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4 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 (0x0x7faa6a62f060) 0
+ vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16)
+
+Class std::__mutex_base
+ size=40 align=8
+ base size=40 base align=8
+std::__mutex_base (0x0x7faa6a67c840) 0
+
+Class std::mutex
+ size=40 align=8
+ base size=40 base align=8
+std::mutex (0x0x7faa6a671c98) 0
+ std::__mutex_base (0x0x7faa6a67c8a0) 0
+
+Class std::defer_lock_t
+ size=1 align=1
+ base size=0 base align=1
+std::defer_lock_t (0x0x7faa6a67ca80) 0 empty
+
+Class std::try_to_lock_t
+ size=1 align=1
+ base size=0 base align=1
+std::try_to_lock_t (0x0x7faa6a67cae0) 0 empty
+
+Class std::adopt_lock_t
+ size=1 align=1
+ base size=0 base align=1
+std::adopt_lock_t (0x0x7faa6a67cb40) 0 empty
+
+Class std::__recursive_mutex_base
+ size=40 align=8
+ base size=40 base align=8
+std::__recursive_mutex_base (0x0x7faa6a6af5a0) 0
+
+Class std::recursive_mutex
+ size=40 align=8
+ base size=40 base align=8
+std::recursive_mutex (0x0x7faa6a671d00) 0
+ std::__recursive_mutex_base (0x0x7faa6a6af600) 0
+
+Class std::timed_mutex
+ size=40 align=8
+ base size=40 base align=8
+std::timed_mutex (0x0x7faa6a68eaf0) 0
+ std::__mutex_base (0x0x7faa6a6af9c0) 0
+ std::__timed_mutex_impl<std::timed_mutex> (0x0x7faa6a6afa20) 0 empty
+
+Class std::recursive_timed_mutex
+ size=40 align=8
+ base size=40 base align=8
+std::recursive_timed_mutex (0x0x7faa6a68ee70) 0
+ std::__recursive_mutex_base (0x0x7faa6a6afd80) 0
+ std::__timed_mutex_impl<std::recursive_timed_mutex> (0x0x7faa6a6afde0) 0 empty
+
+Class std::once_flag
+ size=4 align=4
+ base size=4 base align=4
+std::once_flag (0x0x7faa6a6ef540) 0
+
+Vtable for QFutureInterfaceBase
+QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4 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 (0x0x7faa6a6ef780) 0
+ vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16)
+
+Class QFutureWatcherBase::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QFutureWatcherBase::QPrivateSignal (0x0x7faa6a39fae0) 0 empty
+
+Vtable for QFutureWatcherBase
+QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI18QFutureWatcherBase)
+16 (int (*)(...))QFutureWatcherBase::metaObject
+24 (int (*)(...))QFutureWatcherBase::qt_metacast
+32 (int (*)(...))QFutureWatcherBase::qt_metacall
+40 0
+48 0
+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 (0x0x7faa6a72baf8) 0
+ vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16)
+ QObject (0x0x7faa6a39fa80) 0
+ primary-for QFutureWatcherBase (0x0x7faa6a72baf8)
+
+Class QHistoryState::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QHistoryState::QPrivateSignal (0x0x7faa6a3c6e40) 0 empty
+
+Vtable for QHistoryState
+QHistoryState::_ZTV13QHistoryState: 16 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 (0x0x7faa6a3e3340) 0
+ vptr=((& QHistoryState::_ZTV13QHistoryState) + 16)
+ QAbstractState (0x0x7faa6a3e33a8) 0
+ primary-for QHistoryState (0x0x7faa6a3e3340)
+ QObject (0x0x7faa6a3c6de0) 0
+ primary-for QAbstractState (0x0x7faa6a3e33a8)
+
+Class QIdentityProxyModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QIdentityProxyModel::QPrivateSignal (0x0x7faa6a3f8180) 0 empty
+
+Vtable for QIdentityProxyModel
+QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53 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 (0x0x7faa6a3e3410) 0
+ vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16)
+ QAbstractProxyModel (0x0x7faa6a3e3478) 0
+ primary-for QIdentityProxyModel (0x0x7faa6a3e3410)
+ QAbstractItemModel (0x0x7faa6a3e34e0) 0
+ primary-for QAbstractProxyModel (0x0x7faa6a3e3478)
+ QObject (0x0x7faa6a3f8120) 0
+ primary-for QAbstractItemModel (0x0x7faa6a3e34e0)
+
+Class QItemSelectionRange
+ size=16 align=8
+ base size=16 base align=8
+QItemSelectionRange (0x0x7faa6a3f8360) 0
+
+Class QItemSelectionModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QItemSelectionModel::QPrivateSignal (0x0x7faa6a4b2c60) 0 empty
+
+Vtable for QItemSelectionModel
+QItemSelectionModel::_ZTV19QItemSelectionModel: 20 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 (0x0x7faa6a4afe38) 0
+ vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16)
+ QObject (0x0x7faa6a4b2c00) 0
+ primary-for QItemSelectionModel (0x0x7faa6a4afe38)
+
+Class QItemSelection
+ size=8 align=8
+ base size=8 base align=8
+QItemSelection (0x0x7faa6a536000) 0
+ QList<QItemSelectionRange> (0x0x7faa6a536068) 0
+ QListSpecialMethods<QItemSelectionRange> (0x0x7faa6a4f1780) 0 empty
+
+Class QJsonValue
+ size=24 align=8
+ base size=20 base align=8
+QJsonValue (0x0x7faa6a1840c0) 0
+
+Class QJsonValueRef
+ size=16 align=8
+ base size=12 base align=8
+QJsonValueRef (0x0x7faa6a2b1d20) 0
+
+Class QJsonValuePtr
+ size=24 align=8
+ base size=24 base align=8
+QJsonValuePtr (0x0x7faa6a2f1cc0) 0
+
+Class QJsonValueRefPtr
+ size=16 align=8
+ base size=16 base align=8
+QJsonValueRefPtr (0x0x7faa6a2f1f60) 0
+
+Class QJsonArray::iterator
+ size=16 align=8
+ base size=12 base align=8
+QJsonArray::iterator (0x0x7faa69f6c300) 0
+
+Class QJsonArray::const_iterator
+ size=16 align=8
+ base size=12 base align=8
+QJsonArray::const_iterator (0x0x7faa69f6c360) 0
+
+Class QJsonArray
+ size=16 align=8
+ base size=16 base align=8
+QJsonArray (0x0x7faa69f6c2a0) 0
+
+Class QJsonParseError
+ size=8 align=4
+ base size=8 base align=4
+QJsonParseError (0x0x7faa6a09b240) 0
+
+Class QJsonDocument
+ size=8 align=8
+ base size=8 base align=8
+QJsonDocument (0x0x7faa6a09b2a0) 0
+
+Class QJsonObject::iterator
+ size=16 align=8
+ base size=12 base align=8
+QJsonObject::iterator (0x0x7faa6a0eda80) 0
+
+Class QJsonObject::const_iterator
+ size=16 align=8
+ base size=12 base align=8
+QJsonObject::const_iterator (0x0x7faa6a0edae0) 0
+
+Class QJsonObject
+ size=16 align=8
+ base size=16 base align=8
+QJsonObject (0x0x7faa6a0eda20) 0
+
+Class QLibrary::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QLibrary::QPrivateSignal (0x0x7faa69e08f00) 0 empty
+
+Vtable for QLibrary
+QLibrary::_ZTV8QLibrary: 14 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 (0x0x7faa69e0dc98) 0
+ vptr=((& QLibrary::_ZTV8QLibrary) + 16)
+ QObject (0x0x7faa69e08ea0) 0
+ primary-for QLibrary (0x0x7faa69e0dc98)
+
+Class QVersionNumber::SegmentStorage
+ size=8 align=8
+ base size=8 base align=8
+QVersionNumber::SegmentStorage (0x0x7faa69e38d80) 0
+
+Class QVersionNumber
+ size=8 align=8
+ base size=8 base align=8
+QVersionNumber (0x0x7faa69e388a0) 0
+
+Class QLibraryInfo
+ size=1 align=1
+ base size=0 base align=1
+QLibraryInfo (0x0x7faa69f09540) 0 empty
+
+Class QPoint
+ size=8 align=4
+ base size=8 base align=4
+QPoint (0x0x7faa69f095a0) 0
+
+Class QPointF
+ size=16 align=8
+ base size=16 base align=8
+QPointF (0x0x7faa69b82420) 0
+
+Class QLine
+ size=16 align=4
+ base size=16 base align=4
+QLine (0x0x7faa69bf3600) 0
+
+Class QLineF
+ size=32 align=8
+ base size=32 base align=8
+QLineF (0x0x7faa69c5f9c0) 0
+
+Class QLinkedListData
+ size=32 align=8
+ base size=25 base align=8
+QLinkedListData (0x0x7faa69cdcc60) 0
+
+Class QLockFile
+ size=8 align=8
+ base size=8 base align=8
+QLockFile (0x0x7faa6999f1e0) 0
+
+Class QLoggingCategory::AtomicBools
+ size=4 align=1
+ base size=4 base align=1
+QLoggingCategory::AtomicBools (0x0x7faa6999f420) 0
+
+Class QLoggingCategory
+ size=24 align=8
+ base size=24 base align=8
+QLoggingCategory (0x0x7faa6999f3c0) 0
+
+Class QMargins
+ size=16 align=4
+ base size=16 base align=4
+QMargins (0x0x7faa6999f840) 0
+
+Class QMarginsF
+ size=32 align=8
+ base size=32 base align=8
+QMarginsF (0x0x7faa69a61780) 0
+
+Class QMessageAuthenticationCode
+ size=8 align=8
+ base size=8 base align=8
+QMessageAuthenticationCode (0x0x7faa698a9f60) 0
+
+Class QMetaMethod
+ size=16 align=8
+ base size=12 base align=8
+QMetaMethod (0x0x7faa698d2000) 0
+
+Class QMetaEnum
+ size=16 align=8
+ base size=12 base align=8
+QMetaEnum (0x0x7faa69932840) 0
+
+Class QMetaProperty
+ size=32 align=8
+ base size=32 base align=8
+QMetaProperty (0x0x7faa694f4a20) 0
+
+Class QMetaClassInfo
+ size=16 align=8
+ base size=12 base align=8
+QMetaClassInfo (0x0x7faa694f4b40) 0
+
+Class QMimeData::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QMimeData::QPrivateSignal (0x0x7faa6954f120) 0 empty
+
+Vtable for QMimeData
+QMimeData::_ZTV9QMimeData: 17 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 (0x0x7faa695458f0) 0
+ vptr=((& QMimeData::_ZTV9QMimeData) + 16)
+ QObject (0x0x7faa6954f0c0) 0
+ primary-for QMimeData (0x0x7faa695458f0)
+
+Class QMimeType
+ size=8 align=8
+ base size=8 base align=8
+QMimeType (0x0x7faa6954f300) 0
+
+Class QMimeDatabase
+ size=8 align=8
+ base size=8 base align=8
+QMimeDatabase (0x0x7faa69623240) 0
+
+Class QObjectCleanupHandler::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QObjectCleanupHandler::QPrivateSignal (0x0x7faa69623300) 0 empty
+
+Vtable for QObjectCleanupHandler
+QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14 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 (0x0x7faa6961c478) 0
+ vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16)
+ QObject (0x0x7faa696232a0) 0
+ primary-for QObjectCleanupHandler (0x0x7faa6961c478)
+
+Class QOperatingSystemVersion
+ size=16 align=4
+ base size=16 base align=4
+QOperatingSystemVersion (0x0x7faa69623420) 0
+
+Class QParallelAnimationGroup::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QParallelAnimationGroup::QPrivateSignal (0x0x7faa6968dba0) 0 empty
+
+Vtable for QParallelAnimationGroup
+QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18 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 (0x0x7faa6968ed00) 0
+ vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16)
+ QAnimationGroup (0x0x7faa6968ed68) 0
+ primary-for QParallelAnimationGroup (0x0x7faa6968ed00)
+ QAbstractAnimation (0x0x7faa6968edd0) 0
+ primary-for QAnimationGroup (0x0x7faa6968ed68)
+ QObject (0x0x7faa6968db40) 0
+ primary-for QAbstractAnimation (0x0x7faa6968edd0)
+
+Class QPauseAnimation::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QPauseAnimation::QPrivateSignal (0x0x7faa6968dde0) 0 empty
+
+Vtable for QPauseAnimation
+QPauseAnimation::_ZTV15QPauseAnimation: 18 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 (0x0x7faa6968ee38) 0
+ vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16)
+ QAbstractAnimation (0x0x7faa6968eea0) 0
+ primary-for QPauseAnimation (0x0x7faa6968ee38)
+ QObject (0x0x7faa6968dd80) 0
+ primary-for QAbstractAnimation (0x0x7faa6968eea0)
+
+Class QStaticPlugin
+ size=16 align=8
+ base size=16 base align=8
+QStaticPlugin (0x0x7faa696be960) 0
+
+Class QPluginLoader::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QPluginLoader::QPrivateSignal (0x0x7faa69309ae0) 0 empty
+
+Vtable for QPluginLoader
+QPluginLoader::_ZTV13QPluginLoader: 14 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 (0x0x7faa69317208) 0
+ vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16)
+ QObject (0x0x7faa69309a80) 0
+ primary-for QPluginLoader (0x0x7faa69317208)
+
+Class QProcessEnvironment
+ size=8 align=8
+ base size=8 base align=8
+QProcessEnvironment (0x0x7faa69309c00) 0
+
+Class QProcess::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QProcess::QPrivateSignal (0x0x7faa693f00c0) 0 empty
+
+Vtable for QProcess
+QProcess::_ZTV8QProcess: 31 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 (0x0x7faa693e6680) 0
+ vptr=((& QProcess::_ZTV8QProcess) + 16)
+ QIODevice (0x0x7faa693e66e8) 0
+ primary-for QProcess (0x0x7faa693e6680)
+ QObject (0x0x7faa693f0060) 0
+ primary-for QIODevice (0x0x7faa693e66e8)
+
+Class QVariantAnimation::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QVariantAnimation::QPrivateSignal (0x0x7faa693f0780) 0 empty
+
+Vtable for QVariantAnimation
+QVariantAnimation::_ZTV17QVariantAnimation: 20 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 (0x0x7faa693e6750) 0
+ vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16)
+ QAbstractAnimation (0x0x7faa693e67b8) 0
+ primary-for QVariantAnimation (0x0x7faa693e6750)
+ QObject (0x0x7faa693f0720) 0
+ primary-for QAbstractAnimation (0x0x7faa693e67b8)
+
+Class QPropertyAnimation::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QPropertyAnimation::QPrivateSignal (0x0x7faa693f0a20) 0 empty
+
+Vtable for QPropertyAnimation
+QPropertyAnimation::_ZTV18QPropertyAnimation: 20 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 (0x0x7faa693e6888) 0
+ vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16)
+ QVariantAnimation (0x0x7faa693e68f0) 0
+ primary-for QPropertyAnimation (0x0x7faa693e6888)
+ QAbstractAnimation (0x0x7faa693e6958) 0
+ primary-for QVariantAnimation (0x0x7faa693e68f0)
+ QObject (0x0x7faa693f09c0) 0
+ primary-for QAbstractAnimation (0x0x7faa693e6958)
+
+Class std::random_device
+ size=5000 align=8
+ base size=5000 base align=8
+std::random_device (0x0x7faa694be180) 0
+
+Class std::bernoulli_distribution::param_type
+ size=8 align=8
+ base size=8 base align=8
+std::bernoulli_distribution::param_type (0x0x7faa6919bea0) 0
+
+Class std::bernoulli_distribution
+ size=8 align=8
+ base size=8 base align=8
+std::bernoulli_distribution (0x0x7faa6919be40) 0
+
+Class std::seed_seq
+ size=24 align=8
+ base size=24 base align=8
+std::seed_seq (0x0x7faa68f8ac00) 0
+
+Class QRandomGenerator::Storage
+ size=2504 align=8
+ base size=2504 base align=8
+QRandomGenerator::Storage (0x0x7faa68dc88a0) 0
+
+Class QRandomGenerator
+ size=2512 align=8
+ base size=2512 base align=8
+QRandomGenerator (0x0x7faa68dc8840) 0
+
+Class QRandomGenerator64
+ size=2512 align=8
+ base size=2512 base align=8
+QRandomGenerator64 (0x0x7faa68e4d618) 0
+ QRandomGenerator (0x0x7faa68e6c3c0) 0
+
+Class QReadWriteLock
+ size=8 align=8
+ base size=8 base align=8
+QReadWriteLock (0x0x7faa68e6cf60) 0
+
+Class QReadLocker
+ size=8 align=8
+ base size=8 base align=8
+QReadLocker (0x0x7faa68e8f240) 0
+
+Class QWriteLocker
+ size=8 align=8
+ base size=8 base align=8
+QWriteLocker (0x0x7faa68e8f720) 0
+
+Class QSize
+ size=8 align=4
+ base size=8 base align=4
+QSize (0x0x7faa68e8fc00) 0
+
+Class QSizeF
+ size=16 align=8
+ base size=16 base align=8
+QSizeF (0x0x7faa68b64ae0) 0
+
+Class QRect
+ size=16 align=4
+ base size=16 base align=4
+QRect (0x0x7faa68bdeb40) 0
+
+Class QRectF
+ size=32 align=8
+ base size=32 base align=8
+QRectF (0x0x7faa68c8fba0) 0
+
+Class QResource
+ size=8 align=8
+ base size=8 base align=8
+QResource (0x0x7faa68950cc0) 0
+
+Class QSaveFile::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QSaveFile::QPrivateSignal (0x0x7faa68950f60) 0 empty
+
+Vtable for QSaveFile
+QSaveFile::_ZTV9QSaveFile: 34 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 (0x0x7faa6899b000) 0
+ vptr=((& QSaveFile::_ZTV9QSaveFile) + 16)
+ QFileDevice (0x0x7faa6899b068) 0
+ primary-for QSaveFile (0x0x7faa6899b000)
+ QIODevice (0x0x7faa6899b0d0) 0
+ primary-for QFileDevice (0x0x7faa6899b068)
+ QObject (0x0x7faa68950f00) 0
+ primary-for QIODevice (0x0x7faa6899b0d0)
+
+Class QSemaphore
+ size=8 align=8
+ base size=8 base align=8
+QSemaphore (0x0x7faa689a75a0) 0
+
+Class QSemaphoreReleaser
+ size=16 align=8
+ base size=12 base align=8
+QSemaphoreReleaser (0x0x7faa689a7720) 0
+
+Class QSequentialAnimationGroup::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QSequentialAnimationGroup::QPrivateSignal (0x0x7faa68a7c360) 0 empty
+
+Vtable for QSequentialAnimationGroup
+QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18 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 (0x0x7faa68a7a888) 0
+ vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16)
+ QAnimationGroup (0x0x7faa68a7a8f0) 0
+ primary-for QSequentialAnimationGroup (0x0x7faa68a7a888)
+ QAbstractAnimation (0x0x7faa68a7a958) 0
+ primary-for QAnimationGroup (0x0x7faa68a7a8f0)
+ QObject (0x0x7faa68a7c300) 0
+ primary-for QAbstractAnimation (0x0x7faa68a7a958)
+
+Class QSettings::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QSettings::QPrivateSignal (0x0x7faa68a7c5a0) 0 empty
+
+Vtable for QSettings
+QSettings::_ZTV9QSettings: 14 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 (0x0x7faa68a7a9c0) 0
+ vptr=((& QSettings::_ZTV9QSettings) + 16)
+ QObject (0x0x7faa68a7c540) 0
+ primary-for QSettings (0x0x7faa68a7a9c0)
+
+Class QSharedMemory::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QSharedMemory::QPrivateSignal (0x0x7faa68a7ca20) 0 empty
+
+Vtable for QSharedMemory
+QSharedMemory::_ZTV13QSharedMemory: 14 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 (0x0x7faa68a7aa28) 0
+ vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16)
+ QObject (0x0x7faa68a7c9c0) 0
+ primary-for QSharedMemory (0x0x7faa68a7aa28)
+
+Class QSignalMapper::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QSignalMapper::QPrivateSignal (0x0x7faa68a7cc60) 0 empty
+
+Vtable for QSignalMapper
+QSignalMapper::_ZTV13QSignalMapper: 14 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 (0x0x7faa68a7aa90) 0
+ vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16)
+ QObject (0x0x7faa68a7cc00) 0
+ primary-for QSignalMapper (0x0x7faa68a7aa90)
+
+Class QSignalTransition::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QSignalTransition::QPrivateSignal (0x0x7faa68a7cea0) 0 empty
+
+Vtable for QSignalTransition
+QSignalTransition::_ZTV17QSignalTransition: 16 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 (0x0x7faa68a7aaf8) 0
+ vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16)
+ QAbstractTransition (0x0x7faa68a7ab60) 0
+ primary-for QSignalTransition (0x0x7faa68a7aaf8)
+ QObject (0x0x7faa68a7ce40) 0
+ primary-for QAbstractTransition (0x0x7faa68a7ab60)
+
+Class QSocketNotifier::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QSocketNotifier::QPrivateSignal (0x0x7faa68664180) 0 empty
+
+Vtable for QSocketNotifier
+QSocketNotifier::_ZTV15QSocketNotifier: 14 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 (0x0x7faa68a7abc8) 0
+ vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16)
+ QObject (0x0x7faa68664120) 0
+ primary-for QSocketNotifier (0x0x7faa68a7abc8)
+
+Class QSortFilterProxyModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QSortFilterProxyModel::QPrivateSignal (0x0x7faa686643c0) 0 empty
+
+Vtable for QSortFilterProxyModel
+QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56 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 (0x0x7faa68a7ac30) 0
+ vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16)
+ QAbstractProxyModel (0x0x7faa68a7ac98) 0
+ primary-for QSortFilterProxyModel (0x0x7faa68a7ac30)
+ QAbstractItemModel (0x0x7faa68a7ad00) 0
+ primary-for QAbstractProxyModel (0x0x7faa68a7ac98)
+ QObject (0x0x7faa68664360) 0
+ primary-for QAbstractItemModel (0x0x7faa68a7ad00)
+
+Class QStandardPaths
+ size=1 align=1
+ base size=0 base align=1
+QStandardPaths (0x0x7faa686647e0) 0 empty
+
+Class QState::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QState::QPrivateSignal (0x0x7faa686cd120) 0 empty
+
+Vtable for QState
+QState::_ZTV6QState: 16 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 (0x0x7faa68a7aea0) 0
+ vptr=((& QState::_ZTV6QState) + 16)
+ QAbstractState (0x0x7faa68a7af08) 0
+ primary-for QState (0x0x7faa68a7aea0)
+ QObject (0x0x7faa686cd0c0) 0
+ primary-for QAbstractState (0x0x7faa68a7af08)
+
+Class QStateMachine::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QStateMachine::QPrivateSignal (0x0x7faa686cd5a0) 0 empty
+
+Vtable for QStateMachine::SignalEvent
+QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4 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 (0x0x7faa686eb0d0) 0
+ vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16)
+ QEvent (0x0x7faa686cd600) 0
+ primary-for QStateMachine::SignalEvent (0x0x7faa686eb0d0)
+
+Vtable for QStateMachine::WrappedEvent
+QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4 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 (0x0x7faa686eb138) 0
+ vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16)
+ QEvent (0x0x7faa686cd660) 0
+ primary-for QStateMachine::WrappedEvent (0x0x7faa686eb138)
+
+Vtable for QStateMachine
+QStateMachine::_ZTV13QStateMachine: 20 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 (0x0x7faa68a7af70) 0
+ vptr=((& QStateMachine::_ZTV13QStateMachine) + 16)
+ QState (0x0x7faa686eb000) 0
+ primary-for QStateMachine (0x0x7faa68a7af70)
+ QAbstractState (0x0x7faa686eb068) 0
+ primary-for QState (0x0x7faa686eb000)
+ QObject (0x0x7faa686cd540) 0
+ primary-for QAbstractState (0x0x7faa686eb068)
+
+Class QStorageInfo
+ size=8 align=8
+ base size=8 base align=8
+QStorageInfo (0x0x7faa686cda20) 0
+
+Class QAbstractConcatenable
+ size=1 align=1
+ base size=0 base align=1
+QAbstractConcatenable (0x0x7faa687f27e0) 0 empty
+
+Class QStringListModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QStringListModel::QPrivateSignal (0x0x7faa6847ab40) 0 empty
+
+Vtable for QStringListModel
+QStringListModel::_ZTV16QStringListModel: 48 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 (*)(...))QStringListModel::itemData
+200 (int (*)(...))QStringListModel::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 (*)(...))QStringListModel::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 (0x0x7faa6846ea28) 0
+ vptr=((& QStringListModel::_ZTV16QStringListModel) + 16)
+ QAbstractListModel (0x0x7faa6846ea90) 0
+ primary-for QStringListModel (0x0x7faa6846ea28)
+ QAbstractItemModel (0x0x7faa6846eaf8) 0
+ primary-for QAbstractListModel (0x0x7faa6846ea90)
+ QObject (0x0x7faa6847aae0) 0
+ primary-for QAbstractItemModel (0x0x7faa6846eaf8)
+
+Class QSystemSemaphore
+ size=8 align=8
+ base size=8 base align=8
+QSystemSemaphore (0x0x7faa6847ac60) 0
+
+Class QTemporaryDir
+ size=8 align=8
+ base size=8 base align=8
+QTemporaryDir (0x0x7faa6847ad20) 0
+
+Class QTemporaryFile::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QTemporaryFile::QPrivateSignal (0x0x7faa6847ae40) 0 empty
+
+Vtable for QTemporaryFile
+QTemporaryFile::_ZTV14QTemporaryFile: 34 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 (0x0x7faa6846eb60) 0
+ vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16)
+ QFile (0x0x7faa6846ebc8) 0
+ primary-for QTemporaryFile (0x0x7faa6846eb60)
+ QFileDevice (0x0x7faa6846ec30) 0
+ primary-for QFile (0x0x7faa6846ebc8)
+ QIODevice (0x0x7faa6846ec98) 0
+ primary-for QFileDevice (0x0x7faa6846ec30)
+ QObject (0x0x7faa6847ade0) 0
+ primary-for QIODevice (0x0x7faa6846ec98)
+
+Class QTextBoundaryFinder
+ size=48 align=8
+ base size=48 base align=8
+QTextBoundaryFinder (0x0x7faa684d51e0) 0
+
+Class QTextCodec::ConverterState
+ size=32 align=8
+ base size=32 base align=8
+QTextCodec::ConverterState (0x0x7faa684d5a20) 0
+
+Vtable for QTextCodec
+QTextCodec::_ZTV10QTextCodec: 9 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 0
+64 0
+
+Class QTextCodec
+ size=8 align=8
+ base size=8 base align=8
+QTextCodec (0x0x7faa684d59c0) 0 nearly-empty
+ vptr=((& QTextCodec::_ZTV10QTextCodec) + 16)
+
+Class QTextEncoder
+ size=40 align=8
+ base size=40 base align=8
+QTextEncoder (0x0x7faa6853a420) 0
+
+Class QTextDecoder
+ size=40 align=8
+ base size=40 base align=8
+QTextDecoder (0x0x7faa6853a600) 0
+
+Vtable for std::thread::_State
+std::thread::_State::_ZTVNSt6thread6_StateE: 5 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTINSt6thread6_StateE)
+16 0
+24 0
+32 (int (*)(...))__cxa_pure_virtual
+
+Class std::thread::_State
+ size=8 align=8
+ base size=8 base align=8
+std::thread::_State (0x0x7faa6853a840) 0 nearly-empty
+ vptr=((& std::thread::_State::_ZTVNSt6thread6_StateE) + 16)
+
+Class std::thread::id
+ size=8 align=8
+ base size=8 base align=8
+std::thread::id (0x0x7faa6853a8a0) 0
+
+Class std::thread
+ size=8 align=8
+ base size=8 base align=8
+std::thread (0x0x7faa6853a7e0) 0
+
+Class std::condition_variable
+ size=48 align=8
+ base size=48 base align=8
+std::condition_variable (0x0x7faa683ddc60) 0
+
+Class std::__at_thread_exit_elt
+ size=16 align=8
+ base size=16 base align=8
+std::__at_thread_exit_elt (0x0x7faa6842a060) 0
+
+Class std::_V2::condition_variable_any
+ size=64 align=8
+ base size=64 base align=8
+std::_V2::condition_variable_any (0x0x7faa6842a0c0) 0
+
+Class std::__atomic_futex_unsigned_base
+ size=1 align=1
+ base size=0 base align=1
+std::__atomic_futex_unsigned_base (0x0x7faa681913c0) 0 empty
+
+Vtable for std::future_error
+std::future_error::_ZTVSt12future_error: 5 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 (0x0x7faa681b2068) 0
+ vptr=((& std::future_error::_ZTVSt12future_error) + 16)
+ std::logic_error (0x0x7faa681b20d0) 0
+ primary-for std::future_error (0x0x7faa681b2068)
+ std::exception (0x0x7faa68191ae0) 0 nearly-empty
+ primary-for std::logic_error (0x0x7faa681b20d0)
+
+Class std::__future_base::_Result_base::_Deleter
+ size=1 align=1
+ base size=0 base align=1
+std::__future_base::_Result_base::_Deleter (0x0x7faa681c3240) 0 empty
+
+Vtable for std::__future_base::_Result_base
+std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE: 5 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTINSt13__future_base12_Result_baseE)
+16 (int (*)(...))__cxa_pure_virtual
+24 0
+32 0
+
+Class std::__future_base::_Result_base
+ size=16 align=8
+ base size=16 base align=8
+std::__future_base::_Result_base (0x0x7faa681c31e0) 0
+ vptr=((& std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE) + 16)
+
+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 (0x0x7faa67fa3960) 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 (0x0x7faa67f858f0) 0
+ std::__at_thread_exit_elt (0x0x7faa67fa3a20) 0
+
+Vtable for std::__future_base::_State_baseV2
+std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E: 6 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 (0x0x7faa681c33c0) 0
+ vptr=((& std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E) + 16)
+
+Class std::__future_base
+ size=1 align=1
+ base size=0 base align=1
+std::__future_base (0x0x7faa681c3180) 0 empty
+
+Vtable for std::__future_base::_Async_state_commonV2
+std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E: 6 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 (0x0x7faa67727618) 0
+ vptr=((& std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E) + 16)
+ std::__future_base::_State_baseV2 (0x0x7faa67749a20) 0
+ primary-for std::__future_base::_Async_state_commonV2 (0x0x7faa67727618)
+
+Class QThread::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QThread::QPrivateSignal (0x0x7faa6777e300) 0 empty
+
+Vtable for QThread
+QThread::_ZTV7QThread: 15 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 (0x0x7faa67727958) 0
+ vptr=((& QThread::_ZTV7QThread) + 16)
+ QObject (0x0x7faa6777e2a0) 0
+ primary-for QThread (0x0x7faa67727958)
+
+Class QThreadPool::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QThreadPool::QPrivateSignal (0x0x7faa6777e6c0) 0 empty
+
+Vtable for QThreadPool
+QThreadPool::_ZTV11QThreadPool: 14 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 (0x0x7faa677279c0) 0
+ vptr=((& QThreadPool::_ZTV11QThreadPool) + 16)
+ QObject (0x0x7faa6777e660) 0
+ primary-for QThreadPool (0x0x7faa677279c0)
+
+Class QThreadStorageData
+ size=4 align=4
+ base size=4 base align=4
+QThreadStorageData (0x0x7faa6777e8a0) 0
+
+Class QTimeLine::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QTimeLine::QPrivateSignal (0x0x7faa6777ef60) 0 empty
+
+Vtable for QTimeLine
+QTimeLine::_ZTV9QTimeLine: 15 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 (0x0x7faa67727a28) 0
+ vptr=((& QTimeLine::_ZTV9QTimeLine) + 16)
+ QObject (0x0x7faa6777ef00) 0
+ primary-for QTimeLine (0x0x7faa67727a28)
+
+Class QTimer::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QTimer::QPrivateSignal (0x0x7faa677d01e0) 0 empty
+
+Vtable for QTimer
+QTimer::_ZTV6QTimer: 14 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 (0x0x7faa67727a90) 0
+ vptr=((& QTimer::_ZTV6QTimer) + 16)
+ QObject (0x0x7faa677d0180) 0
+ primary-for QTimer (0x0x7faa67727a90)
+
+Class QTimeZone::OffsetData
+ size=32 align=8
+ base size=28 base align=8
+QTimeZone::OffsetData (0x0x7faa67808b40) 0
+
+Class QTimeZone
+ size=8 align=8
+ base size=8 base align=8
+QTimeZone (0x0x7faa67808ae0) 0
+
+Class QTranslator::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QTranslator::QPrivateSignal (0x0x7faa674a6c00) 0 empty
+
+Vtable for QTranslator
+QTranslator::_ZTV11QTranslator: 16 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 (0x0x7faa674bc1a0) 0
+ vptr=((& QTranslator::_ZTV11QTranslator) + 16)
+ QObject (0x0x7faa674a6ba0) 0
+ primary-for QTranslator (0x0x7faa674bc1a0)
+
+Class QTransposeProxyModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QTransposeProxyModel::QPrivateSignal (0x0x7faa674a6e40) 0 empty
+
+Vtable for QTransposeProxyModel
+QTransposeProxyModel::_ZTV20QTransposeProxyModel: 53 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI20QTransposeProxyModel)
+16 (int (*)(...))QTransposeProxyModel::metaObject
+24 (int (*)(...))QTransposeProxyModel::qt_metacast
+32 (int (*)(...))QTransposeProxyModel::qt_metacall
+40 (int (*)(...))QTransposeProxyModel::~QTransposeProxyModel
+48 (int (*)(...))QTransposeProxyModel::~QTransposeProxyModel
+56 (int (*)(...))QObject::event
+64 (int (*)(...))QObject::eventFilter
+72 (int (*)(...))QObject::timerEvent
+80 (int (*)(...))QObject::childEvent
+88 (int (*)(...))QObject::customEvent
+96 (int (*)(...))QObject::connectNotify
+104 (int (*)(...))QObject::disconnectNotify
+112 (int (*)(...))QTransposeProxyModel::index
+120 (int (*)(...))QTransposeProxyModel::parent
+128 (int (*)(...))QAbstractProxyModel::sibling
+136 (int (*)(...))QTransposeProxyModel::rowCount
+144 (int (*)(...))QTransposeProxyModel::columnCount
+152 (int (*)(...))QAbstractProxyModel::hasChildren
+160 (int (*)(...))QAbstractProxyModel::data
+168 (int (*)(...))QAbstractProxyModel::setData
+176 (int (*)(...))QTransposeProxyModel::headerData
+184 (int (*)(...))QTransposeProxyModel::setHeaderData
+192 (int (*)(...))QTransposeProxyModel::itemData
+200 (int (*)(...))QTransposeProxyModel::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 (*)(...))QTransposeProxyModel::insertRows
+264 (int (*)(...))QTransposeProxyModel::insertColumns
+272 (int (*)(...))QTransposeProxyModel::removeRows
+280 (int (*)(...))QTransposeProxyModel::removeColumns
+288 (int (*)(...))QTransposeProxyModel::moveRows
+296 (int (*)(...))QTransposeProxyModel::moveColumns
+304 (int (*)(...))QAbstractProxyModel::fetchMore
+312 (int (*)(...))QAbstractProxyModel::canFetchMore
+320 (int (*)(...))QAbstractProxyModel::flags
+328 (int (*)(...))QTransposeProxyModel::sort
+336 (int (*)(...))QAbstractProxyModel::buddy
+344 (int (*)(...))QAbstractItemModel::match
+352 (int (*)(...))QTransposeProxyModel::span
+360 (int (*)(...))QAbstractItemModel::roleNames
+368 (int (*)(...))QAbstractProxyModel::submit
+376 (int (*)(...))QAbstractProxyModel::revert
+384 (int (*)(...))QTransposeProxyModel::setSourceModel
+392 (int (*)(...))QTransposeProxyModel::mapToSource
+400 (int (*)(...))QTransposeProxyModel::mapFromSource
+408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource
+416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource
+
+Class QTransposeProxyModel
+ size=16 align=8
+ base size=16 base align=8
+QTransposeProxyModel (0x0x7faa674bc208) 0
+ vptr=((& QTransposeProxyModel::_ZTV20QTransposeProxyModel) + 16)
+ QAbstractProxyModel (0x0x7faa674bc270) 0
+ primary-for QTransposeProxyModel (0x0x7faa674bc208)
+ QAbstractItemModel (0x0x7faa674bc2d8) 0
+ primary-for QAbstractProxyModel (0x0x7faa674bc270)
+ QObject (0x0x7faa674a6de0) 0
+ primary-for QAbstractItemModel (0x0x7faa674bc2d8)
+
+Class QUrlQuery
+ size=8 align=8
+ base size=8 base align=8
+QUrlQuery (0x0x7faa674ec060) 0
+
+Class QWaitCondition
+ size=8 align=8
+ base size=8 base align=8
+QWaitCondition (0x0x7faa675c3540) 0
+
+Class QXmlStreamStringRef
+ size=16 align=8
+ base size=16 base align=8
+QXmlStreamStringRef (0x0x7faa675c3660) 0
+
+Class QXmlStreamAttribute
+ size=80 align=8
+ base size=73 base align=8
+QXmlStreamAttribute (0x0x7faa67154a20) 0
+
+Class QXmlStreamAttributes
+ size=8 align=8
+ base size=8 base align=8
+QXmlStreamAttributes (0x0x7faa671c75b0) 0
+ QVector<QXmlStreamAttribute> (0x0x7faa671cd180) 0
+
+Class QXmlStreamNamespaceDeclaration
+ size=40 align=8
+ base size=40 base align=8
+QXmlStreamNamespaceDeclaration (0x0x7faa671cd480) 0
+
+Class QXmlStreamNotationDeclaration
+ size=56 align=8
+ base size=56 base align=8
+QXmlStreamNotationDeclaration (0x0x7faa67259420) 0
+
+Class QXmlStreamEntityDeclaration
+ size=88 align=8
+ base size=88 base align=8
+QXmlStreamEntityDeclaration (0x0x7faa672b7420) 0
+
+Vtable for QXmlStreamEntityResolver
+QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6 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 (0x0x7faa673224e0) 0 nearly-empty
+ vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16)
+
+Class QXmlStreamReader
+ size=8 align=8
+ base size=8 base align=8
+QXmlStreamReader (0x0x7faa67322540) 0
+
+Class QXmlStreamWriter
+ size=8 align=8
+ base size=8 base align=8
+QXmlStreamWriter (0x0x7faa66f7f420) 0
+
+Class QBluetoothAddress
+ size=8 align=8
+ base size=8 base align=8
+QBluetoothAddress (0x0x7faa66fe53c0) 0
+
+Class QBluetoothDeviceInfo
+ size=8 align=8
+ base size=8 base align=8
+QBluetoothDeviceInfo (0x0x7faa66fe5720) 0
+
+Class QBluetoothDeviceDiscoveryAgent::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QBluetoothDeviceDiscoveryAgent::QPrivateSignal (0x0x7faa6704f840) 0 empty
+
+Vtable for QBluetoothDeviceDiscoveryAgent
+QBluetoothDeviceDiscoveryAgent::_ZTV30QBluetoothDeviceDiscoveryAgent: 14 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 (0x0x7faa66f805b0) 0
+ vptr=((& QBluetoothDeviceDiscoveryAgent::_ZTV30QBluetoothDeviceDiscoveryAgent) + 16)
+ QObject (0x0x7faa6704f7e0) 0
+ primary-for QBluetoothDeviceDiscoveryAgent (0x0x7faa66f805b0)
+
+Class QBluetoothHostInfo
+ size=8 align=8
+ base size=8 base align=8
+QBluetoothHostInfo (0x0x7faa670b7360) 0
+
+Class QBluetoothLocalDevice::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QBluetoothLocalDevice::QPrivateSignal (0x0x7faa670b76c0) 0 empty
+
+Vtable for QBluetoothLocalDevice
+QBluetoothLocalDevice::_ZTV21QBluetoothLocalDevice: 14 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 (0x0x7faa66f806e8) 0
+ vptr=((& QBluetoothLocalDevice::_ZTV21QBluetoothLocalDevice) + 16)
+ QObject (0x0x7faa670b7660) 0
+ primary-for QBluetoothLocalDevice (0x0x7faa66f806e8)
+
+Class quint128
+ size=16 align=1
+ base size=16 base align=1
+quint128 (0x0x7faa670fb0c0) 0
+
+Class QBluetoothUuid
+ size=16 align=4
+ base size=16 base align=4
+QBluetoothUuid (0x0x7faa66f80750) 0
+ QUuid (0x0x7faa670fb120) 0
+
+Class QBluetoothServiceInfo::Sequence
+ size=8 align=8
+ base size=8 base align=8
+QBluetoothServiceInfo::Sequence (0x0x7faa66f807b8) 0
+ QList<QVariant> (0x0x7faa66f80820) 0
+ QListSpecialMethods<QVariant> (0x0x7faa670fb660) 0 empty
+
+Class QBluetoothServiceInfo::Alternative
+ size=8 align=8
+ base size=8 base align=8
+QBluetoothServiceInfo::Alternative (0x0x7faa66f80888) 0
+ QList<QVariant> (0x0x7faa66f808f0) 0
+ QListSpecialMethods<QVariant> (0x0x7faa670fb6c0) 0 empty
+
+Class QBluetoothServiceInfo
+ size=16 align=8
+ base size=16 base align=8
+QBluetoothServiceInfo (0x0x7faa670fb600) 0
+
+Class QAbstractSocket::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAbstractSocket::QPrivateSignal (0x0x7faa66d848a0) 0 empty
+
+Vtable for QAbstractSocket
+QAbstractSocket::_ZTV15QAbstractSocket: 41 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 (0x0x7faa66f80958) 0
+ vptr=((& QAbstractSocket::_ZTV15QAbstractSocket) + 16)
+ QIODevice (0x0x7faa66f809c0) 0
+ primary-for QAbstractSocket (0x0x7faa66f80958)
+ QObject (0x0x7faa66d84840) 0
+ primary-for QIODevice (0x0x7faa66f809c0)
+
+Class QBluetoothSocket::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QBluetoothSocket::QPrivateSignal (0x0x7faa66e37060) 0 empty
+
+Vtable for QBluetoothSocket
+QBluetoothSocket::_ZTV16QBluetoothSocket: 30 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 (0x0x7faa66f80bc8) 0
+ vptr=((& QBluetoothSocket::_ZTV16QBluetoothSocket) + 16)
+ QIODevice (0x0x7faa66f80c30) 0
+ primary-for QBluetoothSocket (0x0x7faa66f80bc8)
+ QObject (0x0x7faa66e37000) 0
+ primary-for QIODevice (0x0x7faa66f80c30)
+
+Class QBluetoothServer::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QBluetoothServer::QPrivateSignal (0x0x7faa66e37480) 0 empty
+
+Vtable for QBluetoothServer
+QBluetoothServer::_ZTV16QBluetoothServer: 14 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 (0x0x7faa66f80c98) 0
+ vptr=((& QBluetoothServer::_ZTV16QBluetoothServer) + 16)
+ QObject (0x0x7faa66e37420) 0
+ primary-for QBluetoothServer (0x0x7faa66f80c98)
+
+Class QBluetoothServiceDiscoveryAgent::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QBluetoothServiceDiscoveryAgent::QPrivateSignal (0x0x7faa66e37780) 0 empty
+
+Vtable for QBluetoothServiceDiscoveryAgent
+QBluetoothServiceDiscoveryAgent::_ZTV31QBluetoothServiceDiscoveryAgent: 14 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 (0x0x7faa66f80d00) 0
+ vptr=((& QBluetoothServiceDiscoveryAgent::_ZTV31QBluetoothServiceDiscoveryAgent) + 16)
+ QObject (0x0x7faa66e37720) 0
+ primary-for QBluetoothServiceDiscoveryAgent (0x0x7faa66f80d00)
+
+Class QBluetoothTransferManager::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QBluetoothTransferManager::QPrivateSignal (0x0x7faa66e37b40) 0 empty
+
+Vtable for QBluetoothTransferManager
+QBluetoothTransferManager::_ZTV25QBluetoothTransferManager: 14 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 (0x0x7faa66f80d68) 0
+ vptr=((& QBluetoothTransferManager::_ZTV25QBluetoothTransferManager) + 16)
+ QObject (0x0x7faa66e37ae0) 0
+ primary-for QBluetoothTransferManager (0x0x7faa66f80d68)
+
+Class QBluetoothTransferRequest
+ size=8 align=8
+ base size=8 base align=8
+QBluetoothTransferRequest (0x0x7faa66e37c60) 0
+
+Class QBluetoothTransferReply::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QBluetoothTransferReply::QPrivateSignal (0x0x7faa66e37de0) 0 empty
+
+Vtable for QBluetoothTransferReply
+QBluetoothTransferReply::_ZTV23QBluetoothTransferReply: 18 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI23QBluetoothTransferReply)
+16 (int (*)(...))QBluetoothTransferReply::metaObject
+24 (int (*)(...))QBluetoothTransferReply::qt_metacast
+32 (int (*)(...))QBluetoothTransferReply::qt_metacall
+40 0
+48 0
+56 (int (*)(...))QObject::event
+64 (int (*)(...))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 (0x0x7faa66f80dd0) 0
+ vptr=((& QBluetoothTransferReply::_ZTV23QBluetoothTransferReply) + 16)
+ QObject (0x0x7faa66e37d80) 0
+ primary-for QBluetoothTransferReply (0x0x7faa66f80dd0)
+
+Class QLowEnergyAdvertisingData
+ size=8 align=8
+ base size=8 base align=8
+QLowEnergyAdvertisingData (0x0x7faa66ea72a0) 0
+
+Class QLowEnergyDescriptor
+ size=24 align=8
+ base size=24 base align=8
+QLowEnergyDescriptor (0x0x7faa66b764e0) 0
+
+Class QLowEnergyCharacteristic
+ size=24 align=8
+ base size=24 base align=8
+QLowEnergyCharacteristic (0x0x7faa66b76780) 0
+
+Class QLowEnergyService::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QLowEnergyService::QPrivateSignal (0x0x7faa66bf0120) 0 empty
+
+Vtable for QLowEnergyService
+QLowEnergyService::_ZTV17QLowEnergyService: 14 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 (0x0x7faa66bc50d0) 0
+ vptr=((& QLowEnergyService::_ZTV17QLowEnergyService) + 16)
+ QObject (0x0x7faa66bf00c0) 0
+ primary-for QLowEnergyService (0x0x7faa66bc50d0)
+
+Class QLowEnergyController::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QLowEnergyController::QPrivateSignal (0x0x7faa66c4a4e0) 0 empty
+
+Vtable for QLowEnergyController
+QLowEnergyController::_ZTV20QLowEnergyController: 14 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 (0x0x7faa66bc5208) 0
+ vptr=((& QLowEnergyController::_ZTV20QLowEnergyController) + 16)
+ QObject (0x0x7faa66c4a480) 0
+ primary-for QLowEnergyController (0x0x7faa66bc5208)
+
+Class QLowEnergyAdvertisingParameters::AddressInfo
+ size=16 align=8
+ base size=12 base align=8
+QLowEnergyAdvertisingParameters::AddressInfo (0x0x7faa66c941e0) 0
+
+Class QLowEnergyAdvertisingParameters
+ size=8 align=8
+ base size=8 base align=8
+QLowEnergyAdvertisingParameters (0x0x7faa66c94180) 0
+
+Class QLowEnergyCharacteristicData
+ size=8 align=8
+ base size=8 base align=8
+QLowEnergyCharacteristicData (0x0x7faa66965f00) 0
+
+Class QLowEnergyConnectionParameters
+ size=8 align=8
+ base size=8 base align=8
+QLowEnergyConnectionParameters (0x0x7faa66a56060) 0
+
+Class QLowEnergyDescriptorData
+ size=8 align=8
+ base size=8 base align=8
+QLowEnergyDescriptorData (0x0x7faa66b1b420) 0
+
+Class QLowEnergyServiceData
+ size=8 align=8
+ base size=8 base align=8
+QLowEnergyServiceData (0x0x7faa667e3900) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7faa668fc000) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7faa668fc360) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7faa668fc540) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7faa668fc8a0) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7faa668fca80) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7faa668fcde0) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7faa6693a000) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7faa6693a360) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7faa6693a540) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7faa6693a8a0) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7faa6693aa80) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7faa6693ade0) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7faa66570000) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7faa66570360) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7faa66570540) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7faa665708a0) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7faa6659dd80) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7faa665cc120) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7faa665cc2a0) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7faa665cc600) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7faa665cc780) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7faa665ccae0) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7faa665ccc60) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7faa665fd000) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7faa665fd180) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7faa665fd4e0) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7faa665fd660) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7faa665fd9c0) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7faa665fdb40) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7faa665fdea0) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7faa6662d060) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7faa6662d3c0) 0 empty
+
diff --git a/tests/auto/bic/data/QtNfc.5.14.0.linux-gcc-amd64.txt b/tests/auto/bic/data/QtNfc.5.14.0.linux-gcc-amd64.txt
new file mode 100644
index 00000000..ce605a5a
--- /dev/null
+++ b/tests/auto/bic/data/QtNfc.5.14.0.linux-gcc-amd64.txt
@@ -0,0 +1,5228 @@
+Class std::__failure_type
+ size=1 align=1
+ base size=0 base align=1
+std::__failure_type (0x0x7fb80aaea0c0) 0 empty
+
+Class std::__do_is_destructible_impl
+ size=1 align=1
+ base size=0 base align=1
+std::__do_is_destructible_impl (0x0x7fb80ab30840) 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 (0x0x7fb80ab30a80) 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 (0x0x7fb80ab30cc0) 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 (0x0x7fb80ab30f00) 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 (0x0x7fb80ab600c0) 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 (0x0x7fb80ab60480) 0 empty
+
+Class std::__do_is_implicitly_default_constructible_impl
+ size=1 align=1
+ base size=0 base align=1
+std::__do_is_implicitly_default_constructible_impl (0x0x7fb80ab9b5a0) 0 empty
+
+Class std::__do_common_type_impl
+ size=1 align=1
+ base size=0 base align=1
+std::__do_common_type_impl (0x0x7fb80abf1c60) 0 empty
+
+Class std::__do_member_type_wrapper
+ size=1 align=1
+ base size=0 base align=1
+std::__do_member_type_wrapper (0x0x7fb80abf1d20) 0 empty
+
+Class std::__invoke_memfun_ref
+ size=1 align=1
+ base size=0 base align=1
+std::__invoke_memfun_ref (0x0x7fb80ac21120) 0 empty
+
+Class std::__invoke_memfun_deref
+ size=1 align=1
+ base size=0 base align=1
+std::__invoke_memfun_deref (0x0x7fb80ac21180) 0 empty
+
+Class std::__invoke_memobj_ref
+ size=1 align=1
+ base size=0 base align=1
+std::__invoke_memobj_ref (0x0x7fb80ac211e0) 0 empty
+
+Class std::__invoke_memobj_deref
+ size=1 align=1
+ base size=0 base align=1
+std::__invoke_memobj_deref (0x0x7fb80ac21240) 0 empty
+
+Class std::__invoke_other
+ size=1 align=1
+ base size=0 base align=1
+std::__invoke_other (0x0x7fb80ac212a0) 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 (0x0x7fb80ac21360) 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 (0x0x7fb80ac21420) 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 (0x0x7fb80ac214e0) 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 (0x0x7fb80ac215a0) 0 empty
+
+Class std::__result_of_other_impl
+ size=1 align=1
+ base size=0 base align=1
+std::__result_of_other_impl (0x0x7fb80ac21900) 0 empty
+
+Class std::__swappable_details::__do_is_swappable_impl
+ size=1 align=1
+ base size=0 base align=1
+std::__swappable_details::__do_is_swappable_impl (0x0x7fb80ac21c60) 0 empty
+
+Class std::__swappable_details::__do_is_nothrow_swappable_impl
+ size=1 align=1
+ base size=0 base align=1
+std::__swappable_details::__do_is_nothrow_swappable_impl (0x0x7fb80ac21cc0) 0 empty
+
+Class std::__nonesuch
+ size=1 align=1
+ base size=0 base align=1
+std::__nonesuch (0x0x7fb80a8682a0) 0 empty
+
+Class std::piecewise_construct_t
+ size=1 align=1
+ base size=0 base align=1
+std::piecewise_construct_t (0x0x7fb80a868900) 0 empty
+
+Class std::__nonesuch_no_braces
+ size=1 align=1
+ base size=1 base align=1
+std::__nonesuch_no_braces (0x0x7fb80a85f3a8) 0 empty
+ std::__nonesuch (0x0x7fb80a868de0) 0 empty
+
+Class std::__true_type
+ size=1 align=1
+ base size=0 base align=1
+std::__true_type (0x0x7fb80a8ec780) 0 empty
+
+Class std::__false_type
+ size=1 align=1
+ base size=0 base align=1
+std::__false_type (0x0x7fb80a8ec7e0) 0 empty
+
+Class std::input_iterator_tag
+ size=1 align=1
+ base size=0 base align=1
+std::input_iterator_tag (0x0x7fb80a9464e0) 0 empty
+
+Class std::output_iterator_tag
+ size=1 align=1
+ base size=0 base align=1
+std::output_iterator_tag (0x0x7fb80a946540) 0 empty
+
+Class std::forward_iterator_tag
+ size=1 align=1
+ base size=1 base align=1
+std::forward_iterator_tag (0x0x7fb80a85f888) 0 empty
+ std::input_iterator_tag (0x0x7fb80a9465a0) 0 empty
+
+Class std::bidirectional_iterator_tag
+ size=1 align=1
+ base size=1 base align=1
+std::bidirectional_iterator_tag (0x0x7fb80a85f8f0) 0 empty
+ std::forward_iterator_tag (0x0x7fb80a85f958) 0 empty
+ std::input_iterator_tag (0x0x7fb80a946600) 0 empty
+
+Class std::random_access_iterator_tag
+ size=1 align=1
+ base size=1 base align=1
+std::random_access_iterator_tag (0x0x7fb80a85f9c0) 0 empty
+ std::bidirectional_iterator_tag (0x0x7fb80a85fa28) 0 empty
+ std::forward_iterator_tag (0x0x7fb80a85fa90) 0 empty
+ std::input_iterator_tag (0x0x7fb80a946660) 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 (0x0x7fb80a9fe180) 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 (0x0x7fb80a9fe2a0) 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 (0x0x7fb80a9fe5a0) 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 (0x0x7fb80a9fe8a0) 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 (0x0x7fb80a9fe9c0) 0 empty
+
+Class __locale_struct
+ size=232 align=8
+ base size=232 base align=8
+__locale_struct (0x0x7fb80a687cc0) 0
+
+Class timeval
+ size=16 align=8
+ base size=16 base align=8
+timeval (0x0x7fb80a6cf000) 0
+
+Class timespec
+ size=16 align=8
+ base size=16 base align=8
+timespec (0x0x7fb80a6cf060) 0
+
+Class __pthread_rwlock_arch_t
+ size=56 align=8
+ base size=56 base align=8
+__pthread_rwlock_arch_t (0x0x7fb80a6cf120) 0
+
+Class __pthread_internal_list
+ size=16 align=8
+ base size=16 base align=8
+__pthread_internal_list (0x0x7fb80a6cf180) 0
+
+Class __pthread_mutex_s
+ size=40 align=8
+ base size=40 base align=8
+__pthread_mutex_s (0x0x7fb80a6cf1e0) 0
+
+Class __pthread_cond_s
+ size=48 align=8
+ base size=48 base align=8
+__pthread_cond_s (0x0x7fb80a6cf240) 0
+
+Class pthread_attr_t
+ size=56 align=8
+ base size=56 base align=8
+pthread_attr_t (0x0x7fb80a6cf4e0) 0
+
+Class random_data
+ size=48 align=8
+ base size=48 base align=8
+random_data (0x0x7fb80a6cf780) 0
+
+Class drand48_data
+ size=24 align=8
+ base size=24 base align=8
+drand48_data (0x0x7fb80a6cf7e0) 0
+
+Vtable for std::exception
+std::exception::_ZTVSt9exception: 5 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 (0x0x7fb80a7865a0) 0 nearly-empty
+ vptr=((& std::exception::_ZTVSt9exception) + 16)
+
+Vtable for std::bad_exception
+std::bad_exception::_ZTVSt13bad_exception: 5 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 (0x0x7fb80a85fdd0) 0 nearly-empty
+ vptr=((& std::bad_exception::_ZTVSt13bad_exception) + 16)
+ std::exception (0x0x7fb80a786780) 0 nearly-empty
+ primary-for std::bad_exception (0x0x7fb80a85fdd0)
+
+Vtable for std::type_info
+std::type_info::_ZTVSt9type_info: 8 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 (0x0x7fb80a786960) 0
+ vptr=((& std::type_info::_ZTVSt9type_info) + 16)
+
+Vtable for std::bad_cast
+std::bad_cast::_ZTVSt8bad_cast: 5 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 (0x0x7fb80a85fe38) 0 nearly-empty
+ vptr=((& std::bad_cast::_ZTVSt8bad_cast) + 16)
+ std::exception (0x0x7fb80a786d20) 0 nearly-empty
+ primary-for std::bad_cast (0x0x7fb80a85fe38)
+
+Vtable for std::bad_typeid
+std::bad_typeid::_ZTVSt10bad_typeid: 5 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 (0x0x7fb80a85fea0) 0 nearly-empty
+ vptr=((& std::bad_typeid::_ZTVSt10bad_typeid) + 16)
+ std::exception (0x0x7fb80a786f00) 0 nearly-empty
+ primary-for std::bad_typeid (0x0x7fb80a85fea0)
+
+Class std::__exception_ptr::exception_ptr
+ size=8 align=8
+ base size=8 base align=8
+std::__exception_ptr::exception_ptr (0x0x7fb80a7b6120) 0
+
+Vtable for std::nested_exception
+std::nested_exception::_ZTVSt16nested_exception: 4 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 (0x0x7fb80a7b66c0) 0
+ vptr=((& std::nested_exception::_ZTVSt16nested_exception) + 16)
+
+Vtable for std::bad_alloc
+std::bad_alloc::_ZTVSt9bad_alloc: 5 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 (0x0x7fb80a85ff08) 0 nearly-empty
+ vptr=((& std::bad_alloc::_ZTVSt9bad_alloc) + 16)
+ std::exception (0x0x7fb80a7b6d80) 0 nearly-empty
+ primary-for std::bad_alloc (0x0x7fb80a85ff08)
+
+Vtable for std::bad_array_new_length
+std::bad_array_new_length::_ZTVSt20bad_array_new_length: 5 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 (0x0x7fb80a85ff70) 0 nearly-empty
+ vptr=((& std::bad_array_new_length::_ZTVSt20bad_array_new_length) + 16)
+ std::bad_alloc (0x0x7fb80a7e9000) 0 nearly-empty
+ primary-for std::bad_array_new_length (0x0x7fb80a85ff70)
+ std::exception (0x0x7fb80a7b6f60) 0 nearly-empty
+ primary-for std::bad_alloc (0x0x7fb80a7e9000)
+
+Class std::nothrow_t
+ size=1 align=1
+ base size=0 base align=1
+std::nothrow_t (0x0x7fb80a7ef180) 0 empty
+
+Class std::__allocator_traits_base
+ size=1 align=1
+ base size=0 base align=1
+std::__allocator_traits_base (0x0x7fb80a7ef360) 0 empty
+
+Class std::__numeric_limits_base
+ size=1 align=1
+ base size=0 base align=1
+std::__numeric_limits_base (0x0x7fb80a464840) 0 empty
+
+Class QSysInfo
+ size=1 align=1
+ base size=0 base align=1
+QSysInfo (0x0x7fb80a0dcd80) 0 empty
+
+Class QMessageLogContext
+ size=32 align=8
+ base size=32 base align=8
+QMessageLogContext (0x0x7fb80a0dcea0) 0
+
+Class QMessageLogger
+ size=32 align=8
+ base size=32 base align=8
+QMessageLogger (0x0x7fb80a1120c0) 0
+
+Class QFlag
+ size=4 align=4
+ base size=4 base align=4
+QFlag (0x0x7fb80a112780) 0
+
+Class QIncompatibleFlag
+ size=4 align=4
+ base size=4 base align=4
+QIncompatibleFlag (0x0x7fb80a159f00) 0
+
+Class std::__atomic_flag_base
+ size=1 align=1
+ base size=1 base align=1
+std::__atomic_flag_base (0x0x7fb80a208420) 0
+
+Class std::atomic_flag
+ size=1 align=1
+ base size=1 base align=1
+std::atomic_flag (0x0x7fb80a19be38) 0
+ std::__atomic_flag_base (0x0x7fb80a208480) 0
+
+Class QAtomicInt
+ size=4 align=4
+ base size=4 base align=4
+QAtomicInt (0x0x7fb809f515b0) 0
+ QAtomicInteger<int> (0x0x7fb809f51618) 0
+ QBasicAtomicInteger<int> (0x0x7fb809d3d6c0) 0
+
+Class QInternal
+ size=1 align=1
+ base size=0 base align=1
+QInternal (0x0x7fb809998240) 0 empty
+
+Class QtPrivate::QSlotObjectBase
+ size=16 align=8
+ base size=16 base align=8
+QtPrivate::QSlotObjectBase (0x0x7fb8099db7e0) 0
+
+Class QGenericArgument
+ size=16 align=8
+ base size=16 base align=8
+QGenericArgument (0x0x7fb8099dbf00) 0
+
+Class QGenericReturnArgument
+ size=16 align=8
+ base size=16 base align=8
+QGenericReturnArgument (0x0x7fb809a0d270) 0
+ QGenericArgument (0x0x7fb809a1b1e0) 0
+
+Class QMetaObject::SuperData
+ size=8 align=8
+ base size=8 base align=8
+QMetaObject::SuperData (0x0x7fb809a1b660) 0
+
+Class QMetaObject
+ size=48 align=8
+ base size=48 base align=8
+QMetaObject (0x0x7fb809a1b600) 0
+
+Class QMetaObject::Connection
+ size=8 align=8
+ base size=8 base align=8
+QMetaObject::Connection (0x0x7fb809a1bf00) 0
+
+Class QLatin1Char
+ size=1 align=1
+ base size=1 base align=1
+QLatin1Char (0x0x7fb8096caa20) 0
+
+Class QChar
+ size=2 align=2
+ base size=2 base align=2
+QChar (0x0x7fb8096ee180) 0
+
+Class QtPrivate::RefCount
+ size=4 align=4
+ base size=4 base align=4
+QtPrivate::RefCount (0x0x7fb80979ef60) 0
+
+Class QArrayData
+ size=24 align=8
+ base size=24 base align=8
+QArrayData (0x0x7fb8097c4300) 0
+
+Class QtPrivate::QContainerImplHelper
+ size=1 align=1
+ base size=0 base align=1
+QtPrivate::QContainerImplHelper (0x0x7fb809826600) 0 empty
+
+Class lconv
+ size=96 align=8
+ base size=96 base align=8
+lconv (0x0x7fb8094d6e40) 0
+
+Vtable for __cxxabiv1::__forced_unwind
+__cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE: 5 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTIN10__cxxabiv115__forced_unwindE)
+16 0
+24 0
+32 (int (*)(...))__cxa_pure_virtual
+
+Class __cxxabiv1::__forced_unwind
+ size=8 align=8
+ base size=8 base align=8
+__cxxabiv1::__forced_unwind (0x0x7fb8094d6f00) 0 nearly-empty
+ vptr=((& __cxxabiv1::__forced_unwind::_ZTVN10__cxxabiv115__forced_unwindE) + 16)
+
+Class sched_param
+ size=4 align=4
+ base size=4 base align=4
+sched_param (0x0x7fb8095ca060) 0
+
+Class timex
+ size=208 align=8
+ base size=208 base align=8
+timex (0x0x7fb8095ca120) 0
+
+Class tm
+ size=56 align=8
+ base size=56 base align=8
+tm (0x0x7fb8095ca180) 0
+
+Class itimerspec
+ size=32 align=8
+ base size=32 base align=8
+itimerspec (0x0x7fb8095ca1e0) 0
+
+Class _pthread_cleanup_buffer
+ size=32 align=8
+ base size=32 base align=8
+_pthread_cleanup_buffer (0x0x7fb8095ca240) 0
+
+Class __pthread_cleanup_frame
+ size=24 align=8
+ base size=24 base align=8
+__pthread_cleanup_frame (0x0x7fb8095ca360) 0
+
+Class __pthread_cleanup_class
+ size=24 align=8
+ base size=24 base align=8
+__pthread_cleanup_class (0x0x7fb8095ca3c0) 0
+
+Class _IO_marker
+ size=24 align=8
+ base size=24 base align=8
+_IO_marker (0x0x7fb80930f360) 0
+
+Class _IO_FILE
+ size=216 align=8
+ base size=216 base align=8
+_IO_FILE (0x0x7fb80930f3c0) 0
+
+Class std::_Hash_impl
+ size=1 align=1
+ base size=0 base align=1
+std::_Hash_impl (0x0x7fb8090c1420) 0 empty
+
+Class std::_Fnv_hash_impl
+ size=1 align=1
+ base size=0 base align=1
+std::_Fnv_hash_impl (0x0x7fb8090c15a0) 0 empty
+
+Class std::locale
+ size=8 align=8
+ base size=8 base align=8
+std::locale (0x0x7fb80923b720) 0
+
+Vtable for std::locale::facet
+std::locale::facet::_ZTVNSt6locale5facetE: 4 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 (0x0x7fb80923bae0) 0
+ vptr=((& std::locale::facet::_ZTVNSt6locale5facetE) + 16)
+
+Class std::locale::id
+ size=8 align=8
+ base size=8 base align=8
+std::locale::id (0x0x7fb80923bd80) 0
+
+Class std::locale::_Impl
+ size=40 align=8
+ base size=40 base align=8
+std::locale::_Impl (0x0x7fb80923bf60) 0
+
+Class std::__cow_string
+ size=8 align=8
+ base size=8 base align=8
+std::__cow_string (0x0x7fb808e95f60) 0
+
+Vtable for std::logic_error
+std::logic_error::_ZTVSt11logic_error: 5 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 (0x0x7fb808ec8208) 0
+ vptr=((& std::logic_error::_ZTVSt11logic_error) + 16)
+ std::exception (0x0x7fb808edb060) 0 nearly-empty
+ primary-for std::logic_error (0x0x7fb808ec8208)
+
+Vtable for std::domain_error
+std::domain_error::_ZTVSt12domain_error: 5 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 (0x0x7fb808ec8270) 0
+ vptr=((& std::domain_error::_ZTVSt12domain_error) + 16)
+ std::logic_error (0x0x7fb808ec82d8) 0
+ primary-for std::domain_error (0x0x7fb808ec8270)
+ std::exception (0x0x7fb808edb0c0) 0 nearly-empty
+ primary-for std::logic_error (0x0x7fb808ec82d8)
+
+Vtable for std::invalid_argument
+std::invalid_argument::_ZTVSt16invalid_argument: 5 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 (0x0x7fb808ec8340) 0
+ vptr=((& std::invalid_argument::_ZTVSt16invalid_argument) + 16)
+ std::logic_error (0x0x7fb808ec83a8) 0
+ primary-for std::invalid_argument (0x0x7fb808ec8340)
+ std::exception (0x0x7fb808edb120) 0 nearly-empty
+ primary-for std::logic_error (0x0x7fb808ec83a8)
+
+Vtable for std::length_error
+std::length_error::_ZTVSt12length_error: 5 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 (0x0x7fb808ec8410) 0
+ vptr=((& std::length_error::_ZTVSt12length_error) + 16)
+ std::logic_error (0x0x7fb808ec8478) 0
+ primary-for std::length_error (0x0x7fb808ec8410)
+ std::exception (0x0x7fb808edb180) 0 nearly-empty
+ primary-for std::logic_error (0x0x7fb808ec8478)
+
+Vtable for std::out_of_range
+std::out_of_range::_ZTVSt12out_of_range: 5 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 (0x0x7fb808ec84e0) 0
+ vptr=((& std::out_of_range::_ZTVSt12out_of_range) + 16)
+ std::logic_error (0x0x7fb808ec8548) 0
+ primary-for std::out_of_range (0x0x7fb808ec84e0)
+ std::exception (0x0x7fb808edb1e0) 0 nearly-empty
+ primary-for std::logic_error (0x0x7fb808ec8548)
+
+Vtable for std::runtime_error
+std::runtime_error::_ZTVSt13runtime_error: 5 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 (0x0x7fb808ec85b0) 0
+ vptr=((& std::runtime_error::_ZTVSt13runtime_error) + 16)
+ std::exception (0x0x7fb808edb240) 0 nearly-empty
+ primary-for std::runtime_error (0x0x7fb808ec85b0)
+
+Vtable for std::range_error
+std::range_error::_ZTVSt11range_error: 5 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 (0x0x7fb808ec8618) 0
+ vptr=((& std::range_error::_ZTVSt11range_error) + 16)
+ std::runtime_error (0x0x7fb808ec8680) 0
+ primary-for std::range_error (0x0x7fb808ec8618)
+ std::exception (0x0x7fb808edb2a0) 0 nearly-empty
+ primary-for std::runtime_error (0x0x7fb808ec8680)
+
+Vtable for std::overflow_error
+std::overflow_error::_ZTVSt14overflow_error: 5 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 (0x0x7fb808ec86e8) 0
+ vptr=((& std::overflow_error::_ZTVSt14overflow_error) + 16)
+ std::runtime_error (0x0x7fb808ec8750) 0
+ primary-for std::overflow_error (0x0x7fb808ec86e8)
+ std::exception (0x0x7fb808edb300) 0 nearly-empty
+ primary-for std::runtime_error (0x0x7fb808ec8750)
+
+Vtable for std::underflow_error
+std::underflow_error::_ZTVSt15underflow_error: 5 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 (0x0x7fb808ec87b8) 0
+ vptr=((& std::underflow_error::_ZTVSt15underflow_error) + 16)
+ std::runtime_error (0x0x7fb808ec8820) 0
+ primary-for std::underflow_error (0x0x7fb808ec87b8)
+ std::exception (0x0x7fb808edb360) 0 nearly-empty
+ primary-for std::runtime_error (0x0x7fb808ec8820)
+
+Vtable for std::_V2::error_category
+std::_V2::error_category::_ZTVNSt3_V214error_categoryE: 10 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTINSt3_V214error_categoryE)
+16 0
+24 0
+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 (0x0x7fb808edb4e0) 0 nearly-empty
+ vptr=((& std::_V2::error_category::_ZTVNSt3_V214error_categoryE) + 16)
+
+Class std::error_code
+ size=16 align=8
+ base size=16 base align=8
+std::error_code (0x0x7fb808edb840) 0
+
+Class std::error_condition
+ size=16 align=8
+ base size=16 base align=8
+std::error_condition (0x0x7fb808f2b0c0) 0
+
+Vtable for std::system_error
+std::system_error::_ZTVSt12system_error: 5 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 (0x0x7fb808ec8c30) 0
+ vptr=((& std::system_error::_ZTVSt12system_error) + 16)
+ std::runtime_error (0x0x7fb808ec8c98) 0
+ primary-for std::system_error (0x0x7fb808ec8c30)
+ std::exception (0x0x7fb808f2bc60) 0 nearly-empty
+ primary-for std::runtime_error (0x0x7fb808ec8c98)
+
+Vtable for std::ios_base::failure
+std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E: 5 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 (0x0x7fb808ec8f08) 0
+ vptr=((& std::ios_base::failure::_ZTVNSt8ios_base7failureB5cxx11E) + 16)
+ std::system_error (0x0x7fb808ec8f70) 0
+ primary-for std::ios_base::failure (0x0x7fb808ec8f08)
+ std::runtime_error (0x0x7fb808f8e000) 0
+ primary-for std::system_error (0x0x7fb808ec8f70)
+ std::exception (0x0x7fb808f86240) 0 nearly-empty
+ primary-for std::runtime_error (0x0x7fb808f8e000)
+
+Class std::ios_base::_Callback_list
+ size=24 align=8
+ base size=24 base align=8
+std::ios_base::_Callback_list (0x0x7fb808f862a0) 0
+
+Class std::ios_base::_Words
+ size=16 align=8
+ base size=16 base align=8
+std::ios_base::_Words (0x0x7fb808f86300) 0
+
+Class std::ios_base::Init
+ size=1 align=1
+ base size=0 base align=1
+std::ios_base::Init (0x0x7fb808f86360) 0 empty
+
+Vtable for std::ios_base
+std::ios_base::_ZTVSt8ios_base: 4 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 (0x0x7fb808f861e0) 0
+ vptr=((& std::ios_base::_ZTVSt8ios_base) + 16)
+
+Class std::ctype_base
+ size=1 align=1
+ base size=0 base align=1
+std::ctype_base (0x0x7fb809056c60) 0 empty
+
+Class std::__num_base
+ size=1 align=1
+ base size=0 base align=1
+std::__num_base (0x0x7fb808cffe40) 0 empty
+
+VTT for std::basic_ostream<char>
+std::basic_ostream<char>::_ZTTSo: 2 entries
+0 ((& std::basic_ostream<char>::_ZTVSo) + 24)
+8 ((& std::basic_ostream<char>::_ZTVSo) + 64)
+
+VTT for std::basic_ostream<wchar_t>
+std::basic_ostream<wchar_t>::_ZTTSt13basic_ostreamIwSt11char_traitsIwEE: 2 entries
+0 ((& std::basic_ostream<wchar_t>::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 24)
+8 ((& std::basic_ostream<wchar_t>::_ZTVSt13basic_ostreamIwSt11char_traitsIwEE) + 64)
+
+VTT for std::basic_istream<char>
+std::basic_istream<char>::_ZTTSi: 2 entries
+0 ((& std::basic_istream<char>::_ZTVSi) + 24)
+8 ((& std::basic_istream<char>::_ZTVSi) + 64)
+
+VTT for std::basic_istream<wchar_t>
+std::basic_istream<wchar_t>::_ZTTSt13basic_istreamIwSt11char_traitsIwEE: 2 entries
+0 ((& std::basic_istream<wchar_t>::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 24)
+8 ((& std::basic_istream<wchar_t>::_ZTVSt13basic_istreamIwSt11char_traitsIwEE) + 64)
+
+Construction vtable for std::basic_istream<char> (0x0x7fb8088d06e8 instance) in std::basic_iostream<char>
+std::basic_iostream<char>::_ZTCSd0_Si: 10 entries
+0 24
+8 (int (*)(...))0
+16 (int (*)(...))(& _ZTISi)
+24 0
+32 0
+40 18446744073709551592
+48 (int (*)(...))-24
+56 (int (*)(...))(& _ZTISi)
+64 0
+72 0
+
+Construction vtable for std::basic_ostream<char> (0x0x7fb8088d07b8 instance) in std::basic_iostream<char>
+std::basic_iostream<char>::_ZTCSd16_So: 10 entries
+0 8
+8 (int (*)(...))0
+16 (int (*)(...))(& _ZTISo)
+24 0
+32 0
+40 18446744073709551608
+48 (int (*)(...))-8
+56 (int (*)(...))(& _ZTISo)
+64 0
+72 0
+
+VTT for std::basic_iostream<char>
+std::basic_iostream<char>::_ZTTSd: 7 entries
+0 ((& std::basic_iostream<char>::_ZTVSd) + 24)
+8 ((& std::basic_iostream<char>::_ZTCSd0_Si) + 24)
+16 ((& std::basic_iostream<char>::_ZTCSd0_Si) + 64)
+24 ((& std::basic_iostream<char>::_ZTCSd16_So) + 24)
+32 ((& std::basic_iostream<char>::_ZTCSd16_So) + 64)
+40 ((& std::basic_iostream<char>::_ZTVSd) + 104)
+48 ((& std::basic_iostream<char>::_ZTVSd) + 64)
+
+Construction vtable for std::basic_istream<wchar_t> (0x0x7fb80890e478 instance) in std::basic_iostream<wchar_t>
+std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E: 10 entries
+0 24
+8 (int (*)(...))0
+16 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE)
+24 0
+32 0
+40 18446744073709551592
+48 (int (*)(...))-24
+56 (int (*)(...))(& _ZTISt13basic_istreamIwSt11char_traitsIwEE)
+64 0
+72 0
+
+Construction vtable for std::basic_ostream<wchar_t> (0x0x7fb80890e548 instance) in std::basic_iostream<wchar_t>
+std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E: 10 entries
+0 8
+8 (int (*)(...))0
+16 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE)
+24 0
+32 0
+40 18446744073709551608
+48 (int (*)(...))-8
+56 (int (*)(...))(& _ZTISt13basic_ostreamIwSt11char_traitsIwEE)
+64 0
+72 0
+
+VTT for std::basic_iostream<wchar_t>
+std::basic_iostream<wchar_t>::_ZTTSt14basic_iostreamIwSt11char_traitsIwEE: 7 entries
+0 ((& std::basic_iostream<wchar_t>::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 24)
+8 ((& std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 24)
+16 ((& std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE0_St13basic_istreamIwS1_E) + 64)
+24 ((& std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 24)
+32 ((& std::basic_iostream<wchar_t>::_ZTCSt14basic_iostreamIwSt11char_traitsIwEE16_St13basic_ostreamIwS1_E) + 64)
+40 ((& std::basic_iostream<wchar_t>::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 104)
+48 ((& std::basic_iostream<wchar_t>::_ZTVSt14basic_iostreamIwSt11char_traitsIwEE) + 64)
+
+Class QByteArrayDataPtr
+ size=8 align=8
+ base size=8 base align=8
+QByteArrayDataPtr (0x0x7fb8089377e0) 0
+
+Class QByteArray
+ size=8 align=8
+ base size=8 base align=8
+QByteArray (0x0x7fb808937840) 0
+
+Class QByteRef
+ size=16 align=8
+ base size=12 base align=8
+QByteRef (0x0x7fb808663c00) 0
+
+Class QStringDataPtr
+ size=8 align=8
+ base size=8 base align=8
+QStringDataPtr (0x0x7fb80870aa80) 0
+
+Class QStringView
+ size=16 align=8
+ base size=16 base align=8
+QStringView (0x0x7fb80870af00) 0
+
+Class QLatin1String
+ size=16 align=8
+ base size=16 base align=8
+QLatin1String (0x0x7fb80880d000) 0
+
+Class QString::Null
+ size=1 align=1
+ base size=0 base align=1
+QString::Null (0x0x7fb80849ff60) 0 empty
+
+Class QString
+ size=8 align=8
+ base size=8 base align=8
+QString (0x0x7fb80849fe40) 0
+
+Class QCharRef
+ size=16 align=8
+ base size=12 base align=8
+QCharRef (0x0x7fb80835fde0) 0
+
+Class QStringRef
+ size=16 align=8
+ base size=16 base align=8
+QStringRef (0x0x7fb8080f79c0) 0
+
+Class QtPrivate::ArgBase
+ size=1 align=1
+ base size=1 base align=1
+QtPrivate::ArgBase (0x0x7fb807d807e0) 0
+
+Class QtPrivate::QStringViewArg
+ size=24 align=8
+ base size=24 base align=8
+QtPrivate::QStringViewArg (0x0x7fb80819d3a8) 0
+ QtPrivate::ArgBase (0x0x7fb807d80840) 0
+
+Class QtPrivate::QLatin1StringArg
+ size=24 align=8
+ base size=24 base align=8
+QtPrivate::QLatin1StringArg (0x0x7fb80819d410) 0
+ QtPrivate::ArgBase (0x0x7fb807d80a20) 0
+
+Class std::__erased_type
+ size=1 align=1
+ base size=0 base align=1
+std::__erased_type (0x0x7fb807e56960) 0 empty
+
+Class std::allocator_arg_t
+ size=1 align=1
+ base size=0 base align=1
+std::allocator_arg_t (0x0x7fb807e569c0) 0 empty
+
+Class std::__uses_alloc_base
+ size=1 align=1
+ base size=0 base align=1
+std::__uses_alloc_base (0x0x7fb807e56b40) 0 empty
+
+Class std::__uses_alloc0::_Sink
+ size=1 align=1
+ base size=0 base align=1
+std::__uses_alloc0::_Sink (0x0x7fb807e56c00) 0 empty
+
+Class std::__uses_alloc0
+ size=1 align=1
+ base size=1 base align=1
+std::__uses_alloc0 (0x0x7fb80819d7b8) 0
+ std::__uses_alloc_base (0x0x7fb807e56ba0) 0 empty
+
+Class std::_Swallow_assign
+ size=1 align=1
+ base size=0 base align=1
+std::_Swallow_assign (0x0x7fb807badf60) 0 empty
+
+Vtable for std::bad_function_call
+std::bad_function_call::_ZTVSt17bad_function_call: 5 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 (0x0x7fb807bd5a28) 0 nearly-empty
+ vptr=((& std::bad_function_call::_ZTVSt17bad_function_call) + 16)
+ std::exception (0x0x7fb807c298a0) 0 nearly-empty
+ primary-for std::bad_function_call (0x0x7fb807bd5a28)
+
+Class std::_Nocopy_types
+ size=16 align=8
+ base size=16 base align=8
+std::_Nocopy_types (0x0x7fb807c29960) 0
+
+Class std::_Any_data
+ size=16 align=8
+ base size=16 base align=8
+std::_Any_data (0x0x7fb807c299c0) 0
+
+Class std::_Function_base
+ size=24 align=8
+ base size=24 base align=8
+std::_Function_base (0x0x7fb807c29cc0) 0
+
+Class QtPrivate::QHashCombine
+ size=1 align=1
+ base size=0 base align=1
+QtPrivate::QHashCombine (0x0x7fb807a5a180) 0 empty
+
+Class QtPrivate::QHashCombineCommutative
+ size=1 align=1
+ base size=0 base align=1
+QtPrivate::QHashCombineCommutative (0x0x7fb807a5a240) 0 empty
+
+Class std::_Bit_reference
+ size=16 align=8
+ base size=16 base align=8
+std::_Bit_reference (0x0x7fb807760960) 0
+
+Class std::_Bit_iterator_base
+ size=16 align=8
+ base size=12 base align=8
+std::_Bit_iterator_base (0x0x7fb807a9c5b0) 0
+ std::iterator<std::random_access_iterator_tag, bool> (0x0x7fb8077820c0) 0 empty
+
+Class std::_Bit_iterator
+ size=16 align=8
+ base size=12 base align=8
+std::_Bit_iterator (0x0x7fb807a9c6e8) 0
+ std::_Bit_iterator_base (0x0x7fb807a9c750) 0
+ std::iterator<std::random_access_iterator_tag, bool> (0x0x7fb807782720) 0 empty
+
+Class std::_Bit_const_iterator
+ size=16 align=8
+ base size=12 base align=8
+std::_Bit_const_iterator (0x0x7fb807a9c7b8) 0
+ std::_Bit_iterator_base (0x0x7fb807a9c820) 0
+ std::iterator<std::random_access_iterator_tag, bool> (0x0x7fb807782f00) 0 empty
+
+Class std::__detail::_List_node_base
+ size=16 align=8
+ base size=16 base align=8
+std::__detail::_List_node_base (0x0x7fb8075d7a80) 0
+
+Class QListData::NotArrayCompatibleLayout
+ size=1 align=1
+ base size=0 base align=1
+QListData::NotArrayCompatibleLayout (0x0x7fb8076ab840) 0 empty
+
+Class QListData::NotIndirectLayout
+ size=1 align=1
+ base size=0 base align=1
+QListData::NotIndirectLayout (0x0x7fb8076ab8a0) 0 empty
+
+Class QListData::ArrayCompatibleLayout
+ size=1 align=1
+ base size=1 base align=1
+QListData::ArrayCompatibleLayout (0x0x7fb80757f340) 0 empty
+ QListData::NotIndirectLayout (0x0x7fb8076ab900) 0 empty
+
+Class QListData::InlineWithPaddingLayout
+ size=1 align=1
+ base size=1 base align=1
+QListData::InlineWithPaddingLayout (0x0x7fb80760d8c0) 0 empty
+ QListData::NotArrayCompatibleLayout (0x0x7fb8076ab960) 0 empty
+ QListData::NotIndirectLayout (0x0x7fb8076ab9c0) 0 empty
+
+Class QListData::IndirectLayout
+ size=1 align=1
+ base size=1 base align=1
+QListData::IndirectLayout (0x0x7fb80757f3a8) 0 empty
+ QListData::NotArrayCompatibleLayout (0x0x7fb8076aba20) 0 empty
+
+Class QListData::Data
+ size=24 align=8
+ base size=24 base align=8
+QListData::Data (0x0x7fb8076aba80) 0
+
+Class QListData
+ size=8 align=8
+ base size=8 base align=8
+QListData (0x0x7fb8076ab7e0) 0
+
+Class QRegExp
+ size=8 align=8
+ base size=8 base align=8
+QRegExp (0x0x7fb80739dc00) 0
+
+Class QStringMatcher::Data
+ size=272 align=8
+ base size=272 base align=8
+QStringMatcher::Data (0x0x7fb807497180) 0
+
+Class QStringMatcher
+ size=1048 align=8
+ base size=1048 base align=8
+QStringMatcher (0x0x7fb807497120) 0
+
+Class QStringList
+ size=8 align=8
+ base size=8 base align=8
+QStringList (0x0x7fb8074af068) 0
+ QList<QString> (0x0x7fb8074af0d0) 0
+ QListSpecialMethods<QString> (0x0x7fb8074973c0) 0 empty
+
+Class QScopedPointerPodDeleter
+ size=1 align=1
+ base size=0 base align=1
+QScopedPointerPodDeleter (0x0x7fb807178300) 0 empty
+
+Class std::_Rb_tree_node_base
+ size=32 align=8
+ base size=32 base align=8
+std::_Rb_tree_node_base (0x0x7fb807200540) 0
+
+Class std::_Rb_tree_header
+ size=40 align=8
+ base size=40 base align=8
+std::_Rb_tree_header (0x0x7fb8072008a0) 0
+
+Class QtPrivate::AbstractDebugStreamFunction
+ size=16 align=8
+ base size=16 base align=8
+QtPrivate::AbstractDebugStreamFunction (0x0x7fb806f47ea0) 0
+
+Class QtPrivate::AbstractComparatorFunction
+ size=24 align=8
+ base size=24 base align=8
+QtPrivate::AbstractComparatorFunction (0x0x7fb806f63240) 0
+
+Class QtPrivate::AbstractConverterFunction
+ size=8 align=8
+ base size=8 base align=8
+QtPrivate::AbstractConverterFunction (0x0x7fb806f63780) 0
+
+Class QMetaType
+ size=80 align=8
+ base size=80 base align=8
+QMetaType (0x0x7fb806f63cc0) 0
+
+Class QtMetaTypePrivate::VariantData
+ size=24 align=8
+ base size=20 base align=8
+QtMetaTypePrivate::VariantData (0x0x7fb806fb4ea0) 0
+
+Class QtMetaTypePrivate::VectorBoolElements
+ size=1 align=1
+ base size=0 base align=1
+QtMetaTypePrivate::VectorBoolElements (0x0x7fb806fed5a0) 0 empty
+
+Class QtMetaTypePrivate::QSequentialIterableImpl
+ size=104 align=8
+ base size=104 base align=8
+QtMetaTypePrivate::QSequentialIterableImpl (0x0x7fb806c86420) 0
+
+Class QtMetaTypePrivate::QAssociativeIterableImpl
+ size=112 align=8
+ base size=112 base align=8
+QtMetaTypePrivate::QAssociativeIterableImpl (0x0x7fb806ce0ae0) 0
+
+Class QtMetaTypePrivate::QPairVariantInterfaceImpl
+ size=40 align=8
+ base size=40 base align=8
+QtMetaTypePrivate::QPairVariantInterfaceImpl (0x0x7fb806d57060) 0
+
+Class std::chrono::_V2::system_clock
+ size=1 align=1
+ base size=0 base align=1
+std::chrono::_V2::system_clock (0x0x7fb806bfe600) 0 empty
+
+Class std::chrono::_V2::steady_clock
+ size=1 align=1
+ base size=0 base align=1
+std::chrono::_V2::steady_clock (0x0x7fb80692a0c0) 0 empty
+
+Vtable for QObjectData
+QObjectData::_ZTV11QObjectData: 4 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 (0x0x7fb80692a120) 0
+ vptr=((& QObjectData::_ZTV11QObjectData) + 16)
+
+Class QObject::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QObject::QPrivateSignal (0x0x7fb80692a300) 0 empty
+
+Vtable for QObject
+QObject::_ZTV7QObject: 14 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 (0x0x7fb80692a2a0) 0
+ vptr=((& QObject::_ZTV7QObject) + 16)
+
+Vtable for QObjectUserData
+QObjectUserData::_ZTV15QObjectUserData: 4 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 (0x0x7fb8069fb120) 0 nearly-empty
+ vptr=((& QObjectUserData::_ZTV15QObjectUserData) + 16)
+
+Class QSignalBlocker
+ size=16 align=8
+ base size=10 base align=8
+QSignalBlocker (0x0x7fb8069fb2a0) 0
+
+Class QAbstractAnimation::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAbstractAnimation::QPrivateSignal (0x0x7fb8069fbb40) 0 empty
+
+Vtable for QAbstractAnimation
+QAbstractAnimation::_ZTV18QAbstractAnimation: 18 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI18QAbstractAnimation)
+16 (int (*)(...))QAbstractAnimation::metaObject
+24 (int (*)(...))QAbstractAnimation::qt_metacast
+32 (int (*)(...))QAbstractAnimation::qt_metacall
+40 0
+48 0
+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 (0x0x7fb8069f8208) 0
+ vptr=((& QAbstractAnimation::_ZTV18QAbstractAnimation) + 16)
+ QObject (0x0x7fb8069fbae0) 0
+ primary-for QAbstractAnimation (0x0x7fb8069f8208)
+
+Class QAnimationDriver::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAnimationDriver::QPrivateSignal (0x0x7fb8069fbf00) 0 empty
+
+Vtable for QAnimationDriver
+QAnimationDriver::_ZTV16QAnimationDriver: 18 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 (0x0x7fb8069f8270) 0
+ vptr=((& QAnimationDriver::_ZTV16QAnimationDriver) + 16)
+ QObject (0x0x7fb8069fbea0) 0
+ primary-for QAnimationDriver (0x0x7fb8069f8270)
+
+Class QEventLoop::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QEventLoop::QPrivateSignal (0x0x7fb806a3f180) 0 empty
+
+Vtable for QEventLoop
+QEventLoop::_ZTV10QEventLoop: 14 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 (0x0x7fb8069f82d8) 0
+ vptr=((& QEventLoop::_ZTV10QEventLoop) + 16)
+ QObject (0x0x7fb806a3f120) 0
+ primary-for QEventLoop (0x0x7fb8069f82d8)
+
+Class QEventLoopLocker
+ size=8 align=8
+ base size=8 base align=8
+QEventLoopLocker (0x0x7fb806a3fa20) 0
+
+Class QAbstractEventDispatcher::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAbstractEventDispatcher::QPrivateSignal (0x0x7fb806a3fae0) 0 empty
+
+Class QAbstractEventDispatcher::TimerInfo
+ size=12 align=4
+ base size=12 base align=4
+QAbstractEventDispatcher::TimerInfo (0x0x7fb806a3fb40) 0
+
+Vtable for QAbstractEventDispatcher
+QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher: 28 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI24QAbstractEventDispatcher)
+16 (int (*)(...))QAbstractEventDispatcher::metaObject
+24 (int (*)(...))QAbstractEventDispatcher::qt_metacast
+32 (int (*)(...))QAbstractEventDispatcher::qt_metacall
+40 0
+48 0
+56 (int (*)(...))QObject::event
+64 (int (*)(...))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 (0x0x7fb8069f8410) 0
+ vptr=((& QAbstractEventDispatcher::_ZTV24QAbstractEventDispatcher) + 16)
+ QObject (0x0x7fb806a3fa80) 0
+ primary-for QAbstractEventDispatcher (0x0x7fb8069f8410)
+
+Class QMapNodeBase
+ size=24 align=8
+ base size=24 base align=8
+QMapNodeBase (0x0x7fb8066b7b40) 0
+
+Class QMapDataBase
+ size=40 align=8
+ base size=40 base align=8
+QMapDataBase (0x0x7fb8066e07e0) 0
+
+Class QHashData::Node
+ size=16 align=8
+ base size=16 base align=8
+QHashData::Node (0x0x7fb8067cd180) 0
+
+Class QHashData
+ size=48 align=8
+ base size=44 base align=8
+QHashData (0x0x7fb8067cd120) 0
+
+Class QHashDummyValue
+ size=1 align=1
+ base size=0 base align=1
+QHashDummyValue (0x0x7fb8067cd420) 0 empty
+
+Class QVariant::PrivateShared
+ size=16 align=8
+ base size=12 base align=8
+QVariant::PrivateShared (0x0x7fb8064dab40) 0
+
+Class QVariant::Private::Data
+ size=8 align=8
+ base size=8 base align=8
+QVariant::Private::Data (0x0x7fb8064dac00) 0
+
+Class QVariant::Private
+ size=16 align=8
+ base size=12 base align=8
+QVariant::Private (0x0x7fb8064daba0) 0
+
+Class QVariant::Handler
+ size=72 align=8
+ base size=72 base align=8
+QVariant::Handler (0x0x7fb8064dac60) 0
+
+Class QVariant
+ size=16 align=8
+ base size=16 base align=8
+QVariant (0x0x7fb8064daae0) 0
+
+Class QVariantComparisonHelper
+ size=8 align=8
+ base size=8 base align=8
+QVariantComparisonHelper (0x0x7fb8065d3f00) 0
+
+Class QSequentialIterable::const_iterator
+ size=112 align=8
+ base size=112 base align=8
+QSequentialIterable::const_iterator (0x0x7fb8062a15a0) 0
+
+Class QSequentialIterable
+ size=104 align=8
+ base size=104 base align=8
+QSequentialIterable (0x0x7fb8062a1540) 0
+
+Class QAssociativeIterable::const_iterator
+ size=120 align=8
+ base size=120 base align=8
+QAssociativeIterable::const_iterator (0x0x7fb8062a16c0) 0
+
+Class QAssociativeIterable
+ size=112 align=8
+ base size=112 base align=8
+QAssociativeIterable (0x0x7fb8062a1660) 0
+
+Class QModelIndex
+ size=24 align=8
+ base size=24 base align=8
+QModelIndex (0x0x7fb80636b840) 0
+
+Class QPersistentModelIndex
+ size=8 align=8
+ base size=8 base align=8
+QPersistentModelIndex (0x0x7fb8063e0480) 0
+
+Class QAbstractItemModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAbstractItemModel::QPrivateSignal (0x0x7fb8060b02a0) 0 empty
+
+Vtable for QAbstractItemModel
+QAbstractItemModel::_ZTV18QAbstractItemModel: 48 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI18QAbstractItemModel)
+16 (int (*)(...))QAbstractItemModel::metaObject
+24 (int (*)(...))QAbstractItemModel::qt_metacast
+32 (int (*)(...))QAbstractItemModel::qt_metacall
+40 0
+48 0
+56 (int (*)(...))QObject::event
+64 (int (*)(...))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 (0x0x7fb8060af5b0) 0
+ vptr=((& QAbstractItemModel::_ZTV18QAbstractItemModel) + 16)
+ QObject (0x0x7fb8060b0240) 0
+ primary-for QAbstractItemModel (0x0x7fb8060af5b0)
+
+Class QAbstractTableModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAbstractTableModel::QPrivateSignal (0x0x7fb806176660) 0 empty
+
+Vtable for QAbstractTableModel
+QAbstractTableModel::_ZTV19QAbstractTableModel: 48 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI19QAbstractTableModel)
+16 (int (*)(...))QAbstractTableModel::metaObject
+24 (int (*)(...))QAbstractTableModel::qt_metacast
+32 (int (*)(...))QAbstractTableModel::qt_metacall
+40 0
+48 0
+56 (int (*)(...))QObject::event
+64 (int (*)(...))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 (0x0x7fb8060afbc8) 0
+ vptr=((& QAbstractTableModel::_ZTV19QAbstractTableModel) + 16)
+ QAbstractItemModel (0x0x7fb8060afc30) 0
+ primary-for QAbstractTableModel (0x0x7fb8060afbc8)
+ QObject (0x0x7fb806176600) 0
+ primary-for QAbstractItemModel (0x0x7fb8060afc30)
+
+Class QAbstractListModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAbstractListModel::QPrivateSignal (0x0x7fb8061767e0) 0 empty
+
+Vtable for QAbstractListModel
+QAbstractListModel::_ZTV18QAbstractListModel: 48 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI18QAbstractListModel)
+16 (int (*)(...))QAbstractListModel::metaObject
+24 (int (*)(...))QAbstractListModel::qt_metacast
+32 (int (*)(...))QAbstractListModel::qt_metacall
+40 0
+48 0
+56 (int (*)(...))QObject::event
+64 (int (*)(...))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 (0x0x7fb8060afc98) 0
+ vptr=((& QAbstractListModel::_ZTV18QAbstractListModel) + 16)
+ QAbstractItemModel (0x0x7fb8060afd00) 0
+ primary-for QAbstractListModel (0x0x7fb8060afc98)
+ QObject (0x0x7fb806176780) 0
+ primary-for QAbstractItemModel (0x0x7fb8060afd00)
+
+Vtable for QAbstractNativeEventFilter
+QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter: 5 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI26QAbstractNativeEventFilter)
+16 0
+24 0
+32 (int (*)(...))__cxa_pure_virtual
+
+Class QAbstractNativeEventFilter
+ size=16 align=8
+ base size=16 base align=8
+QAbstractNativeEventFilter (0x0x7fb806176f00) 0
+ vptr=((& QAbstractNativeEventFilter::_ZTV26QAbstractNativeEventFilter) + 16)
+
+Class QAbstractProxyModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAbstractProxyModel::QPrivateSignal (0x0x7fb8061e8000) 0 empty
+
+Vtable for QAbstractProxyModel
+QAbstractProxyModel::_ZTV19QAbstractProxyModel: 53 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI19QAbstractProxyModel)
+16 (int (*)(...))QAbstractProxyModel::metaObject
+24 (int (*)(...))QAbstractProxyModel::qt_metacast
+32 (int (*)(...))QAbstractProxyModel::qt_metacall
+40 0
+48 0
+56 (int (*)(...))QObject::event
+64 (int (*)(...))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 (0x0x7fb8060afdd0) 0
+ vptr=((& QAbstractProxyModel::_ZTV19QAbstractProxyModel) + 16)
+ QAbstractItemModel (0x0x7fb8060afe38) 0
+ primary-for QAbstractProxyModel (0x0x7fb8060afdd0)
+ QObject (0x0x7fb806176f60) 0
+ primary-for QAbstractItemModel (0x0x7fb8060afe38)
+
+Class QAbstractState::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAbstractState::QPrivateSignal (0x0x7fb8061e8240) 0 empty
+
+Vtable for QAbstractState
+QAbstractState::_ZTV14QAbstractState: 16 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI14QAbstractState)
+16 (int (*)(...))QAbstractState::metaObject
+24 (int (*)(...))QAbstractState::qt_metacast
+32 (int (*)(...))QAbstractState::qt_metacall
+40 0
+48 0
+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 (0x0x7fb8060afea0) 0
+ vptr=((& QAbstractState::_ZTV14QAbstractState) + 16)
+ QObject (0x0x7fb8061e81e0) 0
+ primary-for QAbstractState (0x0x7fb8060afea0)
+
+Class QAbstractTransition::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAbstractTransition::QPrivateSignal (0x0x7fb8061e8480) 0 empty
+
+Vtable for QAbstractTransition
+QAbstractTransition::_ZTV19QAbstractTransition: 16 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI19QAbstractTransition)
+16 (int (*)(...))QAbstractTransition::metaObject
+24 (int (*)(...))QAbstractTransition::qt_metacast
+32 (int (*)(...))QAbstractTransition::qt_metacall
+40 0
+48 0
+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 (0x0x7fb8060aff08) 0
+ vptr=((& QAbstractTransition::_ZTV19QAbstractTransition) + 16)
+ QObject (0x0x7fb8061e8420) 0
+ primary-for QAbstractTransition (0x0x7fb8060aff08)
+
+Class QAnimationGroup::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QAnimationGroup::QPrivateSignal (0x0x7fb8061e8780) 0 empty
+
+Vtable for QAnimationGroup
+QAnimationGroup::_ZTV15QAnimationGroup: 18 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI15QAnimationGroup)
+16 (int (*)(...))QAnimationGroup::metaObject
+24 (int (*)(...))QAnimationGroup::qt_metacast
+32 (int (*)(...))QAnimationGroup::qt_metacall
+40 0
+48 0
+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 (0x0x7fb8060aff70) 0
+ vptr=((& QAnimationGroup::_ZTV15QAnimationGroup) + 16)
+ QAbstractAnimation (0x0x7fb80621e000) 0
+ primary-for QAnimationGroup (0x0x7fb8060aff70)
+ QObject (0x0x7fb8061e8720) 0
+ primary-for QAbstractAnimation (0x0x7fb80621e000)
+
+Class QBasicTimer
+ size=4 align=4
+ base size=4 base align=4
+QBasicTimer (0x0x7fb805e6aa80) 0
+
+Class QBitArray
+ size=8 align=8
+ base size=8 base align=8
+QBitArray (0x0x7fb805f00420) 0
+
+Class QBitRef
+ size=16 align=8
+ base size=12 base align=8
+QBitRef (0x0x7fb805f548a0) 0
+
+Class QIODevice::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QIODevice::QPrivateSignal (0x0x7fb805fa7b40) 0 empty
+
+Vtable for QIODevice
+QIODevice::_ZTV9QIODevice: 30 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI9QIODevice)
+16 (int (*)(...))QIODevice::metaObject
+24 (int (*)(...))QIODevice::qt_metacast
+32 (int (*)(...))QIODevice::qt_metacall
+40 0
+48 0
+56 (int (*)(...))QObject::event
+64 (int (*)(...))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 (0x0x7fb805fb45b0) 0
+ vptr=((& QIODevice::_ZTV9QIODevice) + 16)
+ QObject (0x0x7fb805fa7ae0) 0
+ primary-for QIODevice (0x0x7fb805fb45b0)
+
+Class QBuffer::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QBuffer::QPrivateSignal (0x0x7fb805ff04e0) 0 empty
+
+Vtable for QBuffer
+QBuffer::_ZTV7QBuffer: 30 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 (0x0x7fb805fb46e8) 0
+ vptr=((& QBuffer::_ZTV7QBuffer) + 16)
+ QIODevice (0x0x7fb805fb4750) 0
+ primary-for QBuffer (0x0x7fb805fb46e8)
+ QObject (0x0x7fb805ff0480) 0
+ primary-for QIODevice (0x0x7fb805fb4750)
+
+Class QByteArrayMatcher::Data
+ size=272 align=8
+ base size=272 base align=8
+QByteArrayMatcher::Data (0x0x7fb805ff0780) 0
+
+Class QByteArrayMatcher
+ size=1040 align=8
+ base size=1040 base align=8
+QByteArrayMatcher (0x0x7fb805ff0720) 0
+
+Class QStaticByteArrayMatcherBase::Skiptable
+ size=256 align=1
+ base size=256 base align=1
+QStaticByteArrayMatcherBase::Skiptable (0x0x7fb805ff0900) 0
+
+Class QStaticByteArrayMatcherBase
+ size=256 align=16
+ base size=256 base align=16
+QStaticByteArrayMatcherBase (0x0x7fb805ff08a0) 0
+
+Class QSharedData
+ size=4 align=4
+ base size=4 base align=4
+QSharedData (0x0x7fb8060437e0) 0
+
+Class QLocale
+ size=8 align=8
+ base size=8 base align=8
+QLocale (0x0x7fb805c866c0) 0
+
+Class QCalendar::YearMonthDay
+ size=12 align=4
+ base size=12 base align=4
+QCalendar::YearMonthDay (0x0x7fb805de0ba0) 0
+
+Class QCalendar
+ size=8 align=8
+ base size=8 base align=8
+QCalendar (0x0x7fb805de0b40) 0
+
+Class QDate
+ size=8 align=8
+ base size=8 base align=8
+QDate (0x0x7fb805e2a3c0) 0
+
+Class QTime
+ size=4 align=4
+ base size=4 base align=4
+QTime (0x0x7fb805a81c60) 0
+
+Class QDateTime::ShortData
+ size=8 align=8
+ base size=8 base align=8
+QDateTime::ShortData (0x0x7fb805aed900) 0
+
+Class QDateTime::Data
+ size=8 align=8
+ base size=8 base align=8
+QDateTime::Data (0x0x7fb805aed960) 0
+
+Class QDateTime
+ size=8 align=8
+ base size=8 base align=8
+QDateTime (0x0x7fb805aed8a0) 0
+
+Vtable for QTextStream
+QTextStream::_ZTV11QTextStream: 4 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 (0x0x7fb805bdc060) 0
+ vptr=((& QTextStream::_ZTV11QTextStream) + 16)
+
+Class QTextStreamManipulator
+ size=40 align=8
+ base size=38 base align=8
+QTextStreamManipulator (0x0x7fb805bdc900) 0
+
+Class QContiguousCacheData
+ size=24 align=4
+ base size=24 base align=4
+QContiguousCacheData (0x0x7fb8058b45a0) 0
+
+Vtable for __gnu_cxx::__concurrence_lock_error
+__gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE: 5 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 (0x0x7fb805bd3750) 0 nearly-empty
+ vptr=((& __gnu_cxx::__concurrence_lock_error::_ZTVN9__gnu_cxx24__concurrence_lock_errorE) + 16)
+ std::exception (0x0x7fb805903420) 0 nearly-empty
+ primary-for __gnu_cxx::__concurrence_lock_error (0x0x7fb805bd3750)
+
+Vtable for __gnu_cxx::__concurrence_unlock_error
+__gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE: 5 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 (0x0x7fb805bd37b8) 0 nearly-empty
+ vptr=((& __gnu_cxx::__concurrence_unlock_error::_ZTVN9__gnu_cxx26__concurrence_unlock_errorE) + 16)
+ std::exception (0x0x7fb805903540) 0 nearly-empty
+ primary-for __gnu_cxx::__concurrence_unlock_error (0x0x7fb805bd37b8)
+
+Vtable for __gnu_cxx::__concurrence_broadcast_error
+__gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE: 5 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 (0x0x7fb805bd3820) 0 nearly-empty
+ vptr=((& __gnu_cxx::__concurrence_broadcast_error::_ZTVN9__gnu_cxx29__concurrence_broadcast_errorE) + 16)
+ std::exception (0x0x7fb805903660) 0 nearly-empty
+ primary-for __gnu_cxx::__concurrence_broadcast_error (0x0x7fb805bd3820)
+
+Vtable for __gnu_cxx::__concurrence_wait_error
+__gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE: 5 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 (0x0x7fb805bd38f0) 0 nearly-empty
+ vptr=((& __gnu_cxx::__concurrence_wait_error::_ZTVN9__gnu_cxx24__concurrence_wait_errorE) + 16)
+ std::exception (0x0x7fb805903780) 0 nearly-empty
+ primary-for __gnu_cxx::__concurrence_wait_error (0x0x7fb805bd38f0)
+
+Class __gnu_cxx::__mutex
+ size=40 align=8
+ base size=40 base align=8
+__gnu_cxx::__mutex (0x0x7fb8059277e0) 0
+
+Class __gnu_cxx::__recursive_mutex
+ size=40 align=8
+ base size=40 base align=8
+__gnu_cxx::__recursive_mutex (0x0x7fb805927ae0) 0
+
+Class __gnu_cxx::__scoped_lock
+ size=8 align=8
+ base size=8 base align=8
+__gnu_cxx::__scoped_lock (0x0x7fb805927de0) 0
+
+Class __gnu_cxx::__cond
+ size=48 align=8
+ base size=48 base align=8
+__gnu_cxx::__cond (0x0x7fb80594e180) 0
+
+Vtable for std::bad_weak_ptr
+std::bad_weak_ptr::_ZTVSt12bad_weak_ptr: 5 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 (0x0x7fb805bd3958) 0 nearly-empty
+ vptr=((& std::bad_weak_ptr::_ZTVSt12bad_weak_ptr) + 16)
+ std::exception (0x0x7fb8059c8360) 0 nearly-empty
+ primary-for std::bad_weak_ptr (0x0x7fb805bd3958)
+
+Class std::_Sp_make_shared_tag
+ size=1 align=1
+ base size=0 base align=1
+std::_Sp_make_shared_tag (0x0x7fb805a34300) 0 empty
+
+Class std::__sp_array_delete
+ size=1 align=1
+ base size=0 base align=1
+std::__sp_array_delete (0x0x7fb805a34720) 0 empty
+
+Class std::_Sp_locker
+ size=2 align=1
+ base size=2 base align=1
+std::_Sp_locker (0x0x7fb8057735a0) 0
+
+Class QtSharedPointer::NormalDeleter
+ size=1 align=1
+ base size=0 base align=1
+QtSharedPointer::NormalDeleter (0x0x7fb8057aaa80) 0 empty
+
+Class QtSharedPointer::ExternalRefCountData
+ size=16 align=8
+ base size=16 base align=8
+QtSharedPointer::ExternalRefCountData (0x0x7fb8057aac00) 0
+
+Class QtPrivate::EnableInternalData
+ size=1 align=1
+ base size=0 base align=1
+QtPrivate::EnableInternalData (0x0x7fb805833540) 0 empty
+
+Class QDebug::Stream
+ size=80 align=8
+ base size=76 base align=8
+QDebug::Stream (0x0x7fb80545bc00) 0
+
+Class QDebug
+ size=8 align=8
+ base size=8 base align=8
+QDebug (0x0x7fb80545bba0) 0
+
+Class QDebugStateSaver
+ size=8 align=8
+ base size=8 base align=8
+QDebugStateSaver (0x0x7fb8055f0540) 0
+
+Class QNoDebug
+ size=1 align=1
+ base size=0 base align=1
+QNoDebug (0x0x7fb8055f0600) 0 empty
+
+Class QCborError
+ size=4 align=4
+ base size=4 base align=4
+QCborError (0x0x7fb805270840) 0
+
+Class QRegularExpression
+ size=8 align=8
+ base size=8 base align=8
+QRegularExpression (0x0x7fb8052a8000) 0
+
+Class QRegularExpressionMatch
+ size=8 align=8
+ base size=8 base align=8
+QRegularExpressionMatch (0x0x7fb80532cea0) 0
+
+Class QRegularExpressionMatchIterator
+ size=8 align=8
+ base size=8 base align=8
+QRegularExpressionMatchIterator (0x0x7fb805392c60) 0
+
+Class QUrl
+ size=8 align=8
+ base size=8 base align=8
+QUrl (0x0x7fb8054146c0) 0
+
+Class QUuid
+ size=16 align=4
+ base size=16 base align=4
+QUuid (0x0x7fb80515c660) 0
+
+Class QCborParserError
+ size=16 align=8
+ base size=12 base align=8
+QCborParserError (0x0x7fb8051df1e0) 0
+
+Class QCborValue
+ size=24 align=8
+ base size=20 base align=8
+QCborValue (0x0x7fb8051df2a0) 0
+
+Class QCborValueRef
+ size=16 align=8
+ base size=16 base align=8
+QCborValueRef (0x0x7fb80501de40) 0
+
+Class QCborArray::Iterator
+ size=16 align=8
+ base size=16 base align=8
+QCborArray::Iterator (0x0x7fb804cd58a0) 0
+
+Class QCborArray::ConstIterator
+ size=16 align=8
+ base size=16 base align=8
+QCborArray::ConstIterator (0x0x7fb804cd5900) 0
+
+Class QCborArray
+ size=8 align=8
+ base size=8 base align=8
+QCborArray (0x0x7fb804cd5840) 0
+
+Class QCborMap::Iterator
+ size=16 align=8
+ base size=16 base align=8
+QCborMap::Iterator (0x0x7fb804e564e0) 0
+
+Class QCborMap::ConstIterator
+ size=16 align=8
+ base size=16 base align=8
+QCborMap::ConstIterator (0x0x7fb804e56540) 0
+
+Class QCborMap
+ size=8 align=8
+ base size=8 base align=8
+QCborMap (0x0x7fb804e56480) 0
+
+Class qfloat16::Wrap
+ size=2 align=2
+ base size=2 base align=2
+qfloat16::Wrap (0x0x7fb80485bcc0) 0
+
+Class qfloat16
+ size=2 align=2
+ base size=2 base align=2
+qfloat16 (0x0x7fb80485bc60) 0
+
+Class QCborStreamWriter
+ size=8 align=8
+ base size=8 base align=8
+QCborStreamWriter (0x0x7fb80493e960) 0
+
+Class QCborStreamReader
+ size=24 align=8
+ base size=20 base align=8
+QCborStreamReader (0x0x7fb8049756c0) 0
+
+Class QCollatorSortKey
+ size=8 align=8
+ base size=8 base align=8
+QCollatorSortKey (0x0x7fb8049fb7e0) 0
+
+Class QCollator
+ size=8 align=8
+ base size=8 base align=8
+QCollator (0x0x7fb8049fb9c0) 0
+
+Class QCommandLineOption
+ size=8 align=8
+ base size=8 base align=8
+QCommandLineOption (0x0x7fb804711000) 0
+
+Vtable for QEvent
+QEvent::_ZTV6QEvent: 4 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 (0x0x7fb8047ed540) 0
+ vptr=((& QEvent::_ZTV6QEvent) + 16)
+
+Vtable for QTimerEvent
+QTimerEvent::_ZTV11QTimerEvent: 4 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 (0x0x7fb8047cd3a8) 0
+ vptr=((& QTimerEvent::_ZTV11QTimerEvent) + 16)
+ QEvent (0x0x7fb8047ed900) 0
+ primary-for QTimerEvent (0x0x7fb8047cd3a8)
+
+Vtable for QChildEvent
+QChildEvent::_ZTV11QChildEvent: 4 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 (0x0x7fb8047cd410) 0
+ vptr=((& QChildEvent::_ZTV11QChildEvent) + 16)
+ QEvent (0x0x7fb8047ed9c0) 0
+ primary-for QChildEvent (0x0x7fb8047cd410)
+
+Vtable for QDynamicPropertyChangeEvent
+QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent: 4 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 (0x0x7fb8047cd958) 0
+ vptr=((& QDynamicPropertyChangeEvent::_ZTV27QDynamicPropertyChangeEvent) + 16)
+ QEvent (0x0x7fb804829060) 0
+ primary-for QDynamicPropertyChangeEvent (0x0x7fb8047cd958)
+
+Vtable for QDeferredDeleteEvent
+QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent: 4 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 (0x0x7fb8047cd9c0) 0
+ vptr=((& QDeferredDeleteEvent::_ZTV20QDeferredDeleteEvent) + 16)
+ QEvent (0x0x7fb804829120) 0
+ primary-for QDeferredDeleteEvent (0x0x7fb8047cd9c0)
+
+Class QCoreApplication::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QCoreApplication::QPrivateSignal (0x0x7fb804829240) 0 empty
+
+Vtable for QCoreApplication
+QCoreApplication::_ZTV16QCoreApplication: 16 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 (0x0x7fb8047cda28) 0
+ vptr=((& QCoreApplication::_ZTV16QCoreApplication) + 16)
+ QObject (0x0x7fb8048291e0) 0
+ primary-for QCoreApplication (0x0x7fb8047cda28)
+
+Class QCommandLineParser
+ size=8 align=8
+ base size=8 base align=8
+QCommandLineParser (0x0x7fb804829480) 0
+
+Class QConcatenateTablesProxyModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QConcatenateTablesProxyModel::QPrivateSignal (0x0x7fb804829600) 0 empty
+
+Vtable for QConcatenateTablesProxyModel
+QConcatenateTablesProxyModel::_ZTV28QConcatenateTablesProxyModel: 48 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI28QConcatenateTablesProxyModel)
+16 (int (*)(...))QConcatenateTablesProxyModel::metaObject
+24 (int (*)(...))QConcatenateTablesProxyModel::qt_metacast
+32 (int (*)(...))QConcatenateTablesProxyModel::qt_metacall
+40 (int (*)(...))QConcatenateTablesProxyModel::~QConcatenateTablesProxyModel
+48 (int (*)(...))QConcatenateTablesProxyModel::~QConcatenateTablesProxyModel
+56 (int (*)(...))QObject::event
+64 (int (*)(...))QObject::eventFilter
+72 (int (*)(...))QObject::timerEvent
+80 (int (*)(...))QObject::childEvent
+88 (int (*)(...))QObject::customEvent
+96 (int (*)(...))QObject::connectNotify
+104 (int (*)(...))QObject::disconnectNotify
+112 (int (*)(...))QConcatenateTablesProxyModel::index
+120 (int (*)(...))QConcatenateTablesProxyModel::parent
+128 (int (*)(...))QAbstractItemModel::sibling
+136 (int (*)(...))QConcatenateTablesProxyModel::rowCount
+144 (int (*)(...))QConcatenateTablesProxyModel::columnCount
+152 (int (*)(...))QAbstractItemModel::hasChildren
+160 (int (*)(...))QConcatenateTablesProxyModel::data
+168 (int (*)(...))QConcatenateTablesProxyModel::setData
+176 (int (*)(...))QConcatenateTablesProxyModel::headerData
+184 (int (*)(...))QAbstractItemModel::setHeaderData
+192 (int (*)(...))QConcatenateTablesProxyModel::itemData
+200 (int (*)(...))QConcatenateTablesProxyModel::setItemData
+208 (int (*)(...))QConcatenateTablesProxyModel::mimeTypes
+216 (int (*)(...))QConcatenateTablesProxyModel::mimeData
+224 (int (*)(...))QConcatenateTablesProxyModel::canDropMimeData
+232 (int (*)(...))QConcatenateTablesProxyModel::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 (*)(...))QConcatenateTablesProxyModel::flags
+328 (int (*)(...))QAbstractItemModel::sort
+336 (int (*)(...))QAbstractItemModel::buddy
+344 (int (*)(...))QAbstractItemModel::match
+352 (int (*)(...))QConcatenateTablesProxyModel::span
+360 (int (*)(...))QAbstractItemModel::roleNames
+368 (int (*)(...))QAbstractItemModel::submit
+376 (int (*)(...))QAbstractItemModel::revert
+
+Class QConcatenateTablesProxyModel
+ size=16 align=8
+ base size=16 base align=8
+QConcatenateTablesProxyModel (0x0x7fb8047cda90) 0
+ vptr=((& QConcatenateTablesProxyModel::_ZTV28QConcatenateTablesProxyModel) + 16)
+ QAbstractItemModel (0x0x7fb8047cdaf8) 0
+ primary-for QConcatenateTablesProxyModel (0x0x7fb8047cda90)
+ QObject (0x0x7fb8048295a0) 0
+ primary-for QAbstractItemModel (0x0x7fb8047cdaf8)
+
+Class QCryptographicHash
+ size=8 align=8
+ base size=8 base align=8
+QCryptographicHash (0x0x7fb8048297e0) 0
+
+Class QDataStream
+ size=32 align=8
+ base size=32 base align=8
+QDataStream (0x0x7fb804829900) 0
+
+Class QtPrivate::StreamStateSaver
+ size=16 align=8
+ base size=12 base align=8
+QtPrivate::StreamStateSaver (0x0x7fb804829a80) 0
+
+Class QElapsedTimer
+ size=16 align=8
+ base size=16 base align=8
+QElapsedTimer (0x0x7fb8044ef1e0) 0
+
+Class QDeadlineTimer
+ size=16 align=8
+ base size=16 base align=8
+QDeadlineTimer (0x0x7fb8044ef900) 0
+
+Class QFileDevice::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QFileDevice::QPrivateSignal (0x0x7fb804630600) 0 empty
+
+Vtable for QFileDevice
+QFileDevice::_ZTV11QFileDevice: 34 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 (0x0x7fb804620d00) 0
+ vptr=((& QFileDevice::_ZTV11QFileDevice) + 16)
+ QIODevice (0x0x7fb804620d68) 0
+ primary-for QFileDevice (0x0x7fb804620d00)
+ QObject (0x0x7fb8046305a0) 0
+ primary-for QIODevice (0x0x7fb804620d68)
+
+Class QFile::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QFile::QPrivateSignal (0x0x7fb804630f00) 0 empty
+
+Vtable for QFile
+QFile::_ZTV5QFile: 34 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 (0x0x7fb804620ea0) 0
+ vptr=((& QFile::_ZTV5QFile) + 16)
+ QFileDevice (0x0x7fb804620f08) 0
+ primary-for QFile (0x0x7fb804620ea0)
+ QIODevice (0x0x7fb804620f70) 0
+ primary-for QFileDevice (0x0x7fb804620f08)
+ QObject (0x0x7fb804630ea0) 0
+ primary-for QIODevice (0x0x7fb804620f70)
+
+Class QFileInfo
+ size=8 align=8
+ base size=8 base align=8
+QFileInfo (0x0x7fb8042955a0) 0
+
+Class QDir
+ size=8 align=8
+ base size=8 base align=8
+QDir (0x0x7fb804372480) 0
+
+Class QDirIterator
+ size=8 align=8
+ base size=8 base align=8
+QDirIterator (0x0x7fb804089480) 0
+
+Class QEasingCurve
+ size=8 align=8
+ base size=8 base align=8
+QEasingCurve (0x0x7fb804089c00) 0
+
+Class QEventTransition::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QEventTransition::QPrivateSignal (0x0x7fb8041c7d20) 0 empty
+
+Vtable for QEventTransition
+QEventTransition::_ZTV16QEventTransition: 16 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 (0x0x7fb80418dc30) 0
+ vptr=((& QEventTransition::_ZTV16QEventTransition) + 16)
+ QAbstractTransition (0x0x7fb80418dc98) 0
+ primary-for QEventTransition (0x0x7fb80418dc30)
+ QObject (0x0x7fb8041c7cc0) 0
+ primary-for QAbstractTransition (0x0x7fb80418dc98)
+
+Vtable for QException
+QException::_ZTV10QException: 7 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 (0x0x7fb80418dd00) 0 nearly-empty
+ vptr=((& QException::_ZTV10QException) + 16)
+ std::exception (0x0x7fb8041c7f00) 0 nearly-empty
+ primary-for QException (0x0x7fb80418dd00)
+
+Vtable for QUnhandledException
+QUnhandledException::_ZTV19QUnhandledException: 7 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 (0x0x7fb80418dd68) 0 nearly-empty
+ vptr=((& QUnhandledException::_ZTV19QUnhandledException) + 16)
+ QException (0x0x7fb80418ddd0) 0 nearly-empty
+ primary-for QUnhandledException (0x0x7fb80418dd68)
+ std::exception (0x0x7fb8041c7f60) 0 nearly-empty
+ primary-for QException (0x0x7fb80418ddd0)
+
+Class QtPrivate::ExceptionHolder
+ size=8 align=8
+ base size=8 base align=8
+QtPrivate::ExceptionHolder (0x0x7fb8041fe000) 0
+
+Class QtPrivate::ExceptionStore
+ size=8 align=8
+ base size=8 base align=8
+QtPrivate::ExceptionStore (0x0x7fb8041fe0c0) 0
+
+Vtable for QFactoryInterface
+QFactoryInterface::_ZTV17QFactoryInterface: 5 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI17QFactoryInterface)
+16 0
+24 0
+32 (int (*)(...))__cxa_pure_virtual
+
+Class QFactoryInterface
+ size=8 align=8
+ base size=8 base align=8
+QFactoryInterface (0x0x7fb8041fe120) 0 nearly-empty
+ vptr=((& QFactoryInterface::_ZTV17QFactoryInterface) + 16)
+
+Class QFileSelector::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QFileSelector::QPrivateSignal (0x0x7fb8041fe360) 0 empty
+
+Vtable for QFileSelector
+QFileSelector::_ZTV13QFileSelector: 14 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 (0x0x7fb80418de38) 0
+ vptr=((& QFileSelector::_ZTV13QFileSelector) + 16)
+ QObject (0x0x7fb8041fe300) 0
+ primary-for QFileSelector (0x0x7fb80418de38)
+
+Class QFileSystemWatcher::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QFileSystemWatcher::QPrivateSignal (0x0x7fb8041fe5a0) 0 empty
+
+Vtable for QFileSystemWatcher
+QFileSystemWatcher::_ZTV18QFileSystemWatcher: 14 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 (0x0x7fb80418dea0) 0
+ vptr=((& QFileSystemWatcher::_ZTV18QFileSystemWatcher) + 16)
+ QObject (0x0x7fb8041fe540) 0
+ primary-for QFileSystemWatcher (0x0x7fb80418dea0)
+
+Class QFinalState::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QFinalState::QPrivateSignal (0x0x7fb8041fe7e0) 0 empty
+
+Vtable for QFinalState
+QFinalState::_ZTV11QFinalState: 16 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 (0x0x7fb80418df08) 0
+ vptr=((& QFinalState::_ZTV11QFinalState) + 16)
+ QAbstractState (0x0x7fb80418df70) 0
+ primary-for QFinalState (0x0x7fb80418df08)
+ QObject (0x0x7fb8041fe780) 0
+ primary-for QAbstractState (0x0x7fb80418df70)
+
+Vtable for QRunnable
+QRunnable::_ZTV9QRunnable: 5 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI9QRunnable)
+16 (int (*)(...))__cxa_pure_virtual
+24 0
+32 0
+
+Class QRunnable
+ size=16 align=8
+ base size=12 base align=8
+QRunnable (0x0x7fb8041fe9c0) 0
+ vptr=((& QRunnable::_ZTV9QRunnable) + 16)
+
+Class QBasicMutex
+ size=8 align=8
+ base size=8 base align=8
+QBasicMutex (0x0x7fb8041fec60) 0
+
+Class QMutex
+ size=8 align=8
+ base size=8 base align=8
+QMutex (0x0x7fb803e34068) 0
+ QBasicMutex (0x0x7fb803e6d900) 0
+
+Class QRecursiveMutex
+ size=8 align=8
+ base size=8 base align=8
+QRecursiveMutex (0x0x7fb803e340d0) 0
+ QMutex (0x0x7fb803e34138) 0
+ QBasicMutex (0x0x7fb803e6db40) 0
+
+Class QMutexLocker
+ size=8 align=8
+ base size=8 base align=8
+QMutexLocker (0x0x7fb803e6dba0) 0
+
+Class QtPrivate::ResultItem
+ size=16 align=8
+ base size=16 base align=8
+QtPrivate::ResultItem (0x0x7fb803e941e0) 0
+
+Class QtPrivate::ResultIteratorBase
+ size=16 align=8
+ base size=12 base align=8
+QtPrivate::ResultIteratorBase (0x0x7fb803e947e0) 0
+
+Vtable for QtPrivate::ResultStoreBase
+QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE: 4 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 (0x0x7fb803e949c0) 0
+ vptr=((& QtPrivate::ResultStoreBase::_ZTVN9QtPrivate15ResultStoreBaseE) + 16)
+
+Class std::__mutex_base
+ size=40 align=8
+ base size=40 base align=8
+std::__mutex_base (0x0x7fb803f281e0) 0
+
+Class std::mutex
+ size=40 align=8
+ base size=40 base align=8
+std::mutex (0x0x7fb803f13a28) 0
+ std::__mutex_base (0x0x7fb803f28240) 0
+
+Class std::defer_lock_t
+ size=1 align=1
+ base size=0 base align=1
+std::defer_lock_t (0x0x7fb803f28420) 0 empty
+
+Class std::try_to_lock_t
+ size=1 align=1
+ base size=0 base align=1
+std::try_to_lock_t (0x0x7fb803f28480) 0 empty
+
+Class std::adopt_lock_t
+ size=1 align=1
+ base size=0 base align=1
+std::adopt_lock_t (0x0x7fb803f284e0) 0 empty
+
+Class std::__recursive_mutex_base
+ size=40 align=8
+ base size=40 base align=8
+std::__recursive_mutex_base (0x0x7fb803f28f00) 0
+
+Class std::recursive_mutex
+ size=40 align=8
+ base size=40 base align=8
+std::recursive_mutex (0x0x7fb803f13a90) 0
+ std::__recursive_mutex_base (0x0x7fb803f28f60) 0
+
+Class std::timed_mutex
+ size=40 align=8
+ base size=40 base align=8
+std::timed_mutex (0x0x7fb803f33af0) 0
+ std::__mutex_base (0x0x7fb803f64360) 0
+ std::__timed_mutex_impl<std::timed_mutex> (0x0x7fb803f643c0) 0 empty
+
+Class std::recursive_timed_mutex
+ size=40 align=8
+ base size=40 base align=8
+std::recursive_timed_mutex (0x0x7fb803f33e70) 0
+ std::__recursive_mutex_base (0x0x7fb803f64720) 0
+ std::__timed_mutex_impl<std::recursive_timed_mutex> (0x0x7fb803f64780) 0 empty
+
+Class std::once_flag
+ size=4 align=4
+ base size=4 base align=4
+std::once_flag (0x0x7fb803f64ea0) 0
+
+Vtable for QFutureInterfaceBase
+QFutureInterfaceBase::_ZTV20QFutureInterfaceBase: 4 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 (0x0x7fb803fab120) 0
+ vptr=((& QFutureInterfaceBase::_ZTV20QFutureInterfaceBase) + 16)
+
+Class QFutureWatcherBase::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QFutureWatcherBase::QPrivateSignal (0x0x7fb803c53480) 0 empty
+
+Vtable for QFutureWatcherBase
+QFutureWatcherBase::_ZTV18QFutureWatcherBase: 16 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI18QFutureWatcherBase)
+16 (int (*)(...))QFutureWatcherBase::metaObject
+24 (int (*)(...))QFutureWatcherBase::qt_metacast
+32 (int (*)(...))QFutureWatcherBase::qt_metacall
+40 0
+48 0
+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 (0x0x7fb803fd9888) 0
+ vptr=((& QFutureWatcherBase::_ZTV18QFutureWatcherBase) + 16)
+ QObject (0x0x7fb803c53420) 0
+ primary-for QFutureWatcherBase (0x0x7fb803fd9888)
+
+Class QHistoryState::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QHistoryState::QPrivateSignal (0x0x7fb803c7d7e0) 0 empty
+
+Vtable for QHistoryState
+QHistoryState::_ZTV13QHistoryState: 16 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 (0x0x7fb803c890d0) 0
+ vptr=((& QHistoryState::_ZTV13QHistoryState) + 16)
+ QAbstractState (0x0x7fb803c89138) 0
+ primary-for QHistoryState (0x0x7fb803c890d0)
+ QObject (0x0x7fb803c7d780) 0
+ primary-for QAbstractState (0x0x7fb803c89138)
+
+Class QIdentityProxyModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QIdentityProxyModel::QPrivateSignal (0x0x7fb803c7dae0) 0 empty
+
+Vtable for QIdentityProxyModel
+QIdentityProxyModel::_ZTV19QIdentityProxyModel: 53 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 (0x0x7fb803c891a0) 0
+ vptr=((& QIdentityProxyModel::_ZTV19QIdentityProxyModel) + 16)
+ QAbstractProxyModel (0x0x7fb803c89208) 0
+ primary-for QIdentityProxyModel (0x0x7fb803c891a0)
+ QAbstractItemModel (0x0x7fb803c89270) 0
+ primary-for QAbstractProxyModel (0x0x7fb803c89208)
+ QObject (0x0x7fb803c7da80) 0
+ primary-for QAbstractItemModel (0x0x7fb803c89270)
+
+Class QItemSelectionRange
+ size=16 align=8
+ base size=16 base align=8
+QItemSelectionRange (0x0x7fb803c7dcc0) 0
+
+Class QItemSelectionModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QItemSelectionModel::QPrivateSignal (0x0x7fb803d64600) 0 empty
+
+Vtable for QItemSelectionModel
+QItemSelectionModel::_ZTV19QItemSelectionModel: 20 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 (0x0x7fb803d59bc8) 0
+ vptr=((& QItemSelectionModel::_ZTV19QItemSelectionModel) + 16)
+ QObject (0x0x7fb803d645a0) 0
+ primary-for QItemSelectionModel (0x0x7fb803d59bc8)
+
+Class QItemSelection
+ size=8 align=8
+ base size=8 base align=8
+QItemSelection (0x0x7fb803d59d68) 0
+ QList<QItemSelectionRange> (0x0x7fb803d59dd0) 0
+ QListSpecialMethods<QItemSelectionRange> (0x0x7fb803dab120) 0 empty
+
+Class QJsonValue
+ size=24 align=8
+ base size=20 base align=8
+QJsonValue (0x0x7fb803e12a20) 0
+
+Class QJsonValueRef
+ size=16 align=8
+ base size=12 base align=8
+QJsonValueRef (0x0x7fb803b696c0) 0
+
+Class QJsonValuePtr
+ size=24 align=8
+ base size=24 base align=8
+QJsonValuePtr (0x0x7fb803bba660) 0
+
+Class QJsonValueRefPtr
+ size=16 align=8
+ base size=16 base align=8
+QJsonValueRefPtr (0x0x7fb803bba900) 0
+
+Class QJsonArray::iterator
+ size=16 align=8
+ base size=12 base align=8
+QJsonArray::iterator (0x0x7fb803bfdc60) 0
+
+Class QJsonArray::const_iterator
+ size=16 align=8
+ base size=12 base align=8
+QJsonArray::const_iterator (0x0x7fb803bfdcc0) 0
+
+Class QJsonArray
+ size=16 align=8
+ base size=16 base align=8
+QJsonArray (0x0x7fb803bfdc00) 0
+
+Class QJsonParseError
+ size=8 align=4
+ base size=8 base align=4
+QJsonParseError (0x0x7fb80392aba0) 0
+
+Class QJsonDocument
+ size=8 align=8
+ base size=8 base align=8
+QJsonDocument (0x0x7fb80392ac00) 0
+
+Class QJsonObject::iterator
+ size=16 align=8
+ base size=12 base align=8
+QJsonObject::iterator (0x0x7fb803998420) 0
+
+Class QJsonObject::const_iterator
+ size=16 align=8
+ base size=12 base align=8
+QJsonObject::const_iterator (0x0x7fb803998480) 0
+
+Class QJsonObject
+ size=16 align=8
+ base size=16 base align=8
+QJsonObject (0x0x7fb8039983c0) 0
+
+Class QLibrary::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QLibrary::QPrivateSignal (0x0x7fb8036bc8a0) 0 empty
+
+Vtable for QLibrary
+QLibrary::_ZTV8QLibrary: 14 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 (0x0x7fb8036b6a28) 0
+ vptr=((& QLibrary::_ZTV8QLibrary) + 16)
+ QObject (0x0x7fb8036bc840) 0
+ primary-for QLibrary (0x0x7fb8036b6a28)
+
+Class QVersionNumber::SegmentStorage
+ size=8 align=8
+ base size=8 base align=8
+QVersionNumber::SegmentStorage (0x0x7fb8036ff720) 0
+
+Class QVersionNumber
+ size=8 align=8
+ base size=8 base align=8
+QVersionNumber (0x0x7fb8036ff240) 0
+
+Class QLibraryInfo
+ size=1 align=1
+ base size=0 base align=1
+QLibraryInfo (0x0x7fb80379aea0) 0 empty
+
+Class QPoint
+ size=8 align=4
+ base size=8 base align=4
+QPoint (0x0x7fb80379af00) 0
+
+Class QPointF
+ size=16 align=8
+ base size=16 base align=8
+QPointF (0x0x7fb803811d80) 0
+
+Class QLine
+ size=16 align=4
+ base size=16 base align=4
+QLine (0x0x7fb803482f60) 0
+
+Class QLineF
+ size=32 align=8
+ base size=32 base align=8
+QLineF (0x0x7fb803512360) 0
+
+Class QLinkedListData
+ size=32 align=8
+ base size=25 base align=8
+QLinkedListData (0x0x7fb803589600) 0
+
+Class QLockFile
+ size=8 align=8
+ base size=8 base align=8
+QLockFile (0x0x7fb803233b40) 0
+
+Class QLoggingCategory::AtomicBools
+ size=4 align=1
+ base size=4 base align=1
+QLoggingCategory::AtomicBools (0x0x7fb803233d80) 0
+
+Class QLoggingCategory
+ size=24 align=8
+ base size=24 base align=8
+QLoggingCategory (0x0x7fb803233d20) 0
+
+Class QMargins
+ size=16 align=4
+ base size=16 base align=4
+QMargins (0x0x7fb8032a41e0) 0
+
+Class QMarginsF
+ size=32 align=8
+ base size=32 base align=8
+QMarginsF (0x0x7fb803323120) 0
+
+Class QMessageAuthenticationCode
+ size=8 align=8
+ base size=8 base align=8
+QMessageAuthenticationCode (0x0x7fb80315c900) 0
+
+Class QMetaMethod
+ size=16 align=8
+ base size=12 base align=8
+QMetaMethod (0x0x7fb80315c960) 0
+
+Class QMetaEnum
+ size=16 align=8
+ base size=12 base align=8
+QMetaEnum (0x0x7fb8031e31e0) 0
+
+Class QMetaProperty
+ size=32 align=8
+ base size=32 base align=8
+QMetaProperty (0x0x7fb802da63c0) 0
+
+Class QMetaClassInfo
+ size=16 align=8
+ base size=12 base align=8
+QMetaClassInfo (0x0x7fb802da64e0) 0
+
+Class QMimeData::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QMimeData::QPrivateSignal (0x0x7fb802de5a80) 0 empty
+
+Vtable for QMimeData
+QMimeData::_ZTV9QMimeData: 17 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 (0x0x7fb802dec680) 0
+ vptr=((& QMimeData::_ZTV9QMimeData) + 16)
+ QObject (0x0x7fb802de5a20) 0
+ primary-for QMimeData (0x0x7fb802dec680)
+
+Class QMimeType
+ size=8 align=8
+ base size=8 base align=8
+QMimeType (0x0x7fb802de5c60) 0
+
+Class QMimeDatabase
+ size=8 align=8
+ base size=8 base align=8
+QMimeDatabase (0x0x7fb802eb1ba0) 0
+
+Class QObjectCleanupHandler::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QObjectCleanupHandler::QPrivateSignal (0x0x7fb802eb1c60) 0 empty
+
+Vtable for QObjectCleanupHandler
+QObjectCleanupHandler::_ZTV21QObjectCleanupHandler: 14 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 (0x0x7fb802ec4208) 0
+ vptr=((& QObjectCleanupHandler::_ZTV21QObjectCleanupHandler) + 16)
+ QObject (0x0x7fb802eb1c00) 0
+ primary-for QObjectCleanupHandler (0x0x7fb802ec4208)
+
+Class QOperatingSystemVersion
+ size=16 align=4
+ base size=16 base align=4
+QOperatingSystemVersion (0x0x7fb802eb1d80) 0
+
+Class QParallelAnimationGroup::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QParallelAnimationGroup::QPrivateSignal (0x0x7fb802f3f540) 0 empty
+
+Vtable for QParallelAnimationGroup
+QParallelAnimationGroup::_ZTV23QParallelAnimationGroup: 18 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 (0x0x7fb802f3ca90) 0
+ vptr=((& QParallelAnimationGroup::_ZTV23QParallelAnimationGroup) + 16)
+ QAnimationGroup (0x0x7fb802f3caf8) 0
+ primary-for QParallelAnimationGroup (0x0x7fb802f3ca90)
+ QAbstractAnimation (0x0x7fb802f3cb60) 0
+ primary-for QAnimationGroup (0x0x7fb802f3caf8)
+ QObject (0x0x7fb802f3f4e0) 0
+ primary-for QAbstractAnimation (0x0x7fb802f3cb60)
+
+Class QPauseAnimation::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QPauseAnimation::QPrivateSignal (0x0x7fb802f3f780) 0 empty
+
+Vtable for QPauseAnimation
+QPauseAnimation::_ZTV15QPauseAnimation: 18 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 (0x0x7fb802f3cbc8) 0
+ vptr=((& QPauseAnimation::_ZTV15QPauseAnimation) + 16)
+ QAbstractAnimation (0x0x7fb802f3cc30) 0
+ primary-for QPauseAnimation (0x0x7fb802f3cbc8)
+ QObject (0x0x7fb802f3f720) 0
+ primary-for QAbstractAnimation (0x0x7fb802f3cc30)
+
+Class QStaticPlugin
+ size=16 align=8
+ base size=16 base align=8
+QStaticPlugin (0x0x7fb802f78300) 0
+
+Class QPluginLoader::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QPluginLoader::QPrivateSignal (0x0x7fb802bb6480) 0 empty
+
+Vtable for QPluginLoader
+QPluginLoader::_ZTV13QPluginLoader: 14 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 (0x0x7fb802ba6f70) 0
+ vptr=((& QPluginLoader::_ZTV13QPluginLoader) + 16)
+ QObject (0x0x7fb802bb6420) 0
+ primary-for QPluginLoader (0x0x7fb802ba6f70)
+
+Class QProcessEnvironment
+ size=8 align=8
+ base size=8 base align=8
+QProcessEnvironment (0x0x7fb802bb65a0) 0
+
+Class QProcess::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QProcess::QPrivateSignal (0x0x7fb802c88a20) 0 empty
+
+Vtable for QProcess
+QProcess::_ZTV8QProcess: 31 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 (0x0x7fb802c8e410) 0
+ vptr=((& QProcess::_ZTV8QProcess) + 16)
+ QIODevice (0x0x7fb802c8e478) 0
+ primary-for QProcess (0x0x7fb802c8e410)
+ QObject (0x0x7fb802c889c0) 0
+ primary-for QIODevice (0x0x7fb802c8e478)
+
+Class QVariantAnimation::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QVariantAnimation::QPrivateSignal (0x0x7fb802cc6120) 0 empty
+
+Vtable for QVariantAnimation
+QVariantAnimation::_ZTV17QVariantAnimation: 20 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 (0x0x7fb802c8e4e0) 0
+ vptr=((& QVariantAnimation::_ZTV17QVariantAnimation) + 16)
+ QAbstractAnimation (0x0x7fb802c8e548) 0
+ primary-for QVariantAnimation (0x0x7fb802c8e4e0)
+ QObject (0x0x7fb802cc60c0) 0
+ primary-for QAbstractAnimation (0x0x7fb802c8e548)
+
+Class QPropertyAnimation::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QPropertyAnimation::QPrivateSignal (0x0x7fb802cc63c0) 0 empty
+
+Vtable for QPropertyAnimation
+QPropertyAnimation::_ZTV18QPropertyAnimation: 20 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 (0x0x7fb802c8e618) 0
+ vptr=((& QPropertyAnimation::_ZTV18QPropertyAnimation) + 16)
+ QVariantAnimation (0x0x7fb802c8e680) 0
+ primary-for QPropertyAnimation (0x0x7fb802c8e618)
+ QAbstractAnimation (0x0x7fb802c8e6e8) 0
+ primary-for QVariantAnimation (0x0x7fb802c8e680)
+ QObject (0x0x7fb802cc6360) 0
+ primary-for QAbstractAnimation (0x0x7fb802c8e6e8)
+
+Class std::random_device
+ size=5000 align=8
+ base size=5000 base align=8
+std::random_device (0x0x7fb802d4dae0) 0
+
+Class std::bernoulli_distribution::param_type
+ size=8 align=8
+ base size=8 base align=8
+std::bernoulli_distribution::param_type (0x0x7fb802a44840) 0
+
+Class std::bernoulli_distribution
+ size=8 align=8
+ base size=8 base align=8
+std::bernoulli_distribution (0x0x7fb802a447e0) 0
+
+Class std::seed_seq
+ size=24 align=8
+ base size=24 base align=8
+std::seed_seq (0x0x7fb80284b5a0) 0
+
+Class QRandomGenerator::Storage
+ size=2504 align=8
+ base size=2504 base align=8
+QRandomGenerator::Storage (0x0x7fb80267f240) 0
+
+Class QRandomGenerator
+ size=2512 align=8
+ base size=2512 base align=8
+QRandomGenerator (0x0x7fb80267f1e0) 0
+
+Class QRandomGenerator64
+ size=2512 align=8
+ base size=2512 base align=8
+QRandomGenerator64 (0x0x7fb8027003a8) 0
+ QRandomGenerator (0x0x7fb8026f8d20) 0
+
+Class QReadWriteLock
+ size=8 align=8
+ base size=8 base align=8
+QReadWriteLock (0x0x7fb802724900) 0
+
+Class QReadLocker
+ size=8 align=8
+ base size=8 base align=8
+QReadLocker (0x0x7fb802724ba0) 0
+
+Class QWriteLocker
+ size=8 align=8
+ base size=8 base align=8
+QWriteLocker (0x0x7fb8023a80c0) 0
+
+Class QSize
+ size=8 align=4
+ base size=8 base align=4
+QSize (0x0x7fb8023a85a0) 0
+
+Class QSizeF
+ size=16 align=8
+ base size=16 base align=8
+QSizeF (0x0x7fb802419480) 0
+
+Class QRect
+ size=16 align=4
+ base size=16 base align=4
+QRect (0x0x7fb8024924e0) 0
+
+Class QRectF
+ size=32 align=8
+ base size=32 base align=8
+QRectF (0x0x7fb80254c540) 0
+
+Class QResource
+ size=8 align=8
+ base size=8 base align=8
+QResource (0x0x7fb802208660) 0
+
+Class QSaveFile::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QSaveFile::QPrivateSignal (0x0x7fb802208900) 0 empty
+
+Vtable for QSaveFile
+QSaveFile::_ZTV9QSaveFile: 34 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 (0x0x7fb8021b2d68) 0
+ vptr=((& QSaveFile::_ZTV9QSaveFile) + 16)
+ QFileDevice (0x0x7fb8021b2dd0) 0
+ primary-for QSaveFile (0x0x7fb8021b2d68)
+ QIODevice (0x0x7fb8021b2e38) 0
+ primary-for QFileDevice (0x0x7fb8021b2dd0)
+ QObject (0x0x7fb8022088a0) 0
+ primary-for QIODevice (0x0x7fb8021b2e38)
+
+Class QSemaphore
+ size=8 align=8
+ base size=8 base align=8
+QSemaphore (0x0x7fb802208f00) 0
+
+Class QSemaphoreReleaser
+ size=16 align=8
+ base size=12 base align=8
+QSemaphoreReleaser (0x0x7fb8022600c0) 0
+
+Class QSequentialAnimationGroup::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QSequentialAnimationGroup::QPrivateSignal (0x0x7fb80230bcc0) 0 empty
+
+Vtable for QSequentialAnimationGroup
+QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup: 18 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 (0x0x7fb80231f618) 0
+ vptr=((& QSequentialAnimationGroup::_ZTV25QSequentialAnimationGroup) + 16)
+ QAnimationGroup (0x0x7fb80231f680) 0
+ primary-for QSequentialAnimationGroup (0x0x7fb80231f618)
+ QAbstractAnimation (0x0x7fb80231f6e8) 0
+ primary-for QAnimationGroup (0x0x7fb80231f680)
+ QObject (0x0x7fb80230bc60) 0
+ primary-for QAbstractAnimation (0x0x7fb80231f6e8)
+
+Class QSettings::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QSettings::QPrivateSignal (0x0x7fb80230bf00) 0 empty
+
+Vtable for QSettings
+QSettings::_ZTV9QSettings: 14 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 (0x0x7fb80231f750) 0
+ vptr=((& QSettings::_ZTV9QSettings) + 16)
+ QObject (0x0x7fb80230bea0) 0
+ primary-for QSettings (0x0x7fb80231f750)
+
+Class QSharedMemory::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QSharedMemory::QPrivateSignal (0x0x7fb8023533c0) 0 empty
+
+Vtable for QSharedMemory
+QSharedMemory::_ZTV13QSharedMemory: 14 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 (0x0x7fb80231f7b8) 0
+ vptr=((& QSharedMemory::_ZTV13QSharedMemory) + 16)
+ QObject (0x0x7fb802353360) 0
+ primary-for QSharedMemory (0x0x7fb80231f7b8)
+
+Class QSignalMapper::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QSignalMapper::QPrivateSignal (0x0x7fb802353600) 0 empty
+
+Vtable for QSignalMapper
+QSignalMapper::_ZTV13QSignalMapper: 14 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 (0x0x7fb80231f820) 0
+ vptr=((& QSignalMapper::_ZTV13QSignalMapper) + 16)
+ QObject (0x0x7fb8023535a0) 0
+ primary-for QSignalMapper (0x0x7fb80231f820)
+
+Class QSignalTransition::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QSignalTransition::QPrivateSignal (0x0x7fb802353840) 0 empty
+
+Vtable for QSignalTransition
+QSignalTransition::_ZTV17QSignalTransition: 16 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 (0x0x7fb80231f888) 0
+ vptr=((& QSignalTransition::_ZTV17QSignalTransition) + 16)
+ QAbstractTransition (0x0x7fb80231f8f0) 0
+ primary-for QSignalTransition (0x0x7fb80231f888)
+ QObject (0x0x7fb8023537e0) 0
+ primary-for QAbstractTransition (0x0x7fb80231f8f0)
+
+Class QSocketNotifier::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QSocketNotifier::QPrivateSignal (0x0x7fb802353ae0) 0 empty
+
+Vtable for QSocketNotifier
+QSocketNotifier::_ZTV15QSocketNotifier: 14 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 (0x0x7fb80231f958) 0
+ vptr=((& QSocketNotifier::_ZTV15QSocketNotifier) + 16)
+ QObject (0x0x7fb802353a80) 0
+ primary-for QSocketNotifier (0x0x7fb80231f958)
+
+Class QSortFilterProxyModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QSortFilterProxyModel::QPrivateSignal (0x0x7fb802353d20) 0 empty
+
+Vtable for QSortFilterProxyModel
+QSortFilterProxyModel::_ZTV21QSortFilterProxyModel: 56 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 (0x0x7fb80231f9c0) 0
+ vptr=((& QSortFilterProxyModel::_ZTV21QSortFilterProxyModel) + 16)
+ QAbstractProxyModel (0x0x7fb80231fa28) 0
+ primary-for QSortFilterProxyModel (0x0x7fb80231f9c0)
+ QAbstractItemModel (0x0x7fb80231fa90) 0
+ primary-for QAbstractProxyModel (0x0x7fb80231fa28)
+ QObject (0x0x7fb802353cc0) 0
+ primary-for QAbstractItemModel (0x0x7fb80231fa90)
+
+Class QStandardPaths
+ size=1 align=1
+ base size=0 base align=1
+QStandardPaths (0x0x7fb801fc0180) 0 empty
+
+Class QState::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QState::QPrivateSignal (0x0x7fb801fc0a80) 0 empty
+
+Vtable for QState
+QState::_ZTV6QState: 16 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 (0x0x7fb80231fc30) 0
+ vptr=((& QState::_ZTV6QState) + 16)
+ QAbstractState (0x0x7fb80231fc98) 0
+ primary-for QState (0x0x7fb80231fc30)
+ QObject (0x0x7fb801fc0a20) 0
+ primary-for QAbstractState (0x0x7fb80231fc98)
+
+Class QStateMachine::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QStateMachine::QPrivateSignal (0x0x7fb801fc0f00) 0 empty
+
+Vtable for QStateMachine::SignalEvent
+QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE: 4 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 (0x0x7fb80231fe38) 0
+ vptr=((& QStateMachine::SignalEvent::_ZTVN13QStateMachine11SignalEventE) + 16)
+ QEvent (0x0x7fb801fc0f60) 0
+ primary-for QStateMachine::SignalEvent (0x0x7fb80231fe38)
+
+Vtable for QStateMachine::WrappedEvent
+QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE: 4 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 (0x0x7fb80231fea0) 0
+ vptr=((& QStateMachine::WrappedEvent::_ZTVN13QStateMachine12WrappedEventE) + 16)
+ QEvent (0x0x7fb802018000) 0
+ primary-for QStateMachine::WrappedEvent (0x0x7fb80231fea0)
+
+Vtable for QStateMachine
+QStateMachine::_ZTV13QStateMachine: 20 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 (0x0x7fb80231fd00) 0
+ vptr=((& QStateMachine::_ZTV13QStateMachine) + 16)
+ QState (0x0x7fb80231fd68) 0
+ primary-for QStateMachine (0x0x7fb80231fd00)
+ QAbstractState (0x0x7fb80231fdd0) 0
+ primary-for QState (0x0x7fb80231fd68)
+ QObject (0x0x7fb801fc0ea0) 0
+ primary-for QAbstractState (0x0x7fb80231fdd0)
+
+Class QStorageInfo
+ size=8 align=8
+ base size=8 base align=8
+QStorageInfo (0x0x7fb8020183c0) 0
+
+Class QAbstractConcatenable
+ size=1 align=1
+ base size=0 base align=1
+QAbstractConcatenable (0x0x7fb802124180) 0 empty
+
+Class QStringListModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QStringListModel::QPrivateSignal (0x0x7fb801dad4e0) 0 empty
+
+Vtable for QStringListModel
+QStringListModel::_ZTV16QStringListModel: 48 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 (*)(...))QStringListModel::itemData
+200 (int (*)(...))QStringListModel::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 (*)(...))QStringListModel::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 (0x0x7fb801d9d7b8) 0
+ vptr=((& QStringListModel::_ZTV16QStringListModel) + 16)
+ QAbstractListModel (0x0x7fb801d9d820) 0
+ primary-for QStringListModel (0x0x7fb801d9d7b8)
+ QAbstractItemModel (0x0x7fb801d9d888) 0
+ primary-for QAbstractListModel (0x0x7fb801d9d820)
+ QObject (0x0x7fb801dad480) 0
+ primary-for QAbstractItemModel (0x0x7fb801d9d888)
+
+Class QSystemSemaphore
+ size=8 align=8
+ base size=8 base align=8
+QSystemSemaphore (0x0x7fb801dad600) 0
+
+Class QTemporaryDir
+ size=8 align=8
+ base size=8 base align=8
+QTemporaryDir (0x0x7fb801dad6c0) 0
+
+Class QTemporaryFile::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QTemporaryFile::QPrivateSignal (0x0x7fb801dad7e0) 0 empty
+
+Vtable for QTemporaryFile
+QTemporaryFile::_ZTV14QTemporaryFile: 34 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 (0x0x7fb801d9d8f0) 0
+ vptr=((& QTemporaryFile::_ZTV14QTemporaryFile) + 16)
+ QFile (0x0x7fb801d9d958) 0
+ primary-for QTemporaryFile (0x0x7fb801d9d8f0)
+ QFileDevice (0x0x7fb801d9d9c0) 0
+ primary-for QFile (0x0x7fb801d9d958)
+ QIODevice (0x0x7fb801d9da28) 0
+ primary-for QFileDevice (0x0x7fb801d9d9c0)
+ QObject (0x0x7fb801dad780) 0
+ primary-for QIODevice (0x0x7fb801d9da28)
+
+Class QTextBoundaryFinder
+ size=48 align=8
+ base size=48 base align=8
+QTextBoundaryFinder (0x0x7fb801dadb40) 0
+
+Class QTextCodec::ConverterState
+ size=32 align=8
+ base size=32 base align=8
+QTextCodec::ConverterState (0x0x7fb801e2c3c0) 0
+
+Vtable for QTextCodec
+QTextCodec::_ZTV10QTextCodec: 9 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 0
+64 0
+
+Class QTextCodec
+ size=8 align=8
+ base size=8 base align=8
+QTextCodec (0x0x7fb801e2c360) 0 nearly-empty
+ vptr=((& QTextCodec::_ZTV10QTextCodec) + 16)
+
+Class QTextEncoder
+ size=40 align=8
+ base size=40 base align=8
+QTextEncoder (0x0x7fb801e2cd80) 0
+
+Class QTextDecoder
+ size=40 align=8
+ base size=40 base align=8
+QTextDecoder (0x0x7fb801e2cf60) 0
+
+Vtable for std::thread::_State
+std::thread::_State::_ZTVNSt6thread6_StateE: 5 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTINSt6thread6_StateE)
+16 0
+24 0
+32 (int (*)(...))__cxa_pure_virtual
+
+Class std::thread::_State
+ size=8 align=8
+ base size=8 base align=8
+std::thread::_State (0x0x7fb801e831e0) 0 nearly-empty
+ vptr=((& std::thread::_State::_ZTVNSt6thread6_StateE) + 16)
+
+Class std::thread::id
+ size=8 align=8
+ base size=8 base align=8
+std::thread::id (0x0x7fb801e83240) 0
+
+Class std::thread
+ size=8 align=8
+ base size=8 base align=8
+std::thread (0x0x7fb801e83180) 0
+
+Class std::condition_variable
+ size=48 align=8
+ base size=48 base align=8
+std::condition_variable (0x0x7fb801d16600) 0
+
+Class std::__at_thread_exit_elt
+ size=16 align=8
+ base size=16 base align=8
+std::__at_thread_exit_elt (0x0x7fb801d169c0) 0
+
+Class std::_V2::condition_variable_any
+ size=64 align=8
+ base size=64 base align=8
+std::_V2::condition_variable_any (0x0x7fb801d16a20) 0
+
+Class std::__atomic_futex_unsigned_base
+ size=1 align=1
+ base size=0 base align=1
+std::__atomic_futex_unsigned_base (0x0x7fb801aa6d20) 0 empty
+
+Vtable for std::future_error
+std::future_error::_ZTVSt12future_error: 5 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 (0x0x7fb801aa5dd0) 0
+ vptr=((& std::future_error::_ZTVSt12future_error) + 16)
+ std::logic_error (0x0x7fb801aa5e38) 0
+ primary-for std::future_error (0x0x7fb801aa5dd0)
+ std::exception (0x0x7fb801ad0480) 0 nearly-empty
+ primary-for std::logic_error (0x0x7fb801aa5e38)
+
+Class std::__future_base::_Result_base::_Deleter
+ size=1 align=1
+ base size=0 base align=1
+std::__future_base::_Result_base::_Deleter (0x0x7fb801ad0ba0) 0 empty
+
+Vtable for std::__future_base::_Result_base
+std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE: 5 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTINSt13__future_base12_Result_baseE)
+16 (int (*)(...))__cxa_pure_virtual
+24 0
+32 0
+
+Class std::__future_base::_Result_base
+ size=16 align=8
+ base size=16 base align=8
+std::__future_base::_Result_base (0x0x7fb801ad0b40) 0
+ vptr=((& std::__future_base::_Result_base::_ZTVNSt13__future_base12_Result_baseE) + 16)
+
+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 (0x0x7fb8018d5300) 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 (0x0x7fb8018cd680) 0
+ std::__at_thread_exit_elt (0x0x7fb8018d53c0) 0
+
+Vtable for std::__future_base::_State_baseV2
+std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E: 6 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 (0x0x7fb801ad0d20) 0
+ vptr=((& std::__future_base::_State_baseV2::_ZTVNSt13__future_base13_State_baseV2E) + 16)
+
+Class std::__future_base
+ size=1 align=1
+ base size=0 base align=1
+std::__future_base (0x0x7fb801ad0ae0) 0 empty
+
+Vtable for std::__future_base::_Async_state_commonV2
+std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E: 6 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 (0x0x7fb8010503a8) 0
+ vptr=((& std::__future_base::_Async_state_commonV2::_ZTVNSt13__future_base21_Async_state_commonV2E) + 16)
+ std::__future_base::_State_baseV2 (0x0x7fb8010873c0) 0
+ primary-for std::__future_base::_Async_state_commonV2 (0x0x7fb8010503a8)
+
+Class QThread::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QThread::QPrivateSignal (0x0x7fb801087c60) 0 empty
+
+Vtable for QThread
+QThread::_ZTV7QThread: 15 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 (0x0x7fb8010506e8) 0
+ vptr=((& QThread::_ZTV7QThread) + 16)
+ QObject (0x0x7fb801087c00) 0
+ primary-for QThread (0x0x7fb8010506e8)
+
+Class QThreadPool::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QThreadPool::QPrivateSignal (0x0x7fb8010c4060) 0 empty
+
+Vtable for QThreadPool
+QThreadPool::_ZTV11QThreadPool: 14 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 (0x0x7fb801050750) 0
+ vptr=((& QThreadPool::_ZTV11QThreadPool) + 16)
+ QObject (0x0x7fb8010c4000) 0
+ primary-for QThreadPool (0x0x7fb801050750)
+
+Class QThreadStorageData
+ size=4 align=4
+ base size=4 base align=4
+QThreadStorageData (0x0x7fb8010c4240) 0
+
+Class QTimeLine::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QTimeLine::QPrivateSignal (0x0x7fb8010c4900) 0 empty
+
+Vtable for QTimeLine
+QTimeLine::_ZTV9QTimeLine: 15 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 (0x0x7fb8010507b8) 0
+ vptr=((& QTimeLine::_ZTV9QTimeLine) + 16)
+ QObject (0x0x7fb8010c48a0) 0
+ primary-for QTimeLine (0x0x7fb8010507b8)
+
+Class QTimer::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QTimer::QPrivateSignal (0x0x7fb8010c4b40) 0 empty
+
+Vtable for QTimer
+QTimer::_ZTV6QTimer: 14 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 (0x0x7fb801050820) 0
+ vptr=((& QTimer::_ZTV6QTimer) + 16)
+ QObject (0x0x7fb8010c4ae0) 0
+ primary-for QTimer (0x0x7fb801050820)
+
+Class QTimeZone::OffsetData
+ size=32 align=8
+ base size=28 base align=8
+QTimeZone::OffsetData (0x0x7fb80113e4e0) 0
+
+Class QTimeZone
+ size=8 align=8
+ base size=8 base align=8
+QTimeZone (0x0x7fb80113e480) 0
+
+Class QTranslator::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QTranslator::QPrivateSignal (0x0x7fb800ddd5a0) 0 empty
+
+Vtable for QTranslator
+QTranslator::_ZTV11QTranslator: 16 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 (0x0x7fb800dcdf08) 0
+ vptr=((& QTranslator::_ZTV11QTranslator) + 16)
+ QObject (0x0x7fb800ddd540) 0
+ primary-for QTranslator (0x0x7fb800dcdf08)
+
+Class QTransposeProxyModel::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QTransposeProxyModel::QPrivateSignal (0x0x7fb800ddd7e0) 0 empty
+
+Vtable for QTransposeProxyModel
+QTransposeProxyModel::_ZTV20QTransposeProxyModel: 53 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI20QTransposeProxyModel)
+16 (int (*)(...))QTransposeProxyModel::metaObject
+24 (int (*)(...))QTransposeProxyModel::qt_metacast
+32 (int (*)(...))QTransposeProxyModel::qt_metacall
+40 (int (*)(...))QTransposeProxyModel::~QTransposeProxyModel
+48 (int (*)(...))QTransposeProxyModel::~QTransposeProxyModel
+56 (int (*)(...))QObject::event
+64 (int (*)(...))QObject::eventFilter
+72 (int (*)(...))QObject::timerEvent
+80 (int (*)(...))QObject::childEvent
+88 (int (*)(...))QObject::customEvent
+96 (int (*)(...))QObject::connectNotify
+104 (int (*)(...))QObject::disconnectNotify
+112 (int (*)(...))QTransposeProxyModel::index
+120 (int (*)(...))QTransposeProxyModel::parent
+128 (int (*)(...))QAbstractProxyModel::sibling
+136 (int (*)(...))QTransposeProxyModel::rowCount
+144 (int (*)(...))QTransposeProxyModel::columnCount
+152 (int (*)(...))QAbstractProxyModel::hasChildren
+160 (int (*)(...))QAbstractProxyModel::data
+168 (int (*)(...))QAbstractProxyModel::setData
+176 (int (*)(...))QTransposeProxyModel::headerData
+184 (int (*)(...))QTransposeProxyModel::setHeaderData
+192 (int (*)(...))QTransposeProxyModel::itemData
+200 (int (*)(...))QTransposeProxyModel::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 (*)(...))QTransposeProxyModel::insertRows
+264 (int (*)(...))QTransposeProxyModel::insertColumns
+272 (int (*)(...))QTransposeProxyModel::removeRows
+280 (int (*)(...))QTransposeProxyModel::removeColumns
+288 (int (*)(...))QTransposeProxyModel::moveRows
+296 (int (*)(...))QTransposeProxyModel::moveColumns
+304 (int (*)(...))QAbstractProxyModel::fetchMore
+312 (int (*)(...))QAbstractProxyModel::canFetchMore
+320 (int (*)(...))QAbstractProxyModel::flags
+328 (int (*)(...))QTransposeProxyModel::sort
+336 (int (*)(...))QAbstractProxyModel::buddy
+344 (int (*)(...))QAbstractItemModel::match
+352 (int (*)(...))QTransposeProxyModel::span
+360 (int (*)(...))QAbstractItemModel::roleNames
+368 (int (*)(...))QAbstractProxyModel::submit
+376 (int (*)(...))QAbstractProxyModel::revert
+384 (int (*)(...))QTransposeProxyModel::setSourceModel
+392 (int (*)(...))QTransposeProxyModel::mapToSource
+400 (int (*)(...))QTransposeProxyModel::mapFromSource
+408 (int (*)(...))QAbstractProxyModel::mapSelectionToSource
+416 (int (*)(...))QAbstractProxyModel::mapSelectionFromSource
+
+Class QTransposeProxyModel
+ size=16 align=8
+ base size=16 base align=8
+QTransposeProxyModel (0x0x7fb800dcdf70) 0
+ vptr=((& QTransposeProxyModel::_ZTV20QTransposeProxyModel) + 16)
+ QAbstractProxyModel (0x0x7fb800df6000) 0
+ primary-for QTransposeProxyModel (0x0x7fb800dcdf70)
+ QAbstractItemModel (0x0x7fb800df6068) 0
+ primary-for QAbstractProxyModel (0x0x7fb800df6000)
+ QObject (0x0x7fb800ddd780) 0
+ primary-for QAbstractItemModel (0x0x7fb800df6068)
+
+Class QUrlQuery
+ size=8 align=8
+ base size=8 base align=8
+QUrlQuery (0x0x7fb800ddd9c0) 0
+
+Class QWaitCondition
+ size=8 align=8
+ base size=8 base align=8
+QWaitCondition (0x0x7fb800edaea0) 0
+
+Class QXmlStreamStringRef
+ size=16 align=8
+ base size=16 base align=8
+QXmlStreamStringRef (0x0x7fb800ef9000) 0
+
+Class QXmlStreamAttribute
+ size=80 align=8
+ base size=73 base align=8
+QXmlStreamAttribute (0x0x7fb800f863c0) 0
+
+Class QXmlStreamAttributes
+ size=8 align=8
+ base size=8 base align=8
+QXmlStreamAttributes (0x0x7fb800af2340) 0
+ QVector<QXmlStreamAttribute> (0x0x7fb800ae7ae0) 0
+
+Class QXmlStreamNamespaceDeclaration
+ size=40 align=8
+ base size=40 base align=8
+QXmlStreamNamespaceDeclaration (0x0x7fb800ae7de0) 0
+
+Class QXmlStreamNotationDeclaration
+ size=56 align=8
+ base size=56 base align=8
+QXmlStreamNotationDeclaration (0x0x7fb800b6cd80) 0
+
+Class QXmlStreamEntityDeclaration
+ size=88 align=8
+ base size=88 base align=8
+QXmlStreamEntityDeclaration (0x0x7fb800bc7d80) 0
+
+Vtable for QXmlStreamEntityResolver
+QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver: 6 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 (0x0x7fb800c34e40) 0 nearly-empty
+ vptr=((& QXmlStreamEntityResolver::_ZTV24QXmlStreamEntityResolver) + 16)
+
+Class QXmlStreamReader
+ size=8 align=8
+ base size=8 base align=8
+QXmlStreamReader (0x0x7fb800c34ea0) 0
+
+Class QXmlStreamWriter
+ size=8 align=8
+ base size=8 base align=8
+QXmlStreamWriter (0x0x7fb800c72d80) 0
+
+Class QNdefRecord
+ size=8 align=8
+ base size=8 base align=8
+QNdefRecord (0x0x7fb800c72f60) 0
+
+Class QNdefFilter::Record
+ size=24 align=8
+ base size=24 base align=8
+QNdefFilter::Record (0x0x7fb8008cd180) 0
+
+Class QNdefFilter
+ size=8 align=8
+ base size=8 base align=8
+QNdefFilter (0x0x7fb8008cd120) 0
+
+Class QNdefMessage
+ size=8 align=8
+ base size=8 base align=8
+QNdefMessage (0x0x7fb8008ec068) 0
+ QList<QNdefRecord> (0x0x7fb8008ec0d0) 0
+ QListSpecialMethods<QNdefRecord> (0x0x7fb8008cd3c0) 0 empty
+
+Class QNdefNfcTextRecord
+ size=8 align=8
+ base size=8 base align=8
+QNdefNfcTextRecord (0x0x7fb8008ec138) 0
+ QNdefRecord (0x0x7fb8008cdc60) 0
+
+Class QNdefNfcUriRecord
+ size=8 align=8
+ base size=8 base align=8
+QNdefNfcUriRecord (0x0x7fb8008ec680) 0
+ QNdefRecord (0x0x7fb80093c4e0) 0
+
+Class QNdefNfcIconRecord
+ size=8 align=8
+ base size=8 base align=8
+QNdefNfcIconRecord (0x0x7fb8008ec6e8) 0
+ QNdefRecord (0x0x7fb80093c8a0) 0
+
+Class QNdefNfcSmartPosterRecord
+ size=16 align=8
+ base size=16 base align=8
+QNdefNfcSmartPosterRecord (0x0x7fb8008ec750) 0
+ QNdefRecord (0x0x7fb80093cc00) 0
+
+Class QNearFieldTarget::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QNearFieldTarget::QPrivateSignal (0x0x7fb80093cde0) 0 empty
+
+Class QNearFieldTarget::RequestId
+ size=8 align=8
+ base size=8 base align=8
+QNearFieldTarget::RequestId (0x0x7fb80093ce40) 0
+
+Vtable for QNearFieldTarget
+QNearFieldTarget::_ZTV16QNearFieldTarget: 25 entries
+0 (int (*)(...))0
+8 (int (*)(...))(& _ZTI16QNearFieldTarget)
+16 (int (*)(...))QNearFieldTarget::metaObject
+24 (int (*)(...))QNearFieldTarget::qt_metacast
+32 (int (*)(...))QNearFieldTarget::qt_metacall
+40 0
+48 0
+56 (int (*)(...))QObject::event
+64 (int (*)(...))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 (0x0x7fb8008ec7b8) 0
+ vptr=((& QNearFieldTarget::_ZTV16QNearFieldTarget) + 16)
+ QObject (0x0x7fb80093cd80) 0
+ primary-for QNearFieldTarget (0x0x7fb8008ec7b8)
+
+Class QNearFieldManager::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QNearFieldManager::QPrivateSignal (0x0x7fb8009c6c00) 0 empty
+
+Vtable for QNearFieldManager
+QNearFieldManager::_ZTV17QNearFieldManager: 14 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 (0x0x7fb8008ec8f0) 0
+ vptr=((& QNearFieldManager::_ZTV17QNearFieldManager) + 16)
+ QObject (0x0x7fb8009c6ba0) 0
+ primary-for QNearFieldManager (0x0x7fb8008ec8f0)
+
+Class QNearFieldShareManager::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QNearFieldShareManager::QPrivateSignal (0x0x7fb800a0f6c0) 0 empty
+
+Vtable for QNearFieldShareManager
+QNearFieldShareManager::_ZTV22QNearFieldShareManager: 14 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 (0x0x7fb8008eca28) 0
+ vptr=((& QNearFieldShareManager::_ZTV22QNearFieldShareManager) + 16)
+ QObject (0x0x7fb800a0f660) 0
+ primary-for QNearFieldShareManager (0x0x7fb8008eca28)
+
+Class QNearFieldShareTarget::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QNearFieldShareTarget::QPrivateSignal (0x0x7fb800a75240) 0 empty
+
+Vtable for QNearFieldShareTarget
+QNearFieldShareTarget::_ZTV21QNearFieldShareTarget: 14 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 (0x0x7fb8008ecb60) 0
+ vptr=((& QNearFieldShareTarget::_ZTV21QNearFieldShareTarget) + 16)
+ QObject (0x0x7fb800a751e0) 0
+ primary-for QNearFieldShareTarget (0x0x7fb8008ecb60)
+
+Class QQmlNdefRecord::QPrivateSignal
+ size=1 align=1
+ base size=0 base align=1
+QQmlNdefRecord::QPrivateSignal (0x0x7fb800a75480) 0 empty
+
+Vtable for QQmlNdefRecord
+QQmlNdefRecord::_ZTV14QQmlNdefRecord: 14 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 (0x0x7fb8008ecbc8) 0
+ vptr=((& QQmlNdefRecord::_ZTV14QQmlNdefRecord) + 16)
+ QObject (0x0x7fb800a75420) 0
+ primary-for QQmlNdefRecord (0x0x7fb8008ecbc8)
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fb8006c3a20) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fb8006c3d80) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fb8006c3f60) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fb8006ee300) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fb8006ee4e0) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fb8006ee840) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fb8006eea20) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fb8006eed80) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fb8006eef60) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = char; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fb800729300) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fb8007294e0) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fb800729840) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fb800729a20) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fb800729d80) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fb800729f60) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = char; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fb800760300) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fb80078a7e0) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fb80078ab40) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fb80078acc0) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long int; _Ret = long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fb8007b8060) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fb8007b81e0) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long unsigned int; _Ret = long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fb8007b8540) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fb8007b86c0) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long int; _Ret = long long int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fb8007b8a20) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Save_errno (0x0x7fb8007b8ba0) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long long unsigned int; _Ret = long long unsigned int; _CharT = wchar_t; _Base = {int}; std::size_t = long unsigned int]::_Range_chk (0x0x7fb8007b8f00) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fb8007ec0c0) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = float; _Ret = float; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fb8007ec420) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fb8007ec5a0) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = double; _Ret = double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fb8007ec900) 0 empty
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno
+ size=4 align=4
+ base size=4 base align=4
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Save_errno (0x0x7fb8007eca80) 0
+
+Class __gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk
+ size=1 align=1
+ base size=0 base align=1
+__gnu_cxx::__stoa(_TRet (*)(const _CharT*, _CharT**, _Base ...), const char*, const _CharT*, std::size_t*, _Base ...) [with _TRet = long double; _Ret = long double; _CharT = wchar_t; _Base = {}; std::size_t = long unsigned int]::_Range_chk (0x0x7fb8007ecde0) 0 empty
+
diff --git a/tests/auto/cmake/CMakeLists.txt b/tests/auto/cmake/CMakeLists.txt
index 34bbf980..edb51051 100644
--- a/tests/auto/cmake/CMakeLists.txt
+++ b/tests/auto/cmake/CMakeLists.txt
@@ -1,19 +1,48 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
-cmake_minimum_required(VERSION 2.8)
-
-project(qmake_cmake_files)
+# This is an automatic test for the CMake configuration files.
+# To run it manually,
+# 1) mkdir build # Create a build directory
+# 2) cd build
+# 3) # Run cmake on this directory
+# `$qt_prefix/bin/qt-cmake ..` or `cmake -DCMAKE_PREFIX_PATH=/path/to/qt ..`
+# 4) ctest # Run ctest
+cmake_minimum_required(VERSION 3.16)
+project(connectivity_cmake_tests)
enable_testing()
-find_package(Qt5Core REQUIRED)
+set(required_packages Core Bluetooth Nfc)
+
+# Setup the test when called as a completely standalone project.
+if(TARGET Qt6::Core)
+ # Tests are built as part of the repository's build tree.
+ # Setup paths so that the Qt packages are found.
+ qt_internal_set_up_build_dir_package_paths()
+endif()
+
+find_package(Qt6 REQUIRED COMPONENTS ${required_packages})
+
+# Setup common test variables which were previously set by ctest_testcase_common.prf.
+set(CMAKE_MODULES_UNDER_TEST "${required_packages}")
+
+foreach(qt_package ${CMAKE_MODULES_UNDER_TEST})
+ set(package_name "${QT_CMAKE_EXPORT_NAMESPACE}${qt_package}")
+ if(${package_name}_FOUND)
+ set(CMAKE_${qt_package}_MODULE_MAJOR_VERSION "${${package_name}_VERSION_MAJOR}")
+ set(CMAKE_${qt_package}_MODULE_MINOR_VERSION "${${package_name}_VERSION_MINOR}")
+ set(CMAKE_${qt_package}_MODULE_PATCH_VERSION "${${package_name}_VERSION_PATCH}")
+ endif()
+endforeach()
-include("${_Qt5CTestMacros}")
+include("${_Qt6CTestMacros}")
-set(qt_module_includes
+set(module_includes
Bluetooth QBluetoothAddress
Nfc QNdefRecord
)
-test_module_includes(
- ${qt_module_includes}
+_qt_internal_test_module_includes(
+ ${module_includes}
)
diff --git a/tests/auto/cmake/cmake.pro b/tests/auto/cmake/cmake.pro
deleted file mode 100644
index 7bd2c29e..00000000
--- a/tests/auto/cmake/cmake.pro
+++ /dev/null
@@ -1,7 +0,0 @@
-
-# Cause make to do nothing.
-TEMPLATE = subdirs
-
-CMAKE_QT_MODULES_UNDER_TEST = bluetooth nfc
-
-CONFIG += ctest_testcase
diff --git a/tests/auto/nfccommons/qnearfieldmanager_emulator.cpp b/tests/auto/nfccommons/qnearfieldmanager_emulator.cpp
new file mode 100644
index 00000000..20e1f1f9
--- /dev/null
+++ b/tests/auto/nfccommons/qnearfieldmanager_emulator.cpp
@@ -0,0 +1,90 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "qnearfieldmanager_emulator_p.h"
+#include "qnearfieldtarget_emulator_p.h"
+
+#include <QtCore/QDebug>
+
+QT_BEGIN_NAMESPACE
+
+QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl()
+{
+ TagActivator *activator = TagActivator::instance();
+ activator->initialize();
+
+ connect(activator, &TagActivator::tagActivated, this, &QNearFieldManagerPrivateImpl::tagActivated);
+ connect(activator, &TagActivator::tagDeactivated, this, &QNearFieldManagerPrivateImpl::tagDeactivated);
+}
+
+QNearFieldManagerPrivateImpl::~QNearFieldManagerPrivateImpl()
+{
+}
+
+bool QNearFieldManagerPrivateImpl::isEnabled() const
+{
+ return true;
+}
+
+bool QNearFieldManagerPrivateImpl::isSupported(QNearFieldTarget::AccessMethod accessMethod) const
+{
+ return accessMethod == QNearFieldTarget::NdefAccess
+ || accessMethod == QNearFieldTarget::AnyAccess;
+}
+
+bool QNearFieldManagerPrivateImpl::startTargetDetection(QNearFieldTarget::AccessMethod accessMethod)
+{
+ const bool supported = isSupported(accessMethod);
+ if (supported)
+ TagActivator::instance()->start();
+
+ return supported;
+}
+
+void QNearFieldManagerPrivateImpl::stopTargetDetection(const QString &message)
+{
+ setUserInformation(message);
+ TagActivator::instance()->stop();
+ emit targetDetectionStopped();
+}
+
+void QNearFieldManagerPrivateImpl::setUserInformation(const QString &message)
+{
+ emit userInformationChanged(message);
+}
+
+void QNearFieldManagerPrivateImpl::reset()
+{
+ TagActivator::instance()->reset();
+}
+
+void QNearFieldManagerPrivateImpl::tagActivated(TagBase *tag)
+{
+ QNearFieldTargetPrivate *target = targets.value(tag).data();
+ if (!target) {
+ if (dynamic_cast<NfcTagType1 *>(tag))
+ target = new TagType1(tag, this);
+ else if (dynamic_cast<NfcTagType2 *>(tag))
+ target = new TagType2(tag, this);
+ else
+ qFatal("Unknown emulator tag type");
+
+ targets.insert(tag, target);
+ }
+
+ Q_EMIT targetDetected(new QNearFieldTarget(target, this));
+}
+
+void QNearFieldManagerPrivateImpl::tagDeactivated(TagBase *tag)
+{
+ QNearFieldTargetPrivate *target = targets.value(tag).data();
+ if (!target) {
+ targets.remove(tag);
+ return;
+ }
+
+ Q_EMIT targetLost(target->q_ptr);
+ QMetaObject::invokeMethod(target->q_ptr, &QNearFieldTarget::disconnected);
+}
+
+QT_END_NAMESPACE
diff --git a/tests/auto/nfccommons/qnearfieldmanager_emulator_p.h b/tests/auto/nfccommons/qnearfieldmanager_emulator_p.h
new file mode 100644
index 00000000..b7316944
--- /dev/null
+++ b/tests/auto/nfccommons/qnearfieldmanager_emulator_p.h
@@ -0,0 +1,61 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#ifndef QNEARFIELDMANAGER_EMULATOR_H
+#define QNEARFIELDMANAGER_EMULATOR_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 <QtNfc/private/qnearfieldmanager_p.h>
+#include <QtNfc/private/qnearfieldtarget_p.h>
+#include <QtNfc/qndeffilter.h>
+
+#include <QtCore/QMetaMethod>
+#include <QtCore/QObject>
+#include <QtCore/QPointer>
+
+QT_BEGIN_NAMESPACE
+
+class TagBase;
+class QNearFieldManagerPrivateImpl : public QNearFieldManagerPrivate
+{
+ Q_OBJECT
+
+public:
+ QNearFieldManagerPrivateImpl();
+ ~QNearFieldManagerPrivateImpl() override;
+
+ bool isEnabled() const override;
+
+ bool isSupported(QNearFieldTarget::AccessMethod accessMethod) const override;
+
+ bool startTargetDetection(QNearFieldTarget::AccessMethod accessMethod) override;
+ void stopTargetDetection(const QString &message) override;
+ void setUserInformation(const QString &message) override;
+
+ void reset();
+
+signals:
+ void userInformationChanged(const QString &message);
+
+private slots:
+ void tagActivated(TagBase *tag);
+ void tagDeactivated(TagBase *tag);
+
+private:
+ QMap<TagBase *, QPointer<QNearFieldTargetPrivate> > targets;
+
+};
+
+QT_END_NAMESPACE
+
+#endif // QNEARFIELDMANAGER_EMULATOR_H
diff --git a/tests/auto/nfccommons/qnearfieldtagtype1.cpp b/tests/auto/nfccommons/qnearfieldtagtype1.cpp
new file mode 100644
index 00000000..cad1c1e7
--- /dev/null
+++ b/tests/auto/nfccommons/qnearfieldtagtype1.cpp
@@ -0,0 +1,697 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "qnearfieldtagtype1_p.h"
+#include "qtlv_p.h"
+
+#include <QtNfc/private/qnearfieldtarget_p.h>
+#include <QtNfc/qndefmessage.h>
+
+#include <QtCore/QByteArray>
+#include <QtCore/QVariant>
+
+#include <QtCore/QDebug>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QNearFieldTagType1
+ \brief The QNearFieldTagType1 class provides an interface for communicating with an NFC Tag
+ Type 1 tag.
+
+ \ingroup connectivity-nfc
+ \inmodule QtNfc
+ \internal
+*/
+
+/*!
+ \enum QNearFieldTagType1::WriteMode
+ \brief This enum describes the write modes that are supported.
+
+ \value EraseAndWrite The memory is erased before the new value is written.
+ \value WriteOnly The memory is not erased before the new value is written. The effect of
+ this mode is that the final value store is the bitwise or of the data
+ to be written and the original data value.
+*/
+
+/*!
+ \fn Type QNearFieldTagType1::type() const
+ \reimp
+*/
+
+class QNearFieldTagType1Private
+{
+ Q_DECLARE_PUBLIC(QNearFieldTagType1)
+
+public:
+ QNearFieldTagType1Private(QNearFieldTagType1 *q)
+ : q_ptr(q), m_readNdefMessageState(NotReadingNdefMessage),
+ m_tlvReader(nullptr),
+ m_writeNdefMessageState(NotWritingNdefMessage),
+ m_tlvWriter(nullptr)
+ { }
+
+ QNearFieldTagType1 *q_ptr;
+
+ QMap<QNearFieldTarget::RequestId, QByteArray> m_pendingInternalCommands;
+
+ enum ReadNdefMessageState {
+ NotReadingNdefMessage,
+ NdefReadCheckingIdentification,
+ NdefReadCheckingNdefMagicNumber,
+ NdefReadReadingTlv
+ };
+
+ void progressToNextNdefReadMessageState();
+ ReadNdefMessageState m_readNdefMessageState;
+ QNearFieldTarget::RequestId m_readNdefRequestId;
+
+ QTlvReader *m_tlvReader;
+ QNearFieldTarget::RequestId m_nextExpectedRequestId;
+
+ enum WriteNdefMessageState {
+ NotWritingNdefMessage,
+ NdefWriteCheckingIdentification,
+ NdefWriteCheckingNdefMagicNumber,
+ NdefWriteReadingTlv,
+ NdefWriteWritingTlv,
+ NdefWriteWritingTlvFlush
+ };
+
+ void progressToNextNdefWriteMessageState();
+ WriteNdefMessageState m_writeNdefMessageState;
+ QNearFieldTarget::RequestId m_writeNdefRequestId;
+ QList<QNdefMessage> m_ndefWriteMessages;
+
+ QTlvWriter *m_tlvWriter;
+
+ typedef QPair<quint8, QByteArray> Tlv;
+ QList<Tlv> m_tlvs;
+};
+
+void QNearFieldTagType1Private::progressToNextNdefReadMessageState()
+{
+ Q_Q(QNearFieldTagType1);
+
+ switch (m_readNdefMessageState) {
+ case NotReadingNdefMessage:
+ m_readNdefMessageState = NdefReadCheckingIdentification;
+ m_nextExpectedRequestId = q->readIdentification();
+ break;
+ case NdefReadCheckingIdentification: {
+ const QByteArray data = q->requestResponse(m_nextExpectedRequestId).toByteArray();
+
+ if (data.isEmpty()) {
+ m_readNdefMessageState = NotReadingNdefMessage;
+ m_nextExpectedRequestId = QNearFieldTarget::RequestId();
+ Q_EMIT q->error(QNearFieldTarget::NdefReadError, m_readNdefRequestId);
+ m_readNdefRequestId = QNearFieldTarget::RequestId();
+ break;
+ }
+
+ quint8 hr0 = data.at(0);
+
+ // Check if target is a NFC TagType1 tag
+ if (!(hr0 & 0x10)) {
+ m_readNdefMessageState = NotReadingNdefMessage;
+ m_nextExpectedRequestId = QNearFieldTarget::RequestId();
+ Q_EMIT q->error(QNearFieldTarget::NdefReadError, m_readNdefRequestId);
+ m_readNdefRequestId = QNearFieldTarget::RequestId();
+ break;
+ }
+
+ m_readNdefMessageState = NdefReadCheckingNdefMagicNumber;
+ m_nextExpectedRequestId = q->readByte(8);
+ break;
+ }
+ case NdefReadCheckingNdefMagicNumber: {
+ quint8 ndefMagicNumber = q->requestResponse(m_nextExpectedRequestId).toUInt();
+ m_nextExpectedRequestId = QNearFieldTarget::RequestId();
+
+ if (ndefMagicNumber != 0xe1) {
+ m_readNdefMessageState = NotReadingNdefMessage;
+ Q_EMIT q->error(QNearFieldTarget::NdefReadError, m_readNdefRequestId);
+ m_readNdefRequestId = QNearFieldTarget::RequestId();
+ break;
+ }
+
+ m_readNdefMessageState = NdefReadReadingTlv;
+ delete m_tlvReader;
+ m_tlvReader = new QTlvReader(q);
+
+ Q_FALLTHROUGH(); // fall through
+ }
+ case NdefReadReadingTlv:
+ Q_ASSERT(m_tlvReader);
+ while (!m_tlvReader->atEnd()) {
+ if (!m_tlvReader->readNext())
+ break;
+
+ // NDEF Message TLV
+ if (m_tlvReader->tag() == 0x03) {
+ Q_Q(QNearFieldTagType1);
+
+ Q_EMIT q->ndefMessageRead(QNdefMessage::fromByteArray(m_tlvReader->data()));
+ }
+ }
+
+ m_nextExpectedRequestId = m_tlvReader->requestId();
+ if (!m_nextExpectedRequestId.isValid()) {
+ delete m_tlvReader;
+ m_tlvReader = nullptr;
+ m_readNdefMessageState = NotReadingNdefMessage;
+ Q_EMIT q->requestCompleted(m_readNdefRequestId);
+ m_readNdefRequestId = QNearFieldTarget::RequestId();
+ }
+ break;
+ }
+}
+
+void QNearFieldTagType1Private::progressToNextNdefWriteMessageState()
+{
+ Q_Q(QNearFieldTagType1);
+
+ switch (m_writeNdefMessageState) {
+ case NotWritingNdefMessage:
+ m_writeNdefMessageState = NdefWriteCheckingIdentification;
+ m_nextExpectedRequestId = q->readIdentification();
+ break;
+ case NdefWriteCheckingIdentification: {
+ const QByteArray data = q->requestResponse(m_nextExpectedRequestId).toByteArray();
+
+ if (data.isEmpty()) {
+ m_writeNdefMessageState = NotWritingNdefMessage;
+ m_nextExpectedRequestId = QNearFieldTarget::RequestId();
+ Q_EMIT q->error(QNearFieldTarget::NdefWriteError, m_writeNdefRequestId);
+ m_writeNdefRequestId = QNearFieldTarget::RequestId();
+ break;
+ }
+
+ quint8 hr0 = data.at(0);
+
+ // Check if target is a NFC TagType1 tag
+ if (!(hr0 & 0x10)) {
+ m_writeNdefMessageState = NotWritingNdefMessage;
+ m_nextExpectedRequestId = QNearFieldTarget::RequestId();
+ Q_EMIT q->error(QNearFieldTarget::NdefWriteError, m_writeNdefRequestId);
+ m_writeNdefRequestId = QNearFieldTarget::RequestId();
+ break;
+ }
+
+ m_writeNdefMessageState = NdefWriteCheckingNdefMagicNumber;
+ m_nextExpectedRequestId = q->readByte(8);
+ break;
+ }
+ case NdefWriteCheckingNdefMagicNumber: {
+ quint8 ndefMagicNumber = q->requestResponse(m_nextExpectedRequestId).toUInt();
+ m_nextExpectedRequestId = QNearFieldTarget::RequestId();
+
+ if (ndefMagicNumber != 0xe1) {
+ m_writeNdefMessageState = NotWritingNdefMessage;
+ Q_EMIT q->error(QNearFieldTarget::NdefWriteError, m_writeNdefRequestId);
+ m_writeNdefRequestId = QNearFieldTarget::RequestId();
+ break;
+ }
+
+ m_writeNdefMessageState = NdefWriteReadingTlv;
+ delete m_tlvReader;
+ m_tlvReader = new QTlvReader(q);
+
+ Q_FALLTHROUGH(); // fall through
+ }
+ case NdefWriteReadingTlv:
+ Q_ASSERT(m_tlvReader);
+ while (!m_tlvReader->atEnd()) {
+ if (!m_tlvReader->readNext())
+ break;
+
+ quint8 tag = m_tlvReader->tag();
+ if (tag == 0x01 || tag == 0x02 || tag == 0xfd)
+ m_tlvs.append(qMakePair(tag, m_tlvReader->data()));
+ }
+
+ m_nextExpectedRequestId = m_tlvReader->requestId();
+ if (m_nextExpectedRequestId.isValid())
+ break;
+
+ delete m_tlvReader;
+ m_tlvReader = nullptr;
+ m_writeNdefMessageState = NdefWriteWritingTlv;
+
+ // fall through
+ case NdefWriteWritingTlv:
+ delete m_tlvWriter;
+ m_tlvWriter = new QTlvWriter(q);
+
+ // write old TLVs
+ for (const Tlv &tlv : std::as_const(m_tlvs))
+ m_tlvWriter->writeTlv(tlv.first, tlv.second);
+
+ // write new NDEF message TLVs
+ for (const QNdefMessage &message : std::as_const(m_ndefWriteMessages))
+ m_tlvWriter->writeTlv(0x03, message.toByteArray());
+
+ // write terminator TLV
+ m_tlvWriter->writeTlv(0xfe);
+
+ m_writeNdefMessageState = NdefWriteWritingTlvFlush;
+
+ // fall through
+ case NdefWriteWritingTlvFlush:
+ // flush the writer
+ Q_ASSERT(m_tlvWriter);
+ if (m_tlvWriter->process(true)) {
+ m_nextExpectedRequestId = QNearFieldTarget::RequestId();
+ m_writeNdefMessageState = NotWritingNdefMessage;
+ delete m_tlvWriter;
+ m_tlvWriter = nullptr;
+ Q_EMIT q->requestCompleted(m_writeNdefRequestId);
+ m_writeNdefRequestId = QNearFieldTarget::RequestId();
+ } else {
+ m_nextExpectedRequestId = m_tlvWriter->requestId();
+ if (!m_nextExpectedRequestId.isValid()) {
+ m_writeNdefMessageState = NotWritingNdefMessage;
+ delete m_tlvWriter;
+ m_tlvWriter = nullptr;
+ Q_EMIT q->error(QNearFieldTarget::NdefWriteError, m_writeNdefRequestId);
+ m_writeNdefRequestId = QNearFieldTarget::RequestId();
+ }
+ }
+ break;
+ }
+}
+
+static QVariant decodeResponse(const QByteArray &command, const QByteArray &response)
+{
+ switch (command.at(0)) {
+ case 0x01: // READ
+ if (command.at(1) == response.at(0))
+ return quint8(response.at(1));
+ break;
+ case 0x53: { // WRITE-E
+ quint8 address = command.at(1);
+ quint8 data = command.at(2);
+ quint8 writeAddress = response.at(0);
+ quint8 writeData = response.at(1);
+
+ return ((writeAddress == address) && (writeData == data));
+ }
+ case 0x1a: { // WRITE-NE
+ quint8 address = command.at(1);
+ quint8 data = command.at(2);
+ quint8 writeAddress = response.at(0);
+ quint8 writeData = response.at(1);
+
+ return ((writeAddress == address) && ((writeData & data) == data));
+ }
+ case 0x10: { // RSEG
+ quint8 segmentAddress = quint8(command.at(1)) >> 4;
+ quint8 readSegmentAddress = quint8(response.at(0)) >> 4;
+ if (readSegmentAddress == segmentAddress)
+ return response.mid(1);
+ break;
+ }
+ case 0x02: { // READ8
+ quint8 blockAddress = command.at(1);
+ quint8 readBlockAddress = response.at(0);
+ if (readBlockAddress == blockAddress)
+ return response.mid(1);
+ break;
+ }
+ case 0x54: { // WRITE-E8
+ quint8 blockAddress = command.at(1);
+ QByteArray data = command.mid(2, 8);
+ quint8 writeBlockAddress = response.at(0);
+ QByteArray writeData = response.mid(1);
+
+ return ((writeBlockAddress == blockAddress) && (writeData == data));
+ }
+ case 0x1b: { // WRITE-NE8
+ quint8 blockAddress = command.at(1);
+ QByteArray data = command.mid(2, 8);
+ quint8 writeBlockAddress = response.at(0);
+ QByteArray writeData = response.mid(1);
+
+ if (writeBlockAddress != blockAddress)
+ return false;
+
+ for (int i = 0; i < writeData.size(); ++i) {
+ if ((writeData.at(i) & data.at(i)) != data.at(i))
+ return false;
+ }
+
+ return true;
+ }
+ }
+
+ return QVariant();
+}
+
+/*!
+ Constructs a new tag type 1 near field target with \a parent.
+*/
+QNearFieldTagType1::QNearFieldTagType1(QObject *parent)
+: QNearFieldTargetPrivate(parent), d_ptr(new QNearFieldTagType1Private(this))
+{
+}
+
+/*!
+ Destroys the tag type 1 near field target.
+*/
+QNearFieldTagType1::~QNearFieldTagType1()
+{
+ delete d_ptr;
+}
+
+/*!
+ \reimp
+*/
+bool QNearFieldTagType1::hasNdefMessage()
+{
+ QNearFieldTarget::RequestId id = readAll();
+ if (!waitForRequestCompleted(id))
+ return false;
+
+ const QByteArray data = requestResponse(id).toByteArray();
+
+ if (data.isEmpty())
+ return false;
+
+ quint8 hr0 = data.at(0);
+
+ // Check if target is a NFC TagType1 tag
+ if (!(hr0 & 0x10))
+ return false;
+
+ // Check if NDEF Message Magic number is present
+ quint8 nmn = data.at(10);
+ if (nmn != 0xe1)
+ return false;
+
+ // Check if TLV contains NDEF Message
+ return true;
+}
+
+/*!
+ \reimp
+*/
+QNearFieldTarget::RequestId QNearFieldTagType1::readNdefMessages()
+{
+ Q_D(QNearFieldTagType1);
+
+ d->m_readNdefRequestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate);
+
+ if (d->m_readNdefMessageState == QNearFieldTagType1Private::NotReadingNdefMessage) {
+ d->progressToNextNdefReadMessageState();
+ } else {
+ reportError(QNearFieldTarget::NdefReadError, d->m_readNdefRequestId);
+ }
+
+ return d->m_readNdefRequestId;
+}
+
+/*!
+ \reimp
+*/
+QNearFieldTarget::RequestId QNearFieldTagType1::writeNdefMessages(const QList<QNdefMessage> &messages)
+{
+ Q_D(QNearFieldTagType1);
+
+ d->m_writeNdefRequestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate);
+
+ if (d->m_readNdefMessageState == QNearFieldTagType1Private::NotReadingNdefMessage &&
+ d->m_writeNdefMessageState == QNearFieldTagType1Private::NotWritingNdefMessage) {
+ d->m_ndefWriteMessages = messages;
+ d->progressToNextNdefWriteMessageState();
+ } else {
+ reportError(QNearFieldTarget::NdefWriteError, d->m_readNdefRequestId);
+ }
+
+ return d->m_writeNdefRequestId;
+}
+
+/*!
+ Returns the NFC Tag Type 1 specification version number that the tag supports.
+*/
+quint8 QNearFieldTagType1::version()
+{
+ QNearFieldTarget::RequestId id = readByte(9);
+ if (!waitForRequestCompleted(id))
+ return 0;
+
+ quint8 versionNumber = requestResponse(id).toUInt();
+ return versionNumber;
+}
+
+/*!
+ Returns the memory size in bytes of the tag.
+*/
+int QNearFieldTagType1::memorySize()
+{
+ QNearFieldTarget::RequestId id = readByte(10);
+ if (!waitForRequestCompleted(id))
+ return 0;
+
+ quint8 tms = requestResponse(id).toUInt();
+
+ return 8 * (tms + 1);
+}
+
+/*!
+ Requests the identification bytes from the target. Returns a request id which can be used to
+ track the completion status of the request.
+
+ Once the request completes successfully the response can be retrieved from the
+ requestResponse() function. The response of this request will be a QByteArray containing: HR0,
+ HR1, UID0, UID1, UID2 and UID3 in order.
+
+ \sa requestCompleted(), waitForRequestCompleted()
+*/
+QNearFieldTarget::RequestId QNearFieldTagType1::readIdentification()
+{
+ QByteArray command;
+ command.append(char(0x78)); // RID
+ command.append(char(0x00)); // Address (unused)
+ command.append(char(0x00)); // Data (unused)
+ command.append(uid().left(4)); // 4 bytes of UID
+
+ return sendCommand(command);
+}
+
+/*!
+ Requests all data in the static memory area of the target. Returns a request id which can be
+ used to track the completion status of the request.
+
+ Once the request completes successfully the response can be retrieved from the
+ requestResponse() function. The response of this request will be a QByteArray containing: HR0
+ and HR1 followed by the 120 bytes of data stored in the static memory area of the target.
+
+ \sa requestCompleted(), waitForRequestCompleted()
+*/
+QNearFieldTarget::RequestId QNearFieldTagType1::readAll()
+{
+ QByteArray command;
+ command.append(char(0x00)); // RALL
+ command.append(char(0x00)); // Address (unused)
+ command.append(char(0x00)); // Data (unused)
+ command.append(uid().left(4));// 4 bytes of UID
+
+ return sendCommand(command);
+}
+
+/*!
+ Requests a single byte from the static memory area of the tag. The \a address parameter
+ specifices the linear byte address to read. Returns a request id which can be used to track
+ the completion status of the request.
+
+ Once the request completes successfully the response can be retrieved from the
+ requestResponse() function. The response of this request will be a quint8.
+
+ \sa requestCompleted(), waitForRequestCompleted()
+*/
+QNearFieldTarget::RequestId QNearFieldTagType1::readByte(quint8 address)
+{
+ if (address & 0x80)
+ return QNearFieldTarget::RequestId();
+
+ QByteArray command;
+ command.append(char(0x01)); // READ
+ command.append(char(address)); // Address
+ command.append(char(0x00)); // Data (unused)
+ command.append(uid().left(4)); // 4 bytes of UID
+
+ QNearFieldTarget::RequestId id = sendCommand(command);
+
+ Q_D(QNearFieldTagType1);
+
+ d->m_pendingInternalCommands.insert(id, command);
+
+ return id;
+}
+
+/*!
+ Writes a single \a data byte to the linear byte \a address on the tag. If \a mode is
+ EraseAndWrite the byte will be erased before writing. If \a mode is WriteOnly the contents will
+ not be erased before writing. This is equivelant to writing the result of the bitwise OR of
+ \a data and the original value.
+
+ Returns a request id which can be used to track the completion status of the request.
+
+ Once the request completes the response can be retrieved from the requestResponse() function.
+ The response of this request will be a boolean value, true for success; otherwise false.
+
+ \sa requestCompleted(), waitForRequestCompleted()
+*/
+QNearFieldTarget::RequestId QNearFieldTagType1::writeByte(quint8 address, quint8 data,
+ WriteMode mode)
+{
+ if (address & 0x80)
+ return QNearFieldTarget::RequestId();
+
+ QByteArray command;
+
+ if (mode == EraseAndWrite)
+ command.append(char(0x53)); // WRITE-E
+ else if (mode == WriteOnly)
+ command.append(char(0x1a)); // WRITE-NE
+ else
+ return QNearFieldTarget::RequestId();
+
+ command.append(char(address)); // Address
+ command.append(char(data)); // Data
+ command.append(uid().left(4)); // 4 bytes of UID
+
+ QNearFieldTarget::RequestId id = sendCommand(command);
+
+ Q_D(QNearFieldTagType1);
+
+ d->m_pendingInternalCommands.insert(id, command);
+
+ return id;
+}
+
+/*!
+ Requests 128 bytes of data from the segment specified by \a segmentAddress. Returns a request
+ id which can be used to track the completion status of the request.
+
+ Once the request completes successfully the response can be retrieved from the
+ requestResponse() function. The response of this request will be a QByteArray.
+
+ \sa requestCompleted(), waitForRequestCompleted()
+*/
+QNearFieldTarget::RequestId QNearFieldTagType1::readSegment(quint8 segmentAddress)
+{
+ if (segmentAddress & 0xf0)
+ return QNearFieldTarget::RequestId();
+
+ QByteArray command;
+ command.append(char(0x10)); // RSEG
+ command.append(char(segmentAddress << 4)); // Segment address
+ command.append(QByteArray(8, char(0x00))); // Data (unused)
+ command.append(uid().left(4)); // 4 bytes of UID
+
+ QNearFieldTarget::RequestId id = sendCommand(command);
+
+ Q_D(QNearFieldTagType1);
+
+ d->m_pendingInternalCommands.insert(id, command);
+
+ return id;
+}
+
+/*!
+ Requests 8 bytes of data from the block specified by \a blockAddress. Returns a request id
+ which can be used to track the completion status of the request.
+
+ Once the request completes successfully the response can be retrieved from the
+ requestResponse() function. The response of this request will be a QByteArray.
+
+ \sa requestCompleted(), waitForRequestCompleted()
+*/
+QNearFieldTarget::RequestId QNearFieldTagType1::readBlock(quint8 blockAddress)
+{
+ QByteArray command;
+ command.append(char(0x02)); // READ8
+ command.append(char(blockAddress)); // Block address
+ command.append(QByteArray(8, char(0x00))); // Data (unused)
+ command.append(uid().left(4)); // 4 bytes of UID
+
+ QNearFieldTarget::RequestId id = sendCommand(command);
+
+ Q_D(QNearFieldTagType1);
+
+ d->m_pendingInternalCommands.insert(id, command);
+
+ return id;
+}
+
+/*!
+ Writes 8 bytes of \a data to the block specified by \a blockAddress. If \a mode is
+ EraseAndWrite the bytes will be erased before writing. If \a mode is WriteOnly the contents
+ will not be erased before writing. This is equivelant to writing the result of the bitwise OR
+ of \a data and the original value.
+
+ Returns a request id which can be used to track the completion status of the request.
+
+ Once the request completes the response can be retrieved from the requestResponse() function.
+ The response of this request will be a boolean value, true for success; otherwise false.
+
+ \sa requestCompleted(), waitForRequestCompleted()
+*/
+QNearFieldTarget::RequestId QNearFieldTagType1::writeBlock(quint8 blockAddress,
+ const QByteArray &data,
+ WriteMode mode)
+{
+ if (data.size() != 8)
+ return QNearFieldTarget::RequestId();
+
+ QByteArray command;
+
+ if (mode == EraseAndWrite)
+ command.append(char(0x54)); // WRITE-E8
+ else if (mode == WriteOnly)
+ command.append(char(0x1b)); // WRITE-NE8
+ else
+ return QNearFieldTarget::RequestId();
+
+ command.append(char(blockAddress)); // Block address
+ command.append(data); // Data
+ command.append(uid().left(4)); // 4 bytes of UID
+
+ QNearFieldTarget::RequestId id = sendCommand(command);
+
+ Q_D(QNearFieldTagType1);
+
+ d->m_pendingInternalCommands.insert(id, command);
+
+ return id;
+}
+
+/*!
+ \reimp
+*/
+void QNearFieldTagType1::setResponseForRequest(const QNearFieldTarget::RequestId &id,
+ const QVariant &response,
+ bool emitRequestCompleted)
+{
+ Q_D(QNearFieldTagType1);
+
+ if (d->m_pendingInternalCommands.contains(id)) {
+ const QByteArray command = d->m_pendingInternalCommands.take(id);
+
+ QVariant decodedResponse = decodeResponse(command, response.toByteArray());
+ QNearFieldTargetPrivate::setResponseForRequest(id, decodedResponse, emitRequestCompleted);
+ } else {
+ QNearFieldTargetPrivate::setResponseForRequest(id, response, emitRequestCompleted);
+ }
+
+ // continue reading / writing NDEF message
+ if (d->m_nextExpectedRequestId == id) {
+ if (d->m_readNdefMessageState != QNearFieldTagType1Private::NotReadingNdefMessage)
+ d->progressToNextNdefReadMessageState();
+ else if (d->m_writeNdefMessageState != QNearFieldTagType1Private::NotWritingNdefMessage)
+ d->progressToNextNdefWriteMessageState();
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/tests/auto/nfccommons/qnearfieldtagtype1_p.h b/tests/auto/nfccommons/qnearfieldtagtype1_p.h
new file mode 100644
index 00000000..69e37c8c
--- /dev/null
+++ b/tests/auto/nfccommons/qnearfieldtagtype1_p.h
@@ -0,0 +1,72 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#ifndef QNEARFIELDTAGTYPE1_H
+#define QNEARFIELDTAGTYPE1_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 <QtNfc/private/qnearfieldtarget_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QNearFieldTagType1Private;
+
+class QNearFieldTagType1 : public QNearFieldTargetPrivate
+{
+ Q_OBJECT
+
+ Q_DECLARE_PRIVATE(QNearFieldTagType1)
+
+public:
+ enum WriteMode {
+ EraseAndWrite,
+ WriteOnly
+ };
+ Q_ENUM(WriteMode)
+
+ explicit QNearFieldTagType1(QObject *parent = nullptr);
+ ~QNearFieldTagType1();
+
+ QNearFieldTarget::Type type() const override { return QNearFieldTarget::NfcTagType1; }
+
+ bool hasNdefMessage() override;
+ QNearFieldTarget::RequestId readNdefMessages() override;
+ QNearFieldTarget::RequestId writeNdefMessages(const QList<QNdefMessage> &messages) override;
+
+ quint8 version();
+ virtual int memorySize();
+
+ // DIGPROTO
+ virtual QNearFieldTarget::RequestId readIdentification();
+
+ // static memory functions
+ virtual QNearFieldTarget::RequestId readAll();
+ virtual QNearFieldTarget::RequestId readByte(quint8 address);
+ virtual QNearFieldTarget::RequestId writeByte(quint8 address, quint8 data, WriteMode mode = EraseAndWrite);
+
+ // dynamic memory functions
+ virtual QNearFieldTarget::RequestId readSegment(quint8 segmentAddress);
+ virtual QNearFieldTarget::RequestId readBlock(quint8 blockAddress);
+ virtual QNearFieldTarget::RequestId writeBlock(quint8 blockAddress, const QByteArray &data,
+ WriteMode mode = EraseAndWrite);
+
+protected:
+ void setResponseForRequest(const QNearFieldTarget::RequestId &id, const QVariant &response, bool emitRequestCompleted = true) override;
+
+private:
+ QNearFieldTagType1Private *d_ptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // QNEARFIELDTAGTYPE1_H
diff --git a/tests/auto/nfccommons/qnearfieldtagtype2.cpp b/tests/auto/nfccommons/qnearfieldtagtype2.cpp
new file mode 100644
index 00000000..fc416900
--- /dev/null
+++ b/tests/auto/nfccommons/qnearfieldtagtype2.cpp
@@ -0,0 +1,292 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "qnearfieldtagtype2_p.h"
+#include <QtNfc/private/qnearfieldtarget_p.h>
+
+#include <QtCore/QVariant>
+#include <QtCore/QCoreApplication>
+#include <QtCore/QTime>
+
+#include <QtCore/QDebug>
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \class QNearFieldTagType2
+ \brief The QNearFieldTagType2 class provides an interface for communicating with an NFC Tag
+ Type 2 tag.
+
+ \ingroup connectivity-nfc
+ \inmodule QtNfc
+ \internal
+*/
+
+/*!
+ \fn Type QNearFieldTagType2::type() const
+ \reimp
+*/
+
+struct SectorSelectState {
+ int timerId; // id of timer used for passive ack
+ quint8 sector; // sector being selected
+};
+
+class QNearFieldTagType2Private
+{
+public:
+ QNearFieldTagType2Private() : m_currentSector(0) { }
+
+ QMap<QNearFieldTarget::RequestId, QByteArray> m_pendingInternalCommands;
+
+ quint8 m_currentSector;
+
+ QMap<QNearFieldTarget::RequestId, SectorSelectState> m_pendingSectorSelectCommands;
+};
+
+static QVariant decodeResponse(const QByteArray &command, const QByteArray &response)
+{
+ quint8 opcode = command.at(0);
+
+ switch (opcode) {
+ case 0xa2: // WRITE
+ return quint8(response.at(0)) == 0x0a;
+ case 0xc2: // SECTOR SELECT (Command Packet 1)
+ return quint8(response.at(0)) == 0x0a;
+ }
+
+ return QVariant();
+}
+
+/*!
+ Constructs a new tag type 2 near field target with \a parent.
+*/
+QNearFieldTagType2::QNearFieldTagType2(QObject *parent)
+: QNearFieldTargetPrivate(parent), d_ptr(new QNearFieldTagType2Private)
+{
+}
+
+/*!
+ Destroys the tag type 2 near field target.
+*/
+QNearFieldTagType2::~QNearFieldTagType2()
+{
+ delete d_ptr;
+}
+
+/*!
+ \reimp
+*/
+bool QNearFieldTagType2::hasNdefMessage()
+{
+ qWarning() << Q_FUNC_INFO << "is unimplemeted";
+ return false;
+}
+
+/*!
+ \reimp
+*/
+QNearFieldTarget::RequestId QNearFieldTagType2::readNdefMessages()
+{
+ return QNearFieldTarget::RequestId();
+}
+
+/*!
+ \reimp
+*/
+QNearFieldTarget::RequestId QNearFieldTagType2::writeNdefMessages(const QList<QNdefMessage> &messages)
+{
+ Q_UNUSED(messages);
+
+ return QNearFieldTarget::RequestId();
+}
+
+/*!
+ Returns the NFC Tag Type 2 specification version number that the tag supports.
+*/
+quint8 QNearFieldTagType2::version()
+{
+ Q_D(QNearFieldTagType2);
+ if (d->m_currentSector != 0) {
+ QNearFieldTarget::RequestId id = selectSector(0);
+ if (!waitForRequestCompleted(id))
+ return 0;
+ }
+
+ QNearFieldTarget::RequestId id = readBlock(0);
+ if (!waitForRequestCompleted(id))
+ return 0;
+
+ const QByteArray data = requestResponse(id).toByteArray();
+ return data.at(13);
+}
+
+/*!
+ Returns the memory size in bytes of the tag.
+*/
+int QNearFieldTagType2::memorySize()
+{
+ Q_D(QNearFieldTagType2);
+ if (d->m_currentSector != 0) {
+ QNearFieldTarget::RequestId id = selectSector(0);
+ if (!waitForRequestCompleted(id))
+ return 0;
+ }
+
+ QNearFieldTarget::RequestId id = readBlock(0);
+ if (!waitForRequestCompleted(id))
+ return 0;
+
+ const QByteArray data = requestResponse(id).toByteArray();
+ return 8 * quint8(data.at(14));
+}
+
+/*!
+ Requests 16 bytes of data starting at \a blockAddress. Returns a request id which can be used
+ to track the completion status of the request.
+
+ Once the request completes successfully the response can be retrieved from the
+ requestResponse() function. The response of this request will be a QByteArray.
+
+ \sa requestCompleted(), waitForRequestCompleted()
+*/
+QNearFieldTarget::RequestId QNearFieldTagType2::readBlock(quint8 blockAddress)
+{
+ QByteArray command;
+ command.append(char(0x30)); // READ
+ command.append(char(blockAddress)); // Block address
+
+ return sendCommand(command);
+}
+
+/*!
+ Writes 4 bytes of \a data to the block at \a blockAddress. Returns a request id which can be
+ used to track the completion status of the request.
+
+ Once the request completes the response can be retrieved from the requestResponse() function.
+ The response of this request will be a boolean value, true for success; otherwise false.
+
+ Returns true on success; otherwise returns false.
+*/
+QNearFieldTarget::RequestId QNearFieldTagType2::writeBlock(quint8 blockAddress,
+ const QByteArray &data)
+{
+ if (data.size() != 4)
+ return QNearFieldTarget::RequestId();
+
+ QByteArray command;
+ command.append(char(0xa2)); // WRITE
+ command.append(char(blockAddress)); // Block address
+ command.append(data); // Data
+
+ QNearFieldTarget::RequestId id = sendCommand(command);
+
+ Q_D(QNearFieldTagType2);
+
+ d->m_pendingInternalCommands.insert(id, command);
+
+ return id;
+}
+
+/*!
+ Selects the \a sector upon which subsequent readBlock() and writeBlock() operations will act.
+
+ Returns a request id which can be used to track the completion status of the request.
+
+ Once the request completes the response can be retrieved from the requestResponse() function.
+ The response of this request will be a boolean value, true for success; otherwise false.
+
+ \note this request has a passive acknowledgement mechanism. The operation is deemed successful
+ if no response is received within 1ms. It will therefore take a minimum of 1 millisecond for
+ the requestCompleted() signal to be emitted and calling waitForRequestCompleted() on the
+ returned request id may cause the current thread to block for up to 1 millisecond.
+*/
+QNearFieldTarget::RequestId QNearFieldTagType2::selectSector(quint8 sector)
+{
+ QByteArray command;
+ command.append(char(0xc2)); // SECTOR SELECT (Command Packet 1)
+ command.append(char(0xff));
+
+ QNearFieldTarget::RequestId id = sendCommand(command);
+
+ Q_D(QNearFieldTagType2);
+
+ d->m_pendingInternalCommands.insert(id, command);
+
+ SectorSelectState state;
+ state.timerId = -1;
+ state.sector = sector;
+
+ d->m_pendingSectorSelectCommands.insert(id, state);
+
+ return id;
+}
+
+/*!
+ \reimp
+*/
+void QNearFieldTagType2::setResponseForRequest(const QNearFieldTarget::RequestId &id,
+ const QVariant &response,
+ bool emitRequestCompleted)
+{
+ Q_D(QNearFieldTagType2);
+
+ if (d->m_pendingInternalCommands.contains(id)) {
+ const QByteArray command = d->m_pendingInternalCommands.take(id);
+
+ QVariant decodedResponse = decodeResponse(command, response.toByteArray());
+ if (quint8(command.at(0)) == 0xc2 && decodedResponse.toBool()) {
+ // SECTOR SELECT (Command Packet 2)
+ SectorSelectState &state = d->m_pendingSectorSelectCommands[id];
+
+ QByteArray packet2;
+ packet2.append(char(state.sector));
+ packet2.append(QByteArray(3, 0x00));
+
+ sendCommand(packet2);
+
+ state.timerId = startTimer(1);
+ } else {
+ QNearFieldTargetPrivate::setResponseForRequest(id, decodedResponse, emitRequestCompleted);
+ }
+
+ return;
+ }
+
+ if (d->m_pendingSectorSelectCommands.contains(id)) {
+ if (!response.toByteArray().isEmpty()) {
+ d->m_pendingSectorSelectCommands.remove(id);
+ QNearFieldTargetPrivate::setResponseForRequest(id, false, emitRequestCompleted);
+
+ return;
+ }
+ }
+
+ QNearFieldTargetPrivate::setResponseForRequest(id, response, emitRequestCompleted);
+}
+
+/*!
+ \internal
+*/
+void QNearFieldTagType2::timerEvent(QTimerEvent *event)
+{
+ Q_D(QNearFieldTagType2);
+
+ killTimer(event->timerId());
+
+ for (auto i = d->m_pendingSectorSelectCommands.begin(), end = d->m_pendingSectorSelectCommands.end(); i != end; ++i) {
+
+ SectorSelectState &state = i.value();
+
+ if (state.timerId == event->timerId()) {
+ d->m_currentSector = state.sector;
+
+ QNearFieldTargetPrivate::setResponseForRequest(i.key(), true);
+
+ d->m_pendingSectorSelectCommands.erase(i);
+ break;
+ }
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/tests/auto/nfccommons/qnearfieldtagtype2_p.h b/tests/auto/nfccommons/qnearfieldtagtype2_p.h
new file mode 100644
index 00000000..65b9b7d1
--- /dev/null
+++ b/tests/auto/nfccommons/qnearfieldtagtype2_p.h
@@ -0,0 +1,58 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#ifndef QNEARFIELDTAGTYPE2_H
+#define QNEARFIELDTAGTYPE2_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 <QtNfc/private/qnearfieldtarget_p.h>
+
+QT_BEGIN_NAMESPACE
+
+class QNearFieldTagType2Private;
+
+class QNearFieldTagType2 : public QNearFieldTargetPrivate
+{
+ Q_OBJECT
+
+ Q_DECLARE_PRIVATE(QNearFieldTagType2)
+
+public:
+ explicit QNearFieldTagType2(QObject *parent = nullptr);
+ ~QNearFieldTagType2();
+
+ QNearFieldTarget::Type type() const override { return QNearFieldTarget::NfcTagType2; }
+
+ bool hasNdefMessage() override;
+ QNearFieldTarget::RequestId readNdefMessages() override;
+ QNearFieldTarget::RequestId writeNdefMessages(const QList<QNdefMessage> &messages) override;
+
+ quint8 version();
+ int memorySize();
+
+ virtual QNearFieldTarget::RequestId readBlock(quint8 blockAddress);
+ virtual QNearFieldTarget::RequestId writeBlock(quint8 blockAddress, const QByteArray &data);
+ virtual QNearFieldTarget::RequestId selectSector(quint8 sector);
+
+ void timerEvent(QTimerEvent *event) override;
+
+protected:
+ void setResponseForRequest(const QNearFieldTarget::RequestId &id, const QVariant &response, bool emitRequestCompleted = true) override;
+
+private:
+ QNearFieldTagType2Private *d_ptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // QNEARFIELDTAGTYPE2_H
diff --git a/tests/auto/nfccommons/qnearfieldtarget_emulator.cpp b/tests/auto/nfccommons/qnearfieldtarget_emulator.cpp
new file mode 100644
index 00000000..776ba6f6
--- /dev/null
+++ b/tests/auto/nfccommons/qnearfieldtarget_emulator.cpp
@@ -0,0 +1,279 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "qnearfieldtarget_emulator_p.h"
+#include <QtNfc/private/qnearfieldtarget_p.h>
+
+#include <QtCore/QByteArray>
+#include <QtCore/QByteArrayView>
+#include <QtCore/QCoreApplication>
+#include <QtCore/QDateTime>
+#include <QtCore/QDirIterator>
+#include <QtCore/QMutex>
+#include <QtCore/QSettings>
+
+QT_BEGIN_NAMESPACE
+
+static QMutex tagMutex;
+static QMap<TagBase *, bool> tagMap;
+
+Q_GLOBAL_STATIC(TagActivator, globalTagActivator)
+
+TagType1::TagType1(TagBase *tag, QObject *parent)
+: QNearFieldTagType1(parent), tag(tag)
+{
+}
+
+TagType1::~TagType1()
+{
+}
+
+QByteArray TagType1::uid() const
+{
+ QMutexLocker locker(&tagMutex);
+
+ return tag->uid();
+}
+
+QNearFieldTarget::AccessMethods TagType1::accessMethods() const
+{
+ return QNearFieldTarget::NdefAccess | QNearFieldTarget::TagTypeSpecificAccess;
+}
+
+QNearFieldTarget::RequestId TagType1::sendCommand(const QByteArray &command)
+{
+ QMutexLocker locker(&tagMutex);
+
+ QNearFieldTarget::RequestId id(new QNearFieldTarget::RequestIdPrivate);
+
+ // tag not in proximity
+ if (!tagMap.value(tag)) {
+ reportError(QNearFieldTarget::TargetOutOfRangeError, id);
+ return id;
+ }
+
+ quint16 crc = qChecksum(QByteArrayView(command.constData(), command.size()), Qt::ChecksumItuV41);
+
+ QByteArray response = tag->processCommand(command + char(crc & 0xff) + char(crc >> 8));
+
+ if (response.isEmpty()) {
+ reportError(QNearFieldTarget::NoResponseError, id);
+ return id;
+ }
+
+ // check crc
+ if (qChecksum(QByteArrayView(response.constData(), response.size()), Qt::ChecksumItuV41) != 0) {
+ reportError(QNearFieldTarget::ChecksumMismatchError, id);
+ return id;
+ }
+
+ response.chop(2);
+
+ QMetaObject::invokeMethod(this, [this, id, response] {
+ this->setResponseForRequest(id, response);
+ }, Qt::QueuedConnection);
+
+ return id;
+}
+
+bool TagType1::waitForRequestCompleted(const QNearFieldTarget::RequestId &id, int msecs)
+{
+ QCoreApplication::sendPostedEvents(this, QEvent::MetaCall);
+
+ return QNearFieldTagType1::waitForRequestCompleted(id, msecs);
+}
+
+
+TagType2::TagType2(TagBase *tag, QObject *parent)
+: QNearFieldTagType2(parent), tag(tag)
+{
+}
+
+TagType2::~TagType2()
+{
+}
+
+QByteArray TagType2::uid() const
+{
+ QMutexLocker locker(&tagMutex);
+
+ return tag->uid();
+}
+
+QNearFieldTarget::AccessMethods TagType2::accessMethods() const
+{
+ return QNearFieldTarget::NdefAccess | QNearFieldTarget::TagTypeSpecificAccess;
+}
+
+QNearFieldTarget::RequestId TagType2::sendCommand(const QByteArray &command)
+{
+ QMutexLocker locker(&tagMutex);
+
+ QNearFieldTarget::RequestId id(new QNearFieldTarget::RequestIdPrivate);
+
+ // tag not in proximity
+ if (!tagMap.value(tag)) {
+ reportError(QNearFieldTarget::TargetOutOfRangeError, id);
+ return id;
+ }
+
+ quint16 crc = qChecksum(QByteArrayView(command.constData(), command.size()), Qt::ChecksumItuV41);
+
+ QByteArray response = tag->processCommand(command + char(crc & 0xff) + char(crc >> 8));
+
+ if (response.isEmpty())
+ return id;
+
+ if (response.size() > 1) {
+ // check crc
+ if (qChecksum(QByteArrayView(response.constData(), response.size()), Qt::ChecksumItuV41) != 0) {
+ reportError(QNearFieldTarget::ChecksumMismatchError, id);
+ return id;
+ }
+
+ response.chop(2);
+ }
+
+ QMetaObject::invokeMethod(this, [this, id, response] {
+ this->setResponseForRequest(id, response);
+ }, Qt::QueuedConnection);
+
+ return id;
+}
+
+bool TagType2::waitForRequestCompleted(const QNearFieldTarget::RequestId &id, int msecs)
+{
+ QCoreApplication::sendPostedEvents(this, QEvent::MetaCall);
+
+ return QNearFieldTagType2::waitForRequestCompleted(id, msecs);
+}
+
+TagActivator::TagActivator() : QObject()
+{
+ qRegisterMetaType<QNearFieldTarget::Error>();
+}
+
+TagActivator::~TagActivator()
+{
+ QMutexLocker locker(&tagMutex);
+ qDeleteAll(tagMap.keys());
+ tagMap.clear();
+}
+
+void TagActivator::initialize()
+{
+ QMutexLocker locker(&tagMutex);
+
+ if (!tagMap.isEmpty())
+ return;
+
+#ifndef BUILTIN_TESTDATA
+ QDirIterator nfcTargets(QDir::currentPath(), QStringList(QStringLiteral("*.nfc")), QDir::Files);
+#else
+ QDirIterator nfcTargets(":/nfcdata", QStringList(QStringLiteral("*.nfc")), QDir::Files);
+#endif
+ while (nfcTargets.hasNext()) {
+ const QString targetFilename = nfcTargets.next();
+
+ QSettings target(targetFilename, QSettings::IniFormat);
+
+ target.beginGroup(QStringLiteral("Target"));
+
+ const QString tagType = target.value(QStringLiteral("Type")).toString();
+
+ target.endGroup();
+
+ if (tagType == QLatin1String("TagType1")) {
+ NfcTagType1 *tag = new NfcTagType1;
+ tag->load(&target);
+
+ tagMap.insert(tag, false);
+ } else if (tagType == QLatin1String("TagType2")) {
+ NfcTagType2 *tag = new NfcTagType2;
+ tag->load(&target);
+
+ tagMap.insert(tag, false);
+ } else {
+ qWarning("Unknown tag type %s\n", qPrintable(tagType));
+ }
+ }
+
+ current = tagMap.end();
+}
+
+void TagActivator::reset()
+{
+ QMutexLocker locker(&tagMutex);
+
+ stopInternal();
+
+ qDeleteAll(tagMap.keys());
+ tagMap.clear();
+}
+
+void TagActivator::start()
+{
+ QMutexLocker locker(&tagMutex);
+ timerId = startTimer(1000);
+}
+
+void TagActivator::stop()
+{
+ QMutexLocker locker(&tagMutex);
+ stopInternal();
+}
+
+void TagActivator::stopInternal()
+{
+ if (timerId != -1) {
+ killTimer(timerId);
+ timerId = -1;
+ }
+}
+
+TagActivator *TagActivator::instance()
+{
+ return globalTagActivator();
+}
+
+void TagActivator::timerEvent(QTimerEvent *e)
+{
+ Q_UNUSED(e);
+
+ tagMutex.lock();
+
+ if (current != tagMap.end()) {
+ if (current.key()->lastAccessTime() + 1500 > QDateTime::currentMSecsSinceEpoch()) {
+ tagMutex.unlock();
+ return;
+ }
+
+ *current = false;
+
+ TagBase *tag = current.key();
+
+ tagMutex.unlock();
+ Q_EMIT tagDeactivated(tag);
+ tagMutex.lock();
+ }
+
+ if (current != tagMap.end())
+ ++current;
+
+ if (current == tagMap.end())
+ current = tagMap.begin();
+
+ if (current != tagMap.end()) {
+ *current = true;
+
+ TagBase *tag = current.key();
+
+ tagMutex.unlock();
+ Q_EMIT tagActivated(tag);
+ tagMutex.lock();
+ }
+
+ tagMutex.unlock();
+}
+
+QT_END_NAMESPACE
diff --git a/tests/auto/nfccommons/qnearfieldtarget_emulator_p.h b/tests/auto/nfccommons/qnearfieldtarget_emulator_p.h
new file mode 100644
index 00000000..4807ad20
--- /dev/null
+++ b/tests/auto/nfccommons/qnearfieldtarget_emulator_p.h
@@ -0,0 +1,96 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#ifndef QNEARFIELDTARGET_EMULATOR_P_H
+#define QNEARFIELDTARGET_EMULATOR_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 "qnearfieldtagtype1_p.h"
+#include "qnearfieldtagtype2_p.h"
+#include "targetemulator_p.h"
+
+#include <QtCore/QMap>
+
+QT_BEGIN_NAMESPACE
+
+class TagType1 : public QNearFieldTagType1
+{
+ Q_OBJECT
+
+public:
+ TagType1(TagBase *tag, QObject *parent = nullptr);
+ ~TagType1();
+
+ QByteArray uid() const override;
+
+ QNearFieldTarget::AccessMethods accessMethods() const override;
+
+ QNearFieldTarget::RequestId sendCommand(const QByteArray &command) override;
+ bool waitForRequestCompleted(const QNearFieldTarget::RequestId &id, int msecs);
+
+private:
+ TagBase *tag;
+};
+
+class TagType2 : public QNearFieldTagType2
+{
+ Q_OBJECT
+
+public:
+ TagType2(TagBase *tag, QObject *parent = nullptr);
+ ~TagType2();
+
+ QByteArray uid() const override;
+
+ QNearFieldTarget::AccessMethods accessMethods() const override;
+
+ QNearFieldTarget::RequestId sendCommand(const QByteArray &command) override;
+ bool waitForRequestCompleted(const QNearFieldTarget::RequestId &id, int msecs);
+
+private:
+ TagBase *tag;
+};
+
+class TagActivator : public QObject
+{
+ Q_OBJECT
+
+public:
+ TagActivator();
+ ~TagActivator();
+
+ void initialize();
+ void reset();
+
+ void start();
+ void stop();
+
+ static TagActivator *instance();
+
+protected:
+ void timerEvent(QTimerEvent *e) override;
+
+signals:
+ void tagActivated(TagBase *tag);
+ void tagDeactivated(TagBase *tag);
+
+private:
+ void stopInternal();
+
+ QMap<TagBase *, bool>::Iterator current;
+ int timerId = -1;
+};
+
+QT_END_NAMESPACE
+
+#endif // QNEARFIELDTARGET_EMULATOR_P_H
diff --git a/tests/auto/nfccommons/qtlv.cpp b/tests/auto/nfccommons/qtlv.cpp
new file mode 100644
index 00000000..f7dae52b
--- /dev/null
+++ b/tests/auto/nfccommons/qtlv.cpp
@@ -0,0 +1,496 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "qtlv_p.h"
+
+#include "qnearfieldtagtype1_p.h"
+
+#include <QtCore/QVariant>
+
+#include <QtCore/QDebug>
+
+QT_BEGIN_NAMESPACE
+
+QPair<int, int> qParseReservedMemoryControlTlv(const QByteArray &tlvData)
+{
+ quint8 position = tlvData.at(0);
+ int pageAddr = position >> 4;
+ int byteOffset = position & 0x0f;
+
+ int size = quint8(tlvData.at(1));
+ if (size == 0)
+ size = 256;
+
+ quint8 pageControl = tlvData.at(2);
+ int bytesPerPage = pageControl & 0x0f;
+
+ if (!bytesPerPage)
+ return qMakePair(0, 0);
+
+ int byteAddress = pageAddr * (1 << bytesPerPage) + byteOffset;
+ return qMakePair(byteAddress, size);
+}
+
+QPair<int, int> qParseLockControlTlv(const QByteArray &tlvData)
+{
+ quint8 position = tlvData.at(0);
+ int pageAddr = position >> 4;
+ int byteOffset = position & 0x0f;
+
+ int size = quint8(tlvData.at(1));
+ if (size == 0)
+ size = 256;
+ size = size / 8;
+
+ quint8 pageControl = tlvData.at(2);
+ int bytesPerPage = pageControl & 0x0f;
+
+ if (!bytesPerPage)
+ return qMakePair(0, 0);
+
+ int byteAddress = pageAddr * (1 << bytesPerPage) + byteOffset;
+ return qMakePair(byteAddress, size);
+}
+
+QTlvReader::QTlvReader(QNearFieldTargetPrivate *target)
+: m_target(target), m_index(-1)
+{
+ if (qobject_cast<QNearFieldTagType1 *>(m_target)) {
+ addReservedMemory(0, 12); // skip uid, cc
+ addReservedMemory(104, 16); // skip reserved block D, lock block E
+
+ addReservedMemory(120, 8); // skip reserved block F
+ }
+}
+
+QTlvReader::QTlvReader(const QByteArray &data)
+: m_target(0), m_rawData(data), m_index(-1)
+{
+}
+
+void QTlvReader::addReservedMemory(int offset, int length)
+{
+ m_reservedMemory.insert(offset, length);
+}
+
+/*!
+ Returns the number of bytes of reserved memory found so far. The actual number of reserved
+ bytes will not be known until atEnd() returns true.
+*/
+int QTlvReader::reservedMemorySize() const
+{
+ int total = 0;
+
+ QMap<int, int>::ConstIterator i;
+ for (i = m_reservedMemory.constBegin(); i != m_reservedMemory.constEnd(); ++i)
+ total += i.value();
+
+ return total;
+}
+
+/*!
+ Returns the request id that the TLV reader is currently waiting on.
+*/
+QNearFieldTarget::RequestId QTlvReader::requestId() const
+{
+ return m_requestId;
+}
+
+bool QTlvReader::atEnd() const
+{
+ if (m_index == -1)
+ return false;
+
+ if (m_requestId.isValid())
+ return false;
+
+ return (m_index == m_tlvData.size()) || (tag() == 0xfe);
+}
+
+/*!
+ Moves to the next TLV. Returns true on success; otherwise returns false.
+*/
+bool QTlvReader::readNext()
+{
+ if (atEnd())
+ return false;
+
+ // Move to next TLV
+ if (m_index == -1) {
+ m_index = 0;
+ } else if (m_requestId.isValid()) {
+ // do nothing
+ } else if (tag() == 0x00 || tag() == 0xfe) {
+ ++m_index;
+ } else {
+ int tlvLength = length();
+ m_index += (tlvLength < 0xff) ? tlvLength + 2 : tlvLength + 4;
+ }
+
+ // Ensure that tag byte is available
+ if (!readMoreData(m_index))
+ return false;
+
+ // Ensure that length byte(s) are available
+ if (length() == -1)
+ return false;
+
+ // Ensure that data bytes are available
+ int tlvLength = length();
+
+ int dataOffset = (tlvLength < 0xff) ? m_index + 2 : m_index + 4;
+
+ if (!readMoreData(dataOffset + tlvLength - 1))
+ return false;
+
+ switch (tag()) {
+ case 0x01: { // Lock Control TLV
+ QPair<int, int> locked = qParseLockControlTlv(data());
+ addReservedMemory(locked.first, locked.second);
+ break;
+ }
+ case 0x02: { // Reserved Memory Control TLV
+ QPair<int, int> reserved = qParseReservedMemoryControlTlv(data());
+ addReservedMemory(reserved.first, reserved.second);
+ break;
+ }
+ }
+
+ return true;
+}
+
+quint8 QTlvReader::tag() const
+{
+ return m_tlvData.at(m_index);
+}
+
+int QTlvReader::length()
+{
+ if (tag() == 0x00 || tag() == 0xfe)
+ return 0;
+
+ if (!readMoreData(m_index + 1))
+ return -1;
+
+ quint8 shortLength = m_tlvData.at(m_index + 1);
+ if (shortLength != 0xff)
+ return shortLength;
+
+ if (!readMoreData(m_index + 3))
+ return -1;
+
+ quint16 longLength = (quint8(m_tlvData.at(m_index + 2)) << 8) |
+ quint8(m_tlvData.at(m_index + 3));
+
+ if (longLength < 0xff || longLength == 0xffff) {
+ qWarning("Invalid 3 byte length");
+ return 0;
+ }
+
+ return longLength;
+}
+
+QByteArray QTlvReader::data()
+{
+ int tlvLength = length();
+
+ int dataOffset = (tlvLength < 0xff) ? m_index + 2 : m_index + 4;
+
+ if (!readMoreData(dataOffset + tlvLength - 1))
+ return QByteArray();
+
+ return m_tlvData.mid(dataOffset, tlvLength);
+}
+
+bool QTlvReader::readMoreData(int sparseOffset)
+{
+ while (sparseOffset >= m_tlvData.size()) {
+ int absOffset = absoluteOffset(m_tlvData.size());
+
+ QByteArray data;
+
+ if (!m_rawData.isEmpty()) {
+ data = m_rawData.mid(absOffset, dataLength(absOffset));
+ } else if (QNearFieldTagType1 *tag = qobject_cast<QNearFieldTagType1 *>(m_target)) {
+ quint8 segment = absOffset / 128;
+
+ if (m_requestId.isValid()) {
+ QVariant v = m_target->requestResponse(m_requestId);
+ if (!v.isValid())
+ return false;
+
+ m_requestId = QNearFieldTarget::RequestId();
+
+ data = v.toByteArray();
+
+ if (absOffset < 120)
+ data = data.mid(2);
+
+ int length = dataLength(absOffset);
+
+ data = data.mid(absOffset - (segment * 128), length);
+ } else {
+ m_requestId = (absOffset < 120) ? tag->readAll() : tag->readSegment(segment);
+
+ return false;
+ }
+ }
+
+ if (data.isEmpty() && sparseOffset >= m_tlvData.size())
+ return false;
+
+ m_tlvData.append(data);
+ }
+
+ return true;
+}
+
+int QTlvReader::absoluteOffset(int sparseOffset) const
+{
+ int absoluteOffset = sparseOffset;
+ const QList<int> offsets = m_reservedMemory.keys();
+ for (const int offset : offsets) {
+ if (offset <= absoluteOffset)
+ absoluteOffset += m_reservedMemory.value(offset);
+ }
+
+ return absoluteOffset;
+}
+
+/*!
+ Returns the length of the contiguous non-reserved data block starting from absolute offset
+ \a startOffset. -1 is return as the length of the last contiguous data block.
+*/
+int QTlvReader::dataLength(int startOffset) const
+{
+ const QList<int> offsets = m_reservedMemory.keys();
+ for (const int offset : offsets) {
+ if (offset <= startOffset)
+ continue;
+
+ return offset - startOffset;
+ }
+
+ return -1;
+}
+
+
+QTlvWriter::QTlvWriter(QNearFieldTargetPrivate *target)
+: m_target(target), m_rawData(0), m_index(0), m_tagMemorySize(-1)
+{
+ if (qobject_cast<QNearFieldTagType1 *>(m_target)) {
+ addReservedMemory(0, 12); // skip uid, cc
+ addReservedMemory(104, 16); // skip reserved block D, lock block E
+
+ addReservedMemory(120, 8); // skip reserved block F
+ }
+}
+
+QTlvWriter::QTlvWriter(QByteArray *data)
+: m_target(0), m_rawData(data), m_index(0), m_tagMemorySize(-1)
+{
+}
+
+QTlvWriter::~QTlvWriter()
+{
+ if (m_rawData)
+ process(true);
+}
+
+void QTlvWriter::addReservedMemory(int offset, int length)
+{
+ m_reservedMemory.insert(offset, length);
+}
+
+void QTlvWriter::writeTlv(quint8 tagType, const QByteArray &data)
+{
+ m_buffer.append(tagType);
+
+ if (tagType != 0x00 && tagType != 0xfe) {
+ int length = data.size();
+ if (length < 0xff) {
+ m_buffer.append(quint8(length));
+ } else {
+ m_buffer.append(char(0xff));
+ m_buffer.append(quint16(length) >> 8);
+ m_buffer.append(quint16(length) & 0x00ff);
+ }
+
+ m_buffer.append(data);
+ }
+
+ process();
+
+ switch (tagType) {
+ case 0x01: { // Lock Control TLV
+ QPair<int, int> locked = qParseLockControlTlv(data);
+ addReservedMemory(locked.first, locked.second);
+ break;
+ }
+ case 0x02: { // Reserved Memory Control TLV
+ QPair<int, int> reserved = qParseReservedMemoryControlTlv(data);
+ addReservedMemory(reserved.first, reserved.second);
+ break;
+ }
+ }
+}
+
+/*!
+ Processes more of the TLV writer process. Returns true if the TLVs have been successfully
+ written to the target or buffer; otherwise returns false.
+
+ A false return value indicates that an NFC request is pending (if requestId() returns a valid
+ request identifier) or the write process has failed (requestId() returns an invalid request
+ identifier).
+*/
+bool QTlvWriter::process(bool all)
+{
+ if (m_requestId.isValid()) {
+ QVariant v = m_target->requestResponse(m_requestId);
+ if (!v.isValid())
+ return false;
+ }
+
+ if (m_tagMemorySize == -1) {
+ if (m_rawData)
+ m_tagMemorySize = m_rawData->size();
+ else if (QNearFieldTagType1 *tag = qobject_cast<QNearFieldTagType1 *>(m_target)) {
+ if (m_requestId.isValid()) {
+ m_tagMemorySize = 8 * (tag->requestResponse(m_requestId).toUInt() + 1);
+ m_requestId = QNearFieldTarget::RequestId();
+ } else {
+ m_requestId = tag->readByte(10);
+ return false;
+ }
+ }
+ }
+
+ while (!m_buffer.isEmpty()) {
+ int spaceRemaining = moveToNextAvailable();
+ if (spaceRemaining < 1)
+ return false;
+
+ int length = qMin(spaceRemaining, m_buffer.size());
+
+ if (m_rawData) {
+ m_rawData->replace(m_index, length, m_buffer);
+ m_index += length;
+ m_buffer = m_buffer.mid(length);
+ } else if (QNearFieldTagType1 *tag = qobject_cast<QNearFieldTagType1 *>(m_target)) {
+ int bufferIndex = 0;
+
+ // static memory - can only use writeByte()
+ while (m_index < 120 && bufferIndex < length) {
+ if (m_requestId.isValid()) {
+ if (!m_target->requestResponse(m_requestId).toBool())
+ return false;
+
+ m_requestId = QNearFieldTarget::RequestId();
+
+ ++m_index;
+ ++bufferIndex;
+ } else {
+ m_requestId = tag->writeByte(m_index, m_buffer.at(bufferIndex));
+ m_buffer = m_buffer.mid(bufferIndex);
+ return false;
+ }
+ }
+
+
+ // dynamic memory - writeBlock() full
+ while (m_index >= 120 && (m_index % 8 == 0) && bufferIndex + 8 < length) {
+ if (m_requestId.isValid()) {
+ if (!m_target->requestResponse(m_requestId).toBool())
+ return false;
+
+ m_requestId = QNearFieldTarget::RequestId();
+
+ m_index += 8;
+ bufferIndex += 8;
+ } else {
+ m_requestId = tag->writeBlock(m_index / 8, m_buffer.mid(bufferIndex, 8));
+ m_buffer = m_buffer.mid(bufferIndex);
+ return false;
+ }
+ }
+
+ // partial block
+ int currentBlock = m_index / 8;
+ int nextBlock = currentBlock + 1;
+ int currentBlockStart = currentBlock * 8;
+ int nextBlockStart = nextBlock * 8;
+
+ int fillLength = qMin(nextBlockStart - m_index, spaceRemaining - bufferIndex);
+
+ if (fillLength && (all || m_buffer.size() - bufferIndex >= fillLength) &&
+ (m_buffer.size() != bufferIndex)) {
+ // sufficient data available
+ if (m_requestId.isValid()) {
+ const QVariant v = tag->requestResponse(m_requestId);
+ if (v.typeId() == QMetaType::QByteArray) {
+ // read in block
+ QByteArray block = v.toByteArray();
+
+ int fill = qMin(fillLength, m_buffer.size() - bufferIndex);
+
+ for (int i = m_index - currentBlockStart; i < fill; ++i)
+ block[i] = m_buffer.at(bufferIndex++);
+
+ // now write block
+ m_requestId = tag->writeBlock(currentBlock, block);
+ return false;
+ } else if (v.typeId() == QMetaType::Bool) {
+ m_requestId = QNearFieldTarget::RequestId();
+ int fill = qMin(fillLength, m_buffer.size() - bufferIndex);
+ bufferIndex = fill - (m_index - currentBlockStart);
+
+ // write complete
+ if (!v.toBool())
+ return false;
+ }
+ } else {
+ // read in block
+ m_requestId = tag->readBlock(currentBlock);
+ m_buffer = m_buffer.mid(bufferIndex);
+ return false;
+ }
+ }
+
+ m_buffer = m_buffer.mid(bufferIndex);
+ }
+ }
+
+ return true;
+}
+
+QNearFieldTarget::RequestId QTlvWriter::requestId() const
+{
+ return m_requestId;
+}
+
+int QTlvWriter::moveToNextAvailable()
+{
+ int length = -1;
+
+ // move index to next available byte
+ QMap<int, int>::ConstIterator i;
+ for (i = m_reservedMemory.constBegin(); i != m_reservedMemory.constEnd(); ++i) {
+ if (m_index < i.key()) {
+ length = i.key() - m_index;
+ break;
+ } else if (m_index == i.key()) {
+ m_index += i.value();
+ } else if (m_index > i.key() && m_index < (i.key() + i.value())) {
+ m_index = i.key() + i.value();
+ }
+ }
+
+ if (length == -1)
+ return m_tagMemorySize - m_index;
+
+ Q_ASSERT(length != -1);
+
+ return length;
+}
+
+QT_END_NAMESPACE
diff --git a/tests/auto/nfccommons/qtlv_p.h b/tests/auto/nfccommons/qtlv_p.h
new file mode 100644
index 00000000..58119ec9
--- /dev/null
+++ b/tests/auto/nfccommons/qtlv_p.h
@@ -0,0 +1,96 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#ifndef QTLV_P_H
+#define QTLV_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 <QtNfc/qnearfieldtarget.h>
+#include <QtNfc/private/qnearfieldtarget_p.h>
+
+#include <QtCore/QByteArray>
+#include <QtCore/QMap>
+#include <QtCore/QPair>
+
+QT_BEGIN_NAMESPACE
+
+class QNearFieldTarget;
+class QTlvReader
+{
+public:
+ explicit QTlvReader(QNearFieldTargetPrivate *target);
+ explicit QTlvReader(const QByteArray &data);
+
+ void addReservedMemory(int offset, int length);
+ int reservedMemorySize() const;
+
+ QNearFieldTarget::RequestId requestId() const;
+
+ bool atEnd() const;
+
+ bool readNext();
+
+ quint8 tag() const;
+ int length();
+ QByteArray data();
+
+private:
+ bool readMoreData(int sparseOffset);
+ int absoluteOffset(int sparseOffset) const;
+ int dataLength(int startOffset) const;
+
+ QNearFieldTargetPrivate *m_target;
+ QByteArray m_rawData;
+ QNearFieldTarget::RequestId m_requestId;
+
+ QByteArray m_tlvData;
+ int m_index;
+ QMap<int, int> m_reservedMemory;
+};
+
+class QTlvWriter
+{
+public:
+ explicit QTlvWriter(QNearFieldTargetPrivate *target);
+ explicit QTlvWriter(QByteArray *data);
+ ~QTlvWriter();
+
+ void addReservedMemory(int offset, int length);
+
+ void writeTlv(quint8 tag, const QByteArray &data = QByteArray());
+
+ bool process(bool all = false);
+
+ QNearFieldTarget::RequestId requestId() const;
+
+private:
+ int moveToNextAvailable();
+
+ QNearFieldTargetPrivate *m_target;
+ QByteArray *m_rawData;
+
+ int m_index;
+ int m_tagMemorySize;
+ QMap<int, int> m_reservedMemory;
+
+ QByteArray m_buffer;
+
+ QNearFieldTarget::RequestId m_requestId;
+};
+
+QPair<int, int> qParseReservedMemoryControlTlv(const QByteArray &tlvData);
+QPair<int, int> qParseLockControlTlv(const QByteArray &tlvData);
+
+QT_END_NAMESPACE
+
+#endif // QTLV_P_H
diff --git a/tests/auto/nfccommons/targetemulator.cpp b/tests/auto/nfccommons/targetemulator.cpp
new file mode 100644
index 00000000..f19d460b
--- /dev/null
+++ b/tests/auto/nfccommons/targetemulator.cpp
@@ -0,0 +1,345 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include "targetemulator_p.h"
+
+#include <QtCore/QSettings>
+#include <QtCore/QDateTime>
+
+#include <QtCore/QDebug>
+
+QT_BEGIN_NAMESPACE
+
+TagBase::TagBase()
+: lastAccess(0)
+{
+}
+
+TagBase::~TagBase()
+{
+}
+
+NfcTagType1::NfcTagType1()
+: hr0(0x11), hr1(0x00), memory(120, '\0')
+{
+ // Locked blocks
+ memory[(0x0e << 3) | 0x00] = 0x01;
+ memory[(0x0e << 3) | 0x01] = 0x60;
+}
+
+NfcTagType1::~NfcTagType1()
+{
+}
+
+void NfcTagType1::load(QSettings *settings)
+{
+ settings->beginGroup(QStringLiteral("TagType1"));
+
+ hr0 = settings->value(QStringLiteral("HR0"), 0x11).toUInt();
+
+ if (!(hr0 & 0x10)) {
+ settings->endGroup();
+ return;
+ }
+
+ hr1 = settings->value(QStringLiteral("HR1"), 0x00).toUInt();
+
+ memory = settings->value(QStringLiteral("Data")).toByteArray();
+
+ //quint8 nmn = memory.at(8);
+
+ quint8 vno = memory.at(9);
+ if (vno != 0x10)
+ qWarning("Only NFC TagType1 v1.0 behavior is supported.");
+
+ quint8 tms = memory.at(10);
+ if (memory.size() != 8 * (tms + 1))
+ qWarning("Static memory size does not match TMS value.");
+
+ quint8 rwa = memory.at(11);
+ switch (rwa >> 4) {
+ case 0:
+ // Unrestricted read access tag
+ break;
+ default:
+ // tag with unknown read attributes
+ ;
+ }
+
+ switch (rwa & 0x0f) {
+ case 0:
+ // Unrestricted write access tag
+ break;
+ case 0x0f:
+ // Read only tag
+ break;
+ default:
+ // tag with unknown write attributes
+ ;
+ }
+
+ settings->endGroup();
+}
+
+QByteArray NfcTagType1::uid() const
+{
+ lastAccess = QDateTime::currentMSecsSinceEpoch();
+
+ return memory.left(7);
+}
+
+quint8 NfcTagType1::readData(quint8 block, quint8 byte)
+{
+ return memory.at((block << 3) | byte);
+}
+
+QByteArray NfcTagType1::processCommand(const QByteArray &command)
+{
+ lastAccess = QDateTime::currentMSecsSinceEpoch();
+
+ QByteArray response;
+
+ bool tagType1 = (hr0 & 0xf0) == 0x10;
+ bool dynamic = (hr0 & 0x0f) != 0x01;
+
+ if (command.size() == 9) {
+ // static memory model command
+ quint8 opcode = command.at(0);
+ quint8 address = command.at(1);
+ quint8 data = command.at(2);
+ QByteArray uid = command.mid(3, 4);
+
+ // check checksum
+ if (qChecksum(QByteArrayView(command.constData(), command.size()), Qt::ChecksumItuV41) != 0)
+ return QByteArray();
+
+ // check UID
+ if (uid != memory.left(4))
+ return QByteArray();
+
+ switch (opcode) {
+ case 0x00: // RALL
+ response.append(hr0);
+ response.append(hr1);
+ response.append(memory.left(120));
+ break;
+ case 0x01: // READ
+ response.append(address);
+ if (address & 0x80)
+ response.append(char(0x00));
+ else
+ response.append(memory.at(address));
+ break;
+ case 0x53: { // WRITE-E
+ quint8 block = address >> 3;
+ if (block == 0x00 || block == 0x0d || block == 0x0e) // locked blocks
+ break;
+
+ quint16 lock = (readData(0x0e, 0x01) << 8) | readData(0x0e, 0x00);
+ if ((0x01 << block) & lock) // locked blocks
+ break;
+
+ // FIXME: Test dynamic lock bytes
+
+ memory[address] = data;
+
+ response.append(address);
+ response.append(data);
+ break;
+ }
+ case 0x1a: { // WRITE-NE
+ quint8 block = address >> 3;
+ if (block == 0x00 || block == 0x0d) // locked blocks
+ break;
+
+ quint16 lock = (readData(0x0e, 0x01) << 8) | readData(0x0e, 0x00);
+ if ((0x01 << block) & lock) // locked blocks
+ break;
+
+
+ // FIXME: Test dynamic lock bytes
+
+ memory[address] = memory.at(address) | data;
+
+ response.append(address);
+ response.append(memory.at(address));
+ break;
+ }
+ case 0x78: // RID
+ response.append(hr0);
+ response.append(hr1);
+ response.append(memory.left(4));
+ break;
+ }
+ } else if (tagType1 && dynamic && command.size() == 16) {
+ // dynamic memory model command
+ quint8 opcode = command.at(0);
+ quint8 address = command.at(1);
+ QByteArray data = command.mid(2, 8);
+ QByteArray uid = command.mid(10, 4);
+
+ // check checksum
+ if (qChecksum(QByteArrayView(command.constData(), command.size()), Qt::ChecksumItuV41) != 0)
+ return QByteArray();
+
+ // check UID
+ if (uid != memory.left(4))
+ return QByteArray();
+
+ switch (opcode) {
+ case 0x10: // RSEG
+ response.append(address);
+ response.append(memory.mid(128 * (address >> 4), 128));
+ break;
+ case 0x02: // READ8
+ response.append(address);
+ response.append(memory.mid(8 * address, 8));
+ break;
+ case 0x54: { // WRITE-E8
+ // locked blocks
+ if (address == 0x00 || address == 0x0d || address == 0x0e || address == 0x0f)
+ break;
+
+ quint16 lock = (readData(0x0e, 0x01) << 8) | readData(0x0e, 0x00);
+ if (address <= 0x0e && ((0x01 << address) & lock)) // locked blocks
+ break;
+
+ // FIXME: Test dynamic lock bytes
+
+ memory.replace(address * 8, 8, data);
+
+ response.append(address);
+ response.append(memory.mid(address * 8, 8));
+ break;
+ }
+ case 0x1b: // WRITE-NE8
+ // locked blocks
+ if (address == 0x00 || address == 0x0d || address == 0x0e || address == 0x0f)
+ break;
+
+ quint16 lock = (readData(0x0e, 0x01) << 8) | readData(0x0e, 0x00);
+ if (address <= 0x0e && ((0x01 << address) & lock)) // locked blocks
+ break;
+
+ // FIXME: Test dynamic lock bytes
+
+ for (int i = 0; i < 8; ++i)
+ memory[address * 8 + i] = memory.at(address * 8 + i) | data.at(i);
+
+ response.append(address);
+ response.append(memory.mid(address * 8, 8));
+ break;
+ }
+ }
+
+ if (!response.isEmpty()) {
+ quint16 crc = qChecksum(QByteArrayView(response.constData(), response.size()), Qt::ChecksumItuV41);
+ response.append(quint8(crc & 0xff));
+ response.append(quint8(crc >> 8));
+ }
+
+ return response;
+}
+
+
+NfcTagType2::NfcTagType2()
+: memory(64, 0x00), currentSector(0), expectPacket2(false)
+{
+}
+
+NfcTagType2::~NfcTagType2()
+{
+}
+
+void NfcTagType2::load(QSettings *settings)
+{
+ settings->beginGroup(QStringLiteral("TagType2"));
+
+ memory = settings->value(QStringLiteral("Data")).toByteArray();
+
+ settings->endGroup();
+}
+
+QByteArray NfcTagType2::uid() const
+{
+ lastAccess = QDateTime::currentMSecsSinceEpoch();
+
+ return memory.left(3) + memory.mid(4, 4);
+}
+
+#define NACK QByteArray("\x05")
+#define ACK QByteArray("\x0a")
+
+QByteArray NfcTagType2::processCommand(const QByteArray &command)
+{
+ lastAccess = QDateTime::currentMSecsSinceEpoch();
+
+ QByteArray response;
+
+ // check checksum
+ if (qChecksum(QByteArrayView(command.constData(), command.size()), Qt::ChecksumItuV41) != 0)
+ return QByteArray();
+
+ if (expectPacket2) {
+ expectPacket2 = false;
+ quint8 sector = command.at(0);
+ if (sector * 1024 > memory.size())
+ return NACK;
+ else {
+ currentSector = sector;
+ return QByteArray();
+ }
+ }
+
+ quint8 opcode = command.at(0);
+
+ switch (opcode) {
+ case 0x30: { // READ BLOCK
+ quint8 block = command.at(1);
+ int absoluteBlock = currentSector * 256 + block;
+
+ response.append(memory.mid(absoluteBlock * 4, 16));
+ if (response.size() != 16)
+ response.append(QByteArray(16 - response.size(), '\0'));
+
+ break;
+ }
+ case 0xa2: { // WRITE BLOCK
+ quint8 block = command.at(1);
+ int absoluteBlock = currentSector * 256 + block;
+
+ // locked blocks
+ if (absoluteBlock == 0 || absoluteBlock == 1)
+ return NACK;
+
+ const QByteArray data = command.mid(2, 4);
+
+ memory.replace(absoluteBlock * 4, 4, data);
+
+ return ACK;
+ }
+ case 0xc2: // SECTOR SELECT - Packet 1
+ if (memory.size() > 1024) {
+ expectPacket2 = true;
+ return ACK;
+ }
+
+ return NACK;
+ default:
+ qDebug() << "Unknown opcode for Tag Type 2" << Qt::hex << opcode;
+ qDebug() << "command:" << command.toHex();
+
+ return NACK;
+ ;
+ }
+
+ if (!response.isEmpty()) {
+ quint16 crc = qChecksum(QByteArrayView(response.constData(), response.size()), Qt::ChecksumItuV41);
+ response.append(quint8(crc & 0xff));
+ response.append(quint8(crc >> 8));
+ }
+
+ return response;
+}
+
+QT_END_NAMESPACE
diff --git a/tests/auto/nfccommons/targetemulator_p.h b/tests/auto/nfccommons/targetemulator_p.h
new file mode 100644
index 00000000..f77a0b39
--- /dev/null
+++ b/tests/auto/nfccommons/targetemulator_p.h
@@ -0,0 +1,88 @@
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#ifndef TARGETEMULATOR_P_H
+#define TARGETEMULATOR_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 <QtCore/QtGlobal>
+#include <QtCore/QByteArray>
+#include <QtNfc/qtnfcglobal.h>
+#include <QMetaType>
+
+QT_FORWARD_DECLARE_CLASS(QSettings)
+
+QT_BEGIN_NAMESPACE
+
+class TagBase
+{
+public:
+ TagBase();
+ virtual ~TagBase();
+
+ virtual void load(QSettings *settings) = 0;
+
+ virtual QByteArray processCommand(const QByteArray &command) = 0;
+
+ virtual QByteArray uid() const = 0;
+
+ qint64 lastAccessTime() const { return lastAccess; }
+
+protected:
+ mutable qint64 lastAccess;
+};
+
+class NfcTagType1 : public TagBase
+{
+public:
+ NfcTagType1();
+ ~NfcTagType1();
+
+ void load(QSettings *settings) override;
+
+ QByteArray processCommand(const QByteArray &command) override;
+
+ QByteArray uid() const override;
+
+private:
+ quint8 readData(quint8 block, quint8 byte);
+
+ quint8 hr0;
+ quint8 hr1;
+
+ QByteArray memory;
+};
+
+class NfcTagType2 : public TagBase
+{
+public:
+ NfcTagType2();
+ ~NfcTagType2();
+
+ void load(QSettings *settings) override;
+
+ QByteArray processCommand(const QByteArray &command) override;
+
+ QByteArray uid() const override;
+
+private:
+ QByteArray memory;
+ quint8 currentSector;
+ bool expectPacket2;
+};
+
+QT_END_NAMESPACE
+
+Q_DECLARE_METATYPE(TagBase *)
+
+#endif // TARGETEMULATOR_P_H
diff --git a/tests/auto/qbluetoothaddress/CMakeLists.txt b/tests/auto/qbluetoothaddress/CMakeLists.txt
new file mode 100644
index 00000000..0bf39eeb
--- /dev/null
+++ b/tests/auto/qbluetoothaddress/CMakeLists.txt
@@ -0,0 +1,19 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qbluetoothaddress Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qbluetoothaddress LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qbluetoothaddress
+ SOURCES
+ tst_qbluetoothaddress.cpp
+ LIBRARIES
+ Qt::Bluetooth
+)
diff --git a/tests/auto/qbluetoothaddress/qbluetoothaddress.pro b/tests/auto/qbluetoothaddress/qbluetoothaddress.pro
deleted file mode 100644
index f87551e8..00000000
--- a/tests/auto/qbluetoothaddress/qbluetoothaddress.pro
+++ /dev/null
@@ -1,6 +0,0 @@
-SOURCES += tst_qbluetoothaddress.cpp
-TARGET = tst_qbluetoothaddress
-CONFIG += testcase
-
-QT = core concurrent bluetooth testlib
-
diff --git a/tests/auto/qbluetoothaddress/tst_qbluetoothaddress.cpp b/tests/auto/qbluetoothaddress/tst_qbluetoothaddress.cpp
index 7be97b36..8e1c9039 100644
--- a/tests/auto/qbluetoothaddress/tst_qbluetoothaddress.cpp
+++ b/tests/auto/qbluetoothaddress/tst_qbluetoothaddress.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
diff --git a/tests/auto/qbluetoothdevicediscoveryagent/CMakeLists.txt b/tests/auto/qbluetoothdevicediscoveryagent/CMakeLists.txt
new file mode 100644
index 00000000..9a43e90d
--- /dev/null
+++ b/tests/auto/qbluetoothdevicediscoveryagent/CMakeLists.txt
@@ -0,0 +1,39 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qbluetoothdevicediscoveryagent Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qbluetoothdevicediscoveryagent LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qbluetoothdevicediscoveryagent
+ SOURCES
+ tst_qbluetoothdevicediscoveryagent.cpp
+ LIBRARIES
+ Qt::BluetoothPrivate
+)
+
+## Scopes:
+#####################################################################
+
+qt_internal_extend_target(tst_qbluetoothdevicediscoveryagent CONDITION MACOS
+ LIBRARIES
+ Qt::Widgets
+)
+
+set_target_properties(tst_qbluetoothdevicediscoveryagent PROPERTIES
+ MACOSX_BUNDLE TRUE
+)
+
+if (APPLE AND NOT IOS)
+ # Ninja has trouble with relative paths, convert to absolute as a workaround
+ get_filename_component(SHARED_PLIST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../shared ABSOLUTE)
+ set_target_properties(tst_qbluetoothdevicediscoveryagent PROPERTIES
+ MACOSX_BUNDLE_INFO_PLIST "${SHARED_PLIST_DIR}/Info.macos.plist"
+ )
+endif()
diff --git a/tests/auto/qbluetoothdevicediscoveryagent/qbluetoothdevicediscoveryagent.pro b/tests/auto/qbluetoothdevicediscoveryagent/qbluetoothdevicediscoveryagent.pro
deleted file mode 100644
index 900bb5e9..00000000
--- a/tests/auto/qbluetoothdevicediscoveryagent/qbluetoothdevicediscoveryagent.pro
+++ /dev/null
@@ -1,6 +0,0 @@
-SOURCES += tst_qbluetoothdevicediscoveryagent.cpp
-TARGET=tst_qbluetoothdevicediscoveryagent
-CONFIG += testcase
-
-QT = core concurrent bluetooth-private testlib
-osx:QT += widgets
diff --git a/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp b/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp
index cbce5042..d866ec57 100644
--- a/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp
+++ b/tests/auto/qbluetoothdevicediscoveryagent/tst_qbluetoothdevicediscoveryagent.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
@@ -33,11 +8,20 @@
#include <QList>
#include <QLoggingCategory>
+#include "../../shared/bttestutil_p.h"
#include <private/qtbluetoothglobal_p.h>
#include <qbluetoothaddress.h>
#include <qbluetoothdevicediscoveryagent.h>
#include <qbluetoothlocaldevice.h>
+#if QT_CONFIG(permissions)
+#include <QtCore/qcoreapplication.h>
+#include <QtCore/qpermissions.h>
+#include <QtCore/qnamespace.h>
+#endif // permissions
+
+#include <memory>
+
QT_USE_NAMESPACE
/*
@@ -55,6 +39,11 @@ const int MaxScanTime = 5 * 60 * 1000; // 5 minutes in ms
//Bluez needs at least 10s for a device discovery to be cancelled
const int MaxWaitForCancelTime = 15 * 1000; // 15 seconds in ms
+#ifdef Q_OS_ANDROID
+// Android is sometimes unable to cancel immediately
+const int WaitBeforeStopTime = 200;
+#endif
+
class tst_QBluetoothDeviceDiscoveryAgent : public QObject
{
Q_OBJECT
@@ -70,85 +59,52 @@ public slots:
private slots:
void initTestCase();
- void tst_properties();
-
void tst_invalidBtAddress();
void tst_startStopDeviceDiscoveries();
- void tst_deviceDiscovery_data();
void tst_deviceDiscovery();
void tst_discoveryTimeout();
void tst_discoveryMethods();
private:
- int noOfLocalDevices;
- bool isBluez5Runtime = false;
+ qsizetype noOfLocalDevices;
+ using DiscoveryAgentPtr = std::unique_ptr<QBluetoothDeviceDiscoveryAgent>;
+#if QT_CONFIG(permissions)
+ Qt::PermissionStatus permissionStatus = Qt::PermissionStatus::Undetermined;
+#endif
};
tst_QBluetoothDeviceDiscoveryAgent::tst_QBluetoothDeviceDiscoveryAgent()
{
QLoggingCategory::setFilterRules(QStringLiteral("qt.bluetooth* = true"));
qRegisterMetaType<QBluetoothDeviceDiscoveryAgent::Error>();
-}
-
-tst_QBluetoothDeviceDiscoveryAgent::~tst_QBluetoothDeviceDiscoveryAgent()
-{
-}
-
-#if QT_CONFIG(bluez)
-// This section was adopted from tst_qloggingcategory.cpp
-QString logMessage;
-
-QByteArray qMyMessageFormatString(QtMsgType type, const QMessageLogContext &context,
- const QString &str)
-{
- QByteArray message;
- message.append(context.category);
- switch (type) {
- case QtDebugMsg: message.append(".debug"); break;
- case QtInfoMsg: message.append(".info"); break;
- case QtWarningMsg: message.append(".warning"); break;
- case QtCriticalMsg:message.append(".critical"); break;
- case QtFatalMsg: message.append(".fatal"); break;
+#if QT_CONFIG(permissions)
+ permissionStatus = qApp->checkPermission(QBluetoothPermission{});
+
+ const bool ciRun = qEnvironmentVariable("QTEST_ENVIRONMENT").split(' ').contains("ci");
+ if (!ciRun && permissionStatus == Qt::PermissionStatus::Undetermined) {
+ QTestEventLoop loop;
+ qApp->requestPermission(QBluetoothPermission{}, [this, &loop](const QPermission &permission){
+ permissionStatus = permission.status();
+ loop.exitLoop();
+ });
+ if (permissionStatus == Qt::PermissionStatus::Undetermined)
+ loop.enterLoopMSecs(30000);
}
- message.append(": ");
- message.append(qPrintable(str));
-
- return message.simplified();
+#endif // QT_CONFIG(permissions)
}
-static void myCustomMessageHandler(QtMsgType type,
- const QMessageLogContext &context,
- const QString &msg)
+tst_QBluetoothDeviceDiscoveryAgent::~tst_QBluetoothDeviceDiscoveryAgent()
{
- logMessage = qMyMessageFormatString(type, context, msg);
}
-#endif
-
-
void tst_QBluetoothDeviceDiscoveryAgent::initTestCase()
{
qRegisterMetaType<QBluetoothDeviceInfo>();
- qRegisterMetaType<QBluetoothDeviceDiscoveryAgent::InquiryType>();
-
-#if QT_CONFIG(bluez)
- // To distinguish Bluez 4 and 5 we peek into the debug output
- // of first Bluetooth ctor. It executes a runtime test and prints the result
- // as logging output. This avoids more complex runtime detection logic within this unit test.
- QtMessageHandler oldMessageHandler;
- oldMessageHandler = qInstallMessageHandler(myCustomMessageHandler);
-
- noOfLocalDevices = QBluetoothLocalDevice::allDevices().count();
- qInstallMessageHandler(oldMessageHandler);
- isBluez5Runtime = logMessage.contains(QStringLiteral("Bluez 5"));
- if (isBluez5Runtime)
- qDebug() << "BlueZ 5 runtime detected.";
-#else
- noOfLocalDevices = QBluetoothLocalDevice::allDevices().count();
-#endif
+
+ noOfLocalDevices = QBluetoothLocalDevice::allDevices().size();
if (!noOfLocalDevices)
return;
@@ -160,11 +116,11 @@ void tst_QBluetoothDeviceDiscoveryAgent::initTestCase()
QVERIFY(hostModeSpy.isEmpty());
device->powerOn();
int connectTime = 5000; // ms
- while (hostModeSpy.count() < 1 && connectTime > 0) {
+ while (hostModeSpy.isEmpty() && connectTime > 0) {
QTest::qWait(500);
connectTime -= 500;
}
- QVERIFY(hostModeSpy.count() > 0);
+ QVERIFY(!hostModeSpy.isEmpty());
}
QBluetoothLocalDevice::HostMode hostMode= device->hostMode();
QVERIFY(hostMode == QBluetoothLocalDevice::HostConnectable
@@ -173,33 +129,26 @@ void tst_QBluetoothDeviceDiscoveryAgent::initTestCase()
delete device;
}
-void tst_QBluetoothDeviceDiscoveryAgent::tst_properties()
-{
- QBluetoothDeviceDiscoveryAgent discoveryAgent;
-
- QCOMPARE(discoveryAgent.inquiryType(), QBluetoothDeviceDiscoveryAgent::GeneralUnlimitedInquiry);
- discoveryAgent.setInquiryType(QBluetoothDeviceDiscoveryAgent::LimitedInquiry);
- QCOMPARE(discoveryAgent.inquiryType(), QBluetoothDeviceDiscoveryAgent::LimitedInquiry);
- discoveryAgent.setInquiryType(QBluetoothDeviceDiscoveryAgent::GeneralUnlimitedInquiry);
- QCOMPARE(discoveryAgent.inquiryType(), QBluetoothDeviceDiscoveryAgent::GeneralUnlimitedInquiry);
-}
-
void tst_QBluetoothDeviceDiscoveryAgent::tst_invalidBtAddress()
{
- QBluetoothDeviceDiscoveryAgent *discoveryAgent = new QBluetoothDeviceDiscoveryAgent(QBluetoothAddress("11:11:11:11:11:11"));
+ DiscoveryAgentPtr discoveryAgent(new QBluetoothDeviceDiscoveryAgent(
+ QBluetoothAddress(QStringLiteral("11:11:11:11:11:11"))));
QCOMPARE(discoveryAgent->error(), QBluetoothDeviceDiscoveryAgent::InvalidBluetoothAdapterError);
discoveryAgent->start();
QCOMPARE(discoveryAgent->isActive(), false);
- delete discoveryAgent;
- discoveryAgent = new QBluetoothDeviceDiscoveryAgent(QBluetoothAddress());
+#if QT_CONFIG(permissions)
+ if (permissionStatus != Qt::PermissionStatus::Granted)
+ return;
+#endif
+
+ discoveryAgent.reset(new QBluetoothDeviceDiscoveryAgent(QBluetoothAddress()));
QCOMPARE(discoveryAgent->error(), QBluetoothDeviceDiscoveryAgent::NoError);
- if (QBluetoothLocalDevice::allDevices().count() > 0) {
+ if (!QBluetoothLocalDevice::allDevices().isEmpty()) {
discoveryAgent->start();
QCOMPARE(discoveryAgent->isActive(), true);
}
- delete discoveryAgent;
}
void tst_QBluetoothDeviceDiscoveryAgent::deviceDiscoveryDebug(const QBluetoothDeviceInfo &info)
@@ -209,7 +158,9 @@ void tst_QBluetoothDeviceDiscoveryAgent::deviceDiscoveryDebug(const QBluetoothDe
void tst_QBluetoothDeviceDiscoveryAgent::tst_startStopDeviceDiscoveries()
{
- QBluetoothDeviceDiscoveryAgent::InquiryType inquiryType = QBluetoothDeviceDiscoveryAgent::GeneralUnlimitedInquiry;
+ if (androidBluetoothEmulator())
+ QSKIP("Skipping test on Android 12+ emulator, CI can timeout waiting for user input");
+
QBluetoothDeviceDiscoveryAgent discoveryAgent;
QVERIFY(discoveryAgent.error() == discoveryAgent.NoError);
@@ -219,14 +170,22 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_startStopDeviceDiscoveries()
QSignalSpy finishedSpy(&discoveryAgent, SIGNAL(finished()));
QSignalSpy cancelSpy(&discoveryAgent, SIGNAL(canceled()));
- QSignalSpy errorSpy(&discoveryAgent, SIGNAL(error(QBluetoothDeviceDiscoveryAgent::Error)));
+ QSignalSpy errorSpy(&discoveryAgent,
+ SIGNAL(errorOccurred(QBluetoothDeviceDiscoveryAgent::Error)));
// Starting case 1: start-stop, expecting cancel signal
- discoveryAgent.setInquiryType(inquiryType);
// we should have no errors at this point.
QVERIFY(errorSpy.isEmpty());
discoveryAgent.start();
+#if QT_CONFIG(permissions)
+ if (permissionStatus != Qt::PermissionStatus::Granted) {
+ // If bluetooth is OFF, the permission does not get checked (e.g. on Darwin),
+ // but not to depend on the order in which errors generated, we
+ // do not compare error value with MissionPermissionsError here.
+ return;
+ }
+#endif
if (errorSpy.isEmpty()) {
QVERIFY(discoveryAgent.isActive());
@@ -240,19 +199,27 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_startStopDeviceDiscoveries()
QSKIP("No local Bluetooth device available. Skipping remaining part of test.");
}
// cancel current request.
+#ifdef Q_OS_ANDROID
+ // Android sometimes can't cancel immediately (~on the same millisecond),
+ // but instead a "pending cancel" happens, which means the discovery will be
+ // canceled at a later point in time. When this happens the Android backend
+ // also emits an immediate errorOccurred(). While this seems to be as intended,
+ // as a result many parts of this test function may fail (not always).
+ //
+ // In this test function we wait some milliseconds between start() and stop() to
+ // bypass this behavior difference. This is to avoid complex iffery (Android itself
+ // can behave differently every time) and ifdeffery (Q_OS_ANDROID) in the test
+ QTest::qWait(WaitBeforeStopTime);
+#endif
discoveryAgent.stop();
// Wait for up to MaxWaitForCancelTime for the cancel to finish
- int waitTime = MaxWaitForCancelTime;
- while (cancelSpy.count() == 0 && waitTime > 0) {
- QTest::qWait(100);
- waitTime-=100;
- }
+ QTRY_VERIFY_WITH_TIMEOUT(!cancelSpy.isEmpty(), MaxWaitForCancelTime);
// we should not be active anymore
QVERIFY(!discoveryAgent.isActive());
QVERIFY(errorSpy.isEmpty());
- QCOMPARE(cancelSpy.count(), 1);
+ QCOMPARE(cancelSpy.size(), 1);
cancelSpy.clear();
// Starting case 2: start-start-stop, expecting cancel signal
discoveryAgent.start();
@@ -264,19 +231,19 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_startStopDeviceDiscoveries()
QVERIFY(discoveryAgent.isActive());
QVERIFY(errorSpy.isEmpty());
// stop
+#ifdef Q_OS_ANDROID
+ QTest::qWait(WaitBeforeStopTime);
+#endif
discoveryAgent.stop();
// Wait for up to MaxWaitForCancelTime for the cancel to finish
- waitTime = MaxWaitForCancelTime;
- while (cancelSpy.count() == 0 && waitTime > 0) {
- QTest::qWait(100);
- waitTime-=100;
- }
+ QTRY_VERIFY_WITH_TIMEOUT(!cancelSpy.isEmpty(), MaxWaitForCancelTime);
// we should not be active anymore
QVERIFY(!discoveryAgent.isActive());
QVERIFY(errorSpy.isEmpty());
- QVERIFY(cancelSpy.count() == 1);
+
+ QCOMPARE(cancelSpy.size(), 1);
cancelSpy.clear();
// Starting case 3: stop
@@ -285,7 +252,7 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_startStopDeviceDiscoveries()
QVERIFY(errorSpy.isEmpty());
// Don't expect finished signal and no error
- QVERIFY(finishedSpy.count() == 0);
+ QVERIFY(finishedSpy.isEmpty());
QVERIFY(discoveryAgent.error() == discoveryAgent.NoError);
QVERIFY(discoveryAgent.errorString().isEmpty());
@@ -306,9 +273,12 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_startStopDeviceDiscoveries()
QVERIFY(discoveryAgent.isActive());
QVERIFY(errorSpy.isEmpty());
// cancel current request.
+#ifdef Q_OS_ANDROID
+ QTest::qWait(WaitBeforeStopTime);
+#endif
discoveryAgent.stop();
//should only have triggered cancel() if stop didn't involve the event loop
- if (cancelSpy.count() == 1) immediateSignal = true;
+ if (cancelSpy.size() == 1) immediateSignal = true;
// start a new one
discoveryAgent.start();
@@ -316,25 +286,25 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_startStopDeviceDiscoveries()
QVERIFY(discoveryAgent.isActive());
QVERIFY(errorSpy.isEmpty());
// stop
+#ifdef Q_OS_ANDROID
+ QTest::qWait(WaitBeforeStopTime);
+#endif
discoveryAgent.stop();
if (immediateSignal)
- QVERIFY(cancelSpy.count() == 2);
+ QCOMPARE(cancelSpy.size(), 2);
// Wait for up to MaxWaitForCancelTime for the cancel to finish
- waitTime = MaxWaitForCancelTime;
- while (cancelSpy.count() == 0 && waitTime > 0) {
- QTest::qWait(100);
- waitTime-=100;
- }
+ QTRY_VERIFY_WITH_TIMEOUT(!cancelSpy.isEmpty(), MaxWaitForCancelTime);
+
// we should not be active anymore
QVERIFY(!discoveryAgent.isActive());
QVERIFY(errorSpy.isEmpty());
- // should only have 1 cancel
+ // should only have 1 cancel
if (immediateSignal)
- QVERIFY(cancelSpy.count() == 2);
+ QCOMPARE(cancelSpy.size(), 2);
else
- QVERIFY(cancelSpy.count() == 1);
+ QCOMPARE(cancelSpy.size(), 1);
cancelSpy.clear();
// Starting case 5: start-stop-start: expecting finished signal & no cancel
@@ -342,6 +312,9 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_startStopDeviceDiscoveries()
QVERIFY(discoveryAgent.isActive());
QVERIFY(errorSpy.isEmpty());
// cancel current request.
+#ifdef Q_OS_ANDROID
+ QTest::qWait(WaitBeforeStopTime);
+#endif
discoveryAgent.stop();
// start a new one
discoveryAgent.start();
@@ -349,18 +322,14 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_startStopDeviceDiscoveries()
QVERIFY(discoveryAgent.isActive());
QVERIFY(errorSpy.isEmpty());
- // Wait for up to MaxScanTime for the cancel to finish
- waitTime = MaxScanTime;
- while (finishedSpy.count() == 0 && waitTime > 0) {
- QTest::qWait(1000);
- waitTime-=1000;
- }
+ // Wait for up to MaxScanTime for the scan to finish
+ QTRY_VERIFY_WITH_TIMEOUT(!finishedSpy.isEmpty(), MaxScanTime);
// we should not be active anymore
QVERIFY(!discoveryAgent.isActive());
QVERIFY(errorSpy.isEmpty());
// should only have 1 cancel
- QVERIFY(finishedSpy.count() == 1);
+ QCOMPARE(finishedSpy.size(), 1);
// On OS X, stop is synchronous (signal will be emitted immediately).
if (!immediateSignal)
@@ -372,32 +341,13 @@ void tst_QBluetoothDeviceDiscoveryAgent::finished()
qDebug() << "Finished called";
}
-void tst_QBluetoothDeviceDiscoveryAgent::tst_deviceDiscovery_data()
-{
- QTest::addColumn<QBluetoothDeviceDiscoveryAgent::InquiryType>("inquiryType");
-
- QTest::newRow("general unlimited inquiry") << QBluetoothDeviceDiscoveryAgent::GeneralUnlimitedInquiry;
- QTest::newRow("limited inquiry") << QBluetoothDeviceDiscoveryAgent::LimitedInquiry;
-}
-
void tst_QBluetoothDeviceDiscoveryAgent::tst_deviceDiscovery()
{
{
- QFETCH(QBluetoothDeviceDiscoveryAgent::InquiryType, inquiryType);
-
//Run test in case of multiple Bluetooth adapters
QBluetoothLocalDevice localDevice;
//We will use default adapter if there is no other adapter
QBluetoothAddress address = localDevice.address();
- int numberOfAdapters = (localDevice.allDevices()).size();
- QList<QBluetoothAddress> addresses;
- if (numberOfAdapters > 1) {
-
- for (int i=0; i < numberOfAdapters; i++) {
- addresses.append(((QBluetoothHostInfo)localDevice.allDevices().at(i)).address());
- }
- address = (QBluetoothAddress)addresses.at(0);
- }
QBluetoothDeviceDiscoveryAgent discoveryAgent(address);
QVERIFY(discoveryAgent.error() == discoveryAgent.NoError);
@@ -407,15 +357,20 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_deviceDiscovery()
QVERIFY(discoveryAgent.discoveredDevices().isEmpty());
QSignalSpy finishedSpy(&discoveryAgent, SIGNAL(finished()));
- QSignalSpy errorSpy(&discoveryAgent, SIGNAL(error(QBluetoothDeviceDiscoveryAgent::Error)));
+ QSignalSpy errorSpy(&discoveryAgent,
+ SIGNAL(errorOccurred(QBluetoothDeviceDiscoveryAgent::Error)));
QSignalSpy discoveredSpy(&discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)));
// connect(&discoveryAgent, SIGNAL(finished()), this, SLOT(finished()));
// connect(&discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
// this, SLOT(deviceDiscoveryDebug(QBluetoothDeviceInfo)));
- discoveryAgent.setInquiryType(inquiryType);
discoveryAgent.start();
+
if (!errorSpy.isEmpty()) {
+#if QT_CONFIG(permissions)
+ if (permissionStatus == Qt::PermissionStatus::Granted)
+#endif
+
QCOMPARE(noOfLocalDevices, 0);
QVERIFY(!discoveryAgent.isActive());
QSKIP("No local Bluetooth device available. Skipping remaining part of test.");
@@ -425,7 +380,7 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_deviceDiscovery()
// Wait for up to MaxScanTime for the scan to finish
int scanTime = MaxScanTime;
- while (finishedSpy.count() == 0 && scanTime > 0) {
+ while (finishedSpy.isEmpty() && scanTime > 0) {
QTest::qWait(15000);
scanTime -= 15000;
}
@@ -437,16 +392,19 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_deviceDiscovery()
QVERIFY(!discoveryAgent.isActive());
qDebug() << "Scan time left:" << scanTime;
// Expect finished signal with no error
- QVERIFY(finishedSpy.count() == 1);
+ QVERIFY(finishedSpy.size() == 1);
QVERIFY(errorSpy.isEmpty());
QVERIFY(discoveryAgent.error() == discoveryAgent.NoError);
QVERIFY(discoveryAgent.errorString().isEmpty());
// verify that the list is as big as the signals received.
- QVERIFY(discoveredSpy.count() == discoveryAgent.discoveredDevices().length());
+ // discoveredSpy might have more events as some devices are found multiple times,
+ // leading to messages like
+ // "Almost Duplicate "88:C6:26:F5:3E:E2" "88-C6-26-F5-3E-E2" - replacing in place"
+ QVERIFY(discoveredSpy.size() >= discoveryAgent.discoveredDevices().size());
// verify that there really was some devices in the array
- const QString remote = qgetenv("BT_TEST_DEVICE");
+ const QString remote = qEnvironmentVariable("BT_TEST_DEVICE");
QBluetoothAddress remoteDevice;
if (!remote.isEmpty()) {
remoteDevice = QBluetoothAddress(remote);
@@ -456,31 +414,13 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_deviceDiscovery()
}
if (!remoteDevice.isNull())
- QVERIFY(discoveredSpy.count() > 0);
- int counter = 0;
+ QVERIFY(!discoveredSpy.isEmpty());
// All returned QBluetoothDeviceInfo should be valid.
while (!discoveredSpy.isEmpty()) {
const QBluetoothDeviceInfo info =
qvariant_cast<QBluetoothDeviceInfo>(discoveredSpy.takeFirst().at(0));
QVERIFY(info.isValid());
- qDebug() << "Discovered device:" << info.address().toString() << info.name();
-
- if (numberOfAdapters > 1) {
- for (int i= 1; i < numberOfAdapters; i++) {
- if (info.address().toString() == addresses[i].toString())
- counter++;
- }
- }
}
-#if defined(Q_OS_IOS) || defined(Q_OS_TVOS) || QT_CONFIG(winrt_bt)
- //On iOS/WinRT, we do not have access to the local device/adapter, numberOfAdapters is 0,
- //so we skip this test at all.
- QSKIP("iOS/WinRT: no local Bluetooth device available. Skipping remaining part of test.");
-#endif
-
- //For multiple Bluetooth adapter do the check only for GeneralUnlimitedInquiry.
- if (!(inquiryType == QBluetoothDeviceDiscoveryAgent::LimitedInquiry))
- QVERIFY((numberOfAdapters-1) == counter);
}
}
@@ -490,24 +430,13 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_discoveryTimeout()
QBluetoothDeviceDiscoveryAgent agent;
// check default values
-#if defined(Q_OS_MACOS) || defined(Q_OS_IOS) || defined(Q_OS_ANDROID) || QT_CONFIG(winrt_bt)
- QCOMPARE(agent.lowEnergyDiscoveryTimeout(), 25000);
+#if defined(Q_OS_MACOS) || defined(Q_OS_IOS) || defined(Q_OS_ANDROID) || QT_CONFIG(winrt_bt) \
+ || QT_CONFIG(bluez)
+ QCOMPARE(agent.lowEnergyDiscoveryTimeout(), 40000);
agent.setLowEnergyDiscoveryTimeout(-1); // negative ignored
- QCOMPARE(agent.lowEnergyDiscoveryTimeout(), 25000);
+ QCOMPARE(agent.lowEnergyDiscoveryTimeout(), 40000);
agent.setLowEnergyDiscoveryTimeout(20000);
QCOMPARE(agent.lowEnergyDiscoveryTimeout(), 20000);
-#elif QT_CONFIG(bluez)
- if (isBluez5Runtime) {
- QCOMPARE(agent.lowEnergyDiscoveryTimeout(), 20000);
- agent.setLowEnergyDiscoveryTimeout(-1); // negative ignored
- QCOMPARE(agent.lowEnergyDiscoveryTimeout(), 20000);
- agent.setLowEnergyDiscoveryTimeout(25000);
- QCOMPARE(agent.lowEnergyDiscoveryTimeout(), 25000);
- } else {
- QCOMPARE(agent.lowEnergyDiscoveryTimeout(), -1);
- agent.setLowEnergyDiscoveryTimeout(20000); // feature not supported -> ignored
- QCOMPARE(agent.lowEnergyDiscoveryTimeout(), -1);
- }
#else
QCOMPARE(agent.lowEnergyDiscoveryTimeout(), -1);
agent.setLowEnergyDiscoveryTimeout(20000); // feature not supported -> ignored
@@ -517,6 +446,9 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_discoveryTimeout()
void tst_QBluetoothDeviceDiscoveryAgent::tst_discoveryMethods()
{
+ if (androidBluetoothEmulator())
+ QSKIP("Skipping test on Android 12+ emulator, CI can timeout waiting for user input");
+
const QBluetoothLocalDevice localDevice;
if (localDevice.allDevices().size() != 1) {
// On iOS it returns 0 but we still have working BT.
@@ -545,7 +477,7 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_discoveryMethods()
QBluetoothDeviceDiscoveryAgent agent;
QSignalSpy finishedSpy(&agent, SIGNAL(finished()));
- QSignalSpy errorSpy(&agent, SIGNAL(error(QBluetoothDeviceDiscoveryAgent::Error)));
+ QSignalSpy errorSpy(&agent, SIGNAL(errorOccurred(QBluetoothDeviceDiscoveryAgent::Error)));
QSignalSpy discoveredSpy(&agent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)));
// NoMethod - should just immediately return:
@@ -568,10 +500,15 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_discoveryMethods()
// Start discovery, probably both Classic and LE methods:
agent.start(supportedMethods);
+#if QT_CONFIG(permissions)
+ if (permissionStatus != Qt::PermissionStatus::Granted) {
+ QCOMPARE(agent.error(), QBluetoothDeviceDiscoveryAgent::MissingPermissionsError);
+ QSKIP("The remaining test requires the Bluetooth permission granted");
+ }
+#endif
QVERIFY(agent.isActive());
QVERIFY(errorSpy.isEmpty());
-
#define RUN_DISCOVERY(maxTimeout, step, condition) \
for (int scanTime = maxTimeout; (condition) && scanTime > 0; scanTime -= step) \
QTest::qWait(step);
@@ -589,7 +526,7 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_discoveryMethods()
QVERIFY(supportedMethods == QBluetoothDeviceDiscoveryAgent::LowEnergyMethod);
QCOMPARE(agent.error(), QBluetoothDeviceDiscoveryAgent::UnsupportedDiscoveryMethod);
} else {
- QVERIFY(finishedSpy.count() == 1);
+ QVERIFY(finishedSpy.size() == 1);
QVERIFY(agent.error() == QBluetoothDeviceDiscoveryAgent::NoError);
QVERIFY(agent.errorString().isEmpty());
@@ -597,7 +534,9 @@ void tst_QBluetoothDeviceDiscoveryAgent::tst_discoveryMethods()
const QBluetoothDeviceInfo info =
qvariant_cast<QBluetoothDeviceInfo>(discoveredSpy.takeFirst().at(0));
QVERIFY(info.isValid());
- QVERIFY(info.coreConfigurations() & expectedConfiguration);
+ // on Android we do find devices with unknown configuration
+ if (info.coreConfigurations() != QBluetoothDeviceInfo::UnknownCoreConfiguration)
+ QVERIFY(info.coreConfigurations() & expectedConfiguration);
}
}
diff --git a/tests/auto/qbluetoothdeviceinfo/CMakeLists.txt b/tests/auto/qbluetoothdeviceinfo/CMakeLists.txt
new file mode 100644
index 00000000..3b775bfd
--- /dev/null
+++ b/tests/auto/qbluetoothdeviceinfo/CMakeLists.txt
@@ -0,0 +1,19 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qbluetoothdeviceinfo Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qbluetoothdeviceinfo LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qbluetoothdeviceinfo
+ SOURCES
+ tst_qbluetoothdeviceinfo.cpp
+ LIBRARIES
+ Qt::Bluetooth
+)
diff --git a/tests/auto/qbluetoothdeviceinfo/qbluetoothdeviceinfo.pro b/tests/auto/qbluetoothdeviceinfo/qbluetoothdeviceinfo.pro
deleted file mode 100644
index a12da314..00000000
--- a/tests/auto/qbluetoothdeviceinfo/qbluetoothdeviceinfo.pro
+++ /dev/null
@@ -1,5 +0,0 @@
-SOURCES += tst_qbluetoothdeviceinfo.cpp
-TARGET=tst_qbluetoothdeviceinfo
-CONFIG += testcase
-
-QT = core concurrent bluetooth testlib
diff --git a/tests/auto/qbluetoothdeviceinfo/tst_qbluetoothdeviceinfo.cpp b/tests/auto/qbluetoothdeviceinfo/tst_qbluetoothdeviceinfo.cpp
index fba65fa1..87487893 100644
--- a/tests/auto/qbluetoothdeviceinfo/tst_qbluetoothdeviceinfo.cpp
+++ b/tests/auto/qbluetoothdeviceinfo/tst_qbluetoothdeviceinfo.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
@@ -449,15 +424,15 @@ void tst_QBluetoothDeviceInfo::tst_serviceUuids()
QBluetoothDeviceInfo deviceInfo;
QBluetoothDeviceInfo copyInfo = deviceInfo;
- QVector<QBluetoothUuid> servicesList;
- servicesList.append(QBluetoothUuid::L2cap);
- servicesList.append(QBluetoothUuid::Rfcomm);
- QVERIFY(servicesList.count() > 0);
+ QList<QBluetoothUuid> servicesList;
+ servicesList.append(QBluetoothUuid::ProtocolUuid::L2cap);
+ servicesList.append(QBluetoothUuid::ProtocolUuid::Rfcomm);
+ QVERIFY(!servicesList.isEmpty());
deviceInfo.setServiceUuids(servicesList);
- QVERIFY(deviceInfo.serviceUuids().count() > 0);
- deviceInfo.setServiceUuids(QVector<QBluetoothUuid>());
- QCOMPARE(deviceInfo.serviceUuids().count(), 0);
+ QVERIFY(!deviceInfo.serviceUuids().isEmpty());
+ deviceInfo.setServiceUuids(QList<QBluetoothUuid>());
+ QCOMPARE(deviceInfo.serviceUuids().size(), 0);
}
void tst_QBluetoothDeviceInfo::tst_cached()
@@ -528,8 +503,8 @@ void tst_QBluetoothDeviceInfo::tst_manufacturerData()
QVERIFY(!info.setManufacturerData(manufacturerAVM, QByteArray::fromHex("ABCD")));
QCOMPARE(info.manufacturerData(manufacturerAVM), QByteArray::fromHex("ABCD"));
auto temp = info.manufacturerData();
- QCOMPARE(temp.keys().count(), 1);
- QCOMPARE(temp.values().count(), 1);
+ QCOMPARE(temp.keys().size(), 1);
+ QCOMPARE(temp.values().size(), 1);
QCOMPARE(temp.values(), QList<QByteArray>() << QByteArray::fromHex("ABCD"));
QVERIFY(info.setManufacturerData(manufacturerAVM, QByteArray::fromHex("CDEF")));
@@ -537,8 +512,8 @@ void tst_QBluetoothDeviceInfo::tst_manufacturerData()
QVERIFY(!info.setManufacturerData(manufacturerAVM, QByteArray::fromHex("CDEF")));
temp = info.manufacturerData();
- QCOMPARE(temp.keys().count(), 2);
- QCOMPARE(temp.values().count(), 2);
+ QCOMPARE(temp.keys().size(), 2);
+ QCOMPARE(temp.values().size(), 2);
auto list = temp.values();
QCOMPARE(QSet<QByteArray> (list.begin(), list.end()),
diff --git a/tests/auto/qbluetoothhostinfo/CMakeLists.txt b/tests/auto/qbluetoothhostinfo/CMakeLists.txt
new file mode 100644
index 00000000..7ab4e9cb
--- /dev/null
+++ b/tests/auto/qbluetoothhostinfo/CMakeLists.txt
@@ -0,0 +1,19 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qbluetoothhostinfo Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qbluetoothhostinfo LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qbluetoothhostinfo
+ SOURCES
+ tst_qbluetoothhostinfo.cpp
+ LIBRARIES
+ Qt::Bluetooth
+)
diff --git a/tests/auto/qbluetoothhostinfo/qbluetoothhostinfo.pro b/tests/auto/qbluetoothhostinfo/qbluetoothhostinfo.pro
deleted file mode 100644
index 58776a65..00000000
--- a/tests/auto/qbluetoothhostinfo/qbluetoothhostinfo.pro
+++ /dev/null
@@ -1,6 +0,0 @@
-SOURCES += tst_qbluetoothhostinfo.cpp
-TARGET = tst_qbluetoothhostinfo
-CONFIG += testcase
-
-QT = core concurrent bluetooth testlib
-
diff --git a/tests/auto/qbluetoothhostinfo/tst_qbluetoothhostinfo.cpp b/tests/auto/qbluetoothhostinfo/tst_qbluetoothhostinfo.cpp
index d971caf4..ce03564f 100644
--- a/tests/auto/qbluetoothhostinfo/tst_qbluetoothhostinfo.cpp
+++ b/tests/auto/qbluetoothhostinfo/tst_qbluetoothhostinfo.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
diff --git a/tests/auto/qbluetoothlocaldevice/CMakeLists.txt b/tests/auto/qbluetoothlocaldevice/CMakeLists.txt
new file mode 100644
index 00000000..6b38e25e
--- /dev/null
+++ b/tests/auto/qbluetoothlocaldevice/CMakeLists.txt
@@ -0,0 +1,27 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qbluetoothlocaldevice Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qbluetoothlocaldevice LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qbluetoothlocaldevice
+ SOURCES
+ tst_qbluetoothlocaldevice.cpp
+ LIBRARIES
+ Qt::BluetoothPrivate
+)
+
+## Scopes:
+#####################################################################
+
+qt_internal_extend_target(tst_qbluetoothlocaldevice CONDITION MACOS
+ LIBRARIES
+ Qt::Widgets
+)
diff --git a/tests/auto/qbluetoothlocaldevice/qbluetoothlocaldevice.pro b/tests/auto/qbluetoothlocaldevice/qbluetoothlocaldevice.pro
deleted file mode 100644
index 1c4da732..00000000
--- a/tests/auto/qbluetoothlocaldevice/qbluetoothlocaldevice.pro
+++ /dev/null
@@ -1,6 +0,0 @@
-SOURCES += tst_qbluetoothlocaldevice.cpp
-TARGET=tst_qbluetoothlocaldevice
-CONFIG += testcase
-
-QT = core concurrent bluetooth-private testlib
-osx:QT += widgets
diff --git a/tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp b/tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp
index af7f0354..b434cbff 100644
--- a/tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp
+++ b/tests/auto/qbluetoothlocaldevice/tst_qbluetoothlocaldevice.cpp
@@ -1,35 +1,11 @@
-/****************************************************************************
-**
-** 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QDebug>
#include <QVariant>
+#include "../../shared/bttestutil_p.h"
#include <private/qtbluetoothglobal_p.h>
#include <qbluetoothaddress.h>
@@ -67,15 +43,19 @@ private slots:
void tst_pairingStatus();
void tst_pairDevice_data();
void tst_pairDevice();
+ void tst_connectedDevices();
private:
QBluetoothAddress remoteDevice;
- bool expectRemoteDevice;
+ qsizetype numDevices = 0;
+ bool expectRemoteDevice = false;
};
tst_QBluetoothLocalDevice::tst_QBluetoothLocalDevice()
- : expectRemoteDevice(false)
{
+ if (androidBluetoothEmulator())
+ return;
+ numDevices = QBluetoothLocalDevice::allDevices().size();
const QString remote = qgetenv("BT_TEST_DEVICE");
if (!remote.isEmpty()) {
remoteDevice = QBluetoothAddress(remote);
@@ -84,13 +64,6 @@ tst_QBluetoothLocalDevice::tst_QBluetoothLocalDevice()
} else {
qWarning() << "Not using any remote device for testing. Set BT_TEST_DEVICE env to run manual tests involving a remote device";
}
-
- // start with host powered off
- QBluetoothLocalDevice *device = new QBluetoothLocalDevice();
- device->setHostMode(QBluetoothLocalDevice::HostPoweredOff);
- delete device;
- // wait for the device to switch bluetooth mode.
- QTest::qWait(1000);
}
tst_QBluetoothLocalDevice::~tst_QBluetoothLocalDevice()
@@ -107,70 +80,101 @@ void tst_QBluetoothLocalDevice::initTestCase()
void tst_QBluetoothLocalDevice::tst_powerOn()
{
-#ifdef Q_OS_OSX
+ if (androidBluetoothEmulator())
+ QSKIP("Skipping test on Android 12+ emulator, CI can timeout waiting for user input");
+#ifdef Q_OS_MACOS
QSKIP("Not possible on OS X");
#endif
-#ifdef Q_OS_WIN
- QSKIP("Not possible on Windows");
-#endif
+ if (numDevices == 0)
+ QSKIP("Skipping test due to missing Bluetooth device");
QBluetoothLocalDevice localDevice;
+ if (localDevice.hostMode() != QBluetoothLocalDevice::HostPoweredOff) {
+ // Ensure device is OFF so we can test switching it ON
+ localDevice.setHostMode(QBluetoothLocalDevice::HostPoweredOff);
+ // On Android user may need to authorize the transition, hence a longer timeout
+ QTRY_VERIFY_WITH_TIMEOUT(localDevice.hostMode()
+ == QBluetoothLocalDevice::HostPoweredOff, 15000);
+ // Allow possible mode-change signal(s) to arrive (QTRY_COMPARE polls the
+ // host mode in a loop, and thus may return before the host mode change signal)
+ QTest::qWait(1000);
+ }
QSignalSpy hostModeSpy(&localDevice, SIGNAL(hostModeStateChanged(QBluetoothLocalDevice::HostMode)));
// there should be no changes yet
QVERIFY(hostModeSpy.isValid());
QVERIFY(hostModeSpy.isEmpty());
- if (!QBluetoothLocalDevice::allDevices().count())
- QSKIP("Skipping test due to missing Bluetooth device");
-
localDevice.powerOn();
- // async, wait for it
- QTRY_VERIFY(hostModeSpy.count() > 0);
- QBluetoothLocalDevice::HostMode hostMode= localDevice.hostMode();
- // we should not be powered off
- QVERIFY(hostMode == QBluetoothLocalDevice::HostConnectable
- || hostMode == QBluetoothLocalDevice::HostDiscoverable);
+ // On Android user may need to authorize the transition => longer timeout.
+ QTRY_VERIFY_WITH_TIMEOUT(!hostModeSpy.isEmpty(), 15000);
+ QVERIFY(localDevice.hostMode()
+ != QBluetoothLocalDevice::HostPoweredOff);
}
void tst_QBluetoothLocalDevice::tst_powerOff()
{
-#ifdef Q_OS_OSX
+ if (androidBluetoothEmulator())
+ QSKIP("Skipping test on Android 12+ emulator, CI can timeout waiting for user input");
+#ifdef Q_OS_MACOS
QSKIP("Not possible on OS X");
#endif
-#ifdef Q_OS_WIN
- QSKIP("Not possible on Windows");
-#endif
-
- if (!QBluetoothLocalDevice::allDevices().count())
+ if (numDevices == 0)
QSKIP("Skipping test due to missing Bluetooth device");
- {
- QBluetoothLocalDevice *device = new QBluetoothLocalDevice();
- device->powerOn();
- delete device;
- // wait for the device to switch bluetooth mode.
+ QBluetoothLocalDevice localDevice;
+ if (localDevice.hostMode() == QBluetoothLocalDevice::HostPoweredOff) {
+ // Ensure device is ON so we can test switching it OFF
+ localDevice.powerOn();
+ // On Android user may need to authorize the transition => longer timeout.
+ QTRY_VERIFY_WITH_TIMEOUT(localDevice.hostMode()
+ != QBluetoothLocalDevice::HostPoweredOff, 15000);
+ // Allow possible mode-change signal(s) to arrive (QTRY_COMPARE polls the
+ // host mode in a loop, and thus may return before the host mode change signal)
QTest::qWait(1000);
}
- QBluetoothLocalDevice localDevice;
+
QSignalSpy hostModeSpy(&localDevice, SIGNAL(hostModeStateChanged(QBluetoothLocalDevice::HostMode)));
// there should be no changes yet
QVERIFY(hostModeSpy.isValid());
QVERIFY(hostModeSpy.isEmpty());
localDevice.setHostMode(QBluetoothLocalDevice::HostPoweredOff);
- // async, wait for it
- QTRY_VERIFY(hostModeSpy.count() > 0);
- // we should not be powered off
- QVERIFY(localDevice.hostMode() == QBluetoothLocalDevice::HostPoweredOff);
-
+ // On Android user may need to authorize the transition => longer timeout.
+ QTRY_VERIFY_WITH_TIMEOUT(!hostModeSpy.isEmpty(), 15000);
+ QVERIFY(localDevice.hostMode()
+ == QBluetoothLocalDevice::HostPoweredOff);
}
void tst_QBluetoothLocalDevice::tst_hostModes_data()
{
QTest::addColumn<QBluetoothLocalDevice::HostMode>("hostModeExpected");
QTest::addColumn<bool>("expectSignal");
-
+#if defined(Q_OS_WIN)
+ // On Windows local device does not support HostDiscoverable as a separate mode
+ QTest::newRow("HostPoweredOff1") << QBluetoothLocalDevice::HostPoweredOff << false;
+ QTest::newRow("HostConnectable1") << QBluetoothLocalDevice::HostConnectable << true;
+ QTest::newRow("HostConnectable2") << QBluetoothLocalDevice::HostConnectable << false;
+ QTest::newRow("HostPoweredOff3") << QBluetoothLocalDevice::HostPoweredOff << true;
+ QTest::newRow("HostPoweredOff3") << QBluetoothLocalDevice::HostPoweredOff << false;
+ return;
+#elif defined(Q_OS_ANDROID)
+ if (QNativeInterface::QAndroidApplication::sdkVersion() >= 31) {
+ // On Android-12 (API Level 31+) it seems the device's bluetooth visibility setting
+ // defines if we enter "HostDiscoverable" (visible true) or "HostConnectable"
+ // (visible false). Here we assume that the visibility setting is true. For lower
+ // Android versions the default testdata rows are fine
+ qDebug() << "On this Android version the bluetooth visibility setting is assumed true";
+ QTest::newRow("HostDiscoverable1") << QBluetoothLocalDevice::HostDiscoverable << true;
+ QTest::newRow("HostPoweredOff1") << QBluetoothLocalDevice::HostPoweredOff << true;
+ QTest::newRow("HostPoweredOff2") << QBluetoothLocalDevice::HostPoweredOff << false;
+ QTest::newRow("HostDiscoverable2") << QBluetoothLocalDevice::HostDiscoverable << true;
+ QTest::newRow("HostPoweredOff3") << QBluetoothLocalDevice::HostPoweredOff << true;
+ QTest::newRow("HostDiscoverable3") << QBluetoothLocalDevice::HostDiscoverable << true;
+ QTest::newRow("HostDiscoverable4") << QBluetoothLocalDevice::HostDiscoverable << false;
+ return;
+ }
+#endif
QTest::newRow("HostDiscoverable1") << QBluetoothLocalDevice::HostDiscoverable << true;
QTest::newRow("HostPoweredOff1") << QBluetoothLocalDevice::HostPoweredOff << true;
QTest::newRow("HostPoweredOff2") << QBluetoothLocalDevice::HostPoweredOff << false;
@@ -186,50 +190,66 @@ void tst_QBluetoothLocalDevice::tst_hostModes_data()
void tst_QBluetoothLocalDevice::tst_hostModes()
{
-#ifdef Q_OS_OSX
+ if (androidBluetoothEmulator())
+ QSKIP("Skipping test on Android 12+ emulator, CI can timeout waiting for user input");
+#ifdef Q_OS_MACOS
QSKIP("Not possible on OS X");
#endif
-#ifdef Q_OS_WIN
- QSKIP("Not possible on Windows");
-#endif
-
QFETCH(QBluetoothLocalDevice::HostMode, hostModeExpected);
QFETCH(bool, expectSignal);
- if (!QBluetoothLocalDevice::allDevices().count())
+ if (numDevices == 0)
QSKIP("Skipping test due to missing Bluetooth device");
QBluetoothLocalDevice localDevice;
- QSignalSpy hostModeSpy(&localDevice, SIGNAL(hostModeStateChanged(QBluetoothLocalDevice::HostMode)));
+
+ static bool firstIteration = true;
+ if (firstIteration) {
+ // On the first iteration establish a known hostmode so that the test
+ // function can reliably test changes to it
+ firstIteration = false;
+ if (localDevice.hostMode() != QBluetoothLocalDevice::HostPoweredOff) {
+ localDevice.setHostMode(QBluetoothLocalDevice::HostPoweredOff);
+ // On Android user may need to authorize the transition => longer timeout.
+ QTRY_VERIFY_WITH_TIMEOUT(localDevice.hostMode()
+ == QBluetoothLocalDevice::HostPoweredOff, 15000);
+ // Allow possible mode-change signal(s) to arrive (QTRY_COMPARE polls the
+ // host mode in a loop, and thus may return before the host mode change signal).
+ QTest::qWait(1000);
+ }
+ }
+
+ QSignalSpy hostModeSpy(&localDevice,
+ SIGNAL(hostModeStateChanged(QBluetoothLocalDevice::HostMode)));
// there should be no changes yet
QVERIFY(hostModeSpy.isValid());
QVERIFY(hostModeSpy.isEmpty());
- QTest::qWait(1000);
+ // Switch the bluetooth mode and verify it changes
localDevice.setHostMode(hostModeExpected);
- // wait for the device to switch bluetooth mode.
+ // Manual interaction may be needed (for example on Android you may
+ // need to authorize a permission) => hence a longer timeout.
+ // If you see a fail on Android here, please see the comment in _data()
+ QTRY_COMPARE_WITH_TIMEOUT(localDevice.hostMode(), hostModeExpected, 15000);
+ // Allow possible mode-change signal(s) to arrive (QTRY_COMPARE polls the
+ // host mode in a loop, and thus may return before the host mode change signal).
QTest::qWait(1000);
- if (hostModeExpected != localDevice.hostMode()) {
- QTRY_VERIFY(hostModeSpy.count() > 0);
- }
- // test the actual signal values.
- if (expectSignal)
- QVERIFY(hostModeSpy.count() > 0);
- else
- QVERIFY(hostModeSpy.count() == 0);
+ // Verify that signals are as expected
if (expectSignal) {
- QList<QVariant> arguments = hostModeSpy.takeLast();
- QBluetoothLocalDevice::HostMode hostMode = qvariant_cast<QBluetoothLocalDevice::HostMode>(arguments.at(0));
- QCOMPARE(hostModeExpected, hostMode);
+ QVERIFY(hostModeSpy.size() > 0);
+ // Verify that the last signal contained the right mode
+ auto arguments = hostModeSpy.takeLast();
+ auto hostMode = qvariant_cast<QBluetoothLocalDevice::HostMode>(arguments.at(0));
+ QCOMPARE(hostMode, hostModeExpected);
+ } else {
+ QCOMPARE(hostModeSpy.size(), 0);
}
- // test actual
- QCOMPARE(hostModeExpected, localDevice.hostMode());
}
void tst_QBluetoothLocalDevice::tst_address()
{
- if (!QBluetoothLocalDevice::allDevices().count())
+ if (numDevices == 0)
QSKIP("Skipping test due to missing Bluetooth device");
QBluetoothLocalDevice localDevice;
@@ -238,7 +258,7 @@ void tst_QBluetoothLocalDevice::tst_address()
}
void tst_QBluetoothLocalDevice::tst_name()
{
- if (!QBluetoothLocalDevice::allDevices().count())
+ if (numDevices == 0)
QSKIP("Skipping test due to missing Bluetooth device");
QBluetoothLocalDevice localDevice;
@@ -246,11 +266,13 @@ void tst_QBluetoothLocalDevice::tst_name()
}
void tst_QBluetoothLocalDevice::tst_isValid()
{
+ if (androidBluetoothEmulator())
+ QSKIP("Skipping test on Android 12+ emulator, CI can timeout waiting for user input");
#if defined(Q_OS_MACOS) || QT_CONFIG(winrt_bt)
// On OS X we can have a valid device (device.isValid() == true),
// that has neither a name nor a valid address - this happens
// if a Bluetooth adapter is OFF.
- if (!QBluetoothLocalDevice::allDevices().count())
+ if (numDevices == 0)
QSKIP("Skipping test due to missing Bluetooth device");
#endif
@@ -258,10 +280,10 @@ void tst_QBluetoothLocalDevice::tst_isValid()
QBluetoothAddress invalidAddress("FF:FF:FF:FF:FF:FF");
const QList<QBluetoothHostInfo> devices = QBluetoothLocalDevice::allDevices();
- if (devices.count()) {
+ if (!devices.isEmpty()) {
QVERIFY(localDevice.isValid());
bool defaultFound = false;
- for (int i = 0; i<devices.count(); i++) {
+ for (qsizetype i = 0; i < devices.size(); ++i) {
QVERIFY(devices.at(i).address() != invalidAddress);
if (devices.at(i).address() == localDevice.address() ) {
defaultFound = true;
@@ -280,14 +302,8 @@ void tst_QBluetoothLocalDevice::tst_isValid()
QVERIFY(!invalidLocalDevice.isValid());
QCOMPARE(invalidLocalDevice.address(), QBluetoothAddress());
QCOMPARE(invalidLocalDevice.name(), QString());
-#if !QT_CONFIG(winrt_bt)
QCOMPARE(invalidLocalDevice.pairingStatus(QBluetoothAddress()), QBluetoothLocalDevice::Unpaired );
QCOMPARE(invalidLocalDevice.hostMode(), QBluetoothLocalDevice::HostPoweredOff);
-#else
- // When QTBUG-62294 is fixed, the pairingStatus part is consistent across platforms
- QCOMPARE(invalidLocalDevice.pairingStatus(QBluetoothAddress()), QBluetoothLocalDevice::Paired);
- QCOMPARE(invalidLocalDevice.hostMode(), QBluetoothLocalDevice::HostConnectable);
-#endif
}
void tst_QBluetoothLocalDevice::tst_allDevices()
@@ -296,7 +312,7 @@ void tst_QBluetoothLocalDevice::tst_allDevices()
}
void tst_QBluetoothLocalDevice::tst_construction()
{
- if (!QBluetoothLocalDevice::allDevices().count())
+ if (numDevices == 0)
QSKIP("Skipping test due to missing Bluetooth device");
QBluetoothLocalDevice localDevice;
@@ -325,49 +341,56 @@ void tst_QBluetoothLocalDevice::tst_pairDevice_data()
<< QBluetoothLocalDevice::Unpaired << 1000 << true;
if (!remoteDevice.isNull()) {
+ // Unpairing is quick but pairing level upgrade requires manual interaction
+ // on both devices. Therefore the timeouts are higher for the changes
+ // which require manual interaction.
QTest::newRow("UnParing Test device 1") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::Unpaired << 1000 << false;
+ << QBluetoothLocalDevice::Unpaired << 5000 << false;
//Bluez5 may have to do a device search which can take up to 20s
QTest::newRow("Pairing Test Device") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::Paired << 21000 << false;
+ << QBluetoothLocalDevice::Paired << 30000 << false;
QTest::newRow("Pairing upgrade for Authorization") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::AuthorizedPaired << 1000 << false;
+ << QBluetoothLocalDevice::AuthorizedPaired << 5000 << false;
QTest::newRow("Unpairing Test device 2") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::Unpaired << 1000 << false;
+ << QBluetoothLocalDevice::Unpaired << 5000 << false;
QTest::newRow("Authorized Pairing") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::AuthorizedPaired << 10000 << false;
+ << QBluetoothLocalDevice::AuthorizedPaired << 30000 << false;
QTest::newRow("Pairing Test Device after Authorization Pairing") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::Paired << 1000 << false;
+ << QBluetoothLocalDevice::Paired << 5000 << false;
+
QTest::newRow("Pairing Test Device after Authorization2") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::Paired << 1000 << false; //same again
+ << QBluetoothLocalDevice::Paired << 5000 << false; //same again
QTest::newRow("Unpairing Test device 3") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::Unpaired << 1000 << false;
+ << QBluetoothLocalDevice::Unpaired << 5000 << false;
QTest::newRow("UnParing Test device 4") << QBluetoothAddress(remoteDevice)
- << QBluetoothLocalDevice::Unpaired << 1000 << false;
+ << QBluetoothLocalDevice::Unpaired << 5000 << false;
}
}
void tst_QBluetoothLocalDevice::tst_pairDevice()
{
-#ifdef Q_OS_WIN
- QSKIP("Programmatic pairing not supported on Windows");
+ if (androidBluetoothEmulator())
+ QSKIP("Skipping test on Android 12+ emulator, CI can timeout waiting for user input");
+#if defined(Q_OS_MACOS)
+ QSKIP("The pair device test fails on macOS");
#endif
-
QFETCH(QBluetoothAddress, deviceAddress);
QFETCH(QBluetoothLocalDevice::Pairing, pairingExpected);
QFETCH(int, pairingWaitTime);
QFETCH(bool, expectErrorSignal);
- if (!QBluetoothLocalDevice::allDevices().count())
+ if (numDevices == 0)
QSKIP("Skipping test due to missing Bluetooth device");
QBluetoothLocalDevice localDevice;
//powerOn if not already
- localDevice.powerOn();
- QVERIFY(localDevice.hostMode() != QBluetoothLocalDevice::HostPoweredOff);
+ if (localDevice.hostMode() == QBluetoothLocalDevice::HostPoweredOff) {
+ localDevice.powerOn();
+ QTRY_VERIFY(localDevice.hostMode() != QBluetoothLocalDevice::HostPoweredOff);
+ }
QSignalSpy pairingSpy(&localDevice, SIGNAL(pairingFinished(QBluetoothAddress,QBluetoothLocalDevice::Pairing)) );
- QSignalSpy errorSpy(&localDevice, SIGNAL(error(QBluetoothLocalDevice::Error)));
+ QSignalSpy errorSpy(&localDevice, SIGNAL(errorOccurred(QBluetoothLocalDevice::Error)));
// there should be no signals yet
QVERIFY(pairingSpy.isValid());
QVERIFY(pairingSpy.isEmpty());
@@ -377,17 +400,18 @@ void tst_QBluetoothLocalDevice::tst_pairDevice()
QVERIFY(localDevice.isValid());
localDevice.requestPairing(deviceAddress, pairingExpected);
- // async, wait for it
- QTest::qWait(pairingWaitTime);
+ // The above function triggers async interaction with the user on two machines.
+ // Responding takes time. Let's adjust the subsequent timeout dyncamically based on
+ // the need of the operation
if (expectErrorSignal) {
- QTRY_VERIFY(!errorSpy.isEmpty());
+ QTRY_VERIFY_WITH_TIMEOUT(!errorSpy.isEmpty(), pairingWaitTime);
QVERIFY(pairingSpy.isEmpty());
QList<QVariant> arguments = errorSpy.first();
QBluetoothLocalDevice::Error e = qvariant_cast<QBluetoothLocalDevice::Error>(arguments.at(0));
QCOMPARE(e, QBluetoothLocalDevice::PairingError);
} else {
- QTRY_VERIFY(!pairingSpy.isEmpty());
+ QTRY_VERIFY_WITH_TIMEOUT(!pairingSpy.isEmpty(), pairingWaitTime);
QVERIFY(errorSpy.isEmpty());
// test the actual signal values.
@@ -395,11 +419,75 @@ void tst_QBluetoothLocalDevice::tst_pairDevice()
QBluetoothAddress address = qvariant_cast<QBluetoothAddress>(arguments.at(0));
QBluetoothLocalDevice::Pairing pairingResult = qvariant_cast<QBluetoothLocalDevice::Pairing>(arguments.at(1));
QCOMPARE(deviceAddress, address);
- QCOMPARE(pairingExpected, pairingResult);
+ // Verify that the local device pairing status and the signal value match
+ QCOMPARE(pairingResult, localDevice.pairingStatus(deviceAddress));
+#ifndef Q_OS_WIN
+ // On Windows the resulting pairing mode may differ from test's "expected" as the
+ // decision is up to Windows.
+#ifdef Q_OS_ANDROID
+ // On Android we always use "Paired"
+ if (pairingExpected == QBluetoothLocalDevice::AuthorizedPaired)
+ pairingExpected = QBluetoothLocalDevice::Paired;
+#endif
+ QCOMPARE(pairingResult, pairingExpected);
+ QCOMPARE(localDevice.pairingStatus(deviceAddress), pairingExpected);
+#endif
}
+}
+
+void tst_QBluetoothLocalDevice::tst_connectedDevices()
+{
+#if defined(Q_OS_MACOS)
+ QSKIP("The connectedDevices test fails on macOS");
+#endif
+ if (numDevices == 0)
+ QSKIP("Skipping test due to missing Bluetooth device");
+ if (remoteDevice.isNull())
+ QSKIP("This test only makes sense with remote device");
- if (!expectErrorSignal)
- QCOMPARE(pairingExpected, localDevice.pairingStatus(deviceAddress));
+ QBluetoothLocalDevice localDevice;
+ // powerOn if not already
+ if (localDevice.hostMode() == QBluetoothLocalDevice::HostPoweredOff) {
+ localDevice.powerOn();
+ QTRY_VERIFY(localDevice.hostMode() != QBluetoothLocalDevice::HostPoweredOff);
+ }
+
+ QSignalSpy pairingSpy(&localDevice, &QBluetoothLocalDevice::pairingFinished);
+
+ // Make sure that the remote device is not paired
+ localDevice.requestPairing(remoteDevice, QBluetoothLocalDevice::Unpaired);
+ QTRY_VERIFY(!pairingSpy.isEmpty());
+
+ QList<QBluetoothAddress> connectedDevices = localDevice.connectedDevices();
+ QVERIFY(!connectedDevices.contains(remoteDevice));
+
+ QSignalSpy deviceConnectedSpy(&localDevice, &QBluetoothLocalDevice::deviceConnected);
+ QSignalSpy deviceDisconnectedSpy(&localDevice, &QBluetoothLocalDevice::deviceDisconnected);
+
+ // Now pair with the device. We should have a deviceConnected signal.
+ pairingSpy.clear();
+ localDevice.requestPairing(remoteDevice, QBluetoothLocalDevice::Paired);
+ // Manual confirmation for pairing might be required
+ QTRY_VERIFY_WITH_TIMEOUT(!pairingSpy.isEmpty(), 30000);
+ QTRY_VERIFY(!deviceConnectedSpy.isEmpty());
+ QList<QVariant> arguments = deviceConnectedSpy.takeFirst();
+ auto address = arguments.at(0).value<QBluetoothAddress>();
+ QCOMPARE(address, remoteDevice);
+
+ connectedDevices = localDevice.connectedDevices();
+ QVERIFY(connectedDevices.contains(remoteDevice));
+
+ // Unpair again. We should have a deviceDisconnected signal.
+ pairingSpy.clear();
+ localDevice.requestPairing(remoteDevice, QBluetoothLocalDevice::Unpaired);
+ QTRY_VERIFY(!pairingSpy.isEmpty());
+ QTRY_VERIFY(!deviceDisconnectedSpy.isEmpty());
+ arguments = deviceDisconnectedSpy.takeFirst();
+ address = arguments.at(0).value<QBluetoothAddress>();
+ QCOMPARE(address, remoteDevice);
+
+ connectedDevices = localDevice.connectedDevices();
+ QVERIFY(!connectedDevices.contains(remoteDevice));
}
void tst_QBluetoothLocalDevice::tst_pairingStatus_data()
@@ -407,16 +495,9 @@ void tst_QBluetoothLocalDevice::tst_pairingStatus_data()
QTest::addColumn<QBluetoothAddress>("deviceAddress");
QTest::addColumn<QBluetoothLocalDevice::Pairing>("pairingExpected");
-#if !QT_CONFIG(winrt_bt)
QTest::newRow("UnPaired Device: DUMMY") << QBluetoothAddress("11:00:00:00:00:00")
<< QBluetoothLocalDevice::Unpaired;
QTest::newRow("Invalid device") << QBluetoothAddress() << QBluetoothLocalDevice::Unpaired;
-#else
- // Remove special case when QTBUG-62294 is fixed
- QTest::newRow("UnPaired Device: DUMMY") << QBluetoothAddress("11:00:00:00:00:00")
- << QBluetoothLocalDevice::Paired;
- QTest::newRow("Invalid device") << QBluetoothAddress() << QBluetoothLocalDevice::Paired;
-#endif
//valid devices are already tested by tst_pairDevice()
}
@@ -425,7 +506,7 @@ void tst_QBluetoothLocalDevice::tst_pairingStatus()
QFETCH(QBluetoothAddress, deviceAddress);
QFETCH(QBluetoothLocalDevice::Pairing, pairingExpected);
- if (!QBluetoothLocalDevice::allDevices().count())
+ if (numDevices == 0)
QSKIP("Skipping test due to missing Bluetooth device");
QBluetoothLocalDevice localDevice;
diff --git a/tests/auto/qbluetoothserver/CMakeLists.txt b/tests/auto/qbluetoothserver/CMakeLists.txt
new file mode 100644
index 00000000..f1e29b00
--- /dev/null
+++ b/tests/auto/qbluetoothserver/CMakeLists.txt
@@ -0,0 +1,30 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qbluetoothserver Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qbluetoothserver LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qbluetoothserver
+ SOURCES
+ tst_qbluetoothserver.cpp
+ LIBRARIES
+ Qt::BluetoothPrivate
+)
+
+#### Keys ignored in scope 1:.:.:qbluetoothserver.pro:<TRUE>:
+# OTHER_FILES = "README.txt"
+
+## Scopes:
+#####################################################################
+
+qt_internal_extend_target(tst_qbluetoothserver CONDITION MACOS
+ LIBRARIES
+ Qt::Widgets
+)
diff --git a/tests/auto/qbluetoothserver/qbluetoothserver.pro b/tests/auto/qbluetoothserver/qbluetoothserver.pro
deleted file mode 100644
index 7d7eb66b..00000000
--- a/tests/auto/qbluetoothserver/qbluetoothserver.pro
+++ /dev/null
@@ -1,10 +0,0 @@
-SOURCES += tst_qbluetoothserver.cpp
-TARGET = tst_qbluetoothserver
-CONFIG += testcase
-
-QT = core concurrent bluetooth-private testlib
-osx:QT += widgets
-
-OTHER_FILES += \
- README.txt
-
diff --git a/tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp b/tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp
index 4564cf4d..ed56d49a 100644
--- a/tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp
+++ b/tests/auto/qbluetoothserver/tst_qbluetoothserver.cpp
@@ -1,35 +1,11 @@
-/****************************************************************************
-**
-** 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QDebug>
+#include "../../shared/bttestutil_p.h"
#include <private/qtbluetoothglobal_p.h>
#include <qbluetoothserver.h>
#include <qbluetoothsocket.h>
@@ -37,14 +13,8 @@
QT_USE_NAMESPACE
-//same uuid as tests/bttestui
-#define TEST_SERVICE_UUID "e8e10f95-1a70-4b27-9ccf-02010264e9c8"
-
Q_DECLARE_METATYPE(QBluetooth::SecurityFlags)
-// Max time to wait for connection
-static const int MaxConnectTime = 60 * 1000; // 1 minute in ms
-
class tst_QBluetoothServer : public QObject
{
Q_OBJECT
@@ -65,7 +35,7 @@ private slots:
void setHostMode(const QBluetoothAddress &localAdapter, QBluetoothLocalDevice::HostMode newHostMode);
private:
- QBluetoothLocalDevice localDevice;
+ QBluetoothLocalDevice *localDevice = nullptr;
QBluetoothLocalDevice::HostMode initialHostMode;
};
@@ -105,7 +75,7 @@ void tst_QBluetoothServer::setHostMode(const QBluetoothAddress &localAdapter,
}
int connectTime = 5000; // ms
- while (hostModeSpy.count() < 1 && connectTime > 0) {
+ while (hostModeSpy.isEmpty() && connectTime > 0) {
QTest::qWait(500);
connectTime -= 500;
}
@@ -113,30 +83,34 @@ void tst_QBluetoothServer::setHostMode(const QBluetoothAddress &localAdapter,
void tst_QBluetoothServer::initTestCase()
{
+ if (androidBluetoothEmulator())
+ QSKIP("Skipping test on Android 12+ emulator, CI can timeout waiting for user input");
qRegisterMetaType<QBluetooth::SecurityFlags>();
qRegisterMetaType<QBluetoothServer::Error>();
+ localDevice = new QBluetoothLocalDevice(this);
+
QBluetoothLocalDevice device;
if (!device.isValid())
return;
initialHostMode = device.hostMode();
-#ifdef Q_OS_OSX
+#ifdef Q_OS_MACOS
if (initialHostMode == QBluetoothLocalDevice::HostPoweredOff)
return;
#endif
setHostMode(device.address(), QBluetoothLocalDevice::HostConnectable);
- QBluetoothLocalDevice::HostMode hostMode= localDevice.hostMode();
+ QBluetoothLocalDevice::HostMode hostMode= localDevice->hostMode();
QVERIFY(hostMode != QBluetoothLocalDevice::HostPoweredOff);
}
void tst_QBluetoothServer::cleanupTestCase()
{
- QBluetoothLocalDevice device;
- setHostMode(device.address(), initialHostMode);
+ if (localDevice)
+ setHostMode(localDevice->address(), initialHostMode);
}
void tst_QBluetoothServer::tst_construction()
@@ -176,7 +150,7 @@ void tst_QBluetoothServer::tst_receive()
QFETCH(QBluetoothLocalDevice::HostMode, hostmode);
QBluetoothLocalDevice localDev;
-#ifdef Q_OS_OSX
+#ifdef Q_OS_MACOS
if (localDev.hostMode() == QBluetoothLocalDevice::HostPoweredOff)
QSKIP("On OS X this test requires Bluetooth adapter ON");
#endif
@@ -189,23 +163,27 @@ void tst_QBluetoothServer::tst_receive()
setHostMode(address, hostmode);
if (hostmode == QBluetoothLocalDevice::HostPoweredOff) {
-#if !defined(Q_OS_OSX) && !QT_CONFIG(winrt_bt)
- QCOMPARE(localDevice.hostMode(), hostmode);
+#if !defined(Q_OS_MACOS) && !QT_CONFIG(winrt_bt)
+ QCOMPARE(localDevice->hostMode(), hostmode);
#endif
} else {
- QVERIFY(localDevice.hostMode() != QBluetoothLocalDevice::HostPoweredOff);
+ QVERIFY(localDevice->hostMode() != QBluetoothLocalDevice::HostPoweredOff);
}
}
QBluetoothServer server(QBluetoothServiceInfo::RfcommProtocol);
- QSignalSpy errorSpy(&server, SIGNAL(error(QBluetoothServer::Error)));
+ QSignalSpy errorSpy(&server, SIGNAL(errorOccurred(QBluetoothServer::Error)));
bool result = server.listen(address, 20); // port == 20
QTest::qWait(1000);
if (!result) {
+#ifndef Q_OS_ANDROID
+ // Disable address check on Android as an actual device always returns
+ // a valid address, while the emulator doesn't
QCOMPARE(server.serverAddress(), QBluetoothAddress());
+#endif
QCOMPARE(server.serverPort(), quint16(0));
- QVERIFY(errorSpy.count() > 0);
+ QVERIFY(!errorSpy.isEmpty());
QVERIFY(!server.isListening());
if (!localDeviceAvailable) {
QVERIFY(server.error() != QBluetoothServer::NoError);
@@ -219,7 +197,7 @@ void tst_QBluetoothServer::tst_receive()
QVERIFY(result);
#if !QT_CONFIG(winrt_bt)
- QVERIFY(QBluetoothLocalDevice::allDevices().count());
+ QVERIFY(!QBluetoothLocalDevice::allDevices().isEmpty());
#endif
QCOMPARE(server.error(), QBluetoothServer::NoError);
QCOMPARE(server.serverAddress(), address);
diff --git a/tests/auto/qbluetoothservicediscoveryagent/CMakeLists.txt b/tests/auto/qbluetoothservicediscoveryagent/CMakeLists.txt
new file mode 100644
index 00000000..76cd4697
--- /dev/null
+++ b/tests/auto/qbluetoothservicediscoveryagent/CMakeLists.txt
@@ -0,0 +1,39 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qbluetoothservicediscoveryagent Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qbluetoothservicediscoveryagent LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qbluetoothservicediscoveryagent
+ SOURCES
+ tst_qbluetoothservicediscoveryagent.cpp
+ LIBRARIES
+ Qt::Bluetooth
+)
+
+## Scopes:
+#####################################################################
+
+qt_internal_extend_target(tst_qbluetoothservicediscoveryagent CONDITION MACOS
+ LIBRARIES
+ Qt::Widgets
+)
+
+set_target_properties(tst_qbluetoothservicediscoveryagent PROPERTIES
+ MACOSX_BUNDLE TRUE
+)
+
+if (APPLE AND NOT IOS)
+ # Ninja has trouble with relative paths, convert to absolute as a workaround
+ get_filename_component(SHARED_PLIST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../shared ABSOLUTE)
+ set_target_properties(tst_qbluetoothservicediscoveryagent PROPERTIES
+ MACOSX_BUNDLE_INFO_PLIST "${SHARED_PLIST_DIR}/Info.macos.plist"
+ )
+endif()
diff --git a/tests/auto/qbluetoothservicediscoveryagent/qbluetoothservicediscoveryagent.pro b/tests/auto/qbluetoothservicediscoveryagent/qbluetoothservicediscoveryagent.pro
deleted file mode 100644
index 7d4eba6f..00000000
--- a/tests/auto/qbluetoothservicediscoveryagent/qbluetoothservicediscoveryagent.pro
+++ /dev/null
@@ -1,7 +0,0 @@
-SOURCES += tst_qbluetoothservicediscoveryagent.cpp
-TARGET = tst_qbluetoothservicediscoveryagent
-CONFIG += testcase
-
-QT = core concurrent bluetooth testlib
-osx:QT += widgets
-
diff --git a/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp b/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp
index 94a065bc..04382467 100644
--- a/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp
+++ b/tests/auto/qbluetoothservicediscoveryagent/tst_qbluetoothservicediscoveryagent.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
@@ -32,6 +7,7 @@
#include <QLoggingCategory>
#include <QVariant>
#include <QList>
+#include "../../shared/bttestutil_p.h"
#include <qbluetoothaddress.h>
#include <qbluetoothdevicediscoveryagent.h>
@@ -64,6 +40,7 @@ private slots:
void tst_invalidBtAddress();
void tst_serviceDiscovery_data();
void tst_serviceDiscovery();
+ void tst_serviceDiscoveryStop();
void tst_serviceDiscoveryAdapters();
private:
@@ -74,9 +51,10 @@ private:
tst_QBluetoothServiceDiscoveryAgent::tst_QBluetoothServiceDiscoveryAgent()
{
QLoggingCategory::setFilterRules(QStringLiteral("qt.bluetooth* = true"));
-
+ if (androidBluetoothEmulator())
+ return;
// start Bluetooth if not started
-#ifndef Q_OS_OSX
+#ifndef Q_OS_MACOS
QBluetoothLocalDevice *device = new QBluetoothLocalDevice();
localDeviceAvailable = device->isValid();
if (localDeviceAvailable) {
@@ -114,36 +92,59 @@ void tst_QBluetoothServiceDiscoveryAgent::serviceError(const QBluetoothServiceDi
void tst_QBluetoothServiceDiscoveryAgent::initTestCase()
{
+ if (androidBluetoothEmulator())
+ QSKIP("Skipping test on Android 12+ emulator, CI can timeout waiting for user input");
+
if (localDeviceAvailable) {
QBluetoothDeviceDiscoveryAgent discoveryAgent;
QSignalSpy finishedSpy(&discoveryAgent, SIGNAL(finished()));
- QSignalSpy errorSpy(&discoveryAgent, SIGNAL(error(QBluetoothDeviceDiscoveryAgent::Error)));
+ QSignalSpy errorSpy(&discoveryAgent,
+ SIGNAL(errorOccurred(QBluetoothDeviceDiscoveryAgent::Error)));
QSignalSpy discoveredSpy(&discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)));
- // connect(&discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
- // this, SLOT(deviceDiscoveryDebug(QBluetoothDeviceInfo)));
- discoveryAgent.start();
+ discoveryAgent.start(QBluetoothDeviceDiscoveryAgent::ClassicMethod);
// Wait for up to MaxScanTime for the scan to finish
int scanTime = MaxScanTime;
- while (finishedSpy.count() == 0 && scanTime > 0) {
+ while (finishedSpy.isEmpty() && scanTime > 0) {
QTest::qWait(1000);
scanTime -= 1000;
}
- // qDebug() << "Scan time left:" << scanTime;
// Expect finished signal with no error
- QVERIFY(finishedSpy.count() == 1);
+ QVERIFY(finishedSpy.size() == 1);
QVERIFY(errorSpy.isEmpty());
devices = discoveryAgent.discoveredDevices();
}
}
+void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscoveryStop()
+{
+ if (!localDeviceAvailable)
+ QSKIP("This test requires Bluetooth adapter in powered ON state");
+
+ QBluetoothServiceDiscoveryAgent discoveryAgent;
+ QSignalSpy finishedSpy(&discoveryAgent, SIGNAL(finished()));
+ QSignalSpy canceledSpy(&discoveryAgent, SIGNAL(canceled()));
+
+ // Verify we get the correct signals on start-stop
+ discoveryAgent.start(QBluetoothServiceDiscoveryAgent::FullDiscovery);
+ QVERIFY(discoveryAgent.isActive());
+ discoveryAgent.stop();
+ QTRY_COMPARE(canceledSpy.size(), 1);
+ QVERIFY(!discoveryAgent.isActive());
+ // Wait a bit to see that there are no latent signals
+ QTest::qWait(200);
+ QCOMPARE(canceledSpy.size(), 1);
+ QCOMPARE(finishedSpy.size(), 0);
+}
+
+
void tst_QBluetoothServiceDiscoveryAgent::tst_invalidBtAddress()
{
-#ifdef Q_OS_OSX
+#ifdef Q_OS_MACOS
if (!localDeviceAvailable)
QSKIP("On OS X this test requires Bluetooth adapter in powered ON state");
#endif
@@ -156,7 +157,7 @@ void tst_QBluetoothServiceDiscoveryAgent::tst_invalidBtAddress()
discoveryAgent = new QBluetoothServiceDiscoveryAgent(QBluetoothAddress());
QCOMPARE(discoveryAgent->error(), QBluetoothServiceDiscoveryAgent::NoError);
- if (QBluetoothLocalDevice::allDevices().count() > 0) {
+ if (!QBluetoothLocalDevice::allDevices().isEmpty()) {
discoveryAgent->start();
QCOMPARE(discoveryAgent->isActive(), true);
}
@@ -175,6 +176,7 @@ void tst_QBluetoothServiceDiscoveryAgent::serviceDiscoveryDebug(const QBluetooth
qDebug() << "\tRFCOMM server channel:" << info.serverChannel();
}
+#if 0
static void dumpAttributeVariant(const QVariant &var, const QString indent)
{
if (!var.isValid()) {
@@ -182,17 +184,17 @@ static void dumpAttributeVariant(const QVariant &var, const QString indent)
return;
}
- if (var.userType() == qMetaTypeId<QBluetoothServiceInfo::Sequence>()) {
+ if (var.typeId() == qMetaTypeId<QBluetoothServiceInfo::Sequence>()) {
qDebug("%sSequence", indent.toLocal8Bit().constData());
const QBluetoothServiceInfo::Sequence *sequence = static_cast<const QBluetoothServiceInfo::Sequence *>(var.data());
for (const QVariant &v : *sequence)
dumpAttributeVariant(v, indent + '\t');
- } else if (var.userType() == qMetaTypeId<QBluetoothServiceInfo::Alternative>()) {
+ } else if (var.typeId() == qMetaTypeId<QBluetoothServiceInfo::Alternative>()) {
qDebug("%sAlternative", indent.toLocal8Bit().constData());
const QBluetoothServiceInfo::Alternative *alternative = static_cast<const QBluetoothServiceInfo::Alternative *>(var.data());
for (const QVariant &v : *alternative)
dumpAttributeVariant(v, indent + '\t');
- } else if (var.userType() == qMetaTypeId<QBluetoothUuid>()) {
+ } else if (var.typeId() == qMetaTypeId<QBluetoothUuid>()) {
QBluetoothUuid uuid = var.value<QBluetoothUuid>();
switch (uuid.minimumSize()) {
case 0:
@@ -205,27 +207,27 @@ static void dumpAttributeVariant(const QVariant &var, const QString indent)
qDebug("%suuid %08x", indent.toLocal8Bit().constData(), uuid.toUInt32());
break;
case 16: {
- qDebug("%suuid %s", indent.toLocal8Bit().constData(), QByteArray(reinterpret_cast<const char *>(uuid.toUInt128().data), 16).toHex().constData());
+ qDebug("%suuid %s", indent.toLocal8Bit().constData(), uuid.toByteArray(QUuid::Id128).constData());
break;
}
default:
qDebug("%suuid ???", indent.toLocal8Bit().constData());
}
} else {
- switch (var.userType()) {
- case QVariant::UInt:
+ switch (var.typeId()) {
+ case QMetaType::UInt:
qDebug("%suint %u", indent.toLocal8Bit().constData(), var.toUInt());
break;
- case QVariant::Int:
+ case QMetaType::Int:
qDebug("%sint %d", indent.toLocal8Bit().constData(), var.toInt());
break;
- case QVariant::String:
+ case QMetaType::QString:
qDebug("%sstring %s", indent.toLocal8Bit().constData(), var.toString().toLocal8Bit().constData());
break;
- case QVariant::Bool:
+ case QMetaType::Bool:
qDebug("%sbool %d", indent.toLocal8Bit().constData(), var.toBool());
break;
- case QVariant::Url:
+ case QMetaType::QUrl:
qDebug("%surl %s", indent.toLocal8Bit().constData(), var.toUrl().toString().toLocal8Bit().constData());
break;
default:
@@ -241,6 +243,7 @@ static inline void dumpServiceInfoAttributes(const QBluetoothServiceInfo &info)
dumpAttributeVariant(info.attribute(id), QString("\t"));
}
}
+#endif
void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscovery_data()
@@ -254,15 +257,15 @@ void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscovery_data()
// Only need to test the first 5 live devices
int max = 5;
- for (const QBluetoothDeviceInfo &info : qAsConst(devices)) {
+ for (const QBluetoothDeviceInfo &info : std::as_const(devices)) {
if (info.isCached())
continue;
QTest::newRow("default filter") << info << QList<QBluetoothUuid>()
<< QBluetoothServiceDiscoveryAgent::NoError;
if (!--max)
break;
- //QTest::newRow("public browse group") << info << (QList<QBluetoothUuid>() << QBluetoothUuid::PublicBrowseGroup);
- //QTest::newRow("l2cap") << info << (QList<QBluetoothUuid>() << QBluetoothUuid::L2cap);
+ //QTest::newRow("public browse group") << info << (QList<QBluetoothUuid>() << QBluetoothUuid::ServiceClassUuid::PublicBrowseGroup);
+ //QTest::newRow("l2cap") << info << (QList<QBluetoothUuid>() << QBluetoothUuid::ProtocolUuid::L2cap);
}
QTest::newRow("all devices") << QBluetoothDeviceInfo() << QList<QBluetoothUuid>()
<< QBluetoothServiceDiscoveryAgent::NoError;
@@ -271,28 +274,28 @@ void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscovery_data()
void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscoveryAdapters()
{
QBluetoothLocalDevice localDevice;
- int numberOfAdapters = (localDevice.allDevices()).size();
- if (numberOfAdapters>1) {
+ const QList<QBluetoothHostInfo> adapters = localDevice.allDevices();
+ if (adapters.size() > 1) {
if (devices.isEmpty())
QSKIP("This test requires an in-range bluetooth device");
- QList<QBluetoothAddress> addresses;
+ QVarLengthArray<QBluetoothAddress> addresses;
- for (int i=0; i<numberOfAdapters; i++) {
- addresses.append(((QBluetoothHostInfo)localDevice.allDevices().at(i)).address());
+ for (const auto &adapter : adapters) {
+ addresses.append(adapter.address());
}
QBluetoothServer server(QBluetoothServiceInfo::RfcommProtocol);
- QBluetoothUuid uuid(QBluetoothUuid::Ftp);
+ QBluetoothUuid uuid(QBluetoothUuid::ProtocolUuid::Ftp);
server.listen(addresses[0]);
QBluetoothServiceInfo serviceInfo;
serviceInfo.setAttribute(QBluetoothServiceInfo::ServiceName, "serviceName");
QBluetoothServiceInfo::Sequence publicBrowse;
- publicBrowse << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::PublicBrowseGroup));
+ publicBrowse << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::ServiceClassUuid::PublicBrowseGroup));
serviceInfo.setAttribute(QBluetoothServiceInfo::BrowseGroupList, publicBrowse);
QBluetoothServiceInfo::Sequence profileSequence;
QBluetoothServiceInfo::Sequence classId;
- classId << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::SerialPort));
+ classId << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::ServiceClassUuid::SerialPort));
classId << QVariant::fromValue(quint16(0x100));
profileSequence.append(QVariant::fromValue(classId));
serviceInfo.setAttribute(QBluetoothServiceInfo::BluetoothProfileDescriptorList,
@@ -302,11 +305,11 @@ void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscoveryAdapters()
QBluetoothServiceInfo::Sequence protocolDescriptorList;
QBluetoothServiceInfo::Sequence protocol;
- protocol << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::L2cap));
+ protocol << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::ProtocolUuid::L2cap));
protocolDescriptorList.append(QVariant::fromValue(protocol));
protocol.clear();
- protocol << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::Rfcomm))
+ protocol << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::ProtocolUuid::Rfcomm))
<< QVariant::fromValue(quint8(server.serverPort()));
protocolDescriptorList.append(QVariant::fromValue(protocol));
@@ -329,22 +332,20 @@ void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscoveryAdapters()
discoveryAgent.start();
int scanTime = MaxScanTime;
- while (finishedSpy.count() == 0 && scanTime > 0) {
+ while (finishedSpy.isEmpty() && scanTime > 0) {
QTest::qWait(1000);
scanTime -= 1000;
}
- QList<QBluetoothServiceInfo> discServices = discoveryAgent.discoveredServices();
+ const QList<QBluetoothServiceInfo> discServices = discoveryAgent.discoveredServices();
QVERIFY(!discServices.empty());
- int counter = 0;
- for (int i = 0; i<discServices.size(); i++)
- {
- QBluetoothServiceInfo service((QBluetoothServiceInfo)discServices.at(i));
+ qsizetype counter = 0;
+ for (const QBluetoothServiceInfo &service : discServices) {
if (uuid == service.serviceUuid())
counter++;
}
- QVERIFY(counter == 1);
+ QCOMPARE(counter, 1);
}
}
@@ -352,9 +353,6 @@ void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscoveryAdapters()
void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscovery()
{
- // Not all devices respond to SDP, so allow for a failure
- static int expected_failures = 0;
-
if (devices.isEmpty())
QSKIP("This test requires an in-range bluetooth device");
@@ -363,7 +361,7 @@ void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscovery()
QFETCH(QBluetoothServiceDiscoveryAgent::Error, serviceDiscoveryError);
QBluetoothLocalDevice localDevice;
- qDebug() << "Scanning address" << deviceInfo.address().toString();
+ qDebug() << "Scanning address" << deviceInfo.address().toString() << deviceInfo.name();
QBluetoothServiceDiscoveryAgent discoveryAgent(localDevice.address());
bool setAddress = discoveryAgent.setRemoteAddress(deviceInfo.address());
@@ -380,12 +378,11 @@ void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscovery()
QVERIFY(discoveryAgent.uuidFilter() == uuidFilter);
QSignalSpy finishedSpy(&discoveryAgent, SIGNAL(finished()));
- QSignalSpy errorSpy(&discoveryAgent, SIGNAL(error(QBluetoothServiceDiscoveryAgent::Error)));
+ QSignalSpy errorSpy(&discoveryAgent,
+ SIGNAL(errorOccurred(QBluetoothServiceDiscoveryAgent::Error)));
QSignalSpy discoveredSpy(&discoveryAgent, SIGNAL(serviceDiscovered(QBluetoothServiceInfo)));
-// connect(&discoveryAgent, SIGNAL(serviceDiscovered(QBluetoothServiceInfo)),
-// this, SLOT(serviceDiscoveryDebug(QBluetoothServiceInfo)));
- connect(&discoveryAgent, SIGNAL(error(QBluetoothServiceDiscoveryAgent::Error)),
- this, SLOT(serviceError(QBluetoothServiceDiscoveryAgent::Error)));
+ connect(&discoveryAgent, SIGNAL(errorOccurred(QBluetoothServiceDiscoveryAgent::Error)), this,
+ SLOT(serviceError(QBluetoothServiceDiscoveryAgent::Error)));
discoveryAgent.start(QBluetoothServiceDiscoveryAgent::FullDiscovery);
@@ -396,13 +393,13 @@ void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscovery()
QVERIFY(discoveryAgent.isActive() || !finishedSpy.isEmpty());
// Wait for up to MaxScanTime for the scan to finish
- int scanTime = MaxScanTime;
- while (finishedSpy.count() == 0 && scanTime > 0) {
+ int scanTime = 20000;
+ while (finishedSpy.isEmpty() && scanTime > 0) {
QTest::qWait(1000);
scanTime -= 1000;
}
- if (discoveryAgent.error() && expected_failures++ < 2){
+ if (discoveryAgent.error()) {
qDebug() << "Device failed to respond to SDP, skipping device" << discoveryAgent.error() << discoveryAgent.errorString();
return;
}
@@ -411,12 +408,14 @@ void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscovery()
QVERIFY(discoveryAgent.errorString() == QString());
// Expect finished signal with no error
- QVERIFY(finishedSpy.count() == 1);
+ if (scanTime)
+ QVERIFY(finishedSpy.size() == 1);
+
QVERIFY(errorSpy.isEmpty());
- //if (discoveryAgent.discoveredServices().count() && expected_failures++ <2){
- if (discoveredSpy.isEmpty() && expected_failures++ < 2){
- qDebug() << "Device failed to return any results, skipping device" << discoveryAgent.discoveredServices().count();
+ //if (!discoveryAgent.discoveredServices().isEmpty() && expected_failures++ <2){
+ if (discoveredSpy.isEmpty()) {
+ qDebug() << "Device failed to return any results, skipping device" << discoveryAgent.discoveredServices().size();
return;
}
@@ -451,9 +450,9 @@ void tst_QBluetoothServiceDiscoveryAgent::tst_serviceDiscovery()
}
if (servicesFound)
- QVERIFY(discoveryAgent.discoveredServices().count() != 0);
+ QVERIFY(!discoveryAgent.discoveredServices().isEmpty());
discoveryAgent.clear();
- QVERIFY(discoveryAgent.discoveredServices().count() == 0);
+ QVERIFY(discoveryAgent.discoveredServices().isEmpty());
discoveryAgent.stop();
QVERIFY(!discoveryAgent.isActive());
diff --git a/tests/auto/qbluetoothserviceinfo/CMakeLists.txt b/tests/auto/qbluetoothserviceinfo/CMakeLists.txt
new file mode 100644
index 00000000..6974a03a
--- /dev/null
+++ b/tests/auto/qbluetoothserviceinfo/CMakeLists.txt
@@ -0,0 +1,32 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qbluetoothserviceinfo Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qbluetoothserviceinfo LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qbluetoothserviceinfo
+ SOURCES
+ tst_qbluetoothserviceinfo.cpp
+ LIBRARIES
+ Qt::Bluetooth
+)
+
+## Scopes:
+#####################################################################
+
+qt_internal_extend_target(tst_qbluetoothserviceinfo CONDITION MACOS
+ LIBRARIES
+ Qt::Widgets
+)
+
+qt_internal_extend_target(tst_qbluetoothserviceinfo CONDITION ANDROID AND NOT ANDROID_EMBEDDED
+ DEFINES
+ QT_ANDROID_BLUETOOTH
+)
diff --git a/tests/auto/qbluetoothserviceinfo/qbluetoothserviceinfo.pro b/tests/auto/qbluetoothserviceinfo/qbluetoothserviceinfo.pro
deleted file mode 100644
index 6a072784..00000000
--- a/tests/auto/qbluetoothserviceinfo/qbluetoothserviceinfo.pro
+++ /dev/null
@@ -1,11 +0,0 @@
-SOURCES += tst_qbluetoothserviceinfo.cpp
-TARGET = tst_qbluetoothserviceinfo
-CONFIG += testcase
-
-QT = core concurrent bluetooth testlib
-osx:QT += widgets
-
-
-android:!android-embedded {
- DEFINES += QT_ANDROID_BLUETOOTH
-}
diff --git a/tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp b/tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp
index f89802d2..11d1dd48 100644
--- a/tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp
+++ b/tests/auto/qbluetoothserviceinfo/tst_qbluetoothserviceinfo.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QUuid>
@@ -38,6 +13,8 @@
#include <qbluetoothuuid.h>
#include <QtBluetooth/QBluetoothServer>
+#include <QtCore/qoperatingsystemversion.h>
+
QT_USE_NAMESPACE
Q_DECLARE_METATYPE(QBluetoothUuid::ProtocolUuid)
@@ -78,10 +55,6 @@ void tst_QBluetoothServiceInfo::initTestCase()
qRegisterMetaType<QBluetoothUuid::ProtocolUuid>();
qRegisterMetaType<QUuid>();
qRegisterMetaType<QBluetoothServiceInfo::Protocol>();
- // start Bluetooth if not started
- QBluetoothLocalDevice *device = new QBluetoothLocalDevice();
- device->powerOn();
- delete device;
}
void tst_QBluetoothServiceInfo::tst_construction()
@@ -93,31 +66,31 @@ void tst_QBluetoothServiceInfo::tst_construction()
QList<QBluetoothUuid::ProtocolUuid> protUuids;
//list taken from qbluetoothuuid.h
- protUuids << QBluetoothUuid::Sdp;
- protUuids << QBluetoothUuid::Udp;
- protUuids << QBluetoothUuid::Rfcomm;
- protUuids << QBluetoothUuid::Tcp;
- protUuids << QBluetoothUuid::TcsBin;
- protUuids << QBluetoothUuid::TcsAt;
- protUuids << QBluetoothUuid::Att;
- protUuids << QBluetoothUuid::Obex;
- protUuids << QBluetoothUuid::Ip;
- protUuids << QBluetoothUuid::Ftp;
- protUuids << QBluetoothUuid::Http;
- protUuids << QBluetoothUuid::Wsp;
- protUuids << QBluetoothUuid::Bnep;
- protUuids << QBluetoothUuid::Upnp;
- protUuids << QBluetoothUuid::Hidp;
- protUuids << QBluetoothUuid::HardcopyControlChannel;
- protUuids << QBluetoothUuid::HardcopyDataChannel;
- protUuids << QBluetoothUuid::HardcopyNotification;
- protUuids << QBluetoothUuid::Avctp;
- protUuids << QBluetoothUuid::Avdtp;
- protUuids << QBluetoothUuid::Cmtp;
- protUuids << QBluetoothUuid::UdiCPlain;
- protUuids << QBluetoothUuid::McapControlChannel;
- protUuids << QBluetoothUuid::McapDataChannel;
- protUuids << QBluetoothUuid::L2cap;
+ protUuids << QBluetoothUuid::ProtocolUuid::Sdp;
+ protUuids << QBluetoothUuid::ProtocolUuid::Udp;
+ protUuids << QBluetoothUuid::ProtocolUuid::Rfcomm;
+ protUuids << QBluetoothUuid::ProtocolUuid::Tcp;
+ protUuids << QBluetoothUuid::ProtocolUuid::TcsBin;
+ protUuids << QBluetoothUuid::ProtocolUuid::TcsAt;
+ protUuids << QBluetoothUuid::ProtocolUuid::Att;
+ protUuids << QBluetoothUuid::ProtocolUuid::Obex;
+ protUuids << QBluetoothUuid::ProtocolUuid::Ip;
+ protUuids << QBluetoothUuid::ProtocolUuid::Ftp;
+ protUuids << QBluetoothUuid::ProtocolUuid::Http;
+ protUuids << QBluetoothUuid::ProtocolUuid::Wsp;
+ protUuids << QBluetoothUuid::ProtocolUuid::Bnep;
+ protUuids << QBluetoothUuid::ProtocolUuid::Upnp;
+ protUuids << QBluetoothUuid::ProtocolUuid::Hidp;
+ protUuids << QBluetoothUuid::ProtocolUuid::HardcopyControlChannel;
+ protUuids << QBluetoothUuid::ProtocolUuid::HardcopyDataChannel;
+ protUuids << QBluetoothUuid::ProtocolUuid::HardcopyNotification;
+ protUuids << QBluetoothUuid::ProtocolUuid::Avctp;
+ protUuids << QBluetoothUuid::ProtocolUuid::Avdtp;
+ protUuids << QBluetoothUuid::ProtocolUuid::Cmtp;
+ protUuids << QBluetoothUuid::ProtocolUuid::UdiCPlain;
+ protUuids << QBluetoothUuid::ProtocolUuid::McapControlChannel;
+ protUuids << QBluetoothUuid::ProtocolUuid::McapDataChannel;
+ protUuids << QBluetoothUuid::ProtocolUuid::L2cap;
{
QBluetoothServiceInfo serviceInfo;
@@ -129,13 +102,13 @@ void tst_QBluetoothServiceInfo::tst_construction()
QCOMPARE(serviceInfo.serviceDescription(), QString());
QCOMPARE(serviceInfo.serviceProvider(), QString());
QCOMPARE(serviceInfo.serviceUuid(), QBluetoothUuid());
- QCOMPARE(serviceInfo.serviceClassUuids().count(), 0);
- QCOMPARE(serviceInfo.attributes().count(), 0);
+ QCOMPARE(serviceInfo.serviceClassUuids().size(), 0);
+ QCOMPARE(serviceInfo.attributes().size(), 0);
QCOMPARE(serviceInfo.serverChannel(), -1);
QCOMPARE(serviceInfo.protocolServiceMultiplexer(), -1);
- for (QBluetoothUuid::ProtocolUuid u : qAsConst(protUuids))
- QCOMPARE(serviceInfo.protocolDescriptor(u).count(), 0);
+ for (QBluetoothUuid::ProtocolUuid u : std::as_const(protUuids))
+ QCOMPARE(serviceInfo.protocolDescriptor(u).size(), 0);
}
{
@@ -168,10 +141,10 @@ void tst_QBluetoothServiceInfo::tst_construction()
QCOMPARE(copyInfo.device().address(), alternatedeviceInfo.address());
QCOMPARE(serviceInfo.device().address(), alternatedeviceInfo.address());
- for (QBluetoothUuid::ProtocolUuid u : qAsConst(protUuids))
- QCOMPARE(serviceInfo.protocolDescriptor(u).count(), 0);
- for (QBluetoothUuid::ProtocolUuid u : qAsConst(protUuids))
- QCOMPARE(copyInfo.protocolDescriptor(u).count(), 0);
+ for (QBluetoothUuid::ProtocolUuid u : std::as_const(protUuids))
+ QCOMPARE(serviceInfo.protocolDescriptor(u).size(), 0);
+ for (QBluetoothUuid::ProtocolUuid u : std::as_const(protUuids))
+ QCOMPARE(copyInfo.protocolDescriptor(u).size(), 0);
}
}
@@ -187,12 +160,17 @@ void tst_QBluetoothServiceInfo::tst_assignment_data()
#if defined(QT_ANDROID_BLUETOOTH) || defined(Q_OS_WIN)
l2cpSupported = false;
#endif
+
+#if defined(Q_OS_MACOS)
+ l2cpSupported = QOperatingSystemVersion::current() < QOperatingSystemVersion::MacOSMonterey;
+#endif
+
QTest::newRow("assignment_data_l2cp")
<< QUuid(0x67c8770b, 0x44f1, 0x410a, 0xab, 0x9a, 0xf9, 0xb5, 0x44, 0x6f, 0x13, 0xee)
- << QBluetoothUuid::L2cap << QBluetoothServiceInfo::L2capProtocol << l2cpSupported;
+ << QBluetoothUuid::ProtocolUuid::L2cap << QBluetoothServiceInfo::L2capProtocol << l2cpSupported;
QTest::newRow("assignment_data_rfcomm")
<< QUuid(0x67c8770b, 0x44f1, 0x410a, 0xab, 0x9a, 0xf9, 0xb5, 0x44, 0x6f, 0x13, 0xee)
- << QBluetoothUuid::Rfcomm << QBluetoothServiceInfo::RfcommProtocol << true;
+ << QBluetoothUuid::ProtocolUuid::Rfcomm << QBluetoothServiceInfo::RfcommProtocol << true;
}
@@ -279,7 +257,7 @@ void tst_QBluetoothServiceInfo::tst_assignment()
copyInfo.setAttribute(QBluetoothServiceInfo::ProtocolDescriptorList, QBluetoothUuid(uuid));
QVERIFY(copyInfo.contains(QBluetoothServiceInfo::ProtocolDescriptorList));
QVERIFY(copyInfo.isComplete());
- QVERIFY(copyInfo.attributes().count() > 0);
+ QVERIFY(!copyInfo.attributes().isEmpty());
copyInfo.removeAttribute(QBluetoothServiceInfo::ProtocolDescriptorList);
QVERIFY(!copyInfo.contains(QBluetoothServiceInfo::ProtocolDescriptorList));
@@ -319,11 +297,22 @@ void tst_QBluetoothServiceInfo::tst_assignment()
QVERIFY(!copyInfo.isValid());
copyInfo = serviceInfo;
- copyInfo.setServiceUuid(QBluetoothUuid::SerialPort);
+ copyInfo.setServiceUuid(QBluetoothUuid::ServiceClassUuid::SerialPort);
QVERIFY(!copyInfo.isRegistered());
- if (!QBluetoothLocalDevice::allDevices().count()) {
- QSKIP("Skipping test due to missing Bluetooth device");
+ // start Bluetooth if not started
+ QBluetoothLocalDevice device;
+ if (device.isValid()) {
+ device.powerOn();
+ int waitPowerOnMs = 1000;
+ while (device.hostMode() == QBluetoothLocalDevice::HostPoweredOff && waitPowerOnMs) {
+ QTest::qWait(100);
+ waitPowerOnMs -= 100;
+ }
+ }
+
+ if (device.hostMode() == QBluetoothLocalDevice::HostPoweredOff) {
+ QSKIP("Skipping test due to missing or powered OFF Bluetooth device");
} else if (protocolSupported) {
QBluetoothServer server(serviceInfoProtocol);
QVERIFY(server.listen());
@@ -332,7 +321,7 @@ void tst_QBluetoothServiceInfo::tst_assignment()
QBluetoothServiceInfo::Sequence protocolDescriptorList;
QBluetoothServiceInfo::Sequence protocol;
- protocol << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::L2cap));
+ protocol << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::ProtocolUuid::L2cap));
if (serviceInfoProtocol == QBluetoothServiceInfo::L2capProtocol) {
protocol << QVariant::fromValue(server.serverPort());
@@ -340,7 +329,7 @@ void tst_QBluetoothServiceInfo::tst_assignment()
} else if (serviceInfoProtocol == QBluetoothServiceInfo::RfcommProtocol) {
protocolDescriptorList.append(QVariant::fromValue(protocol));
protocol.clear();
- protocol << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::Rfcomm))
+ protocol << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::ProtocolUuid::Rfcomm))
<< QVariant::fromValue(quint8(server.serverPort()));
protocolDescriptorList.append(QVariant::fromValue(protocol));
}
@@ -348,6 +337,19 @@ void tst_QBluetoothServiceInfo::tst_assignment()
serviceInfo.setAttribute(QBluetoothServiceInfo::ProtocolDescriptorList,
protocolDescriptorList);
+#if defined(Q_OS_MACOS)
+ // bluetoothd on Monterey does not want to register a record if there is no
+ // ServiceClassIDList provided.
+ if (QOperatingSystemVersion::current() >= QOperatingSystemVersion::MacOSMonterey) {
+ // Nothing seems to help with L2CAP though:
+ if (serviceInfoProtocol == QBluetoothServiceInfo::RfcommProtocol) {
+ QBluetoothServiceInfo::Sequence classIds;
+ classIds << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::ServiceClassUuid::SerialPort));
+ copyInfo.setAttribute(QBluetoothServiceInfo::ServiceClassIds, classIds);
+ }
+ }
+#endif // Q_OS_MACOS
+
QVERIFY(copyInfo.registerService());
QVERIFY(copyInfo.isRegistered());
QVERIFY(serviceInfo.isRegistered());
@@ -369,22 +371,22 @@ void tst_QBluetoothServiceInfo::tst_assignment()
void tst_QBluetoothServiceInfo::tst_serviceClassUuids()
{
QBluetoothServiceInfo info;
- QCOMPARE(info.serviceClassUuids().count(), 0);
+ QCOMPARE(info.serviceClassUuids().size(), 0);
QBluetoothServiceInfo::Sequence classIds;
- classIds << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::SerialPort));
- QCOMPARE(classIds.count(), 1);
+ classIds << QVariant::fromValue(QBluetoothUuid(QBluetoothUuid::ServiceClassUuid::SerialPort));
+ QCOMPARE(classIds.size(), 1);
QBluetoothUuid uuid(QString("e8e10f95-1a70-4b27-9ccf-02010264e9c8"));
classIds.prepend(QVariant::fromValue(uuid));
- QCOMPARE(classIds.count(), 2);
+ QCOMPARE(classIds.size(), 2);
QCOMPARE(classIds.at(0).value<QBluetoothUuid>(), uuid);
info.setAttribute(QBluetoothServiceInfo::ServiceClassIds, classIds);
QList<QBluetoothUuid> svclids = info.serviceClassUuids();
- QCOMPARE(svclids.count(), 2);
+ QCOMPARE(svclids.size(), 2);
QCOMPARE(svclids.at(0), uuid);
- QCOMPARE(svclids.at(1), QBluetoothUuid(QBluetoothUuid::SerialPort));
+ QCOMPARE(svclids.at(1), QBluetoothUuid(QBluetoothUuid::ServiceClassUuid::SerialPort));
}
static QByteArray debugOutput;
diff --git a/tests/auto/qbluetoothsocket/CMakeLists.txt b/tests/auto/qbluetoothsocket/CMakeLists.txt
new file mode 100644
index 00000000..59b6a8f2
--- /dev/null
+++ b/tests/auto/qbluetoothsocket/CMakeLists.txt
@@ -0,0 +1,39 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qbluetoothsocket Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qbluetoothsocket LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qbluetoothsocket
+ SOURCES
+ tst_qbluetoothsocket.cpp
+ LIBRARIES
+ Qt::BluetoothPrivate
+ Qt::Network
+)
+
+#### Keys ignored in scope 1:.:.:qbluetoothsocket.pro:<TRUE>:
+# OTHER_FILES = "README.txt"
+# testcase.timeout = "250"
+
+## Scopes:
+#####################################################################
+
+qt_internal_extend_target(tst_qbluetoothsocket CONDITION MACOS
+ DEFINES
+ QT_OSX_BLUETOOTH
+ LIBRARIES
+ Qt::Widgets
+)
+
+qt_internal_extend_target(tst_qbluetoothsocket CONDITION ANDROID AND NOT ANDROID_EMBEDDED
+ DEFINES
+ QT_ANDROID_BLUETOOTH
+)
diff --git a/tests/auto/qbluetoothsocket/qbluetoothsocket.pro b/tests/auto/qbluetoothsocket/qbluetoothsocket.pro
deleted file mode 100644
index 83bc417c..00000000
--- a/tests/auto/qbluetoothsocket/qbluetoothsocket.pro
+++ /dev/null
@@ -1,16 +0,0 @@
-SOURCES += tst_qbluetoothsocket.cpp
-TARGET = tst_qbluetoothsocket
-CONFIG += testcase
-testcase.timeout = 250 # this test is slow
-
-QT = core concurrent network bluetooth-private testlib
-osx:QT += widgets
-
-OTHER_FILES += \
- README.txt
-
-osx {
- DEFINES += QT_OSX_BLUETOOTH
-} else:android:!android-embedded {
- DEFINES += QT_ANDROID_BLUETOOTH
-}
diff --git a/tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp b/tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp
index 05bc1a0f..d88e64e7 100644
--- a/tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp
+++ b/tests/auto/qbluetoothsocket/tst_qbluetoothsocket.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
@@ -35,6 +10,9 @@
#include <qbluetoothserviceinfo.h>
#include <qbluetoothservicediscoveryagent.h>
#include <qbluetoothlocaldevice.h>
+#if QT_CONFIG(bluez)
+#include <QtBluetooth/private/bluez5_helper_p.h>
+#endif
QT_USE_NAMESPACE
@@ -115,7 +93,7 @@ void tst_QBluetoothSocket::initTestCase()
{
// setup Bluetooth env
const QList<QBluetoothHostInfo> foundDevices = QBluetoothLocalDevice::allDevices();
- if (!foundDevices.count()) {
+ if (foundDevices.isEmpty()) {
qWarning() << "Missing local device";
return;
} else {
@@ -136,13 +114,14 @@ void tst_QBluetoothSocket::initTestCase()
// Go find the server
QBluetoothServiceDiscoveryAgent *sda = new QBluetoothServiceDiscoveryAgent(this);
connect(sda, SIGNAL(serviceDiscovered(QBluetoothServiceInfo)), this, SLOT(serviceDiscovered(QBluetoothServiceInfo)));
- connect(sda, SIGNAL(error(QBluetoothServiceDiscoveryAgent::Error)), this, SLOT(error(QBluetoothServiceDiscoveryAgent::Error)));
+ connect(sda, SIGNAL(errorOccurred(QBluetoothServiceDiscoveryAgent::Error)), this,
+ SLOT(error(QBluetoothServiceDiscoveryAgent::Error)));
connect(sda, SIGNAL(finished()), this, SLOT(finished()));
qDebug() << "Starting discovery";
sda->setUuidFilter(QBluetoothUuid(QString(TEST_SERVICE_UUID)));
- sda->start(QBluetoothServiceDiscoveryAgent::MinimalDiscovery);
+ sda->start(QBluetoothServiceDiscoveryAgent::FullDiscovery);
for (int connectTime = MaxConnectTime; !done_discovery && connectTime > 0; connectTime -= 1000)
QTest::qWait(1000);
@@ -196,12 +175,12 @@ void tst_QBluetoothSocket::tst_construction()
QBluetoothSocket socket;
QCOMPARE(socket.socketType(), QBluetoothServiceInfo::UnknownProtocol);
- QCOMPARE(socket.error(), QBluetoothSocket::NoSocketError);
+ QCOMPARE(socket.error(), QBluetoothSocket::SocketError::NoSocketError);
QCOMPARE(socket.errorString(), QString());
QCOMPARE(socket.peerAddress(), QBluetoothAddress());
QCOMPARE(socket.peerName(), QString());
QCOMPARE(socket.peerPort(), quint16(0));
- QCOMPARE(socket.state(), QBluetoothSocket::UnconnectedState);
+ QCOMPARE(socket.state(), QBluetoothSocket::SocketState::UnconnectedState);
QCOMPARE(socket.socketDescriptor(), -1);
QCOMPARE(socket.bytesAvailable(), 0);
QCOMPARE(socket.bytesToWrite(), 0);
@@ -240,11 +219,11 @@ void tst_QBluetoothSocket::tst_serviceConnection()
QSignalSpy stateSpy(&socket, SIGNAL(stateChanged(QBluetoothSocket::SocketState)));
QCOMPARE(socket.socketType(), QBluetoothServiceInfo::UnknownProtocol);
- QCOMPARE(socket.state(), QBluetoothSocket::UnconnectedState);
+ QCOMPARE(socket.state(), QBluetoothSocket::SocketState::UnconnectedState);
/* Connection */
QSignalSpy connectedSpy(&socket, SIGNAL(connected()));
- QSignalSpy errorSpy(&socket, SIGNAL(error(QBluetoothSocket::SocketError)));
+ QSignalSpy errorSpy(&socket, SIGNAL(errorOccurred(QBluetoothSocket::SocketError)));
QCOMPARE(socket.openMode(), QIODevice::NotOpen);
QCOMPARE(socket.isWritable(), false);
@@ -253,26 +232,26 @@ void tst_QBluetoothSocket::tst_serviceConnection()
socket.connectToService(remoteServiceInfo);
- QCOMPARE(stateSpy.count(), 1);
- QCOMPARE(stateSpy.takeFirst().at(0).value<QBluetoothSocket::SocketState>(), QBluetoothSocket::ConnectingState);
- QCOMPARE(socket.state(), QBluetoothSocket::ConnectingState);
+ QCOMPARE(stateSpy.size(), 1);
+ QCOMPARE(stateSpy.takeFirst().at(0).value<QBluetoothSocket::SocketState>(), QBluetoothSocket::SocketState::ConnectingState);
+ QCOMPARE(socket.state(), QBluetoothSocket::SocketState::ConnectingState);
stateSpy.clear();
int connectTime = MaxConnectTime;
- while (connectedSpy.count() == 0 && errorSpy.count() == 0 && connectTime > 0) {
+ while (connectedSpy.isEmpty() && errorSpy.isEmpty() && connectTime > 0) {
QTest::qWait(1000);
connectTime -= 1000;
}
- if (errorSpy.count() != 0) {
+ if (!errorSpy.isEmpty()) {
qDebug() << errorSpy.takeFirst().at(0).toInt();
QSKIP("Connection error");
}
- QCOMPARE(connectedSpy.count(), 1);
- QCOMPARE(stateSpy.count(), 1);
- QCOMPARE(stateSpy.takeFirst().at(0).value<QBluetoothSocket::SocketState>(), QBluetoothSocket::ConnectedState);
- QCOMPARE(socket.state(), QBluetoothSocket::ConnectedState);
+ QCOMPARE(connectedSpy.size(), 1);
+ QCOMPARE(stateSpy.size(), 1);
+ QCOMPARE(stateSpy.takeFirst().at(0).value<QBluetoothSocket::SocketState>(), QBluetoothSocket::SocketState::ConnectedState);
+ QCOMPARE(socket.state(), QBluetoothSocket::SocketState::ConnectedState);
QCOMPARE(socket.isWritable(), true);
QCOMPARE(socket.isReadable(), true);
@@ -283,7 +262,13 @@ void tst_QBluetoothSocket::tst_serviceConnection()
//check the peer & local info
QCOMPARE(socket.localAddress(), localDevice.address());
QCOMPARE(socket.localName(), localDevice.name());
+#ifdef Q_OS_WIN
+ // On Windows the socket peer name (aka remotehost display name) seems to be
+ // formed from the BT address and not necessarily the remoteDevice name
+ QVERIFY(!socket.peerName().isEmpty());
+#else
QCOMPARE(socket.peerName(), remoteDevice.name());
+#endif
QCOMPARE(socket.peerAddress(), remoteDevice.address());
/* Disconnection */
@@ -295,18 +280,18 @@ void tst_QBluetoothSocket::tst_serviceConnection()
QCOMPARE(socket.isOpen(), false);
QCOMPARE(socket.openMode(), QIODevice::NotOpen);
- QVERIFY(stateSpy.count() >= 1);
- QCOMPARE(stateSpy.takeFirst().at(0).value<QBluetoothSocket::SocketState>(), QBluetoothSocket::ClosingState);
+ QVERIFY(!stateSpy.isEmpty());
+ QCOMPARE(stateSpy.takeFirst().at(0).value<QBluetoothSocket::SocketState>(), QBluetoothSocket::SocketState::ClosingState);
int disconnectTime = MaxConnectTime;
- while (disconnectedSpy.count() == 0 && disconnectTime > 0) {
+ while (disconnectedSpy.isEmpty() && disconnectTime > 0) {
QTest::qWait(1000);
disconnectTime -= 1000;
}
- QCOMPARE(disconnectedSpy.count(), 1);
- QCOMPARE(stateSpy.count(), 1);
- QCOMPARE(stateSpy.takeFirst().at(0).value<QBluetoothSocket::SocketState>(), QBluetoothSocket::UnconnectedState);
+ QCOMPARE(disconnectedSpy.size(), 1);
+ QCOMPARE(stateSpy.size(), 1);
+ QCOMPARE(stateSpy.takeFirst().at(0).value<QBluetoothSocket::SocketState>(), QBluetoothSocket::SocketState::UnconnectedState);
// The remote service needs time to close the connection and resume listening
QTest::qSleep(100);
@@ -337,7 +322,7 @@ void tst_QBluetoothSocket::tst_clientCommunication()
QSignalSpy stateSpy(&socket, SIGNAL(stateChanged(QBluetoothSocket::SocketState)));
QCOMPARE(socket.socketType(), QBluetoothServiceInfo::RfcommProtocol);
- QCOMPARE(socket.state(), QBluetoothSocket::UnconnectedState);
+ QCOMPARE(socket.state(), QBluetoothSocket::SocketState::UnconnectedState);
/* Connection */
QSignalSpy connectedSpy(&socket, SIGNAL(connected()));
@@ -348,14 +333,14 @@ void tst_QBluetoothSocket::tst_clientCommunication()
QCOMPARE(socket.openMode(), QIODevice::NotOpen);
socket.connectToService(remoteServiceInfo);
- QCOMPARE(stateSpy.count(), 1);
- QCOMPARE(qvariant_cast<QBluetoothSocket::SocketState>(stateSpy.takeFirst().at(0)), QBluetoothSocket::ConnectingState);
- QCOMPARE(socket.state(), QBluetoothSocket::ConnectingState);
+ QCOMPARE(stateSpy.size(), 1);
+ QCOMPARE(qvariant_cast<QBluetoothSocket::SocketState>(stateSpy.takeFirst().at(0)), QBluetoothSocket::SocketState::ConnectingState);
+ QCOMPARE(socket.state(), QBluetoothSocket::SocketState::ConnectingState);
stateSpy.clear();
int connectTime = MaxConnectTime;
- while (connectedSpy.count() == 0 && connectTime > 0) {
+ while (connectedSpy.isEmpty() && connectTime > 0) {
QTest::qWait(1000);
connectTime -= 1000;
}
@@ -364,10 +349,10 @@ void tst_QBluetoothSocket::tst_clientCommunication()
QCOMPARE(socket.isReadable(), true);
QCOMPARE(socket.isOpen(), true);
- QCOMPARE(connectedSpy.count(), 1);
- QCOMPARE(stateSpy.count(), 1);
- QCOMPARE(qvariant_cast<QBluetoothSocket::SocketState>(stateSpy.takeFirst().at(0)), QBluetoothSocket::ConnectedState);
- QCOMPARE(socket.state(), QBluetoothSocket::ConnectedState);
+ QCOMPARE(connectedSpy.size(), 1);
+ QCOMPARE(stateSpy.size(), 1);
+ QCOMPARE(qvariant_cast<QBluetoothSocket::SocketState>(stateSpy.takeFirst().at(0)), QBluetoothSocket::SocketState::ConnectedState);
+ QCOMPARE(socket.state(), QBluetoothSocket::SocketState::ConnectedState);
stateSpy.clear();
@@ -377,7 +362,7 @@ void tst_QBluetoothSocket::tst_clientCommunication()
{
/* Send line by line with event loop */
- for (const QString &line : qAsConst(data)) {
+ for (const QString &line : std::as_const(data)) {
QSignalSpy readyReadSpy(&socket, SIGNAL(readyRead()));
QSignalSpy bytesWrittenSpy(&socket, SIGNAL(bytesWritten(qint64)));
@@ -386,31 +371,31 @@ void tst_QBluetoothSocket::tst_clientCommunication()
if (socket.openMode() & QIODevice::Unbuffered)
QCOMPARE(socket.bytesToWrite(), qint64(0));
else
- QCOMPARE(socket.bytesToWrite(), qint64(line.length()));
+ QCOMPARE(socket.bytesToWrite(), qint64(line.size()));
- QCOMPARE(dataWritten, qint64(line.length()));
+ QCOMPARE(dataWritten, qint64(line.size()));
int readWriteTime = MaxReadWriteTime;
- while ((bytesWrittenSpy.count() == 0 || readyReadSpy.count() == 0) && readWriteTime > 0) {
+ while ((bytesWrittenSpy.isEmpty() || readyReadSpy.isEmpty()) && readWriteTime > 0) {
QTest::qWait(1000);
readWriteTime -= 1000;
}
- QCOMPARE(bytesWrittenSpy.count(), 1);
- QCOMPARE(bytesWrittenSpy.at(0).at(0).toLongLong(), qint64(line.length()));
+ QCOMPARE(bytesWrittenSpy.size(), 1);
+ QCOMPARE(bytesWrittenSpy.at(0).at(0).toLongLong(), qint64(line.size()));
readWriteTime = MaxReadWriteTime;
- while ((readyReadSpy.count() == 0) && readWriteTime > 0) {
+ while (readyReadSpy.isEmpty() && readWriteTime > 0) {
QTest::qWait(1000);
readWriteTime -= 1000;
}
- QCOMPARE(readyReadSpy.count(), 1);
+ QCOMPARE(readyReadSpy.size(), 1);
if (socket.openMode() & QIODevice::Unbuffered)
- QVERIFY(socket.bytesAvailable() <= qint64(line.length()));
+ QVERIFY(socket.bytesAvailable() <= qint64(line.size()));
else
- QCOMPARE(socket.bytesAvailable(), qint64(line.length()));
+ QCOMPARE(socket.bytesAvailable(), qint64(line.size()));
QVERIFY(socket.canReadLine());
@@ -435,24 +420,24 @@ void tst_QBluetoothSocket::tst_clientCommunication()
if (socket.openMode() & QIODevice::Unbuffered)
QCOMPARE(socket.bytesToWrite(), qint64(0));
else
- QCOMPARE(socket.bytesToWrite(), qint64(joined.length()));
+ QCOMPARE(socket.bytesToWrite(), qint64(joined.size()));
- QCOMPARE(dataWritten, qint64(joined.length()));
+ QCOMPARE(dataWritten, qint64(joined.size()));
int readWriteTime = MaxReadWriteTime;
- while ((bytesWrittenSpy.count() == 0 || readyReadSpy.count() == 0) && readWriteTime > 0) {
+ while ((bytesWrittenSpy.isEmpty() || readyReadSpy.isEmpty()) && readWriteTime > 0) {
QTest::qWait(1000);
readWriteTime -= 1000;
}
- QCOMPARE(bytesWrittenSpy.count(), 1);
- QCOMPARE(bytesWrittenSpy.at(0).at(0).toLongLong(), qint64(joined.length()));
- QVERIFY(readyReadSpy.count() > 0);
+ QCOMPARE(bytesWrittenSpy.size(), 1);
+ QCOMPARE(bytesWrittenSpy.at(0).at(0).toLongLong(), qint64(joined.size()));
+ QVERIFY(!readyReadSpy.isEmpty());
if (socket.openMode() & QIODevice::Unbuffered)
- QVERIFY(socket.bytesAvailable() <= qint64(joined.length()));
+ QVERIFY(socket.bytesAvailable() <= qint64(joined.size()));
else
- QCOMPARE(socket.bytesAvailable(), qint64(joined.length()));
+ QCOMPARE(socket.bytesAvailable(), qint64(joined.size()));
QVERIFY(socket.canReadLine());
@@ -472,15 +457,15 @@ void tst_QBluetoothSocket::tst_clientCommunication()
QCOMPARE(socket.openMode(), QIODevice::NotOpen);
int disconnectTime = MaxConnectTime;
- while (disconnectedSpy.count() == 0 && disconnectTime > 0) {
+ while (disconnectedSpy.isEmpty() && disconnectTime > 0) {
QTest::qWait(1000);
disconnectTime -= 1000;
}
- QCOMPARE(disconnectedSpy.count(), 1);
- QCOMPARE(stateSpy.count(), 2);
- QCOMPARE(qvariant_cast<QBluetoothSocket::SocketState>(stateSpy.takeFirst().at(0)), QBluetoothSocket::ClosingState);
- QCOMPARE(qvariant_cast<QBluetoothSocket::SocketState>(stateSpy.takeFirst().at(0)), QBluetoothSocket::UnconnectedState);
+ QCOMPARE(disconnectedSpy.size(), 1);
+ QCOMPARE(stateSpy.size(), 2);
+ QCOMPARE(qvariant_cast<QBluetoothSocket::SocketState>(stateSpy.takeFirst().at(0)), QBluetoothSocket::SocketState::ClosingState);
+ QCOMPARE(qvariant_cast<QBluetoothSocket::SocketState>(stateSpy.takeFirst().at(0)), QBluetoothSocket::SocketState::UnconnectedState);
// The remote service needs time to close the connection and resume listening
QTest::qSleep(100);
@@ -489,11 +474,11 @@ void tst_QBluetoothSocket::tst_clientCommunication()
void tst_QBluetoothSocket::tst_error()
{
QBluetoothSocket socket;
- QSignalSpy errorSpy(&socket, SIGNAL(error(QBluetoothSocket::SocketError)));
- QCOMPARE(errorSpy.count(), 0);
+ QSignalSpy errorSpy(&socket, SIGNAL(errorOccurred(QBluetoothSocket::SocketError)));
+ QCOMPARE(errorSpy.size(), 0);
const QBluetoothSocket::SocketError e = socket.error();
- QVERIFY(e == QBluetoothSocket::NoSocketError);
+ QVERIFY(e == QBluetoothSocket::SocketError::NoSocketError);
QVERIFY(socket.errorString() == QString());
}
@@ -503,21 +488,27 @@ void tst_QBluetoothSocket::tst_preferredSecurityFlags()
QBluetoothSocket socket;
//test default values
-#if defined(QT_ANDROID_BLUETOOTH) | defined(QT_OSX_BLUETOOTH)
- QCOMPARE(socket.preferredSecurityFlags(), QBluetooth::Secure);
+#if defined(QT_ANDROID_BLUETOOTH) || defined(QT_OSX_BLUETOOTH)
+ QCOMPARE(socket.preferredSecurityFlags(), QBluetooth::Security::Secure);
#elif QT_CONFIG(bluez)
- QCOMPARE(socket.preferredSecurityFlags(), QBluetooth::Authorization);
+ // The bluezdbus socket uses "NoSecurity" by default, whereas the non-dbus bluez
+ // socket uses "Authorization" by default
+ if (bluetoothdVersion() >= QVersionNumber(5, 46))
+ QCOMPARE(socket.preferredSecurityFlags(), QBluetooth::Security::NoSecurity);
+ else
+ QCOMPARE(socket.preferredSecurityFlags(), QBluetooth::Security::Authorization);
#else
- QCOMPARE(socket.preferredSecurityFlags(), QBluetooth::NoSecurity);
+ QCOMPARE(socket.preferredSecurityFlags(), QBluetooth::Security::NoSecurity);
#endif
- socket.setPreferredSecurityFlags(QBluetooth::Authentication|QBluetooth::Encryption);
+ socket.setPreferredSecurityFlags(QBluetooth::Security::Authentication
+ | QBluetooth::Security::Encryption);
#if defined(QT_OSX_BLUETOOTH)
- QCOMPARE(socket.preferredSecurityFlags(), QBluetooth::Secure);
+ QCOMPARE(socket.preferredSecurityFlags(), QBluetooth::Security::Secure);
#else
QCOMPARE(socket.preferredSecurityFlags(),
- QBluetooth::Encryption|QBluetooth::Authentication);
+ QBluetooth::Security::Encryption | QBluetooth::Security::Authentication);
#endif
}
@@ -531,19 +522,19 @@ void tst_QBluetoothSocket::tst_unsupportedProtocolError()
// UnsupportedProtocolError.
QBluetoothSocket socket;
QCOMPARE(socket.socketType(), QBluetoothServiceInfo::UnknownProtocol);
- QVERIFY(socket.error() == QBluetoothSocket::NoSocketError);
+ QVERIFY(socket.error() == QBluetoothSocket::SocketError::NoSocketError);
QVERIFY(socket.errorString() == QString());
- QSignalSpy errorSpy(&socket, SIGNAL(error(QBluetoothSocket::SocketError)));
+ QSignalSpy errorSpy(&socket, SIGNAL(errorOccurred(QBluetoothSocket::SocketError)));
// 1. Stop early with 'UnsupportedProtocolError'.
QBluetoothServiceInfo dummyServiceInfo;
socket.connectToService(dummyServiceInfo, QIODevice::ReadWrite);
QTRY_COMPARE_WITH_TIMEOUT(errorSpy.size(), 1, 1000);
QCOMPARE(errorSpy.size(), 1);
- QCOMPARE(errorSpy.takeFirst().at(0).toInt(), int(QBluetoothSocket::UnsupportedProtocolError));
+ QCOMPARE(errorSpy.takeFirst().at(0).toInt(), int(QBluetoothSocket::SocketError::UnsupportedProtocolError));
QVERIFY(socket.errorString().size() != 0);
- QCOMPARE(socket.state(), QBluetoothSocket::UnconnectedState);
+ QCOMPARE(socket.state(), QBluetoothSocket::SocketState::UnconnectedState);
errorSpy.clear();
@@ -551,9 +542,20 @@ void tst_QBluetoothSocket::tst_unsupportedProtocolError()
socket.connectToService(QBluetoothAddress(), 1, QIODevice::ReadWrite);
QTRY_COMPARE_WITH_TIMEOUT(errorSpy.size(), 1, 1000);
QCOMPARE(errorSpy.size(), 1);
- QCOMPARE(errorSpy.takeFirst().at(0).toInt(), int(QBluetoothSocket::UnsupportedProtocolError));
+#if QT_CONFIG(bluez)
+ // Bluez dbus socket does not support connecting to port and gives different error code
+ if (bluetoothdVersion() >= QVersionNumber(5, 46)) {
+ QCOMPARE(errorSpy.takeFirst().at(0).toInt(),
+ int(QBluetoothSocket::SocketError::ServiceNotFoundError));
+ } else {
+ QCOMPARE(errorSpy.takeFirst().at(0).toInt(),
+ int(QBluetoothSocket::SocketError::UnsupportedProtocolError));
+ }
+#else
+ QCOMPARE(errorSpy.takeFirst().at(0).toInt(), int(QBluetoothSocket::SocketError::UnsupportedProtocolError));
+#endif
QVERIFY(socket.errorString().size() != 0);
- QCOMPARE(socket.state(), QBluetoothSocket::UnconnectedState);
+ QCOMPARE(socket.state(), QBluetoothSocket::SocketState::UnconnectedState);
errorSpy.clear();
@@ -561,9 +563,9 @@ void tst_QBluetoothSocket::tst_unsupportedProtocolError()
socket.connectToService(QBluetoothAddress(), QBluetoothUuid(), QIODevice::ReadWrite);
QTRY_COMPARE_WITH_TIMEOUT(errorSpy.size(), 1, 1000);
QCOMPARE(errorSpy.size(), 1);
- QCOMPARE(errorSpy.takeFirst().at(0).toInt(), int(QBluetoothSocket::UnsupportedProtocolError));
+ QCOMPARE(errorSpy.takeFirst().at(0).toInt(), int(QBluetoothSocket::SocketError::UnsupportedProtocolError));
QVERIFY(socket.errorString().size() != 0);
- QCOMPARE(socket.state(), QBluetoothSocket::UnconnectedState);
+ QCOMPARE(socket.state(), QBluetoothSocket::SocketState::UnconnectedState);
}
QTEST_MAIN(tst_QBluetoothSocket)
diff --git a/tests/auto/qbluetoothtransfermanager/qbluetoothtransfermanager.pro b/tests/auto/qbluetoothtransfermanager/qbluetoothtransfermanager.pro
deleted file mode 100644
index 8e0d22a5..00000000
--- a/tests/auto/qbluetoothtransfermanager/qbluetoothtransfermanager.pro
+++ /dev/null
@@ -1,8 +0,0 @@
-SOURCES += tst_qbluetoothtransfermanager.cpp
-TARGET=tst_qbluetoothtransfermanager
-CONFIG += testcase
-testcase.timeout = 250 # this test is slow
-
-QT = core concurrent bluetooth testlib
-
-TESTDATA += *.txt
diff --git a/tests/auto/qbluetoothtransfermanager/testfile.txt b/tests/auto/qbluetoothtransfermanager/testfile.txt
deleted file mode 100644
index 630a0118..00000000
--- a/tests/auto/qbluetoothtransfermanager/testfile.txt
+++ /dev/null
@@ -1 +0,0 @@
-This is a small test file to be transmitted by tst_bluetoothtransfermanager.
diff --git a/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp b/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp
deleted file mode 100644
index 6b0481a5..00000000
--- a/tests/auto/qbluetoothtransfermanager/tst_qbluetoothtransfermanager.cpp
+++ /dev/null
@@ -1,360 +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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtTest/QtTest>
-
-#include <QDebug>
-#include <QMap>
-#include <QTextStream>
-
-#include <qbluetoothtransferrequest.h>
-#include <qbluetoothtransfermanager.h>
-#include <qbluetoothtransferreply.h>
-#include <qbluetoothaddress.h>
-#include <qbluetoothlocaldevice.h>
-
-#include <qbluetoothdeviceinfo.h>
-#include <qbluetoothserviceinfo.h>
-#include <qbluetoothservicediscoveryagent.h>
-
-/*
- * Some tests require a Bluetooth device within the vincinity of the test
- * machine executing this test. The tests require manual interaction
- * as pairing and file transfer requests must be accepted.
- * The remote device's address must be passed
- * via the BT_TEST_DEVICE env variable. The remote device must be
- * discoverable and the object push service must be accessible. Any
- **/
-
-QT_USE_NAMESPACE
-
-typedef QMap<QBluetoothTransferRequest::Attribute,QVariant> tst_QBluetoothTransferManager_QParameterMap;
-Q_DECLARE_METATYPE(tst_QBluetoothTransferManager_QParameterMap)
-
-static const int MaxConnectTime = 60 * 1000; // 1 minute in ms
-
-class tst_QBluetoothTransferManager : public QObject
-{
- Q_OBJECT
-
-public:
- tst_QBluetoothTransferManager();
- ~tst_QBluetoothTransferManager();
-
-private slots:
- void initTestCase();
-
- void tst_construction();
-
- void tst_request_data();
- void tst_request();
-
- void tst_sendFile_data();
- void tst_sendFile();
-
- void tst_sendBuffer_data();
- void tst_sendBuffer();
-
- void tst_sendNullPointer();
-private:
- QBluetoothAddress remoteAddress;
-};
-
-tst_QBluetoothTransferManager::tst_QBluetoothTransferManager()
-{
-}
-
-tst_QBluetoothTransferManager::~tst_QBluetoothTransferManager()
-{
-}
-
-void tst_QBluetoothTransferManager::initTestCase()
-{
- const QString remote = qgetenv("BT_TEST_DEVICE");
- if (!remote.isEmpty()) {
- remoteAddress = QBluetoothAddress(remote);
- QVERIFY(!remoteAddress.isNull());
- qWarning() << "Using remote device " << remote << " for testing. Ensure that the device is discoverable for pairing requests";
- } else {
- qWarning() << "Not using any remote device for testing. Set BT_TEST_DEVICE env to run manual tests involving a remote device";
- QSKIP("Remote upload test not possible. Set BT_TEST_DEVICE");
- }
-
- if (!QBluetoothLocalDevice::allDevices().count())
- QSKIP("Skipping test due to missing Bluetooth device");
-
- // start Bluetooth if not started
- QBluetoothLocalDevice *device = new QBluetoothLocalDevice();
- device->powerOn();
- delete device;
-}
-
-void tst_QBluetoothTransferManager::tst_construction()
-{
- QBluetoothTransferManager *manager = new QBluetoothTransferManager();
-
- QVERIFY(manager);
- delete manager;
-}
-
-void tst_QBluetoothTransferManager::tst_request_data()
-{
- QTest::addColumn<QBluetoothAddress>("address");
- QTest::addColumn<QMap<QBluetoothTransferRequest::Attribute, QVariant> >("parameters");
-
- QMap<QBluetoothTransferRequest::Attribute, QVariant> inparameters;
- inparameters.insert(QBluetoothTransferRequest::DescriptionAttribute, "Description");
- inparameters.insert(QBluetoothTransferRequest::LengthAttribute, QVariant(1024));
- inparameters.insert(QBluetoothTransferRequest::TypeAttribute, "OPP");
- inparameters.insert(QBluetoothTransferRequest::NameAttribute, "name");
- inparameters.insert(QBluetoothTransferRequest::TimeAttribute, QDateTime::currentDateTime());
-
- QTest::newRow("TESTDATA") << QBluetoothAddress("00:11:22:33:44:55:66") << inparameters;
-}
-
-void tst_QBluetoothTransferManager::tst_request()
-{
- QFETCH(QBluetoothAddress, address);
- QFETCH(tst_QBluetoothTransferManager_QParameterMap, parameters);
-
- QBluetoothTransferRequest transferRequest(address);
- const QList<QBluetoothTransferRequest::Attribute> attributes = parameters.keys();
- for (QBluetoothTransferRequest::Attribute key : attributes)
- QCOMPARE(transferRequest.attribute(key), QVariant());
-
- for (QBluetoothTransferRequest::Attribute key : attributes)
- transferRequest.setAttribute((QBluetoothTransferRequest::Attribute)key, parameters[key]);
-
- QCOMPARE(transferRequest.address(), address);
- for (QBluetoothTransferRequest::Attribute key : attributes)
- QCOMPARE(transferRequest.attribute(key), parameters[key]);
-
- //test copy constructor
- QBluetoothTransferRequest constructorCopy = transferRequest;
- QVERIFY(constructorCopy == transferRequest);
- QVERIFY(!(constructorCopy != transferRequest));
- QCOMPARE(constructorCopy.address(), address);
- for (QBluetoothTransferRequest::Attribute key : attributes)
- QCOMPARE(constructorCopy.attribute(key), parameters[key]);
-
- //test assignment operator
- QBluetoothTransferRequest request;
- QVERIFY(request.address().isNull());
- for (QBluetoothTransferRequest::Attribute key : attributes)
- QCOMPARE(request.attribute(key), QVariant());
- request = transferRequest;
- QCOMPARE(request.address(), address);
- for (QBluetoothTransferRequest::Attribute key : attributes)
- QCOMPARE(request.attribute(key), parameters[key]);
-
- //test that it's a true and independent copy
- constructorCopy.setAttribute(QBluetoothTransferRequest::DescriptionAttribute, "newDescription");
- request.setAttribute(QBluetoothTransferRequest::TypeAttribute, "FTP");
-
- QCOMPARE(constructorCopy.attribute(QBluetoothTransferRequest::DescriptionAttribute).toString(),QString("newDescription"));
- QCOMPARE(request.attribute(QBluetoothTransferRequest::DescriptionAttribute).toString(),QString("Description"));
- QCOMPARE(transferRequest.attribute(QBluetoothTransferRequest::DescriptionAttribute).toString(),QString("Description"));
-
- QCOMPARE(constructorCopy.attribute(QBluetoothTransferRequest::TypeAttribute).toString(),QString("OPP"));
- QCOMPARE(request.attribute(QBluetoothTransferRequest::TypeAttribute).toString(),QString("FTP"));
- QCOMPARE(transferRequest.attribute(QBluetoothTransferRequest::TypeAttribute).toString(),QString("OPP"));
-}
-
-void tst_QBluetoothTransferManager::tst_sendFile_data()
-{
- QTest::addColumn<QBluetoothAddress>("deviceAddress");
- QTest::addColumn<bool>("expectSuccess");
- QTest::addColumn<bool>("isInvalidFile");
-
- QTest::newRow("Push to remote test device") << remoteAddress << true << false;
- QTest::newRow("Push of non-existing file") << remoteAddress << false << true;
- QTest::newRow("Push to invalid address") << QBluetoothAddress() << false << false;
- QTest::newRow("Push to non-existend device") << QBluetoothAddress("11:22:33:44:55:66") << false << false;
-
-}
-
-void tst_QBluetoothTransferManager::tst_sendFile()
-{
- QFETCH(QBluetoothAddress, deviceAddress);
- QFETCH(bool, expectSuccess);
- QFETCH(bool, isInvalidFile);
-
- QBluetoothLocalDevice dev;
- if (expectSuccess) {
- dev.requestPairing(deviceAddress, QBluetoothLocalDevice::Paired);
- QTest::qWait(5000);
- QCOMPARE(dev.pairingStatus(deviceAddress), QBluetoothLocalDevice::Paired);
- }
-
- QBluetoothTransferRequest request(deviceAddress);
- QCOMPARE(request.address(), deviceAddress);
-
- QBluetoothTransferManager manager;
- QString fileHandle;
- if (!isInvalidFile) {
- fileHandle = QFINDTESTDATA("testfile.txt");
- QVERIFY(!fileHandle.isEmpty());
- } else {
- fileHandle = ("arbitraryFileName.txt"); //file doesn't exist
- }
- QFile f(fileHandle);
- QCOMPARE(f.exists(), !isInvalidFile);
-
-
- qDebug() << "Transferring file to " << deviceAddress.toString();
- if (expectSuccess)
- qDebug() << "Please accept Object push request on remote device";
- QBluetoothTransferReply* reply = manager.put(request, &f);
- QSignalSpy finishedSpy(reply, SIGNAL(finished(QBluetoothTransferReply*)));
- QSignalSpy progressSpy(reply, SIGNAL(transferProgress(qint64,qint64)));
- QSignalSpy errorSpy(reply, SIGNAL(error(QBluetoothTransferReply::TransferError)));
-
- QCOMPARE(reply->request(), request);
- QVERIFY(reply->manager() == &manager);
- QVERIFY(!reply->isFinished());
- QVERIFY(reply->isRunning());
-
- const int maxWaitTime = 20 * 1000; //20s
- for (int time = 0;
- time<maxWaitTime && (finishedSpy.count()==0);
- time+=1000) {
- QTest::qWait(1000); //if interval
- }
-
- QVERIFY(finishedSpy.count()>0);
- if (expectSuccess) {
- QVERIFY(progressSpy.count()>0);
- QCOMPARE(reply->error(), QBluetoothTransferReply::NoError);
- QCOMPARE(reply->errorString(), QString());
- QVERIFY(errorSpy.isEmpty());
- } else {
- QVERIFY(progressSpy.count() == 0);
- if (isInvalidFile)
- QVERIFY(reply->error() == QBluetoothTransferReply::FileNotFoundError);
- else
- QVERIFY(reply->error() != QBluetoothTransferReply::NoError);
- QVERIFY(!reply->errorString().isEmpty());
- QCOMPARE(errorSpy.count(), 1);
- }
-
- QVERIFY(reply->isFinished());
- QVERIFY(!reply->isRunning());
-}
-
-void tst_QBluetoothTransferManager::tst_sendBuffer_data()
-{
-
- QTest::addColumn<QBluetoothAddress>("deviceAddress");
- QTest::addColumn<bool>("expectSuccess");
- QTest::addColumn<QByteArray>("data");
-
- QTest::newRow("Push to remote test device") << remoteAddress << true <<
- QByteArray("This is a very long byte array which we are going to access via a QBuffer"); ;
- QTest::newRow("Push to invalid address") << QBluetoothAddress() << false << QByteArray("test");
- QTest::newRow("Push to non-existend device") << QBluetoothAddress("11:22:33:44:55:66") << false << QByteArray("test");
-}
-
-
-
-void tst_QBluetoothTransferManager::tst_sendBuffer()
-{
- QFETCH(QBluetoothAddress, deviceAddress);
- QFETCH(bool, expectSuccess);
- QFETCH(QByteArray, data);
-
- QBuffer buffer;
- buffer.setData(data);
- buffer.open(QIODevice::ReadOnly);
- buffer.seek(0);
-
- QBluetoothLocalDevice dev;
- if (expectSuccess) {
- dev.requestPairing(deviceAddress, QBluetoothLocalDevice::Paired);
- QTest::qWait(2000);
- QCOMPARE(dev.pairingStatus(deviceAddress), QBluetoothLocalDevice::Paired);
- }
-
- QBluetoothTransferRequest request(deviceAddress);
- QCOMPARE(request.address(), deviceAddress);
-
- QBluetoothTransferManager manager;
-
- qDebug() << "Transferring test buffer to " << deviceAddress.toString();
- if (expectSuccess)
- qDebug() << "Please accept Object push request on remote device";
- QBluetoothTransferReply* reply = manager.put(request, &buffer);
- QSignalSpy finishedSpy(reply, SIGNAL(finished(QBluetoothTransferReply*)));
- QSignalSpy progressSpy(reply, SIGNAL(transferProgress(qint64,qint64)));
- QSignalSpy errorSpy(reply, SIGNAL(error(QBluetoothTransferReply::TransferError)));
-
- QCOMPARE(reply->request(), request);
- QVERIFY(reply->manager() == &manager);
- QVERIFY(!reply->isFinished());
- QVERIFY(reply->isRunning());
-
- const int maxWaitTime = 20 * 1000; //20s
- for (int time = 0;
- time<maxWaitTime && (finishedSpy.count()==0);
- time+=10000) {
- QTest::qWait(10000); //if interval
- }
-
- QVERIFY(finishedSpy.count()>0);
- if (expectSuccess) {
- QVERIFY(progressSpy.count()>0);
- QVERIFY(errorSpy.isEmpty());
- QCOMPARE(reply->error(), QBluetoothTransferReply::NoError);
- QCOMPARE(reply->errorString(), QString());
- } else {
- QVERIFY(progressSpy.count() == 0);
- QVERIFY(reply->error() != QBluetoothTransferReply::NoError);
- QVERIFY(!reply->errorString().isEmpty());
- QCOMPARE(errorSpy.count(), 1);
- }
-
- QVERIFY(reply->isFinished());
- QVERIFY(!reply->isRunning());
-}
-
-void tst_QBluetoothTransferManager::tst_sendNullPointer()
-{
- QBluetoothTransferRequest request(remoteAddress);
- QBluetoothTransferManager manager;
- QBluetoothTransferReply *reply = manager.put(request, 0);
-
- QVERIFY(reply);
- QCOMPARE(reply->isFinished(), true);
- QCOMPARE(reply->isRunning(), false);
- QCOMPARE(reply->manager(), &manager);
- QCOMPARE(reply->request(), request);
- QCOMPARE(reply->error(), QBluetoothTransferReply::FileNotFoundError);
-}
-
-QTEST_MAIN(tst_QBluetoothTransferManager)
-
-#include "tst_qbluetoothtransfermanager.moc"
diff --git a/tests/auto/qbluetoothtransferrequest/qbluetoothtransferrequest.pro b/tests/auto/qbluetoothtransferrequest/qbluetoothtransferrequest.pro
deleted file mode 100644
index 2dfbfe09..00000000
--- a/tests/auto/qbluetoothtransferrequest/qbluetoothtransferrequest.pro
+++ /dev/null
@@ -1,5 +0,0 @@
-SOURCES += tst_qbluetoothtransferrequest.cpp
-TARGET=tst_qbluetoothtransferrequest
-CONFIG += testcase
-
-QT = core concurrent bluetooth testlib
diff --git a/tests/auto/qbluetoothtransferrequest/tst_qbluetoothtransferrequest.cpp b/tests/auto/qbluetoothtransferrequest/tst_qbluetoothtransferrequest.cpp
deleted file mode 100644
index dcf2c95b..00000000
--- a/tests/auto/qbluetoothtransferrequest/tst_qbluetoothtransferrequest.cpp
+++ /dev/null
@@ -1,164 +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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtTest/QtTest>
-
-#include <QDebug>
-#include <QMap>
-
-#include <qbluetoothtransferrequest.h>
-#include <qbluetoothaddress.h>
-#include <qbluetoothlocaldevice.h>
-
-QT_USE_NAMESPACE
-
-typedef QMap<int,QVariant> tst_QBluetoothTransferRequest_QParameterMap;
-Q_DECLARE_METATYPE(tst_QBluetoothTransferRequest_QParameterMap)
-
-class tst_QBluetoothTransferRequest : public QObject
-{
- Q_OBJECT
-
-public:
- tst_QBluetoothTransferRequest();
- ~tst_QBluetoothTransferRequest();
-
-private slots:
- void initTestCase();
-
- void tst_construction_data();
- void tst_construction();
-
- void tst_assignment_data();
- void tst_assignment();
-};
-
-tst_QBluetoothTransferRequest::tst_QBluetoothTransferRequest()
-{
-}
-
-tst_QBluetoothTransferRequest::~tst_QBluetoothTransferRequest()
-{
-}
-
-void tst_QBluetoothTransferRequest::initTestCase()
-{
- // start Bluetooth if not started
- QBluetoothLocalDevice *device = new QBluetoothLocalDevice();
- device->powerOn();
- delete device;
-}
-
-void tst_QBluetoothTransferRequest::tst_construction_data()
-{
- QTest::addColumn<QBluetoothAddress>("address");
- QTest::addColumn<QMap<int, QVariant> >("parameters");
-
- QMap<int, QVariant> inparameters;
- inparameters.insert((int)QBluetoothTransferRequest::DescriptionAttribute, "Desciption");
- inparameters.insert((int)QBluetoothTransferRequest::LengthAttribute, QVariant(1024));
- inparameters.insert((int)QBluetoothTransferRequest::TypeAttribute, "OPP");
-
- QTest::newRow("0x000000 COD") << QBluetoothAddress("000000000000") << inparameters;
- QTest::newRow("0x000100 COD") << QBluetoothAddress("000000000000") << inparameters;
- QTest::newRow("0x000104 COD") << QBluetoothAddress("000000000000") << inparameters;
- QTest::newRow("0x000118 COD") << QBluetoothAddress("000000000000") << inparameters;
- QTest::newRow("0x000200 COD") << QBluetoothAddress("000000000000") << inparameters;
-}
-
-void tst_QBluetoothTransferRequest::tst_construction()
-{
- QFETCH(QBluetoothAddress, address);
- QFETCH(tst_QBluetoothTransferRequest_QParameterMap, parameters);
-
- QBluetoothTransferRequest transferRequest(address);
-
- const QList<int> keys = parameters.keys();
- for (const int key : keys) {
- transferRequest.setAttribute((QBluetoothTransferRequest::Attribute)key, parameters[key]);
- QCOMPARE(parameters[key], transferRequest.attribute((QBluetoothTransferRequest::Attribute)key));
- }
-
- QCOMPARE(transferRequest.address(), address);
-
- QBluetoothTransferRequest copyRequest(transferRequest);
-
- QCOMPARE(copyRequest.address(), address);
- QCOMPARE(transferRequest, copyRequest);
-}
-
-void tst_QBluetoothTransferRequest::tst_assignment_data()
-{
- tst_construction_data();
-}
-
-void tst_QBluetoothTransferRequest::tst_assignment()
-{
- QFETCH(QBluetoothAddress, address);
- QFETCH(tst_QBluetoothTransferRequest_QParameterMap, parameters);
-
- QBluetoothTransferRequest transferRequest(address);
-
- const QList<int> keys = parameters.keys();
- for (const int key : keys) {
- transferRequest.setAttribute((QBluetoothTransferRequest::Attribute)key, parameters[key]);
- }
-
- {
- QBluetoothTransferRequest copyRequest = transferRequest;
-
- QCOMPARE(copyRequest.address(), address);
- QCOMPARE(transferRequest, copyRequest);
- }
-
- {
- QBluetoothTransferRequest copyRequest(QBluetoothAddress("000000000001"));
-
- copyRequest = transferRequest;
-
- QCOMPARE(copyRequest.address(), address);
- QCOMPARE(transferRequest, copyRequest);
- }
-
- {
- QBluetoothTransferRequest copyRequest1(QBluetoothAddress("000000000001"));
- QBluetoothTransferRequest copyRequest2(QBluetoothAddress("000000000001"));
-
- copyRequest1 = copyRequest2 = transferRequest;
-
- QCOMPARE(copyRequest1.address(), address);
- QCOMPARE(copyRequest2.address(), address);
- QCOMPARE(transferRequest, copyRequest1);
- QCOMPARE(transferRequest, copyRequest2);
-
- }
-}
-
-QTEST_MAIN(tst_QBluetoothTransferRequest)
-
-#include "tst_qbluetoothtransferrequest.moc"
diff --git a/tests/auto/qbluetoothuuid/CMakeLists.txt b/tests/auto/qbluetoothuuid/CMakeLists.txt
new file mode 100644
index 00000000..de981305
--- /dev/null
+++ b/tests/auto/qbluetoothuuid/CMakeLists.txt
@@ -0,0 +1,20 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qbluetoothuuid Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qbluetoothuuid LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qbluetoothuuid
+ SOURCES
+ tst_qbluetoothuuid.cpp
+ LIBRARIES
+ Qt::Bluetooth
+ Qt::CorePrivate
+)
diff --git a/tests/auto/qbluetoothuuid/qbluetoothuuid.pro b/tests/auto/qbluetoothuuid/qbluetoothuuid.pro
deleted file mode 100644
index 2d81c4af..00000000
--- a/tests/auto/qbluetoothuuid/qbluetoothuuid.pro
+++ /dev/null
@@ -1,5 +0,0 @@
-SOURCES += tst_qbluetoothuuid.cpp
-TARGET = tst_qbluetoothuuid
-CONFIG += testcase
-
-QT = core concurrent bluetooth testlib
diff --git a/tests/auto/qbluetoothuuid/tst_qbluetoothuuid.cpp b/tests/auto/qbluetoothuuid/tst_qbluetoothuuid.cpp
index 2206826d..377f788a 100644
--- a/tests/auto/qbluetoothuuid/tst_qbluetoothuuid.cpp
+++ b/tests/auto/qbluetoothuuid/tst_qbluetoothuuid.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QUuid>
@@ -33,6 +8,10 @@
#include <qbluetoothuuid.h>
+#if defined(Q_OS_DARWIN)
+#include <QtCore/private/qcore_mac_p.h>
+#endif
+
#if defined(Q_OS_UNIX)
# include <arpa/inet.h>
# include <netinet/in.h>
@@ -40,8 +19,6 @@
QT_USE_NAMESPACE
-Q_DECLARE_METATYPE(quint128)
-
class tst_QBluetoothUuid : public QObject
{
Q_OBJECT
@@ -59,12 +36,10 @@ private slots:
void tst_conversion();
void tst_comparison_data();
void tst_comparison();
- void tst_quint128ToUuid();
};
tst_QBluetoothUuid::tst_QBluetoothUuid()
{
- qRegisterMetaType<quint128>();
}
tst_QBluetoothUuid::~tst_QBluetoothUuid()
@@ -84,7 +59,7 @@ void tst_QBluetoothUuid::tst_construction()
}
{
- QBluetoothUuid uuid(QBluetoothUuid::PublicBrowseGroup);
+ QBluetoothUuid uuid(QBluetoothUuid::ServiceClassUuid::PublicBrowseGroup);
QVERIFY(!uuid.isNull());
@@ -94,11 +69,11 @@ void tst_QBluetoothUuid::tst_construction()
uuid16 = uuid.toUInt16(&ok);
QVERIFY(ok);
- QCOMPARE(uuid16, static_cast<quint16>(QBluetoothUuid::PublicBrowseGroup));
+ QCOMPARE(uuid16, static_cast<quint16>(QBluetoothUuid::ServiceClassUuid::PublicBrowseGroup));
}
{
- QBluetoothUuid uuid(QBluetoothUuid::PublicBrowseGroup);
+ QBluetoothUuid uuid(QBluetoothUuid::ServiceClassUuid::PublicBrowseGroup);
QBluetoothUuid copy(uuid);
@@ -106,7 +81,7 @@ void tst_QBluetoothUuid::tst_construction()
}
{
- QBluetoothUuid uuid(QBluetoothUuid::L2cap);
+ QBluetoothUuid uuid(QBluetoothUuid::ProtocolUuid::L2cap);
QVERIFY(!uuid.isNull());
@@ -116,7 +91,7 @@ void tst_QBluetoothUuid::tst_construction()
uuid16 = uuid.toUInt16(&ok);
QVERIFY(ok);
- QCOMPARE(uuid16, static_cast<quint16>(QBluetoothUuid::L2cap));
+ QCOMPARE(uuid16, static_cast<quint16>(QBluetoothUuid::ProtocolUuid::L2cap));
}
{
@@ -146,7 +121,7 @@ void tst_QBluetoothUuid::tst_construction()
void tst_QBluetoothUuid::tst_assignment()
{
- QBluetoothUuid uuid(QBluetoothUuid::PublicBrowseGroup);
+ QBluetoothUuid uuid(QBluetoothUuid::ServiceClassUuid::PublicBrowseGroup);
{
QBluetoothUuid copy = uuid;
@@ -173,42 +148,6 @@ void tst_QBluetoothUuid::tst_assignment()
#define BASEUUID "-0000-1000-8000-00805F9B34FB"
-#define UUID128_32(x, a, b, c, d) \
- quint128 x = { \
- { \
- a, b, c, d, \
- 0x00, 0x00, \
- 0x10, 0x00, \
- 0x80, 0x00, \
- 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB \
- } \
- }
-
-#define UUID128_16(x, a, b) UUID128_32(x, 0, 0, a, b)
-
-#define NEWROW16(text, a, b, s) \
-do { \
- UUID128_16(uuid128, a, b); \
- quint32 uuid32 = a << 8 | b; \
- quint16 uuid16 = a << 8 | b; \
- QTest::newRow(text) << true << uuid16 << true << uuid32 << true << uuid128 \
- << (QLatin1Char('{') + QLatin1String(s) + QLatin1Char('}')); \
-} while (0)
-
-#define NEWROW32(text, a, b, c, d, s) \
-do { \
- UUID128_32(uuid128, a, b, c, d); \
- quint32 uuid32 = a << 24 | b << 16 | c << 8 | d; \
- quint16 uuid16; \
- bool constructUuid16 = (a == 0) && (b == 0); \
- if (constructUuid16) \
- uuid16 = c << 8 | d; \
- else \
- uuid16 = 0; \
- QTest::newRow(text) << constructUuid16 << uuid16 << true << uuid32 << true << uuid128 \
- << (QLatin1Char('{') + QLatin1String(s) + QLatin1Char('}')); \
-} while (0)
-
void tst_QBluetoothUuid::tst_conversion_data()
{
QTest::addColumn<bool>("constructUuid16");
@@ -216,19 +155,53 @@ void tst_QBluetoothUuid::tst_conversion_data()
QTest::addColumn<bool>("constructUuid32");
QTest::addColumn<quint32>("uuid32");
QTest::addColumn<bool>("constructUuid128");
- QTest::addColumn<quint128>("uuid128");
+ QTest::addColumn<QUuid::Id128Bytes>("uuid128");
QTest::addColumn<QString>("uuidS");
- NEWROW32("base uuid", 0x00, 0x00, 0x00, 0x00, "00000000" BASEUUID);
- NEWROW16("0x0001", 0x00, 0x01, "00000001" BASEUUID);
- NEWROW16("0xffff", 0xff, 0xff, "0000FFFF" BASEUUID);
- NEWROW32("0x00010000", 0x00, 0x01, 0x00, 0x00, "00010000" BASEUUID);
- NEWROW32("0x0001ffff", 0x00, 0x01, 0xff, 0xff, "0001FFFF" BASEUUID);
- NEWROW32("0xffff0000", 0xff, 0xff, 0x00, 0x00, "FFFF0000" BASEUUID);
- NEWROW32("0xffffffff", 0xff, 0xff, 0xff, 0xff, "FFFFFFFF" BASEUUID);
+ static const auto uuid128_32 = [](quint8 a, quint8 b, quint8 c, quint8 d) {
+ QUuid::Id128Bytes x = {
+ {
+ a, b, c, d,
+ 0x00, 0x00,
+ 0x10, 0x00,
+ 0x80, 0x00,
+ 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB
+ }
+ };
+ return x;
+ };
+
+ auto newRow32 = [](const char *name, quint8 a, quint8 b, quint8 c, quint8 d, const char *s) {
+ auto uuid128 = uuid128_32(a, b, c, d);
+ quint32 uuid32 = a << 24 | b << 16 | c << 8 | d;
+ quint16 uuid16; \
+ bool constructUuid16 = (a == 0) && (b == 0);
+ if (constructUuid16)
+ uuid16 = c << 8 | d;
+ else
+ uuid16 = 0;
+ QTest::newRow(name) << constructUuid16 << uuid16 << true << uuid32 << true << uuid128
+ << (QLatin1Char('{') + QLatin1String(s) + QLatin1Char('}'));
+ };
+
+ auto newRow16 = [](const char *name, quint8 a, quint8 b, const char *s) {
+ auto uuid128 = uuid128_32(0, 0, a, b);
+ quint32 uuid32 = a << 8 | b;
+ quint16 uuid16 = a << 8 | b;
+ QTest::newRow(name) << true << uuid16 << true << uuid32 << true << uuid128
+ << (QLatin1Char('{') + QLatin1String(s) + QLatin1Char('}'));
+ };
+
+ newRow32("base uuid", 0x00, 0x00, 0x00, 0x00, "00000000" BASEUUID);
+ newRow16("0x0001", 0x00, 0x01, "00000001" BASEUUID);
+ newRow16("0xffff", 0xff, 0xff, "0000FFFF" BASEUUID);
+ newRow32("0x00010000", 0x00, 0x01, 0x00, 0x00, "00010000" BASEUUID);
+ newRow32("0x0001ffff", 0x00, 0x01, 0xff, 0xff, "0001FFFF" BASEUUID);
+ newRow32("0xffff0000", 0xff, 0xff, 0x00, 0x00, "FFFF0000" BASEUUID);
+ newRow32("0xffffffff", 0xff, 0xff, 0xff, 0xff, "FFFFFFFF" BASEUUID);
{
- quint128 uuid128 = {
+ QUuid::Id128Bytes uuid128 = {
{
0x00, 0x11, 0x22, 0x33,
0x44, 0x55,
@@ -251,7 +224,7 @@ void tst_QBluetoothUuid::tst_conversion()
QFETCH(bool, constructUuid32);
QFETCH(quint32, uuid32);
QFETCH(bool, constructUuid128);
- QFETCH(quint128, uuid128);
+ QFETCH(QUuid::Id128Bytes, uuid128);
QFETCH(QString, uuidS);
int minimumSize = 16;
@@ -260,9 +233,21 @@ void tst_QBluetoothUuid::tst_conversion()
else if (constructUuid32)
minimumSize = 4;
+#if defined(Q_OS_DARWIN)
+#define CHECK_PLATFORM_CONVERSION(qtUuid) \
+ const QMacAutoReleasePool pool; \
+ CBUUID *nativeUuid = qtUuid.toCBUUID(); \
+ QVERIFY(nativeUuid); \
+ QCOMPARE(qtUuid, QBluetoothUuid::fromCBUUID(nativeUuid));
+#else
+#define CHECK_PLATFORM_CONVERSION(qtUuid)
+#endif // Q_OS_DARWIN
+
if (constructUuid16) {
QBluetoothUuid uuid(uuid16);
+ QCOMPARE(uuid, QBluetoothUuid(QStringView{uuidS}));
+
bool ok;
QCOMPARE(uuid.toUInt16(&ok), uuid16);
@@ -271,16 +256,20 @@ void tst_QBluetoothUuid::tst_conversion()
QCOMPARE(uuid.toUInt32(&ok), uuid32);
QVERIFY(ok);
- QVERIFY(memcmp(uuid.toUInt128().data, uuid128.data, 16) == 0);
+ QVERIFY(memcmp(uuid.toBytes().data, uuid128.data, 16) == 0);
QCOMPARE(uuid.toString().toUpper(), uuidS.toUpper());
QCOMPARE(uuid.minimumSize(), minimumSize);
+
+ CHECK_PLATFORM_CONVERSION(uuid)
}
if (constructUuid32) {
QBluetoothUuid uuid(uuid32);
+ QCOMPARE(uuid, QBluetoothUuid(QLatin1StringView{uuidS.toLatin1()}));
+
bool ok;
quint16 tmp = uuid.toUInt16(&ok);
@@ -292,16 +281,20 @@ void tst_QBluetoothUuid::tst_conversion()
QCOMPARE(uuid.toUInt32(&ok), uuid32);
QVERIFY(ok);
- QVERIFY(memcmp(uuid.toUInt128().data, uuid128.data, 16) == 0);
+ QVERIFY(memcmp(uuid.toBytes().data, uuid128.data, 16) == 0);
QCOMPARE(uuid.toString().toUpper(), uuidS.toUpper());
QCOMPARE(uuid.minimumSize(), minimumSize);
+
+ CHECK_PLATFORM_CONVERSION(uuid)
}
if (constructUuid128) {
QBluetoothUuid uuid(uuid128);
+ QCOMPARE(uuid, QBluetoothUuid(QUtf8StringView{uuidS.toUtf8()}));
+
bool ok;
quint16 tmpUuid16 = uuid.toUInt16(&ok);
@@ -314,12 +307,15 @@ void tst_QBluetoothUuid::tst_conversion()
if (ok)
QCOMPARE(tmpUuid32, uuid32);
- QVERIFY(memcmp(uuid.toUInt128().data, uuid128.data, 16) == 0);
+ QVERIFY(memcmp(uuid.toBytes().data, uuid128.data, 16) == 0);
QCOMPARE(uuid.toString().toUpper(), uuidS.toUpper());
QCOMPARE(uuid.minimumSize(), minimumSize);
+
+ CHECK_PLATFORM_CONVERSION(uuid)
}
+#undef CHECK_PLATFORM_CONVERSION
}
void tst_QBluetoothUuid::tst_comparison_data()
@@ -334,7 +330,7 @@ void tst_QBluetoothUuid::tst_comparison()
QFETCH(bool, constructUuid32);
QFETCH(quint32, uuid32);
QFETCH(bool, constructUuid128);
- QFETCH(quint128, uuid128);
+ QFETCH(QUuid::Id128Bytes, uuid128);
QVERIFY(QBluetoothUuid() == QBluetoothUuid());
@@ -367,22 +363,28 @@ void tst_QBluetoothUuid::tst_comparison()
QBluetoothUuid quuid128(uuid128);
for (int var = 0; var < 16; ++var) {
- QVERIFY(quuid128.toUInt128().data[var] == uuid128.data[var]);
+ QVERIFY(quuid128.toBytes().data[var] == uuid128.data[var]);
}
- }
-}
-void tst_QBluetoothUuid::tst_quint128ToUuid()
-{
- QBluetoothUuid temp(QString("{67C8770B-44F1-410A-AB9A-F9B5446F13EE}"));
- quint128 array = temp.toUInt128();
- QBluetoothUuid u(array);
- QVERIFY(temp == u);
-
- QBENCHMARK {
- QBluetoothUuid u(array);
+ // check that toUInt128() call returns the value in the same format as
+ // QUuid::Id128Bytes, no matter what version we use (it can be
+ // QUuid::toUint128() on platforms that define __SIZEOF_INT128__ or
+ // QBluetoothUuid::toUint128() on other platforms).
+ const quint128 i128 = quuid128.toUInt128();
+ static_assert(sizeof(i128) == 16); // uint128 or QUuid::Id128Bytes
+ uchar dst[16];
+ memcpy(dst, &i128, sizeof(i128));
+ for (int var = 0; var < 16; ++var)
+ QCOMPARE_EQ(dst[var], uuid128.data[var]);
+
+ // check that we always have a c-tor taking quint128
+ QBluetoothUuid other{i128};
+ const auto bytes = other.toBytes();
+ for (int var = 0; var < 16; ++var)
+ QCOMPARE_EQ(bytes.data[var], uuid128.data[var]);
}
}
+
QTEST_MAIN(tst_QBluetoothUuid)
#include "tst_qbluetoothuuid.moc"
diff --git a/tests/auto/qlowenergycharacteristic/CMakeLists.txt b/tests/auto/qlowenergycharacteristic/CMakeLists.txt
new file mode 100644
index 00000000..7089c5cf
--- /dev/null
+++ b/tests/auto/qlowenergycharacteristic/CMakeLists.txt
@@ -0,0 +1,31 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qlowenergycharacteristic Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qlowenergycharacteristic LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qlowenergycharacteristic
+ SOURCES
+ tst_qlowenergycharacteristic.cpp
+ LIBRARIES
+ Qt::Bluetooth
+)
+
+set_target_properties(tst_qlowenergycharacteristic PROPERTIES
+ MACOSX_BUNDLE TRUE
+)
+
+if (APPLE AND NOT IOS)
+ # Ninja has trouble with relative paths, convert to absolute as a workaround
+ get_filename_component(SHARED_PLIST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../shared ABSOLUTE)
+ set_target_properties(tst_qlowenergycharacteristic PROPERTIES
+ MACOSX_BUNDLE_INFO_PLIST "${SHARED_PLIST_DIR}/Info.macos.plist"
+ )
+endif()
diff --git a/tests/auto/qlowenergycharacteristic/qlowenergycharacteristic.pro b/tests/auto/qlowenergycharacteristic/qlowenergycharacteristic.pro
deleted file mode 100644
index 24106573..00000000
--- a/tests/auto/qlowenergycharacteristic/qlowenergycharacteristic.pro
+++ /dev/null
@@ -1,7 +0,0 @@
-SOURCES += tst_qlowenergycharacteristic.cpp
-TARGET = tst_qlowenergycharacteristic
-CONFIG += testcase
-
-QT = core bluetooth testlib
-
-
diff --git a/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp b/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp
index 7e191052..ea87d105 100644
--- a/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp
+++ b/tests/auto/qlowenergycharacteristic/tst_qlowenergycharacteristic.cpp
@@ -1,31 +1,6 @@
-/***************************************************************************
-**
-** Copyright (C) 2016 BlackBerry Limited all rights reserved
-** 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 BlackBerry Limited all rights reserved
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QUuid>
@@ -86,22 +61,32 @@ tst_QLowEnergyCharacteristic::~tst_QLowEnergyCharacteristic()
void tst_QLowEnergyCharacteristic::initTestCase()
{
+#if defined(Q_OS_MACOS)
+ QSKIP("The low energy characteristic tests fail on macOS");
+#endif
if (QBluetoothLocalDevice::allDevices().isEmpty()) {
- qWarning("No remote device discovered.");
+ qWarning("No local adapter, not discovering remote devices");
return;
}
- // start Bluetooth if not started
QBluetoothLocalDevice device;
- device.powerOn();
+ if (device.hostMode() == QBluetoothLocalDevice::HostPoweredOff) {
+ // Attempt to switch Bluetooth ON
+ device.powerOn();
+ QTest::qWait(1000);
+ if (device.hostMode() == QBluetoothLocalDevice::HostPoweredOff) {
+ qWarning("Bluetooth couldn't be switched ON, not discovering remote devices");
+ return;
+ }
+ }
- // find an arbitrary low energy device in vincinity
+ // find an arbitrary low energy device in vicinity
// find an arbitrary service with characteristic
QBluetoothDeviceDiscoveryAgent *devAgent = new QBluetoothDeviceDiscoveryAgent(this);
connect(devAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
this, SLOT(deviceDiscovered(QBluetoothDeviceInfo)));
- QSignalSpy errorSpy(devAgent, SIGNAL(error(QBluetoothDeviceDiscoveryAgent::Error)));
+ QSignalSpy errorSpy(devAgent, SIGNAL(errorOccurred(QBluetoothDeviceDiscoveryAgent::Error)));
QVERIFY(errorSpy.isValid());
QVERIFY(errorSpy.isEmpty());
@@ -110,17 +95,17 @@ void tst_QLowEnergyCharacteristic::initTestCase()
QVERIFY(spy.isEmpty());
devAgent->start();
- QTRY_VERIFY_WITH_TIMEOUT(spy.count() > 0, 50000);
+ QTRY_VERIFY_WITH_TIMEOUT(!spy.isEmpty(), 100000);
// find first service with descriptor
QLowEnergyController *controller = 0;
- for (const QBluetoothDeviceInfo &remoteDevice : qAsConst(remoteLeDevices)) {
+ for (const QBluetoothDeviceInfo &remoteDevice : std::as_const(remoteLeDevices)) {
controller = QLowEnergyController::createCentral(remoteDevice, this);
qDebug() << "Connecting to" << remoteDevice.name()
<< remoteDevice.address() << remoteDevice.deviceUuid();
controller->connectToDevice();
QTRY_IMPL(controller->state() != QLowEnergyController::ConnectingState,
- 20000);
+ 50000);
if (controller->state() != QLowEnergyController::ConnectedState) {
// any error and we skip
delete controller;
@@ -131,8 +116,8 @@ void tst_QLowEnergyCharacteristic::initTestCase()
QSignalSpy discoveryFinishedSpy(controller, SIGNAL(discoveryFinished()));
QSignalSpy stateSpy(controller, SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
controller->discoverServices();
- QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 10000);
- QCOMPARE(stateSpy.count(), 2);
+ QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.size() == 1, 10000);
+ QCOMPARE(stateSpy.size(), 2);
QCOMPARE(stateSpy.at(0).at(0).value<QLowEnergyController::ControllerState>(),
QLowEnergyController::DiscoveringState);
QCOMPARE(stateSpy.at(1).at(0).value<QLowEnergyController::ControllerState>(),
@@ -146,7 +131,7 @@ void tst_QLowEnergyCharacteristic::initTestCase()
leService->discoverDetails();
QTRY_VERIFY_WITH_TIMEOUT(
- leService->state() == QLowEnergyService::ServiceDiscovered, 10000);
+ leService->state() == QLowEnergyService::RemoteServiceDiscovered, 10000);
const QList<QLowEnergyCharacteristic> chars = leService->characteristics();
for (const QLowEnergyCharacteristic &ch : chars) {
@@ -195,14 +180,13 @@ void tst_QLowEnergyCharacteristic::tst_constructionDefault()
QVERIFY(!characteristic.isValid());
QCOMPARE(characteristic.value(), QByteArray());
QVERIFY(characteristic.uuid().isNull());
- QVERIFY(characteristic.handle() == 0);
QCOMPARE(characteristic.name(), QString());
- QCOMPARE(characteristic.descriptors().count(), 0);
+ QCOMPARE(characteristic.descriptors().size(), 0);
QCOMPARE(characteristic.descriptor(QBluetoothUuid()),
QLowEnergyDescriptor());
- QCOMPARE(characteristic.descriptor(QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration)),
+ QCOMPARE(characteristic.descriptor(QBluetoothUuid(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration)),
QLowEnergyDescriptor());
- QCOMPARE(characteristic.descriptor(QBluetoothUuid::ClientCharacteristicConfiguration),
+ QCOMPARE(characteristic.descriptor(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration),
QLowEnergyDescriptor());
QCOMPARE(characteristic.properties(), QLowEnergyCharacteristic::Unknown);
@@ -210,9 +194,8 @@ void tst_QLowEnergyCharacteristic::tst_constructionDefault()
QVERIFY(!copyConstructed.isValid());
QCOMPARE(copyConstructed.value(), QByteArray());
QVERIFY(copyConstructed.uuid().isNull());
- QVERIFY(copyConstructed.handle() == 0);
QCOMPARE(copyConstructed.name(), QString());
- QCOMPARE(copyConstructed.descriptors().count(), 0);
+ QCOMPARE(copyConstructed.descriptors().size(), 0);
QCOMPARE(copyConstructed.properties(), QLowEnergyCharacteristic::Unknown);
QVERIFY(copyConstructed == characteristic);
@@ -231,9 +214,8 @@ void tst_QLowEnergyCharacteristic::tst_constructionDefault()
QVERIFY(!assigned.isValid());
QCOMPARE(assigned.value(), QByteArray());
QVERIFY(assigned.uuid().isNull());
- QVERIFY(assigned.handle() == 0);
QCOMPARE(assigned.name(), QString());
- QCOMPARE(assigned.descriptors().count(), 0);
+ QCOMPARE(assigned.descriptors().size(), 0);
QCOMPARE(assigned.properties(), QLowEnergyCharacteristic::Unknown);
QVERIFY(assigned == characteristic);
@@ -251,20 +233,19 @@ void tst_QLowEnergyCharacteristic::tst_assignCompare()
QVERIFY(!target.isValid());
QCOMPARE(target.value(), QByteArray());
QVERIFY(target.uuid().isNull());
- QVERIFY(target.handle() == 0);
QCOMPARE(target.name(), QString());
- QCOMPARE(target.descriptors().count(), 0);
+ QCOMPARE(target.descriptors().size(), 0);
QCOMPARE(target.properties(), QLowEnergyCharacteristic::Unknown);
- int indexWithDescriptor = -1;
+ qsizetype indexWithDescriptor = -1;
const QList<QLowEnergyCharacteristic> chars = globalService->characteristics();
QVERIFY(!chars.isEmpty());
- for (int i = 0; i < chars.count(); i++) {
+ for (qsizetype i = 0; i < chars.size(); ++i) {
const QLowEnergyCharacteristic specific =
globalService->characteristic(chars[i].uuid());
QVERIFY(specific.isValid());
QCOMPARE(specific, chars[i]);
- if (chars[i].descriptors().count() > 0) {
+ if (!chars[i].descriptors().isEmpty()) {
indexWithDescriptor = i;
break;
}
@@ -281,13 +262,12 @@ void tst_QLowEnergyCharacteristic::tst_assignCompare()
target = chars[indexWithDescriptor];
QVERIFY(target.isValid());
QVERIFY(!target.name().isEmpty());
- HANDLE_VERIFY(target.handle() > 0);
QVERIFY(!target.uuid().isNull());
QVERIFY(target.properties() != QLowEnergyCharacteristic::Unknown);
if (target.properties() & QLowEnergyCharacteristic::Read)
QVERIFY(!target.value().isEmpty());
if (!noDescriptors)
- QVERIFY(target.descriptors().count() > 0);
+ QVERIFY(!target.descriptors().isEmpty());
QVERIFY(target == chars[indexWithDescriptor]);
QVERIFY(chars[indexWithDescriptor] == target);
@@ -296,35 +276,35 @@ void tst_QLowEnergyCharacteristic::tst_assignCompare()
QCOMPARE(target.isValid(), chars[indexWithDescriptor].isValid());
QCOMPARE(target.name(), chars[indexWithDescriptor].name());
- QCOMPARE(target.handle(), chars[indexWithDescriptor].handle());
QCOMPARE(target.uuid(), chars[indexWithDescriptor].uuid());
QCOMPARE(target.value(), chars[indexWithDescriptor].value());
QCOMPARE(target.properties(), chars[indexWithDescriptor].properties());
- QCOMPARE(target.descriptors().count(),
- chars[indexWithDescriptor].descriptors().count());
- for (int i = 0; i < target.descriptors().count(); i++) {
- const QLowEnergyDescriptor ref = chars[indexWithDescriptor].descriptors()[i];
- QCOMPARE(target.descriptors()[i].name(), ref.name());
- QCOMPARE(target.descriptors()[i].isValid(), ref.isValid());
- QCOMPARE(target.descriptors()[i].type(), ref.type());
- QCOMPARE(target.descriptors()[i].handle(), ref.handle());
- QCOMPARE(target.descriptors()[i].uuid(), ref.uuid());
- QCOMPARE(target.descriptors()[i].value(), ref.value());
-
- const QLowEnergyDescriptor ref2 = chars[indexWithDescriptor].descriptor(ref.uuid());
- QCOMPARE(ref, ref2);
+ {
+ const auto targetDescriptors = target.descriptors();
+ const auto referenceDescriptors = chars[indexWithDescriptor].descriptors();
+ QCOMPARE(targetDescriptors.size(), referenceDescriptors.size());
+ for (qsizetype i = 0; i < targetDescriptors.size(); ++i) {
+ const QLowEnergyDescriptor ref = referenceDescriptors[i];
+ QCOMPARE(targetDescriptors[i].name(), ref.name());
+ QCOMPARE(targetDescriptors[i].isValid(), ref.isValid());
+ QCOMPARE(targetDescriptors[i].type(), ref.type());
+ QCOMPARE(targetDescriptors[i].uuid(), ref.uuid());
+ QCOMPARE(targetDescriptors[i].value(), ref.value());
+
+ const QLowEnergyDescriptor ref2 = chars[indexWithDescriptor].descriptor(ref.uuid());
+ QCOMPARE(ref, ref2);
+ }
}
// test copy constructor
QLowEnergyCharacteristic copyConstructed(target);
QCOMPARE(copyConstructed.isValid(), chars[indexWithDescriptor].isValid());
QCOMPARE(copyConstructed.name(), chars[indexWithDescriptor].name());
- QCOMPARE(copyConstructed.handle(), chars[indexWithDescriptor].handle());
QCOMPARE(copyConstructed.uuid(), chars[indexWithDescriptor].uuid());
QCOMPARE(copyConstructed.value(), chars[indexWithDescriptor].value());
QCOMPARE(copyConstructed.properties(), chars[indexWithDescriptor].properties());
- QCOMPARE(copyConstructed.descriptors().count(),
- chars[indexWithDescriptor].descriptors().count());
+ QCOMPARE(copyConstructed.descriptors().size(),
+ chars[indexWithDescriptor].descriptors().size());
QVERIFY(copyConstructed == target);
QVERIFY(target == copyConstructed);
@@ -337,9 +317,8 @@ void tst_QLowEnergyCharacteristic::tst_assignCompare()
QVERIFY(!target.isValid());
QCOMPARE(target.value(), QByteArray());
QVERIFY(target.uuid().isNull());
- QVERIFY(target.handle() == 0);
QCOMPARE(target.name(), QString());
- QCOMPARE(target.descriptors().count(), 0);
+ QCOMPARE(target.descriptors().size(), 0);
QCOMPARE(target.properties(), QLowEnergyCharacteristic::Unknown);
QVERIFY(invalid == target);
@@ -352,7 +331,7 @@ void tst_QLowEnergyCharacteristic::tst_assignCompare()
QVERIFY(chars[indexWithDescriptor] != target);
QVERIFY(target != chars[indexWithDescriptor]);
- if (chars.count() >= 2) {
+ if (chars.size() >= 2) {
// at least two characteristics
QVERIFY(!(chars[0] == chars[1]));
QVERIFY(!(chars[1] == chars[0]));
diff --git a/tests/auto/qlowenergycontroller-gattserver/CMakeLists.txt b/tests/auto/qlowenergycontroller-gattserver/CMakeLists.txt
new file mode 100644
index 00000000..5659ea8c
--- /dev/null
+++ b/tests/auto/qlowenergycontroller-gattserver/CMakeLists.txt
@@ -0,0 +1,2 @@
+add_subdirectory(server)
+add_subdirectory(test)
diff --git a/tests/auto/qlowenergycontroller-gattserver/qlowenergycontroller-gattserver.pro b/tests/auto/qlowenergycontroller-gattserver/qlowenergycontroller-gattserver.pro
deleted file mode 100644
index 8b6c52e7..00000000
--- a/tests/auto/qlowenergycontroller-gattserver/qlowenergycontroller-gattserver.pro
+++ /dev/null
@@ -1,2 +0,0 @@
-TEMPLATE = subdirs
-SUBDIRS = server test
diff --git a/tests/auto/qlowenergycontroller-gattserver/server/CMakeLists.txt b/tests/auto/qlowenergycontroller-gattserver/server/CMakeLists.txt
new file mode 100644
index 00000000..3dc46724
--- /dev/null
+++ b/tests/auto/qlowenergycontroller-gattserver/server/CMakeLists.txt
@@ -0,0 +1,15 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## server Binary:
+#####################################################################
+
+qt_internal_add_executable(qlecontroller-server
+ GUI
+ OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
+ SOURCES
+ qlowenergycontroller-gattserver.cpp
+ LIBRARIES
+ Qt::Bluetooth
+)
diff --git a/tests/auto/qlowenergycontroller-gattserver/server/qlowenergycontroller-gattserver.cpp b/tests/auto/qlowenergycontroller-gattserver/server/qlowenergycontroller-gattserver.cpp
index 1275aa65..9eda2c0d 100644
--- a/tests/auto/qlowenergycontroller-gattserver/server/qlowenergycontroller-gattserver.cpp
+++ b/tests/auto/qlowenergycontroller-gattserver/server/qlowenergycontroller-gattserver.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtBluetooth/qlowenergyadvertisingdata.h>
#include <QtBluetooth/qlowenergyadvertisingparameters.h>
@@ -36,9 +11,9 @@
#include <QtCore/qcoreapplication.h>
#include <QtCore/qendian.h>
#include <QtCore/qhash.h>
+#include <QtCore/qlist.h>
#include <QtCore/qscopedpointer.h>
#include <QtCore/qsharedpointer.h>
-#include <QtCore/qvector.h>
static QByteArray deviceName() { return "Qt GATT server"; }
@@ -59,14 +34,14 @@ void addService(const QLowEnergyServiceData &serviceData)
void addRunningSpeedService()
{
QLowEnergyServiceData serviceData;
- serviceData.setUuid(QBluetoothUuid::RunningSpeedAndCadence);
+ serviceData.setUuid(QBluetoothUuid::ServiceClassUuid::RunningSpeedAndCadence);
serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary);
QLowEnergyDescriptorData desc;
- desc.setUuid(QBluetoothUuid::ClientCharacteristicConfiguration);
+ desc.setUuid(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
desc.setValue(QByteArray(2, 0)); // Default: No indication, no notification.
QLowEnergyCharacteristicData charData;
- charData.setUuid(QBluetoothUuid::RSCMeasurement);
+ charData.setUuid(QBluetoothUuid::CharacteristicType::RSCMeasurement);
charData.addDescriptor(desc);
charData.setProperties(QLowEnergyCharacteristic::Notify);
QByteArray value(4, 0);
@@ -75,7 +50,7 @@ void addRunningSpeedService()
serviceData.addCharacteristic(charData);
charData = QLowEnergyCharacteristicData();
- charData.setUuid(QBluetoothUuid::RSCFeature);
+ charData.setUuid(QBluetoothUuid::CharacteristicType::RSCFeature);
charData.setProperties(QLowEnergyCharacteristic::Read);
value = QByteArray(2, 0);
qToLittleEndian<quint16>(1 << 2, reinterpret_cast<uchar *>(value.data()));
@@ -87,24 +62,24 @@ void addRunningSpeedService()
void addGenericAccessService()
{
QLowEnergyServiceData serviceData;
- serviceData.setUuid(QBluetoothUuid::GenericAccess);
+ serviceData.setUuid(QBluetoothUuid::ServiceClassUuid::GenericAccess);
serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary);
QLowEnergyCharacteristicData charData;
- charData.setUuid(QBluetoothUuid::DeviceName);
+ charData.setUuid(QBluetoothUuid::CharacteristicType::DeviceName);
charData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Write);
charData.setValue(deviceName());
serviceData.addCharacteristic(charData);
charData = QLowEnergyCharacteristicData();
- charData.setUuid(QBluetoothUuid::Appearance);
+ charData.setUuid(QBluetoothUuid::CharacteristicType::Appearance);
charData.setProperties(QLowEnergyCharacteristic::Read);
QByteArray value(2, 0);
qToLittleEndian<quint16>(128, reinterpret_cast<uchar *>(value.data())); // Generic computer.
charData.setValue(value);
serviceData.addCharacteristic(charData);
- serviceData.addIncludedService(services.value(QBluetoothUuid::RunningSpeedAndCadence).data());
+ serviceData.addIncludedService(services.value(QBluetoothUuid::ServiceClassUuid::RunningSpeedAndCadence).data());
addService(serviceData);
}
@@ -122,14 +97,15 @@ void addCustomService()
charData.setUuid(QBluetoothUuid(quint16(0x5001)));
charData.setProperties(QLowEnergyCharacteristic::Read);
- charData.setReadConstraints(QBluetooth::AttAuthorizationRequired); // To test read failure.
+ charData.setReadConstraints(
+ QBluetooth::AttAccessConstraint::AttAuthorizationRequired); // To test read failure.
serviceData.addCharacteristic(charData);
charData.setValue("something");
charData.setUuid(QBluetoothUuid(quint16(0x5002)));
charData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Indicate);
charData.setReadConstraints(QBluetooth::AttAccessConstraints());
- const QLowEnergyDescriptorData desc(QBluetoothUuid::ClientCharacteristicConfiguration,
+ const QLowEnergyDescriptorData desc(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration,
QByteArray(2, 0));
charData.addDescriptor(desc);
serviceData.addCharacteristic(charData);
diff --git a/tests/auto/qlowenergycontroller-gattserver/server/server.pro b/tests/auto/qlowenergycontroller-gattserver/server/server.pro
deleted file mode 100644
index b9f2ccf9..00000000
--- a/tests/auto/qlowenergycontroller-gattserver/server/server.pro
+++ /dev/null
@@ -1,5 +0,0 @@
-QT = core bluetooth
-
-CONFIG += c++11
-
-SOURCES = qlowenergycontroller-gattserver.cpp
diff --git a/tests/auto/qlowenergycontroller-gattserver/test/CMakeLists.txt b/tests/auto/qlowenergycontroller-gattserver/test/CMakeLists.txt
new file mode 100644
index 00000000..1e01efb2
--- /dev/null
+++ b/tests/auto/qlowenergycontroller-gattserver/test/CMakeLists.txt
@@ -0,0 +1,38 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qlowenergycontroller-gattserver Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qlowenergycontroller-gattserver LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qlowenergycontroller-gattserver
+ SOURCES
+ tst_qlowenergycontroller-gattserver.cpp
+ LIBRARIES
+ Qt::Bluetooth
+ Qt::BluetoothPrivate
+)
+
+## Scopes:
+#####################################################################
+
+qt_internal_extend_target(tst_qlowenergycontroller-gattserver CONDITION QT_FEATURE_linux_crypto_api
+ DEFINES
+ CONFIG_LINUX_CRYPTO_API
+)
+
+qt_internal_extend_target(tst_qlowenergycontroller-gattserver CONDITION QT_FEATURE_bluez_le
+ DEFINES
+ CONFIG_BLUEZ_LE
+)
+
+qt_internal_extend_target(tst_qlowenergycontroller-gattserver CONDITION boot2qt
+ DEFINES
+ CHECK_CMAC_SUPPORT
+)
diff --git a/tests/auto/qlowenergycontroller-gattserver/test/test.pro b/tests/auto/qlowenergycontroller-gattserver/test/test.pro
deleted file mode 100644
index 5f80e660..00000000
--- a/tests/auto/qlowenergycontroller-gattserver/test/test.pro
+++ /dev/null
@@ -1,12 +0,0 @@
-QT = core bluetooth bluetooth-private testlib
-
-TARGET = tst_qlowenergycontroller-gattserver
-CONFIG += testcase c++11
-
-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 f3a0e9a4..bd72611c 100644
--- a/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp
+++ b/tests/auto/qlowenergycontroller-gattserver/test/tst_qlowenergycontroller-gattserver.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtBluetooth/qbluetoothaddress.h>
#include <QtBluetooth/qbluetoothdevicediscoveryagent.h>
@@ -78,7 +53,7 @@ private:
QScopedPointer<QLowEnergyController> m_leController;
#if defined(CHECK_CMAC_SUPPORT)
- bool checkCmacSupport(const quint128& csrkMsb);
+ bool checkCmacSupport(const QUuid::Id128Bytes& csrkMsb);
#endif
};
@@ -151,8 +126,8 @@ void TestQLowEnergyControllerGattServer::advertisingData()
QCOMPARE(data.manufacturerId(), quint16(0xfffd));
QCOMPARE(data.manufacturerData(), QByteArray("some data"));
- const auto services = QList<QBluetoothUuid>() << QBluetoothUuid::CurrentTimeService
- << QBluetoothUuid::DeviceInformation;
+ const auto services = QList<QBluetoothUuid>() << QBluetoothUuid::ServiceClassUuid::CurrentTimeService
+ << QBluetoothUuid::ServiceClassUuid::DeviceInformation;
data.setServices(services);
QCOMPARE(data.services(), services);
@@ -167,7 +142,7 @@ void TestQLowEnergyControllerGattServer::cmacVerifier()
{
#if defined(CONFIG_LINUX_CRYPTO_API) && defined(QT_BUILD_INTERNAL) && defined(CONFIG_BLUEZ_LE)
// Test data comes from spec v4.2, Vol 3, Part H, Appendix D.1
- const quint128 csrk = {
+ const QUuid::Id128Bytes csrk = {
{ 0x3c, 0x4f, 0xcf, 0x09, 0x88, 0x15, 0xf7, 0xab,
0xa6, 0xd2, 0xae, 0x28, 0x16, 0x15, 0x7e, 0x2b }
};
@@ -193,11 +168,11 @@ void TestQLowEnergyControllerGattServer::cmacVerifier()
#include <linux/if_alg.h>
#include <unistd.h>
-bool TestQLowEnergyControllerGattServer::checkCmacSupport(const quint128& csrk)
+bool TestQLowEnergyControllerGattServer::checkCmacSupport(const QUuid::Id128Bytes& csrk)
{
bool retval = false;
#if defined(CONFIG_LINUX_CRYPTO_API) && defined(QT_BUILD_INTERNAL) && defined(CONFIG_BLUEZ_LE)
- quint128 csrkMsb;
+ QUuid::Id128Bytes csrkMsb;
std::reverse_copy(std::begin(csrk.data), std::end(csrk.data), std::begin(csrkMsb.data));
int testSocket = socket(AF_ALG, SOCK_SEQPACKET, 0);
@@ -212,14 +187,14 @@ bool TestQLowEnergyControllerGattServer::checkCmacSupport(const quint128& csrk)
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");
+ qWarning("Needed socket options (SOL_ALG) not available");
}
} else {
- QWARN("bind() failed for crypto socket:");
+ qWarning("bind() failed for crypto socket:");
}
close(testSocket);
} else {
- QWARN("Unable to create test socket");
+ qWarning("Unable to create test socket");
}
#endif
return retval;
@@ -286,9 +261,9 @@ void TestQLowEnergyControllerGattServer::advertisedData()
// name is seen on the scanning machine.
// QCOMPARE(m_serverInfo.name(), QString("Qt GATT server"));
- QVERIFY(m_serverInfo.serviceUuids().count() >= 3);
- QVERIFY(m_serverInfo.serviceUuids().contains(QBluetoothUuid::GenericAccess));
- QVERIFY(m_serverInfo.serviceUuids().contains(QBluetoothUuid::RunningSpeedAndCadence));
+ QVERIFY(m_serverInfo.serviceUuids().size() >= 3);
+ QVERIFY(m_serverInfo.serviceUuids().contains(QBluetoothUuid::ServiceClassUuid::GenericAccess));
+ QVERIFY(m_serverInfo.serviceUuids().contains(QBluetoothUuid::ServiceClassUuid::RunningSpeedAndCadence));
QVERIFY(m_serverInfo.serviceUuids().contains(QBluetoothUuid(quint16(0x2000))));
}
@@ -306,64 +281,64 @@ void TestQLowEnergyControllerGattServer::serverCommunication()
spy.reset(new QSignalSpy(m_leController.data(), &QLowEnergyController::discoveryFinished));
QVERIFY(spy->wait(30000));
const QList<QBluetoothUuid> serviceUuids = m_leController->services();
- QCOMPARE(serviceUuids.count(), 4);
- QVERIFY(serviceUuids.contains(QBluetoothUuid::GenericAccess));
- QVERIFY(serviceUuids.contains(QBluetoothUuid::RunningSpeedAndCadence));
+ QCOMPARE(serviceUuids.size(), 4);
+ QVERIFY(serviceUuids.contains(QBluetoothUuid::ServiceClassUuid::GenericAccess));
+ QVERIFY(serviceUuids.contains(QBluetoothUuid::ServiceClassUuid::RunningSpeedAndCadence));
QVERIFY(serviceUuids.contains(QBluetoothUuid(quint16(0x2000))));
QVERIFY(serviceUuids.contains(QBluetoothUuid(QString("c47774c7-f237-4523-8968-e4ae75431daf"))));
const QScopedPointer<QLowEnergyService> genericAccessService(
- m_leController->createServiceObject(QBluetoothUuid::GenericAccess));
+ m_leController->createServiceObject(QBluetoothUuid::ServiceClassUuid::GenericAccess));
QVERIFY(!genericAccessService.isNull());
genericAccessService->discoverDetails();
- while (genericAccessService->state() != QLowEnergyService::ServiceDiscovered) {
+ while (genericAccessService->state() != QLowEnergyService::RemoteServiceDiscovered) {
spy.reset(new QSignalSpy(genericAccessService.data(), &QLowEnergyService::stateChanged));
QVERIFY(spy->wait(3000));
}
- QCOMPARE(genericAccessService->includedServices().count(), 1);
+ QCOMPARE(genericAccessService->includedServices().size(), 1);
QCOMPARE(genericAccessService->includedServices().first(),
- QBluetoothUuid(QBluetoothUuid::RunningSpeedAndCadence));
- QCOMPARE(genericAccessService->characteristics().count(), 2);
+ QBluetoothUuid(QBluetoothUuid::ServiceClassUuid::RunningSpeedAndCadence));
+ QCOMPARE(genericAccessService->characteristics().size(), 2);
const QLowEnergyCharacteristic deviceNameChar
- = genericAccessService->characteristic(QBluetoothUuid::DeviceName);
+ = genericAccessService->characteristic(QBluetoothUuid::CharacteristicType::DeviceName);
QVERIFY(deviceNameChar.isValid());
- QCOMPARE(deviceNameChar.descriptors().count(), 0);
+ QCOMPARE(deviceNameChar.descriptors().size(), 0);
QCOMPARE(deviceNameChar.properties(),
QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Write);
QCOMPARE(deviceNameChar.value().constData(), "Qt GATT server");
const QLowEnergyCharacteristic appearanceChar
- = genericAccessService->characteristic(QBluetoothUuid::Appearance);
+ = genericAccessService->characteristic(QBluetoothUuid::CharacteristicType::Appearance);
QVERIFY(appearanceChar.isValid());
- QCOMPARE(appearanceChar.descriptors().count(), 0);
+ QCOMPARE(appearanceChar.descriptors().size(), 0);
QCOMPARE(appearanceChar.properties(), QLowEnergyCharacteristic::Read);
auto value = qFromLittleEndian<quint16>(reinterpret_cast<const uchar *>(
appearanceChar.value().constData()));
QCOMPARE(value, quint16(128));
const QScopedPointer<QLowEnergyService> runningSpeedService(
- m_leController->createServiceObject(QBluetoothUuid::RunningSpeedAndCadence));
+ m_leController->createServiceObject(QBluetoothUuid::ServiceClassUuid::RunningSpeedAndCadence));
QVERIFY(!runningSpeedService.isNull());
runningSpeedService->discoverDetails();
- while (runningSpeedService->state() != QLowEnergyService::ServiceDiscovered) {
+ while (runningSpeedService->state() != QLowEnergyService::RemoteServiceDiscovered) {
spy.reset(new QSignalSpy(runningSpeedService.data(), &QLowEnergyService::stateChanged));
QVERIFY(spy->wait(3000));
}
- QCOMPARE(runningSpeedService->includedServices().count(), 0);
- QCOMPARE(runningSpeedService->characteristics().count(), 2);
+ QCOMPARE(runningSpeedService->includedServices().size(), 0);
+ QCOMPARE(runningSpeedService->characteristics().size(), 2);
QLowEnergyCharacteristic measurementChar
- = runningSpeedService->characteristic(QBluetoothUuid::RSCMeasurement);
+ = runningSpeedService->characteristic(QBluetoothUuid::CharacteristicType::RSCMeasurement);
QVERIFY(measurementChar.isValid());
- QCOMPARE(measurementChar.descriptors().count(), 1);
+ QCOMPARE(measurementChar.descriptors().size(), 1);
const QLowEnergyDescriptor clientConfigDesc
- = measurementChar.descriptor(QBluetoothUuid::ClientCharacteristicConfiguration);
+ = measurementChar.descriptor(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
QVERIFY(clientConfigDesc.isValid());
QCOMPARE(clientConfigDesc.value(), QByteArray(2, 0));
QCOMPARE(measurementChar.properties(), QLowEnergyCharacteristic::Notify);
QCOMPARE(measurementChar.value(), QByteArray()); // Empty because Read property not set
QLowEnergyCharacteristic featureChar
- = runningSpeedService->characteristic(QBluetoothUuid::RSCFeature);
+ = runningSpeedService->characteristic(QBluetoothUuid::CharacteristicType::RSCFeature);
QVERIFY(featureChar.isValid());
- QCOMPARE(featureChar.descriptors().count(), 0);
+ QCOMPARE(featureChar.descriptors().size(), 0);
QCOMPARE(featureChar.properties(), QLowEnergyCharacteristic::Read);
value = qFromLittleEndian<quint16>(reinterpret_cast<const uchar *>(
featureChar.value().constData()));
@@ -376,39 +351,39 @@ void TestQLowEnergyControllerGattServer::serverCommunication()
m_leController->createServiceObject(serviceUuid128));
QVERIFY(!customService128.isNull());
customService128->discoverDetails();
- while (customService128->state() != QLowEnergyService::ServiceDiscovered) {
+ while (customService128->state() != QLowEnergyService::RemoteServiceDiscovered) {
spy.reset(new QSignalSpy(customService128.data(), &QLowEnergyService::stateChanged));
QVERIFY(spy->wait(5000));
}
QCOMPARE(customService128->serviceUuid(), serviceUuid128);
- QCOMPARE(customService128->includedServices().count(), 0);
- QCOMPARE(customService128->characteristics().count(), 1);
+ QCOMPARE(customService128->includedServices().size(), 0);
+ QCOMPARE(customService128->characteristics().size(), 1);
QLowEnergyCharacteristic customChar128
= customService128->characteristic(charUuid128);
QVERIFY(customChar128.isValid());
- QCOMPARE(customChar128.descriptors().count(), 0);
+ QCOMPARE(customChar128.descriptors().size(), 0);
QCOMPARE(customChar128.value(), QByteArray(15, 'a'));
QScopedPointer<QLowEnergyService> customService(
m_leController->createServiceObject(QBluetoothUuid(quint16(0x2000))));
QVERIFY(!customService.isNull());
customService->discoverDetails();
- while (customService->state() != QLowEnergyService::ServiceDiscovered) {
+ while (customService->state() != QLowEnergyService::RemoteServiceDiscovered) {
spy.reset(new QSignalSpy(customService.data(), &QLowEnergyService::stateChanged));
QVERIFY(spy->wait(5000));
}
- QCOMPARE(customService->includedServices().count(), 0);
- QCOMPARE(customService->characteristics().count(), 5);
+ QCOMPARE(customService->includedServices().size(), 0);
+ QCOMPARE(customService->characteristics().size(), 5);
QLowEnergyCharacteristic customChar
= customService->characteristic(QBluetoothUuid(quint16(0x5000)));
QVERIFY(customChar.isValid());
- QCOMPARE(customChar.descriptors().count(), 0);
+ QCOMPARE(customChar.descriptors().size(), 0);
QCOMPARE(customChar.value(), QByteArray(1024, 'x'));
QLowEnergyCharacteristic customChar2
= customService->characteristic(QBluetoothUuid(quint16(0x5001)));
QVERIFY(customChar2.isValid());
- QCOMPARE(customChar2.descriptors().count(), 0);
+ QCOMPARE(customChar2.descriptors().size(), 0);
QCOMPARE(customChar2.value(), QByteArray()); // Was not readable due to authorization requirement.
QLowEnergyCharacteristic customChar3
@@ -416,9 +391,9 @@ void TestQLowEnergyControllerGattServer::serverCommunication()
QVERIFY(customChar3.isValid());
QCOMPARE(customChar3.properties(),
QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Indicate);
- QCOMPARE(customChar3.descriptors().count(), 1);
+ QCOMPARE(customChar3.descriptors().size(), 1);
QLowEnergyDescriptor cc3ClientConfig
- = customChar3.descriptor(QBluetoothUuid::ClientCharacteristicConfiguration);
+ = customChar3.descriptor(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
QVERIFY(cc3ClientConfig.isValid());
QLowEnergyCharacteristic customChar4
@@ -426,9 +401,9 @@ void TestQLowEnergyControllerGattServer::serverCommunication()
QVERIFY(customChar4.isValid());
QCOMPARE(customChar4.properties(),
QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify);
- QCOMPARE(customChar4.descriptors().count(), 1);
+ QCOMPARE(customChar4.descriptors().size(), 1);
QLowEnergyDescriptor cc4ClientConfig
- = customChar4.descriptor(QBluetoothUuid::ClientCharacteristicConfiguration);
+ = customChar4.descriptor(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
QVERIFY(cc4ClientConfig.isValid());
QLowEnergyCharacteristic customChar5
@@ -436,21 +411,19 @@ void TestQLowEnergyControllerGattServer::serverCommunication()
QVERIFY(customChar5.isValid());
QCOMPARE(customChar5.properties(),
QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::WriteSigned);
- QCOMPARE(customChar5.descriptors().count(), 0);
+ QCOMPARE(customChar5.descriptors().size(), 0);
QCOMPARE(customChar5.value(), QByteArray("initial"));
customService->writeCharacteristic(customChar, "whatever");
- spy.reset(new QSignalSpy(customService.data(), static_cast<void (QLowEnergyService::*)
- (QLowEnergyService::ServiceError)>(&QLowEnergyService::error)));
+ spy.reset(new QSignalSpy(customService.data(), &QLowEnergyService::errorOccurred));
QVERIFY(spy->wait(3000));
QCOMPARE(customService->error(), QLowEnergyService::CharacteristicWriteError);
- spy.reset(new QSignalSpy(customService.data(), static_cast<void (QLowEnergyService::*)
- (QLowEnergyService::ServiceError)>(&QLowEnergyService::error)));
+ spy.reset(new QSignalSpy(customService.data(), &QLowEnergyService::errorOccurred));
customService->writeCharacteristic(customChar5, "1", QLowEnergyService::WriteSigned);
// error might happen immediately or once event loop comes back
- bool wasError = ((spy->count() > 0) || spy->wait(3000)); //
+ bool wasError = (!spy->isEmpty() || spy->wait(3000)); //
if (!wasError) {
// Signed write is done twice to test the sign counter stuff.
@@ -484,7 +457,7 @@ void TestQLowEnergyControllerGattServer::serverCommunication()
spy.reset(new QSignalSpy(customService.data(), &QLowEnergyService::characteristicChanged));
QVERIFY(spy->wait(3000));
- if (spy->count() == 1)
+ if (spy->size() == 1)
QVERIFY(spy->wait(3000));
QCOMPARE(customChar3.value().constData(), "indicated");
QCOMPARE(customChar4.value().constData(), "notified");
@@ -516,7 +489,7 @@ void TestQLowEnergyControllerGattServer::serverCommunication()
customService.reset(m_leController->createServiceObject(QBluetoothUuid(quint16(0x2000))));
QVERIFY(!customService.isNull());
customService->discoverDetails();
- while (customService->state() != QLowEnergyService::ServiceDiscovered) {
+ while (customService->state() != QLowEnergyService::RemoteServiceDiscovered) {
spy.reset(new QSignalSpy(customService.data(), &QLowEnergyService::stateChanged));
QVERIFY(spy->wait(5000));
}
@@ -526,9 +499,9 @@ void TestQLowEnergyControllerGattServer::serverCommunication()
customChar4 = customService->characteristic(QBluetoothUuid(quint16(0x5003)));
QVERIFY(customChar4.isValid());
QCOMPARE(customChar4.value().constData(), "notified2");
- cc3ClientConfig = customChar3.descriptor(QBluetoothUuid::ClientCharacteristicConfiguration);
+ cc3ClientConfig = customChar3.descriptor(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
QVERIFY(cc3ClientConfig.isValid());
- cc4ClientConfig = customChar4.descriptor(QBluetoothUuid::ClientCharacteristicConfiguration);
+ cc4ClientConfig = customChar4.descriptor(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
QVERIFY(cc4ClientConfig.isValid());
const bool isBonded = QBluetoothLocalDevice().pairingStatus(m_serverAddress)
@@ -565,33 +538,33 @@ void TestQLowEnergyControllerGattServer::serviceData()
QLowEnergyDescriptorData descData;
QVERIFY(!descData.isValid());
- descData.setUuid(QBluetoothUuid::ValidRange);
- QCOMPARE(descData.uuid(), QBluetoothUuid(QBluetoothUuid::ValidRange));
+ descData.setUuid(QBluetoothUuid::DescriptorType::ValidRange);
+ QCOMPARE(descData.uuid(), QBluetoothUuid(QBluetoothUuid::DescriptorType::ValidRange));
QVERIFY(descData.isValid());
QVERIFY(descData != QLowEnergyDescriptorData());
descData.setValue("xyz");
QCOMPARE(descData.value().constData(), "xyz");
- descData.setReadPermissions(true, AttAuthenticationRequired);
+ descData.setReadPermissions(true, AttAccessConstraint::AttAuthenticationRequired);
QCOMPARE(descData.isReadable(), true);
- QCOMPARE(descData.readConstraints(), AttAuthenticationRequired);
+ QCOMPARE(descData.readConstraints(), AttAccessConstraint::AttAuthenticationRequired);
descData.setWritePermissions(false);
QCOMPARE(descData.isWritable(), false);
- QLowEnergyDescriptorData descData2(QBluetoothUuid::ReportReference, "abc");
+ QLowEnergyDescriptorData descData2(QBluetoothUuid::DescriptorType::ReportReference, "abc");
QVERIFY(descData2 != QLowEnergyDescriptorData());
QVERIFY(descData2.isValid());
- QCOMPARE(descData2.uuid(), QBluetoothUuid(QBluetoothUuid::ReportReference));
+ QCOMPARE(descData2.uuid(), QBluetoothUuid(QBluetoothUuid::DescriptorType::ReportReference));
QCOMPARE(descData2.value().constData(), "abc");
QLowEnergyCharacteristicData charData;
QVERIFY(!charData.isValid());
- charData.setUuid(QBluetoothUuid::BatteryLevel);
+ charData.setUuid(QBluetoothUuid::CharacteristicType::BatteryLevel);
QVERIFY(charData != QLowEnergyCharacteristicData());
- QCOMPARE(charData.uuid(), QBluetoothUuid(QBluetoothUuid::BatteryLevel));
+ QCOMPARE(charData.uuid(), QBluetoothUuid(QBluetoothUuid::CharacteristicType::BatteryLevel));
QVERIFY(charData.isValid());
charData.setValue("value");
@@ -609,17 +582,20 @@ void TestQLowEnergyControllerGattServer::serviceData()
charData.setProperties(props);
QCOMPARE(charData.properties(), props);
- charData.setReadConstraints(AttEncryptionRequired);
- QCOMPARE(charData.readConstraints(), AttEncryptionRequired);
- charData.setWriteConstraints(AttAuthenticationRequired | AttAuthorizationRequired);
- QCOMPARE(charData.writeConstraints(), AttAuthenticationRequired | AttAuthorizationRequired);
+ charData.setReadConstraints(AttAccessConstraint::AttEncryptionRequired);
+ QCOMPARE(charData.readConstraints(), AttAccessConstraint::AttEncryptionRequired);
+ charData.setWriteConstraints(AttAccessConstraint::AttAuthenticationRequired
+ | AttAccessConstraint::AttAuthorizationRequired);
+ QCOMPARE(charData.writeConstraints(),
+ AttAccessConstraint::AttAuthenticationRequired
+ | AttAccessConstraint::AttAuthorizationRequired);
charData.addDescriptor(descData);
- QCOMPARE(charData.descriptors().count(), 1);
+ QCOMPARE(charData.descriptors().size(), 1);
charData.setDescriptors(QList<QLowEnergyDescriptorData>());
- QCOMPARE(charData.descriptors().count(), 0);
+ QCOMPARE(charData.descriptors().size(), 0);
charData.setDescriptors(QList<QLowEnergyDescriptorData>() << descData << descData2);
- QLowEnergyDescriptorData descData3(QBluetoothUuid::ExternalReportReference, "someval");
+ QLowEnergyDescriptorData descData3(QBluetoothUuid::DescriptorType::ExternalReportReference, "someval");
charData.addDescriptor(descData3);
charData.addDescriptor(QLowEnergyDescriptorData()); // Invalid.
QCOMPARE(charData.descriptors(),
@@ -628,8 +604,8 @@ void TestQLowEnergyControllerGattServer::serviceData()
QLowEnergyServiceData secondaryData;
QVERIFY(!secondaryData.isValid());
- secondaryData.setUuid(QBluetoothUuid::SerialPort);
- QCOMPARE(secondaryData.uuid(), QBluetoothUuid(QBluetoothUuid::SerialPort));
+ secondaryData.setUuid(QBluetoothUuid::ServiceClassUuid::SerialPort);
+ QCOMPARE(secondaryData.uuid(), QBluetoothUuid(QBluetoothUuid::ServiceClassUuid::SerialPort));
QVERIFY(secondaryData.isValid());
QVERIFY(secondaryData != QLowEnergyServiceData());
@@ -637,16 +613,16 @@ void TestQLowEnergyControllerGattServer::serviceData()
QCOMPARE(secondaryData.type(), QLowEnergyServiceData::ServiceTypeSecondary);
secondaryData.addCharacteristic(charData);
- QCOMPARE(secondaryData.characteristics().count(), 1);
+ QCOMPARE(secondaryData.characteristics().size(), 1);
secondaryData.setCharacteristics(QList<QLowEnergyCharacteristicData>());
- QCOMPARE(secondaryData.characteristics().count(), 0);
+ QCOMPARE(secondaryData.characteristics().size(), 0);
secondaryData.setCharacteristics(QList<QLowEnergyCharacteristicData>()
<< charData << QLowEnergyCharacteristicData());
QCOMPARE(secondaryData.characteristics(), QList<QLowEnergyCharacteristicData>() << charData);
QLowEnergyServiceData backupData;
- backupData.setUuid(QBluetoothUuid::SerialPort);
- QCOMPARE(backupData.uuid(), QBluetoothUuid(QBluetoothUuid::SerialPort));
+ backupData.setUuid(QBluetoothUuid::ServiceClassUuid::SerialPort);
+ QCOMPARE(backupData.uuid(), QBluetoothUuid(QBluetoothUuid::ServiceClassUuid::SerialPort));
QVERIFY(backupData.isValid());
QVERIFY(backupData != QLowEnergyServiceData());
@@ -667,10 +643,10 @@ void TestQLowEnergyControllerGattServer::serviceData()
QVERIFY(!secondaryService.isNull());
QCOMPARE(secondaryService->serviceUuid(), secondaryData.uuid());
const QList<QLowEnergyCharacteristic> characteristics = secondaryService->characteristics();
- QCOMPARE(characteristics.count(), 1);
+ QCOMPARE(characteristics.size(), 1);
QCOMPARE(characteristics.first().uuid(), charData.uuid());
const QList<QLowEnergyDescriptor> descriptors = characteristics.first().descriptors();
- QCOMPARE(descriptors.count(), 3);
+ QCOMPARE(descriptors.size(), 3);
const auto inUuids = QSet<QBluetoothUuid>() << descData.uuid() << descData2.uuid()
<< descData3.uuid();
QSet<QBluetoothUuid> outUuids;
@@ -679,13 +655,13 @@ void TestQLowEnergyControllerGattServer::serviceData()
QCOMPARE(inUuids, outUuids);
QLowEnergyServiceData primaryData;
- primaryData.setUuid(QBluetoothUuid::Headset);
+ primaryData.setUuid(QBluetoothUuid::ServiceClassUuid::Headset);
primaryData.addIncludedService(secondaryService.data());
const QScopedPointer<QLowEnergyService> primaryService(controller->addService(primaryData));
QVERIFY(!primaryService.isNull());
- QCOMPARE(primaryService->characteristics().count(), 0);
+ QCOMPARE(primaryService->characteristics().size(), 0);
const QList<QBluetoothUuid> includedServices = primaryService->includedServices();
- QCOMPARE(includedServices.count(), 1);
+ QCOMPARE(includedServices.size(), 1);
QCOMPARE(includedServices.first(), secondaryService->serviceUuid());
}
diff --git a/tests/auto/qlowenergycontroller/CMakeLists.txt b/tests/auto/qlowenergycontroller/CMakeLists.txt
new file mode 100644
index 00000000..f374088e
--- /dev/null
+++ b/tests/auto/qlowenergycontroller/CMakeLists.txt
@@ -0,0 +1,44 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qlowenergycontroller Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qlowenergycontroller LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qlowenergycontroller
+ SOURCES
+ tst_qlowenergycontroller.cpp
+ LIBRARIES
+ Qt::BluetoothPrivate
+)
+
+## Scopes:
+#####################################################################
+
+qt_internal_extend_target(tst_qlowenergycontroller CONDITION ANDROID
+ LIBRARIES
+ Qt::Widgets
+)
+
+qt_internal_extend_target(tst_qlowenergycontroller CONDITION IOS OR MACOS
+ LIBRARIES
+ Qt::Widgets
+)
+
+set_target_properties(tst_qlowenergycontroller PROPERTIES
+ MACOSX_BUNDLE TRUE
+)
+
+if (APPLE AND NOT IOS)
+ # Ninja has trouble with relative paths, convert to absolute as a workaround
+ get_filename_component(SHARED_PLIST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../shared ABSOLUTE)
+ set_target_properties(tst_qlowenergycontroller PROPERTIES
+ MACOSX_BUNDLE_INFO_PLIST "${SHARED_PLIST_DIR}/Info.macos.plist"
+ )
+endif()
diff --git a/tests/auto/qlowenergycontroller/qlowenergycontroller.pro b/tests/auto/qlowenergycontroller/qlowenergycontroller.pro
deleted file mode 100644
index 7a67e8e4..00000000
--- a/tests/auto/qlowenergycontroller/qlowenergycontroller.pro
+++ /dev/null
@@ -1,13 +0,0 @@
-QT = core bluetooth-private testlib
-
-# Android requires GUI application when running test
-android: QT += widgets
-
-TARGET = tst_qlowenergycontroller
-CONFIG += testcase
-
-SOURCES += tst_qlowenergycontroller.cpp
-
-osx|ios {
- QT += widgets
-}
diff --git a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp
index ab393210..18365c94 100644
--- a/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp
+++ b/tests/auto/qlowenergycontroller/tst_qlowenergycontroller.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
@@ -39,6 +14,13 @@
#include <QLowEnergyController>
#include <QLowEnergyCharacteristic>
+#if QT_CONFIG(permissions)
+#include <QCoreApplication>
+#include <QPermissions>
+
+#include <QtCore/qnamespace.h>
+#endif
+
#include <QDebug>
/*!
@@ -53,22 +35,6 @@
QT_USE_NAMESPACE
-// This define must be set if the platform provides access to GATT handles
-// otherwise it must not be defined. As of now the two supported platforms
-// (Android and Bluez/Linux) provide access or some notion of it.
-#ifndef Q_OS_MAC
-#define HANDLES_PROVIDED_BY_PLATFORM
-#endif
-
-#ifdef HANDLES_PROVIDED_BY_PLATFORM
-#define HANDLE_COMPARE(actual,expected) \
- if (!isBluezDbusLE) {\
- QCOMPARE(actual, expected);\
- };
-#else
-#define HANDLE_COMPARE(actual,expected)
-#endif
-
class tst_QLowEnergyController : public QObject
{
Q_OBJECT
@@ -90,6 +56,7 @@ private slots:
void tst_readWriteDescriptor();
void tst_customProgrammableDevice();
void tst_errorCases();
+ void tst_rssiError();
private:
void verifyServiceProperties(const QLowEnergyService *info);
bool verifyClientCharacteristicValue(const QByteArray& value);
@@ -99,6 +66,9 @@ private:
QBluetoothDeviceInfo remoteDeviceInfo;
QList<QBluetoothUuid> foundServices;
bool isBluezDbusLE = false;
+#if QT_CONFIG(permissions)
+ Qt::PermissionStatus permissionStatus = Qt::PermissionStatus::Undetermined;
+#endif
};
tst_QLowEnergyController::tst_QLowEnergyController()
@@ -121,6 +91,25 @@ tst_QLowEnergyController::tst_QLowEnergyController()
isBluezDbusLE = (bluetoothdVersion() >= QVersionNumber(5, 42));
qDebug() << "isDBusBluez:" << isBluezDbusLE;
#endif
+
+#if QT_CONFIG(permissions)
+ // FIXME: for Android, set additional parameters for scan and connect
+ // permissions.
+ permissionStatus = qApp->checkPermission(QBluetoothPermission{});
+ // Note: even with missing Bluetooth permission, we still can run tests on
+ // LE controller to test its logic/errors it emits, even if we cannot scan
+ // and cannot connect.
+ const bool ciRun = qEnvironmentVariable("QTEST_ENVIRONMENT").split(' ').contains("ci");
+ if (!ciRun && permissionStatus == Qt::PermissionStatus::Undetermined) {
+ QTestEventLoop loop;
+ qApp->requestPermission(QBluetoothPermission{}, [this, &loop](const QPermission &permission){
+ permissionStatus = permission.status();
+ loop.exitLoop();
+ });
+ if (permissionStatus == Qt::PermissionStatus::Undetermined)
+ loop.enterLoopMSecs(30000);
+ }
+#endif // QT_CONFIG(permissions)
}
tst_QLowEnergyController::~tst_QLowEnergyController()
@@ -140,7 +129,7 @@ void tst_QLowEnergyController::initTestCase()
qWarning("No remote device or local adapter found.");
return;
}
-#elif defined(Q_OS_OSX)
+#elif defined(Q_OS_MACOS)
// allDevices is always empty on iOS:
if (QBluetoothLocalDevice::allDevices().isEmpty()) {
qWarning("No local adapter found.");
@@ -148,6 +137,7 @@ void tst_QLowEnergyController::initTestCase()
}
#endif
+ // QLoggingCategory::setFilterRules(QStringLiteral("qt.bluetooth* = true"));
devAgent = new QBluetoothDeviceDiscoveryAgent(this);
devAgent->setLowEnergyDiscoveryTimeout(5000);
@@ -158,7 +148,13 @@ void tst_QLowEnergyController::initTestCase()
bool deviceFound = false;
devAgent->start(QBluetoothDeviceDiscoveryAgent::LowEnergyMethod);
- QTRY_VERIFY_WITH_TIMEOUT(finishedSpy.count() > 0, 30000);
+#if QT_CONFIG(permissions)
+ if (permissionStatus != Qt::PermissionStatus::Granted) {
+ QCOMPARE(devAgent->error(), QBluetoothDeviceDiscoveryAgent::MissingPermissionsError);
+ return;
+ }
+#endif
+ QTRY_VERIFY_WITH_TIMEOUT(!finishedSpy.isEmpty(), 30000);
const QList<QBluetoothDeviceInfo> infos = devAgent->discoveredDevices();
for (const QBluetoothDeviceInfo &info : infos) {
#ifndef Q_OS_MAC
@@ -174,7 +170,8 @@ void tst_QLowEnergyController::initTestCase()
}
}
- QVERIFY2(deviceFound, "Cannot find remote device.");
+ if (!deviceFound || !remoteDeviceInfo.isValid())
+ qWarning() << "The sensor tag device was not found, will skip most of the test";
// These are the services exported by the TI SensorTag
#ifndef Q_OS_MAC
@@ -218,13 +215,22 @@ void tst_QLowEnergyController::cleanupTestCase()
void tst_QLowEnergyController::tst_emptyCtor()
{
{
- QBluetoothAddress remoteAddress;
- QLowEnergyController control(remoteAddress);
- QSignalSpy connectedSpy(&control, SIGNAL(connected()));
- QSignalSpy stateSpy(&control, SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
- QSignalSpy errorSpy(&control, SIGNAL(error(QLowEnergyController::Error)));
- QCOMPARE(control.error(), QLowEnergyController::NoError);
- control.connectToDevice();
+ QScopedPointer<QLowEnergyController> control(QLowEnergyController::createCentral(QBluetoothDeviceInfo()));
+ QSignalSpy connectedSpy(control.data(), SIGNAL(connected()));
+ QSignalSpy stateSpy(control.data(), SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
+ QSignalSpy errorSpy(control.data(), SIGNAL(errorOccurred(QLowEnergyController::Error)));
+#if QT_CONFIG(bluez)
+ QBluetoothLocalDevice localDevice;
+ // With bluez Kernel ATT interface we get the error already at construction time if the
+ // device does not have a bluetooth adapter
+ if (!isBluezDbusLE && !localDevice.isValid())
+ QCOMPARE(control->error(), QLowEnergyController::InvalidBluetoothAdapterError);
+ else
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
+#else
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
+#endif
+ control->connectToDevice();
QTRY_VERIFY_WITH_TIMEOUT(!errorSpy.isEmpty(), 10000);
@@ -237,13 +243,22 @@ void tst_QLowEnergyController::tst_emptyCtor()
}
{
- QBluetoothDeviceInfo deviceInfo;
- QLowEnergyController control(deviceInfo);
- QSignalSpy connectedSpy(&control, SIGNAL(connected()));
- QSignalSpy stateSpy(&control, SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
- QSignalSpy errorSpy(&control, SIGNAL(error(QLowEnergyController::Error)));
- QCOMPARE(control.error(), QLowEnergyController::NoError);
- control.connectToDevice();
+ QScopedPointer<QLowEnergyController> control(QLowEnergyController::createCentral(
+ QBluetoothDeviceInfo(), QBluetoothAddress(), this));
+ QSignalSpy connectedSpy(control.data(), SIGNAL(connected()));
+ QSignalSpy stateSpy(control.data(), SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
+ QSignalSpy errorSpy(control.data(), SIGNAL(errorOccurred(QLowEnergyController::Error)));
+#if QT_CONFIG(bluez)
+ QBluetoothLocalDevice localDevice;
+ if (!isBluezDbusLE && !localDevice.isValid())
+ QCOMPARE(control->error(), QLowEnergyController::InvalidBluetoothAdapterError);
+ else
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
+#else
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
+#endif
+
+ control->connectToDevice();
QTRY_VERIFY_WITH_TIMEOUT(!errorSpy.isEmpty(), 10000);
@@ -254,7 +269,6 @@ void tst_QLowEnergyController::tst_emptyCtor()
QVERIFY(lastError == QLowEnergyController::UnknownRemoteDeviceError // if local device on platform found
|| lastError == QLowEnergyController::InvalidBluetoothAdapterError); // otherwise, e.g. fallback backend
}
-
}
void tst_QLowEnergyController::tst_connect()
@@ -268,148 +282,149 @@ void tst_QLowEnergyController::tst_connect()
#endif
QSKIP("No local Bluetooth or remote BTLE device found. Skipping test.");
- QLowEnergyController control(remoteDeviceInfo);
- QCOMPARE(remoteDeviceInfo.deviceUuid(), control.remoteDeviceUuid());
- QCOMPARE(control.role(), QLowEnergyController::CentralRole);
- QSignalSpy connectedSpy(&control, SIGNAL(connected()));
- QSignalSpy disconnectedSpy(&control, SIGNAL(disconnected()));
+ QScopedPointer<QLowEnergyController> control(QLowEnergyController::createCentral(remoteDeviceInfo));
+ QCOMPARE(remoteDeviceInfo.deviceUuid(), control->remoteDeviceUuid());
+ QCOMPARE(control->role(), QLowEnergyController::CentralRole);
+ QSignalSpy connectedSpy(control.data(), SIGNAL(connected()));
+ QSignalSpy disconnectedSpy(control.data(), SIGNAL(disconnected()));
if (remoteDeviceInfo.name().isEmpty())
- QVERIFY(control.remoteName().isEmpty());
+ QVERIFY(control->remoteName().isEmpty());
else
- QCOMPARE(control.remoteName(), remoteDeviceInfo.name());
+ QCOMPARE(control->remoteName(), remoteDeviceInfo.name());
#if !defined(Q_OS_IOS) && !defined(Q_OS_TVOS) && !QT_CONFIG(winrt_bt)
const QBluetoothAddress localAdapter = localAdapters.at(0).address();
- QCOMPARE(control.localAddress(), localAdapter);
- QVERIFY(!control.localAddress().isNull());
+ QCOMPARE(control->localAddress(), localAdapter);
+ QVERIFY(!control->localAddress().isNull());
#endif
#ifndef Q_OS_MAC
- QCOMPARE(control.remoteAddress(), remoteDevice);
+ QCOMPARE(control->remoteAddress(), remoteDevice);
#endif
- QCOMPARE(control.state(), QLowEnergyController::UnconnectedState);
- QCOMPARE(control.error(), QLowEnergyController::NoError);
- QVERIFY(control.errorString().isEmpty());
- QCOMPARE(disconnectedSpy.count(), 0);
- QCOMPARE(connectedSpy.count(), 0);
- QVERIFY(control.services().isEmpty());
+ QCOMPARE(control->state(), QLowEnergyController::UnconnectedState);
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
+ QVERIFY(control->errorString().isEmpty());
+ QCOMPARE(disconnectedSpy.size(), 0);
+ QCOMPARE(connectedSpy.size(), 0);
+ QVERIFY(control->services().isEmpty());
bool wasError = false;
- control.connectToDevice();
- QTRY_IMPL(control.state() != QLowEnergyController::ConnectingState,
- 10000);
+ control->connectToDevice();
+ QTRY_IMPL(control->state() != QLowEnergyController::ConnectingState,
+ 10000)
- QCOMPARE(disconnectedSpy.count(), 0);
- if (control.error() != QLowEnergyController::NoError) {
+ QCOMPARE(disconnectedSpy.size(), 0);
+ if (control->error() != QLowEnergyController::NoError) {
//error during connect
- QCOMPARE(connectedSpy.count(), 0);
- QCOMPARE(control.state(), QLowEnergyController::UnconnectedState);
+ QCOMPARE(connectedSpy.size(), 0);
+ QCOMPARE(control->state(), QLowEnergyController::UnconnectedState);
wasError = true;
- } else if (control.state() == QLowEnergyController::ConnectingState) {
+ } else if (control->state() == QLowEnergyController::ConnectingState) {
//timeout
- QCOMPARE(connectedSpy.count(), 0);
- QVERIFY(control.errorString().isEmpty());
- QCOMPARE(control.error(), QLowEnergyController::NoError);
- QVERIFY(control.services().isEmpty());
+ QCOMPARE(connectedSpy.size(), 0);
+ QVERIFY(control->errorString().isEmpty());
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
+ QVERIFY(control->services().isEmpty());
QSKIP("Connection to LE device cannot be established. Skipping test.");
return;
} else {
- QCOMPARE(control.state(), QLowEnergyController::ConnectedState);
- QCOMPARE(connectedSpy.count(), 1);
- QCOMPARE(control.error(), QLowEnergyController::NoError);
- QVERIFY(control.errorString().isEmpty());
+ QCOMPARE(control->state(), QLowEnergyController::ConnectedState);
+ QCOMPARE(connectedSpy.size(), 1);
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
+ QVERIFY(control->errorString().isEmpty());
}
- QVERIFY(control.services().isEmpty());
+ QVERIFY(control->services().isEmpty());
QList<QLowEnergyService *> savedReferences;
if (!wasError) {
- QSignalSpy discoveryFinishedSpy(&control, SIGNAL(discoveryFinished()));
- QSignalSpy serviceFoundSpy(&control, SIGNAL(serviceDiscovered(QBluetoothUuid)));
- QSignalSpy stateSpy(&control, SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
- control.discoverServices();
- QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 20000);
- QCOMPARE(stateSpy.count(), 2);
+ QSignalSpy discoveryFinishedSpy(control.data(), SIGNAL(discoveryFinished()));
+ QSignalSpy serviceFoundSpy(control.data(), SIGNAL(serviceDiscovered(QBluetoothUuid)));
+ QSignalSpy stateSpy(control.data(), SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
+ control->discoverServices();
+ QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.size() == 1, 20000);
+ QCOMPARE(stateSpy.size(), 2);
QCOMPARE(stateSpy.at(0).at(0).value<QLowEnergyController::ControllerState>(),
QLowEnergyController::DiscoveringState);
QCOMPARE(stateSpy.at(1).at(0).value<QLowEnergyController::ControllerState>(),
QLowEnergyController::DiscoveredState);
QVERIFY(!serviceFoundSpy.isEmpty());
- QVERIFY(serviceFoundSpy.count() >= foundServices.count());
+ QVERIFY(serviceFoundSpy.size() >= foundServices.size());
QVERIFY(!serviceFoundSpy.isEmpty());
QList<QBluetoothUuid> listing;
- for (int i = 0; i < serviceFoundSpy.count(); i++) {
+ for (qsizetype i = 0; i < serviceFoundSpy.size(); ++i) {
const QVariant v = serviceFoundSpy[i].at(0);
listing.append(v.value<QBluetoothUuid>());
}
- for (const QBluetoothUuid &uuid : qAsConst(foundServices)) {
+ for (const QBluetoothUuid &uuid : std::as_const(foundServices)) {
QVERIFY2(listing.contains(uuid),
uuid.toString().toLatin1());
- QLowEnergyService *service = control.createServiceObject(uuid);
+ QLowEnergyService *service = control->createServiceObject(uuid);
QVERIFY2(service, uuid.toString().toLatin1());
savedReferences.append(service);
QCOMPARE(service->type(), QLowEnergyService::PrimaryService);
- QCOMPARE(service->state(), QLowEnergyService::DiscoveryRequired);
+ QCOMPARE(service->state(), QLowEnergyService::RemoteService);
}
// unrelated uuids don't return valid service object
// invalid service uuid
- QVERIFY(!control.createServiceObject(QBluetoothUuid()));
+ QVERIFY(!control->createServiceObject(QBluetoothUuid()));
// some random uuid
- QVERIFY(!control.createServiceObject(QBluetoothUuid(QBluetoothUuid::DeviceName)));
+ QVERIFY(!control->createServiceObject(
+ QBluetoothUuid(QBluetoothUuid::CharacteristicType::DeviceName)));
// initiate characteristic discovery
- for (QLowEnergyService *service : qAsConst(savedReferences)) {
+ for (QLowEnergyService *service : std::as_const(savedReferences)) {
qDebug() << "Discovering" << service->serviceUuid();
QSignalSpy stateSpy(service,
SIGNAL(stateChanged(QLowEnergyService::ServiceState)));
- QSignalSpy errorSpy(service, SIGNAL(error(QLowEnergyService::ServiceError)));
+ QSignalSpy errorSpy(service, SIGNAL(errorOccurred(QLowEnergyService::ServiceError)));
service->discoverDetails();
QTRY_VERIFY_WITH_TIMEOUT(
- service->state() == QLowEnergyService::ServiceDiscovered, 10000);
+ service->state() == QLowEnergyService::RemoteServiceDiscovered, 10000);
- QCOMPARE(errorSpy.count(), 0); //no error
- QCOMPARE(stateSpy.count(), 2); //
+ QCOMPARE(errorSpy.size(), 0); //no error
+ QCOMPARE(stateSpy.size(), 2); //
verifyServiceProperties(service);
}
// ensure that related service objects share same state
- for (QLowEnergyService* originalService : qAsConst(savedReferences)) {
- QLowEnergyService *newService = control.createServiceObject(
+ for (QLowEnergyService* originalService : std::as_const(savedReferences)) {
+ QLowEnergyService *newService = control->createServiceObject(
originalService->serviceUuid());
QVERIFY(newService);
- QCOMPARE(newService->state(), QLowEnergyService::ServiceDiscovered);
+ QCOMPARE(newService->state(), QLowEnergyService::RemoteServiceDiscovered);
delete newService;
}
}
// Finish off
- control.disconnectFromDevice();
+ control->disconnectFromDevice();
QTRY_VERIFY_WITH_TIMEOUT(
- control.state() == QLowEnergyController::UnconnectedState,
+ control->state() == QLowEnergyController::UnconnectedState,
10000);
if (wasError) {
- QCOMPARE(disconnectedSpy.count(), 0);
+ QCOMPARE(disconnectedSpy.size(), 0);
} else {
- QCOMPARE(disconnectedSpy.count(), 1);
+ QCOMPARE(disconnectedSpy.size(), 1);
// after disconnect all service references must be invalid
- for (const QLowEnergyService *entry : qAsConst(savedReferences)) {
+ for (const QLowEnergyService *entry : std::as_const(savedReferences)) {
const QBluetoothUuid &uuid = entry->serviceUuid();
QVERIFY2(entry->state() == QLowEnergyService::InvalidService,
uuid.toString().toLatin1());
//after disconnect all related characteristics and descriptors are invalid
QList<QLowEnergyCharacteristic> chars = entry->characteristics();
- for (int i = 0; i < chars.count(); i++) {
+ for (qsizetype i = 0; i < chars.size(); ++i) {
QCOMPARE(chars.at(i).isValid(), false);
QList<QLowEnergyDescriptor> descriptors = chars[i].descriptors();
- for (int j = 0; j < descriptors.count(); j++)
+ for (qsizetype j = 0; j < descriptors.size(); ++j)
QCOMPARE(descriptors[j].isValid(), false);
}
}
@@ -429,78 +444,78 @@ void tst_QLowEnergyController::tst_concurrentDiscovery()
if (!remoteDeviceInfo.isValid())
QSKIP("No remote BTLE device found. Skipping test.");
- QLowEnergyController control(remoteDeviceInfo);
+ QScopedPointer<QLowEnergyController> control(QLowEnergyController::createCentral(remoteDeviceInfo));
- QCOMPARE(control.state(), QLowEnergyController::UnconnectedState);
- QCOMPARE(control.error(), QLowEnergyController::NoError);
+ QCOMPARE(control->state(), QLowEnergyController::UnconnectedState);
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
- control.connectToDevice();
+ control->connectToDevice();
{
- QTRY_IMPL(control.state() != QLowEnergyController::ConnectingState,
- 30000);
+ QTRY_IMPL(control->state() != QLowEnergyController::ConnectingState,
+ 30000)
}
- if (control.state() == QLowEnergyController::ConnectingState
- || control.error() != QLowEnergyController::NoError) {
+ if (control->state() == QLowEnergyController::ConnectingState
+ || control->error() != QLowEnergyController::NoError) {
// default BTLE backend forever hangs in ConnectingState
QSKIP("Cannot connect to remote device");
}
- QCOMPARE(control.state(), QLowEnergyController::ConnectedState);
+ QCOMPARE(control->state(), QLowEnergyController::ConnectedState);
// 2. new controller to same device fails
{
-#ifdef Q_OS_DARWIN
- QLowEnergyController control2(remoteDeviceInfo);
-#else
- QLowEnergyController control2(remoteDevice);
-#endif
- control2.connectToDevice();
+
+ QScopedPointer<QLowEnergyController> control2(
+ QLowEnergyController::createCentral(remoteDeviceInfo));
+ control2->connectToDevice();
{
- QTRY_IMPL(control2.state() != QLowEnergyController::ConnectingState,
- 30000);
+ QTRY_IMPL(control2->state() != QLowEnergyController::ConnectingState,
+ 30000)
}
#if defined(Q_OS_ANDROID) || defined(Q_OS_DARWIN) || QT_CONFIG(winrt_bt)
- QCOMPARE(control.state(), QLowEnergyController::ConnectedState);
- QCOMPARE(control2.state(), QLowEnergyController::ConnectedState);
- control2.disconnectFromDevice();
+ QCOMPARE(control->state(), QLowEnergyController::ConnectedState);
+ QCOMPARE(control2->state(), QLowEnergyController::ConnectedState);
+ control2->disconnectFromDevice();
QTest::qWait(3000);
- QCOMPARE(control.state(), QLowEnergyController::ConnectedState);
- QCOMPARE(control2.state(), QLowEnergyController::UnconnectedState);
+ QCOMPARE(control->state(), QLowEnergyController::ConnectedState);
+ QCOMPARE(control2->state(), QLowEnergyController::UnconnectedState);
#else
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);
+ 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();
+ control->connectToDevice();
{
- QTRY_VERIFY_WITH_TIMEOUT(control.state() != QLowEnergyController::ConnectingState,
+ QTRY_VERIFY_WITH_TIMEOUT(control->state() != QLowEnergyController::ConnectingState,
30000);
}
- QCOMPARE(control.state(), QLowEnergyController::ConnectedState);
+ 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);
+ QCOMPARE(control->state(), QLowEnergyController::ConnectedState);
+ QCOMPARE(control2->state(), QLowEnergyController::ConnectedState);
+ QTRY_COMPARE(control2->error(), QLowEnergyController::NoError);
+ control2->disconnectFromDevice();
+ QTRY_COMPARE(control2->state(), QLowEnergyController::UnconnectedState);
+ QTRY_COMPARE(control->error(), QLowEnergyController::NoError);
+ QTRY_COMPARE(control2->error(), QLowEnergyController::NoError);
+ QTRY_COMPARE(control->state(), QLowEnergyController::UnconnectedState);
// reconnect control
- control.connectToDevice();
+ control->connectToDevice();
{
- QTRY_VERIFY_WITH_TIMEOUT(control.state() != QLowEnergyController::ConnectingState,
+ QTRY_VERIFY_WITH_TIMEOUT(control->state() != QLowEnergyController::ConnectingState,
30000);
}
- QCOMPARE(control.state(), QLowEnergyController::ConnectedState);
+ QCOMPARE(control->state(), QLowEnergyController::ConnectedState);
}
#endif
}
@@ -509,11 +524,11 @@ void tst_QLowEnergyController::tst_concurrentDiscovery()
* for multiple services at the same time.
* */
- QSignalSpy discoveryFinishedSpy(&control, SIGNAL(discoveryFinished()));
- QSignalSpy stateSpy(&control, SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
- control.discoverServices();
- QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 20000);
- QCOMPARE(stateSpy.count(), 2);
+ QSignalSpy discoveryFinishedSpy(control.data(), SIGNAL(discoveryFinished()));
+ QSignalSpy stateSpy(control.data(), SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
+ control->discoverServices();
+ QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.size() == 1, 20000);
+ QCOMPARE(stateSpy.size(), 2);
QCOMPARE(stateSpy.at(0).at(0).value<QLowEnergyController::ControllerState>(),
QLowEnergyController::DiscoveringState);
QCOMPARE(stateSpy.at(1).at(0).value<QLowEnergyController::ControllerState>(),
@@ -524,13 +539,13 @@ void tst_QLowEnergyController::tst_concurrentDiscovery()
#define MAX_SERVICES_SAME_TIME_ACCESS 3
QLowEnergyService *services[MAX_SERVICES_SAME_TIME_ACCESS];
- QVERIFY(control.services().count() >= MAX_SERVICES_SAME_TIME_ACCESS);
+ QVERIFY(control->services().size() >= MAX_SERVICES_SAME_TIME_ACCESS);
- QList<QBluetoothUuid> uuids = control.services();
+ QList<QBluetoothUuid> uuids = control->services();
// initialize services
for (int i = 0; i<MAX_SERVICES_SAME_TIME_ACCESS; i++) {
- services[i] = control.createServiceObject(uuids.at(i), this);
+ services[i] = control->createServiceObject(uuids.at(i), this);
QVERIFY(services[i]);
}
@@ -542,7 +557,7 @@ void tst_QLowEnergyController::tst_concurrentDiscovery()
for (int i = 0; i<MAX_SERVICES_SAME_TIME_ACCESS; i++) {
qWarning() << "Waiting for" << i << services[i]->serviceUuid();
QTRY_VERIFY_WITH_TIMEOUT(
- services[i]->state() == QLowEnergyService::ServiceDiscovered,
+ services[i]->state() == QLowEnergyService::RemoteServiceDiscovered,
30000);
}
@@ -554,24 +569,24 @@ void tst_QLowEnergyController::tst_concurrentDiscovery()
QVERIFY(!services[i]->contains(QLowEnergyDescriptor()));
}
- control.disconnectFromDevice();
- QTRY_VERIFY_WITH_TIMEOUT(control.state() == QLowEnergyController::UnconnectedState,
+ control->disconnectFromDevice();
+ QTRY_VERIFY_WITH_TIMEOUT(control->state() == QLowEnergyController::UnconnectedState,
30000);
discoveryFinishedSpy.clear();
// redo the discovery with same controller
QLowEnergyService *services_second[MAX_SERVICES_SAME_TIME_ACCESS];
- control.connectToDevice();
+ control->connectToDevice();
{
- QTRY_IMPL(control.state() != QLowEnergyController::ConnectingState,
+ QTRY_IMPL(control->state() != QLowEnergyController::ConnectingState,
30000);
}
- QCOMPARE(control.state(), QLowEnergyController::ConnectedState);
+ QCOMPARE(control->state(), QLowEnergyController::ConnectedState);
stateSpy.clear();
- control.discoverServices();
- QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 20000);
- QCOMPARE(stateSpy.count(), 2);
+ control->discoverServices();
+ QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.size() == 1, 20000);
+ QCOMPARE(stateSpy.size(), 2);
QCOMPARE(stateSpy.at(0).at(0).value<QLowEnergyController::ControllerState>(),
QLowEnergyController::DiscoveringState);
QCOMPARE(stateSpy.at(1).at(0).value<QLowEnergyController::ControllerState>(),
@@ -579,10 +594,10 @@ void tst_QLowEnergyController::tst_concurrentDiscovery()
// get all details
for (int i = 0; i<MAX_SERVICES_SAME_TIME_ACCESS; i++) {
- services_second[i] = control.createServiceObject(uuids.at(i), this);
+ services_second[i] = control->createServiceObject(uuids.at(i), this);
QVERIFY(services_second[i]->parent() == this);
QVERIFY(services[i]);
- QVERIFY(services_second[i]->state() == QLowEnergyService::DiscoveryRequired);
+ QVERIFY(services_second[i]->state() == QLowEnergyService::RemoteService);
services_second[i]->discoverDetails();
}
@@ -590,7 +605,7 @@ void tst_QLowEnergyController::tst_concurrentDiscovery()
for (int i = 0; i<MAX_SERVICES_SAME_TIME_ACCESS; i++) {
qWarning() << "Waiting for" << i << services_second[i]->serviceUuid();
QTRY_VERIFY_WITH_TIMEOUT(
- services_second[i]->state() == QLowEnergyService::ServiceDiscovered,
+ services_second[i]->state() == QLowEnergyService::RemoteServiceDiscovered,
30000);
QCOMPARE(services_second[i]->serviceName(), services[i]->serviceName());
QCOMPARE(services_second[i]->serviceUuid(), services[i]->serviceUuid());
@@ -601,12 +616,12 @@ void tst_QLowEnergyController::tst_concurrentDiscovery()
verifyServiceProperties(services_second[i]);
//after disconnect all related characteristics and descriptors are invalid
const QList<QLowEnergyCharacteristic> chars = services[i]->characteristics();
- for (int j = 0; j < chars.count(); j++) {
+ for (qsizetype j = 0; j < chars.size(); ++j) {
QCOMPARE(chars.at(j).isValid(), false);
QVERIFY(services[i]->contains(chars[j]));
QVERIFY(!services_second[i]->contains(chars[j]));
const QList<QLowEnergyDescriptor> descriptors = chars[j].descriptors();
- for (int k = 0; k < descriptors.count(); k++) {
+ for (qsizetype k = 0; k < descriptors.size(); ++k) {
QCOMPARE(descriptors[k].isValid(), false);
services[i]->contains(descriptors[k]);
QVERIFY(!services_second[i]->contains(chars[j]));
@@ -617,7 +632,7 @@ void tst_QLowEnergyController::tst_concurrentDiscovery()
QCOMPARE(services[i]->serviceName(), services_second[i]->serviceName());
QCOMPARE(services[i]->type(), services_second[i]->type());
QVERIFY(services[i]->state() == QLowEnergyService::InvalidService);
- QVERIFY(services_second[i]->state() == QLowEnergyService::ServiceDiscovered);
+ QVERIFY(services_second[i]->state() == QLowEnergyService::RemoteServiceDiscovered);
}
// cleanup
@@ -626,7 +641,9 @@ void tst_QLowEnergyController::tst_concurrentDiscovery()
delete services_second[i];
}
- control.disconnectFromDevice();
+ control->disconnectFromDevice();
+ QTRY_COMPARE(control->state(), QLowEnergyController::UnconnectedState);
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
}
void tst_QLowEnergyController::verifyServiceProperties(
@@ -636,42 +653,38 @@ void tst_QLowEnergyController::verifyServiceProperties(
QBluetoothUuid(QString("00001800-0000-1000-8000-00805f9b34fb"))) {
qDebug() << "Verifying GAP Service";
QList<QLowEnergyCharacteristic> chars = info->characteristics();
- QCOMPARE(chars.count(), 5);
+ QCOMPARE(chars.size(), 5);
// Device Name
QString temp("00002a00-0000-1000-8000-00805f9b34fb");
QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x3));
QCOMPARE(chars[0].properties(), QLowEnergyCharacteristic::Read);
QCOMPARE(chars[0].value(), QByteArray::fromHex("544920424c452053656e736f7220546167"));
QVERIFY(chars[0].isValid());
- QCOMPARE(chars[0].descriptors().count(), 0);
+ QCOMPARE(chars[0].descriptors().size(), 0);
QVERIFY(info->contains(chars[0]));
// Appearance
temp = QString("00002a01-0000-1000-8000-00805f9b34fb");
QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x5));
QCOMPARE(chars[1].properties(), QLowEnergyCharacteristic::Read);
QCOMPARE(chars[1].value(), QByteArray::fromHex("0000"));
QVERIFY(chars[1].isValid());
- QCOMPARE(chars[1].descriptors().count(), 0);
+ QCOMPARE(chars[1].descriptors().size(), 0);
QVERIFY(info->contains(chars[1]));
// Peripheral Privacy Flag
temp = QString("00002a02-0000-1000-8000-00805f9b34fb");
QCOMPARE(chars[2].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[2].handle(), QLowEnergyHandle(0x7));
QVERIFY(chars[2].properties() & QLowEnergyCharacteristic::Read);
QCOMPARE(chars[2].value(), QByteArray::fromHex("00"));
QVERIFY(chars[2].isValid());
- QCOMPARE(chars[2].descriptors().count(), 0);
+ QCOMPARE(chars[2].descriptors().size(), 0);
QVERIFY(info->contains(chars[2]));
// Reconnection Address
temp = QString("00002a03-0000-1000-8000-00805f9b34fb");
QCOMPARE(chars[3].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[3].handle(), QLowEnergyHandle(0x9));
//Early firmware version had this characteristic as Read|Write and may fail
QCOMPARE(chars[3].properties(), QLowEnergyCharacteristic::Write);
if (chars[3].properties() & QLowEnergyCharacteristic::Read)
@@ -679,87 +692,80 @@ void tst_QLowEnergyController::verifyServiceProperties(
else
QCOMPARE(chars[3].value(), QByteArray());
QVERIFY(chars[3].isValid());
- QCOMPARE(chars[3].descriptors().count(), 0);
+ QCOMPARE(chars[3].descriptors().size(), 0);
QVERIFY(info->contains(chars[3]));
// Peripheral Preferred Connection Parameters
temp = QString("00002a04-0000-1000-8000-00805f9b34fb");
QCOMPARE(chars[4].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[4].handle(), QLowEnergyHandle(0xb));
QCOMPARE(chars[4].properties(), QLowEnergyCharacteristic::Read);
QCOMPARE(chars[4].value(), QByteArray::fromHex("5000a0000000e803"));
QVERIFY(chars[4].isValid());
- QCOMPARE(chars[4].descriptors().count(), 0);
+ QCOMPARE(chars[4].descriptors().size(), 0);
QVERIFY(info->contains(chars[4]));
} else if (info->serviceUuid() ==
QBluetoothUuid(QString("00001801-0000-1000-8000-00805f9b34fb"))) {
qDebug() << "Verifying GATT Service";
QList<QLowEnergyCharacteristic> chars = info->characteristics();
- QCOMPARE(chars.count(), 1);
+ QCOMPARE(chars.size(), 1);
// Service Changed
QString temp("00002a05-0000-1000-8000-00805f9b34fb");
//this should really be readable according to GATT Service spec
QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0xe));
QCOMPARE(chars[0].properties(), QLowEnergyCharacteristic::Indicate);
QCOMPARE(chars[0].value(), QByteArray());
QVERIFY(chars[0].isValid());
QVERIFY(info->contains(chars[0]));
- QCOMPARE(chars[0].descriptors().count(), 1);
+ QCOMPARE(chars[0].descriptors().size(), 1);
QCOMPARE(chars[0].descriptors().at(0).isValid(), true);
- HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0xf));
QCOMPARE(chars[0].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration));
QCOMPARE(chars[0].descriptors().at(0).type(),
- QBluetoothUuid::ClientCharacteristicConfiguration);
+ QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
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"))) {
qDebug() << "Verifying Device Information";
QList<QLowEnergyCharacteristic> chars = info->characteristics();
- QCOMPARE(chars.count(), 9);
+ QCOMPARE(chars.size(), 9);
// System ID
QString temp("00002a23-0000-1000-8000-00805f9b34fb");
//this should really be readable according to GATT Service spec
QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x12));
QCOMPARE(chars[0].properties(), QLowEnergyCharacteristic::Read);
// Do not read the System ID as it is different for every device
// QEXPECT_FAIL("", "The value is different on different devices", Continue);
// QCOMPARE(chars[0].value(), QByteArray::fromHex("6e41ab0000296abc"));
QVERIFY(chars[0].isValid());
QVERIFY(info->contains(chars[0]));
- QCOMPARE(chars[0].descriptors().count(), 0);
+ QCOMPARE(chars[0].descriptors().size(), 0);
// Model Number
temp = QString("00002a24-0000-1000-8000-00805f9b34fb");
QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x14));
QCOMPARE(chars[1].properties(), QLowEnergyCharacteristic::Read);
QCOMPARE(chars[1].value(), QByteArray::fromHex("4e2e412e00"));
QVERIFY(chars[1].isValid());
QVERIFY(info->contains(chars[1]));
- QCOMPARE(chars[1].descriptors().count(), 0);
+ QCOMPARE(chars[1].descriptors().size(), 0);
// Serial Number
temp = QString("00002a25-0000-1000-8000-00805f9b34fb");
QCOMPARE(chars[2].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[2].handle(), QLowEnergyHandle(0x16));
QCOMPARE(chars[2].properties(),
(QLowEnergyCharacteristic::Read));
QCOMPARE(chars[2].value(), QByteArray::fromHex("4e2e412e00"));
QVERIFY(chars[2].isValid());
QVERIFY(info->contains(chars[2]));
- QCOMPARE(chars[2].descriptors().count(), 0);
+ QCOMPARE(chars[2].descriptors().size(), 0);
// Firmware Revision
temp = QString("00002a26-0000-1000-8000-00805f9b34fb");
QCOMPARE(chars[3].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[3].handle(), QLowEnergyHandle(0x18));
QCOMPARE(chars[3].properties(),
(QLowEnergyCharacteristic::Read));
//FW rev. : 1.5 (Oct 23 2013)
@@ -767,95 +773,87 @@ void tst_QLowEnergyController::verifyServiceProperties(
QCOMPARE(chars[3].value(), QByteArray::fromHex("312e3520284f637420323320323031332900"));
QVERIFY(chars[3].isValid());
QVERIFY(info->contains(chars[3]));
- QCOMPARE(chars[3].descriptors().count(), 0);
+ QCOMPARE(chars[3].descriptors().size(), 0);
// Hardware Revision
temp = QString("00002a27-0000-1000-8000-00805f9b34fb");
QCOMPARE(chars[4].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[4].handle(), QLowEnergyHandle(0x1a));
QCOMPARE(chars[4].properties(),
(QLowEnergyCharacteristic::Read));
QCOMPARE(chars[4].value(), QByteArray::fromHex("4e2e412e00"));
QVERIFY(chars[4].isValid());
QVERIFY(info->contains(chars[4]));
- QCOMPARE(chars[4].descriptors().count(), 0);
+ QCOMPARE(chars[4].descriptors().size(), 0);
// Software Revision
temp = QString("00002a28-0000-1000-8000-00805f9b34fb");
QCOMPARE(chars[5].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[5].handle(), QLowEnergyHandle(0x1c));
QCOMPARE(chars[5].properties(),
(QLowEnergyCharacteristic::Read));
QCOMPARE(chars[5].value(), QByteArray::fromHex("4e2e412e00"));
QVERIFY(chars[5].isValid());
QVERIFY(info->contains(chars[5]));
- QCOMPARE(chars[5].descriptors().count(), 0);
+ QCOMPARE(chars[5].descriptors().size(), 0);
// Manufacturer Name
temp = QString("00002a29-0000-1000-8000-00805f9b34fb");
QCOMPARE(chars[6].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[6].handle(), QLowEnergyHandle(0x1e));
QCOMPARE(chars[6].properties(),
(QLowEnergyCharacteristic::Read));
QCOMPARE(chars[6].value(), QByteArray::fromHex("546578617320496e737472756d656e747300"));
QVERIFY(chars[6].isValid());
QVERIFY(info->contains(chars[6]));
- QCOMPARE(chars[6].descriptors().count(), 0);
+ QCOMPARE(chars[6].descriptors().size(), 0);
// IEEE
temp = QString("00002a2a-0000-1000-8000-00805f9b34fb");
QCOMPARE(chars[7].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[7].handle(), QLowEnergyHandle(0x20));
QCOMPARE(chars[7].properties(),
(QLowEnergyCharacteristic::Read));
QCOMPARE(chars[7].value(), QByteArray::fromHex("fe006578706572696d656e74616c"));
QVERIFY(chars[7].isValid());
QVERIFY(info->contains(chars[7]));
- QCOMPARE(chars[7].descriptors().count(), 0);
+ QCOMPARE(chars[7].descriptors().size(), 0);
// PnP ID
temp = QString("00002a50-0000-1000-8000-00805f9b34fb");
QCOMPARE(chars[8].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[8].handle(), QLowEnergyHandle(0x22));
QCOMPARE(chars[8].properties(),
(QLowEnergyCharacteristic::Read));
QCOMPARE(chars[8].value(), QByteArray::fromHex("010d0000001001"));
QVERIFY(chars[8].isValid());
QVERIFY(info->contains(chars[8]));
- QCOMPARE(chars[8].descriptors().count(), 0);
+ QCOMPARE(chars[8].descriptors().size(), 0);
} else if (info->serviceUuid() ==
QBluetoothUuid(QString("f000aa00-0451-4000-b000-000000000000"))) {
qDebug() << "Verifying Temperature";
QList<QLowEnergyCharacteristic> chars = info->characteristics();
- QVERIFY(chars.count() >= 2);
+ QVERIFY(chars.size() >= 2);
// Temp Data
QString temp("f000aa01-0451-4000-b000-000000000000");
QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x25));
QCOMPARE(chars[0].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Notify));
QCOMPARE(chars[0].value(), QByteArray::fromHex("00000000"));
QVERIFY(chars[0].isValid());
QVERIFY(info->contains(chars[0]));
- QCOMPARE(chars[0].descriptors().count(), 2);
+ QCOMPARE(chars[0].descriptors().size(), 2);
//descriptor checks
QCOMPARE(chars[0].descriptors().at(0).isValid(), true);
- HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x26));
QCOMPARE(chars[0].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration));
QCOMPARE(chars[0].descriptors().at(0).type(),
- QBluetoothUuid::ClientCharacteristicConfiguration);
+ QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value()));
QVERIFY(info->contains(chars[0].descriptors().at(0)));
QCOMPARE(chars[0].descriptors().at(1).isValid(), true);
- HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x27));
QCOMPARE(chars[0].descriptors().at(1).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[0].descriptors().at(1).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
// value different in other revisions and test may fail
QCOMPARE(chars[0].descriptors().at(1).value(),
QByteArray::fromHex("54656d702e2044617461"));
@@ -864,21 +862,19 @@ void tst_QLowEnergyController::verifyServiceProperties(
// Temp Config
temp = QString("f000aa02-0451-4000-b000-000000000000");
QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x29));
QCOMPARE(chars[1].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write));
QCOMPARE(chars[1].value(), QByteArray::fromHex("00"));
QVERIFY(chars[1].isValid());
QVERIFY(info->contains(chars[1]));
- QCOMPARE(chars[1].descriptors().count(), 1);
+ QCOMPARE(chars[1].descriptors().size(), 1);
//descriptor checks
QCOMPARE(chars[1].descriptors().at(0).isValid(), true);
- HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x2a));
QCOMPARE(chars[1].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[1].descriptors().at(0).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
// value different in other revisions and test may fail
QCOMPARE(chars[1].descriptors().at(0).value(),
QByteArray::fromHex("54656d702e20436f6e662e"));
@@ -886,24 +882,22 @@ void tst_QLowEnergyController::verifyServiceProperties(
//Temp Period (introduced by later firmware versions)
- if (chars.count() > 2) {
+ if (chars.size() > 2) {
temp = QString("f000aa03-0451-4000-b000-000000000000");
QCOMPARE(chars[2].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[2].handle(), QLowEnergyHandle(0x2c));
QCOMPARE(chars[2].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write));
QCOMPARE(chars[2].value(), QByteArray::fromHex("64"));
QVERIFY(chars[2].isValid());
QVERIFY(info->contains(chars[2]));
- QCOMPARE(chars[2].descriptors().count(), 1);
+ QCOMPARE(chars[2].descriptors().size(), 1);
//descriptor checks
QCOMPARE(chars[2].descriptors().at(0).isValid(), true);
- HANDLE_COMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x2d));
QCOMPARE(chars[2].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[2].descriptors().at(0).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[2].descriptors().at(0).value(),
QByteArray::fromHex("54656d702e20506572696f64"));
QVERIFY(info->contains(chars[2].descriptors().at(0)));
@@ -912,38 +906,35 @@ void tst_QLowEnergyController::verifyServiceProperties(
QBluetoothUuid(QString("0000ffe0-0000-1000-8000-00805f9b34fb"))) {
qDebug() << "Verifying Simple Keys";
QList<QLowEnergyCharacteristic> chars = info->characteristics();
- QCOMPARE(chars.count(), 1);
+ QCOMPARE(chars.size(), 1);
// Temp Data
QString temp("0000ffe1-0000-1000-8000-00805f9b34fb");
QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x6b));
QCOMPARE(chars[0].properties(),
(QLowEnergyCharacteristic::Notify));
QCOMPARE(chars[0].value(), QByteArray());
QVERIFY(chars[0].isValid());
QVERIFY(info->contains(chars[0]));
- QCOMPARE(chars[0].descriptors().count(), 2);
+ QCOMPARE(chars[0].descriptors().size(), 2);
//descriptor checks
QCOMPARE(chars[0].descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x6c));
QCOMPARE(chars[0].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration));
QCOMPARE(chars[0].descriptors().at(0).type(),
- QBluetoothUuid::ClientCharacteristicConfiguration);
+ QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value()));
QVERIFY(info->contains(chars[0].descriptors().at(0)));
QCOMPARE(chars[0].descriptors().at(1).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x6d));
QCOMPARE(chars[0].descriptors().at(1).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[0].descriptors().at(1).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[0].descriptors().at(1).value(),
QByteArray::fromHex("4b6579205072657373205374617465"));
QVERIFY(info->contains(chars[0].descriptors().at(1)));
@@ -952,38 +943,35 @@ void tst_QLowEnergyController::verifyServiceProperties(
QBluetoothUuid(QString("f000aa10-0451-4000-b000-000000000000"))) {
qDebug() << "Verifying Accelerometer";
QList<QLowEnergyCharacteristic> chars = info->characteristics();
- QCOMPARE(chars.count(), 3);
+ QCOMPARE(chars.size(), 3);
// Accel Data
QString temp("f000aa11-0451-4000-b000-000000000000");
QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x30));
QCOMPARE(chars[0].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Notify));
QCOMPARE(chars[0].value(), QByteArray::fromHex("000000"));
QVERIFY(chars[0].isValid());
QVERIFY(info->contains(chars[0]));
- QCOMPARE(chars[0].descriptors().count(), 2);
+ QCOMPARE(chars[0].descriptors().size(), 2);
QCOMPARE(chars[0].descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x31));
QCOMPARE(chars[0].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration));
QCOMPARE(chars[0].descriptors().at(0).type(),
- QBluetoothUuid::ClientCharacteristicConfiguration);
+ QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value()));
QVERIFY(info->contains(chars[0].descriptors().at(0)));
QCOMPARE(chars[0].descriptors().at(1).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x32));
QCOMPARE(chars[0].descriptors().at(1).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[0].descriptors().at(1).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[0].descriptors().at(1).value(),
QByteArray::fromHex("416363656c2e2044617461"));
QVERIFY(info->contains(chars[0].descriptors().at(1)));
@@ -992,21 +980,19 @@ void tst_QLowEnergyController::verifyServiceProperties(
temp = QString("f000aa12-0451-4000-b000-000000000000");
QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x34));
QCOMPARE(chars[1].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write));
QCOMPARE(chars[1].value(), QByteArray::fromHex("00"));
QVERIFY(chars[1].isValid());
QVERIFY(info->contains(chars[1]));
- QCOMPARE(chars[1].descriptors().count(), 1);
+ QCOMPARE(chars[1].descriptors().size(), 1);
QCOMPARE(chars[1].descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x35));
QCOMPARE(chars[1].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[1].descriptors().at(0).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[1].descriptors().at(0).value(),
QByteArray::fromHex("416363656c2e20436f6e662e"));
QVERIFY(info->contains(chars[1].descriptors().at(0)));
@@ -1015,22 +1001,20 @@ void tst_QLowEnergyController::verifyServiceProperties(
temp = QString("f000aa13-0451-4000-b000-000000000000");
QCOMPARE(chars[2].uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[2].handle(), QLowEnergyHandle(0x37));
QCOMPARE(chars[2].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write));
QCOMPARE(chars[2].value(), QByteArray::fromHex("64")); // don't change it or set it to 0x64
QVERIFY(chars[2].isValid());
QVERIFY(info->contains(chars[2]));
- QCOMPARE(chars[2].descriptors().count(), 1);
+ QCOMPARE(chars[2].descriptors().size(), 1);
//descriptor checks
QCOMPARE(chars[2].descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x38));
QCOMPARE(chars[2].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[2].descriptors().at(0).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
// value different in other revisions and test may fail
QCOMPARE(chars[2].descriptors().at(0).value(),
QByteArray::fromHex("416363656c2e20506572696f64"));
@@ -1039,38 +1023,35 @@ void tst_QLowEnergyController::verifyServiceProperties(
QBluetoothUuid(QString("f000aa20-0451-4000-b000-000000000000"))) {
qDebug() << "Verifying Humidity";
QList<QLowEnergyCharacteristic> chars = info->characteristics();
- QVERIFY(chars.count() >= 2); //new firmware has more chars
+ QVERIFY(chars.size() >= 2); //new firmware has more chars
// Humidity Data
QString temp("f000aa21-0451-4000-b000-000000000000");
QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x3b));
QCOMPARE(chars[0].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Notify));
QCOMPARE(chars[0].value(), QByteArray::fromHex("00000000"));
QVERIFY(chars[0].isValid());
QVERIFY(info->contains(chars[0]));
- QCOMPARE(chars[0].descriptors().count(), 2);
+ QCOMPARE(chars[0].descriptors().size(), 2);
//descriptor checks
QCOMPARE(chars[0].descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x3c));
QCOMPARE(chars[0].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration));
QCOMPARE(chars[0].descriptors().at(0).type(),
- QBluetoothUuid::ClientCharacteristicConfiguration);
+ QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value()));
QVERIFY(info->contains(chars[0].descriptors().at(0)));
QCOMPARE(chars[0].descriptors().at(1).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x3d));
QCOMPARE(chars[0].descriptors().at(1).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[0].descriptors().at(1).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[0].descriptors().at(1).value(),
QByteArray::fromHex("48756d69642e2044617461"));
QVERIFY(info->contains(chars[0].descriptors().at(1)));
@@ -1079,46 +1060,42 @@ void tst_QLowEnergyController::verifyServiceProperties(
temp = QString("f000aa22-0451-4000-b000-000000000000");
QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x3f));
QCOMPARE(chars[1].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write));
QCOMPARE(chars[1].value(), QByteArray::fromHex("00"));
QVERIFY(chars[1].isValid());
QVERIFY(info->contains(chars[1]));
- QCOMPARE(chars[1].descriptors().count(), 1);
+ QCOMPARE(chars[1].descriptors().size(), 1);
//descriptor checks
QCOMPARE(chars[1].descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x40));
QCOMPARE(chars[1].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[1].descriptors().at(0).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[1].descriptors().at(0).value(),
QByteArray::fromHex("48756d69642e20436f6e662e"));
QVERIFY(info->contains(chars[1].descriptors().at(0)));
- if (chars.count() >= 3) {
+ if (chars.size() >= 3) {
// New firmware new characteristic
// Humidity Period
temp = QString("f000aa23-0451-4000-b000-000000000000");
QCOMPARE(chars[2].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[2].handle(), QLowEnergyHandle(0x42));
QCOMPARE(chars[2].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write));
QCOMPARE(chars[2].value(), QByteArray::fromHex("64"));
QVERIFY(chars[2].isValid());
QVERIFY(info->contains(chars[2]));
- QCOMPARE(chars[2].descriptors().count(), 1);
+ QCOMPARE(chars[2].descriptors().size(), 1);
//descriptor checks
QCOMPARE(chars[2].descriptors().at(0).isValid(), true);
- HANDLE_COMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x43));
QCOMPARE(chars[2].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[2].descriptors().at(0).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[2].descriptors().at(0).value(),
QByteArray::fromHex("48756d69642e20506572696f64"));
QVERIFY(info->contains(chars[2].descriptors().at(0)));
@@ -1127,38 +1104,35 @@ void tst_QLowEnergyController::verifyServiceProperties(
QBluetoothUuid(QString("f000aa30-0451-4000-b000-000000000000"))) {
qDebug() << "Verifying Magnetometer";
QList<QLowEnergyCharacteristic> chars = info->characteristics();
- QCOMPARE(chars.count(), 3);
+ QCOMPARE(chars.size(), 3);
// Magnetometer Data
QString temp("f000aa31-0451-4000-b000-000000000000");
QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x46));
QCOMPARE(chars[0].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Notify));
QCOMPARE(chars[0].value(), QByteArray::fromHex("000000000000"));
QVERIFY(chars[0].isValid());
QVERIFY(info->contains(chars[0]));
- QCOMPARE(chars[0].descriptors().count(), 2);
+ QCOMPARE(chars[0].descriptors().size(), 2);
QCOMPARE(chars[0].descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x47));
QCOMPARE(chars[0].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration));
QCOMPARE(chars[0].descriptors().at(0).type(),
- QBluetoothUuid::ClientCharacteristicConfiguration);
+ QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value()));
QVERIFY(info->contains(chars[0].descriptors().at(0)));
QCOMPARE(chars[0].descriptors().at(1).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x48));
QCOMPARE(chars[0].descriptors().at(1).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[0].descriptors().at(1).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[0].descriptors().at(1).value(),
QByteArray::fromHex("4d61676e2e2044617461"));
QVERIFY(info->contains(chars[0].descriptors().at(1)));
@@ -1167,21 +1141,19 @@ void tst_QLowEnergyController::verifyServiceProperties(
temp = QString("f000aa32-0451-4000-b000-000000000000");
QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x4a));
QCOMPARE(chars[1].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write));
QCOMPARE(chars[1].value(), QByteArray::fromHex("00"));
QVERIFY(chars[1].isValid());
QVERIFY(info->contains(chars[1]));
- QCOMPARE(chars[1].descriptors().count(), 1);
+ QCOMPARE(chars[1].descriptors().size(), 1);
QCOMPARE(chars[1].descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x4b));
QCOMPARE(chars[1].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[1].descriptors().at(0).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
// value different in other revisions and test may fail
QCOMPARE(chars[1].descriptors().at(0).value(),
QByteArray::fromHex("4d61676e2e20436f6e662e"));
@@ -1191,21 +1163,19 @@ void tst_QLowEnergyController::verifyServiceProperties(
temp = QString("f000aa33-0451-4000-b000-000000000000");
QCOMPARE(chars[2].uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[2].handle(), QLowEnergyHandle(0x4d));
QCOMPARE(chars[2].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write));
QCOMPARE(chars[2].value(), QByteArray::fromHex("c8")); // don't change it or set it to 0xc8
QVERIFY(chars[2].isValid());
QVERIFY(info->contains(chars[2]));
- QCOMPARE(chars[2].descriptors().count(), 1);
+ QCOMPARE(chars[2].descriptors().size(), 1);
QCOMPARE(chars[2].descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x4e));
QCOMPARE(chars[2].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[2].descriptors().at(0).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
// value different in other revisions and test may fail
QCOMPARE(chars[2].descriptors().at(0).value(),
QByteArray::fromHex("4d61676e2e20506572696f64"));
@@ -1214,38 +1184,35 @@ void tst_QLowEnergyController::verifyServiceProperties(
QBluetoothUuid(QString("f000aa40-0451-4000-b000-000000000000"))) {
qDebug() << "Verifying Pressure";
const QList<QLowEnergyCharacteristic> chars = info->characteristics();
- QVERIFY(chars.count() >= 3);
+ QVERIFY(chars.size() >= 3);
// Pressure Data
QString temp("f000aa41-0451-4000-b000-000000000000");
QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x51));
QCOMPARE(chars[0].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Notify));
QCOMPARE(chars[0].value(), QByteArray::fromHex("00000000"));
QVERIFY(chars[0].isValid());
QVERIFY(info->contains(chars[0]));
- QCOMPARE(chars[0].descriptors().count(), 2);
+ QCOMPARE(chars[0].descriptors().size(), 2);
//descriptor checks
QCOMPARE(chars[0].descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x52));
QCOMPARE(chars[0].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration));
QCOMPARE(chars[0].descriptors().at(0).type(),
- QBluetoothUuid::ClientCharacteristicConfiguration);
+ QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value()));
QVERIFY(info->contains(chars[0].descriptors().at(0)));
QCOMPARE(chars[0].descriptors().at(1).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x53));
QCOMPARE(chars[0].descriptors().at(1).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[0].descriptors().at(1).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
// value different in other revisions and test may fail
QCOMPARE(chars[0].descriptors().at(1).value(),
QByteArray::fromHex("4261726f6d2e2044617461"));
@@ -1255,21 +1222,19 @@ void tst_QLowEnergyController::verifyServiceProperties(
temp = QString("f000aa42-0451-4000-b000-000000000000");
QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x55));
QCOMPARE(chars[1].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write));
QCOMPARE(chars[1].value(), QByteArray::fromHex("00"));
QVERIFY(chars[1].isValid());
QVERIFY(info->contains(chars[1]));
- QCOMPARE(chars[1].descriptors().count(), 1);
+ QCOMPARE(chars[1].descriptors().size(), 1);
QCOMPARE(chars[1].descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x56));
QCOMPARE(chars[1].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[1].descriptors().at(0).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[1].descriptors().at(0).value(),
QByteArray::fromHex("4261726f6d2e20436f6e662e"));
QVERIFY(info->contains(chars[1].descriptors().at(0)));
@@ -1289,32 +1254,30 @@ void tst_QLowEnergyController::verifyServiceProperties(
temp = QString("f000aa43-0451-4000-b000-000000000000");
QCOMPARE(calibration.uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(calibration.handle(), QLowEnergyHandle(0x5b));
QCOMPARE(calibration.properties(),
(QLowEnergyCharacteristic::Read));
QCOMPARE(calibration.value(), QByteArray::fromHex("00000000000000000000000000000000")); // don't change it
QVERIFY(calibration.isValid());
QVERIFY(info->contains(calibration));
- QCOMPARE(calibration.descriptors().count(), 2);
+ QCOMPARE(calibration.descriptors().size(), 2);
//descriptor checks
QCOMPARE(calibration.descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(calibration.descriptors().at(0).handle(), QLowEnergyHandle(0x5c));
QCOMPARE(calibration.descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration));
+ QBluetoothUuid(
+ QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration));
QCOMPARE(calibration.descriptors().at(0).type(),
- QBluetoothUuid::ClientCharacteristicConfiguration);
+ QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
QVERIFY(verifyClientCharacteristicValue(calibration.descriptors().at(0).value()));
QVERIFY(info->contains(calibration.descriptors().at(0)));
QCOMPARE(calibration.descriptors().at(1).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(calibration.descriptors().at(1).handle(), QLowEnergyHandle(0x5d));
QCOMPARE(calibration.descriptors().at(1).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(calibration.descriptors().at(1).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(calibration.descriptors().at(1).value(),
QByteArray::fromHex("4261726f6d2e2043616c6962722e"));
QVERIFY(info->contains(calibration.descriptors().at(1)));
@@ -1325,22 +1288,20 @@ void tst_QLowEnergyController::verifyServiceProperties(
temp = QString("f000aa44-0451-4000-b000-000000000000");
QCOMPARE(period.uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(period.handle(), QLowEnergyHandle(0x58));
QCOMPARE(period.properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write));
QCOMPARE(period.value(), QByteArray::fromHex("64"));
QVERIFY(period.isValid());
QVERIFY(info->contains(period));
- QCOMPARE(period.descriptors().count(), 1);
+ QCOMPARE(period.descriptors().size(), 1);
//descriptor checks
QCOMPARE(period.descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(period.descriptors().at(0).handle(), QLowEnergyHandle(0x59));
QCOMPARE(period.descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(period.descriptors().at(0).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(period.descriptors().at(0).value(),
QByteArray::fromHex("4261726f6d2e20506572696f64"));
QVERIFY(info->contains(period.descriptors().at(0)));
@@ -1349,38 +1310,35 @@ void tst_QLowEnergyController::verifyServiceProperties(
QBluetoothUuid(QString("f000aa50-0451-4000-b000-000000000000"))) {
qDebug() << "Verifying Gyroscope";
QList<QLowEnergyCharacteristic> chars = info->characteristics();
- QVERIFY(chars.count() >= 2);
+ QVERIFY(chars.size() >= 2);
// Gyroscope Data
QString temp("f000aa51-0451-4000-b000-000000000000");
QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x60));
QCOMPARE(chars[0].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Notify));
QCOMPARE(chars[0].value(), QByteArray::fromHex("000000000000"));
QVERIFY(chars[0].isValid());
QVERIFY(info->contains(chars[0]));
- QCOMPARE(chars[0].descriptors().count(), 2);
+ QCOMPARE(chars[0].descriptors().size(), 2);
//descriptor checks
QCOMPARE(chars[0].descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x61));
QCOMPARE(chars[0].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration));
QCOMPARE(chars[0].descriptors().at(0).type(),
- QBluetoothUuid::ClientCharacteristicConfiguration);
+ QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value()));
QVERIFY(info->contains(chars[0].descriptors().at(0)));
QCOMPARE(chars[0].descriptors().at(1).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x62));
QCOMPARE(chars[0].descriptors().at(1).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[0].descriptors().at(1).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
// value different in other revisions and test may fail
QCOMPARE(chars[0].descriptors().at(1).value(),
QByteArray::fromHex("4779726f2044617461"));
@@ -1390,22 +1348,20 @@ void tst_QLowEnergyController::verifyServiceProperties(
temp = QString("f000aa52-0451-4000-b000-000000000000");
QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x64));
QCOMPARE(chars[1].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write));
QCOMPARE(chars[1].value(), QByteArray::fromHex("00"));
QVERIFY(chars[1].isValid());
QVERIFY(info->contains(chars[1]));
- QCOMPARE(chars[1].descriptors().count(), 1);
+ QCOMPARE(chars[1].descriptors().size(), 1);
//descriptor checks
QCOMPARE(chars[1].descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x65));
QCOMPARE(chars[1].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[1].descriptors().at(0).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[1].descriptors().at(0).value(),
QByteArray::fromHex("4779726f20436f6e662e"));
QVERIFY(info->contains(chars[1].descriptors().at(0)));
@@ -1414,21 +1370,19 @@ void tst_QLowEnergyController::verifyServiceProperties(
temp = QString("f000aa53-0451-4000-b000-000000000000");
QCOMPARE(chars[2].uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[2].handle(), QLowEnergyHandle(0x67));
QCOMPARE(chars[2].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write));
QCOMPARE(chars[2].value(), QByteArray::fromHex("64"));
QVERIFY(chars[2].isValid());
QVERIFY(info->contains(chars[2]));
- QCOMPARE(chars[2].descriptors().count(), 1);
+ QCOMPARE(chars[2].descriptors().size(), 1);
//descriptor checks
QCOMPARE(chars[2].descriptors().at(0).isValid(), true);
- HANDLE_COMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x68));
QCOMPARE(chars[2].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[2].descriptors().at(0).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[2].descriptors().at(0).value(),
QByteArray::fromHex("4779726f20506572696f64"));
QVERIFY(info->contains(chars[2].descriptors().at(0)));
@@ -1436,27 +1390,25 @@ void tst_QLowEnergyController::verifyServiceProperties(
QBluetoothUuid(QString("f000aa60-0451-4000-b000-000000000000"))) {
qDebug() << "Verifying Test Service";
QList<QLowEnergyCharacteristic> chars = info->characteristics();
- QCOMPARE(chars.count(), 2);
+ QCOMPARE(chars.size(), 2);
// Test Data
QString temp("f000aa61-0451-4000-b000-000000000000");
QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x70));
QCOMPARE(chars[0].properties(),
(QLowEnergyCharacteristic::Read));
QCOMPARE(chars[0].value(), QByteArray::fromHex("3f00"));
QVERIFY(chars[0].isValid());
QVERIFY(info->contains(chars[0]));
- QCOMPARE(chars[0].descriptors().count(), 1);
+ QCOMPARE(chars[0].descriptors().size(), 1);
QCOMPARE(chars[0].descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x71));
QCOMPARE(chars[0].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[0].descriptors().at(0).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[0].descriptors().at(0).value(),
QByteArray::fromHex("546573742044617461"));
QVERIFY(info->contains(chars[0].descriptors().at(0)));
@@ -1464,22 +1416,20 @@ void tst_QLowEnergyController::verifyServiceProperties(
// Test Config
temp = QString("f000aa62-0451-4000-b000-000000000000");
QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x73));
QCOMPARE(chars[1].properties(),
(QLowEnergyCharacteristic::Read|QLowEnergyCharacteristic::Write));
QCOMPARE(chars[1].value(), QByteArray::fromHex("00"));
QVERIFY(chars[1].isValid());
QVERIFY(info->contains(chars[1]));
- QCOMPARE(chars[1].descriptors().count(), 1);
+ QCOMPARE(chars[1].descriptors().size(), 1);
//descriptor checks
QCOMPARE(chars[1].descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x74));
QCOMPARE(chars[1].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[1].descriptors().at(0).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[1].descriptors().at(0).value(),
QByteArray::fromHex("5465737420436f6e666967"));
QVERIFY(info->contains(chars[1].descriptors().at(0)));
@@ -1487,12 +1437,11 @@ void tst_QLowEnergyController::verifyServiceProperties(
QBluetoothUuid(QString("f000ccc0-0451-4000-b000-000000000000"))) {
qDebug() << "Connection Control Service";
QList<QLowEnergyCharacteristic> chars = info->characteristics();
- QCOMPARE(chars.count(), 3);
+ QCOMPARE(chars.size(), 3);
//first characteristic
QString temp("f000ccc1-0451-4000-b000-000000000000");
QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x77));
QCOMPARE(chars[0].properties(),
(QLowEnergyCharacteristic::Notify|QLowEnergyCharacteristic::Read));
// the connection control parameter change from platform to platform
@@ -1501,24 +1450,22 @@ void tst_QLowEnergyController::verifyServiceProperties(
QVERIFY(chars[0].isValid());
QVERIFY(info->contains(chars[0]));
- QCOMPARE(chars[0].descriptors().count(), 2);
+ QCOMPARE(chars[0].descriptors().size(), 2);
//descriptor checks
QCOMPARE(chars[0].descriptors().at(0).isValid(), true);
- HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x78));
QCOMPARE(chars[0].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration));
QCOMPARE(chars[0].descriptors().at(0).type(),
- QBluetoothUuid::ClientCharacteristicConfiguration);
+ QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value()));
QVERIFY(info->contains(chars[0].descriptors().at(0)));
QCOMPARE(chars[0].descriptors().at(1).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x79));
QCOMPARE(chars[0].descriptors().at(1).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[0].descriptors().at(1).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[0].descriptors().at(1).value(),
QByteArray::fromHex("436f6e6e2e20506172616d73"));
QVERIFY(info->contains(chars[0].descriptors().at(1)));
@@ -1526,19 +1473,17 @@ void tst_QLowEnergyController::verifyServiceProperties(
//second characteristic
temp = QString("f000ccc2-0451-4000-b000-000000000000");
QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x7b));
QCOMPARE(chars[1].properties(), QLowEnergyCharacteristic::Write);
QCOMPARE(chars[1].value(), QByteArray());
QVERIFY(chars[1].isValid());
QVERIFY(info->contains(chars[1]));
- QCOMPARE(chars[1].descriptors().count(), 1);
+ QCOMPARE(chars[1].descriptors().size(), 1);
QCOMPARE(chars[1].descriptors().at(0).isValid(), true);
- HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x7c));
QCOMPARE(chars[1].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[1].descriptors().at(0).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[1].descriptors().at(0).value(),
QByteArray::fromHex("436f6e6e2e20506172616d7320526571"));
QVERIFY(info->contains(chars[1].descriptors().at(0)));
@@ -1546,19 +1491,17 @@ void tst_QLowEnergyController::verifyServiceProperties(
//third characteristic
temp = QString("f000ccc3-0451-4000-b000-000000000000");
QCOMPARE(chars[2].uuid(), QBluetoothUuid(temp));
- HANDLE_COMPARE(chars[2].handle(), QLowEnergyHandle(0x7e));
QCOMPARE(chars[2].properties(), QLowEnergyCharacteristic::Write);
QCOMPARE(chars[2].value(), QByteArray());
QVERIFY(chars[2].isValid());
QVERIFY(info->contains(chars[2]));
- QCOMPARE(chars[2].descriptors().count(), 1);
+ QCOMPARE(chars[2].descriptors().size(), 1);
QCOMPARE(chars[2].descriptors().at(0).isValid(), true);
- HANDLE_COMPARE(chars[2].descriptors().at(0).handle(), QLowEnergyHandle(0x7f));
QCOMPARE(chars[2].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[2].descriptors().at(0).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[2].descriptors().at(0).value(),
QByteArray::fromHex("446973636f6e6e65637420526571"));
QVERIFY(info->contains(chars[2].descriptors().at(0)));
@@ -1566,37 +1509,34 @@ void tst_QLowEnergyController::verifyServiceProperties(
QBluetoothUuid(QString("f000ffc0-0451-4000-b000-000000000000"))) {
qDebug() << "Verifying OID Service";
QList<QLowEnergyCharacteristic> chars = info->characteristics();
- QCOMPARE(chars.count(), 2);
+ QCOMPARE(chars.size(), 2);
// first characteristic
QString temp("f000ffc1-0451-4000-b000-000000000000");
QCOMPARE(chars[0].uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].handle(), QLowEnergyHandle(0x82));
QCOMPARE(chars[0].properties(),
(QLowEnergyCharacteristic::Notify|QLowEnergyCharacteristic::Write|QLowEnergyCharacteristic::WriteNoResponse));
QCOMPARE(chars[0].value(), QByteArray());
QVERIFY(chars[0].isValid());
QVERIFY(info->contains(chars[0]));
- QCOMPARE(chars[0].descriptors().count(), 2);
+ QCOMPARE(chars[0].descriptors().size(), 2);
//descriptor checks
QCOMPARE(chars[0].descriptors().at(0).isValid(), true);
- HANDLE_COMPARE(chars[0].descriptors().at(0).handle(), QLowEnergyHandle(0x83));
QCOMPARE(chars[0].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration));
QCOMPARE(chars[0].descriptors().at(0).type(),
- QBluetoothUuid::ClientCharacteristicConfiguration);
+ QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value()));
QVERIFY(info->contains(chars[0].descriptors().at(0)));
QCOMPARE(chars[0].descriptors().at(1).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[0].descriptors().at(1).handle(), QLowEnergyHandle(0x84));
QCOMPARE(chars[0].descriptors().at(1).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[0].descriptors().at(1).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[0].descriptors().at(1).value(),
QByteArray::fromHex("496d67204964656e74696679"));
QVERIFY(info->contains(chars[0].descriptors().at(1)));
@@ -1605,32 +1545,29 @@ void tst_QLowEnergyController::verifyServiceProperties(
temp = QString("f000ffc2-0451-4000-b000-000000000000");
QCOMPARE(chars[1].uuid(), QBluetoothUuid(temp));
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[1].handle(), QLowEnergyHandle(0x86));
QCOMPARE(chars[1].properties(),
(QLowEnergyCharacteristic::Notify|QLowEnergyCharacteristic::Write|QLowEnergyCharacteristic::WriteNoResponse));
QCOMPARE(chars[1].value(), QByteArray());
QVERIFY(chars[1].isValid());
QVERIFY(info->contains(chars[1]));
- QCOMPARE(chars[1].descriptors().count(), 2);
+ QCOMPARE(chars[1].descriptors().size(), 2);
//descriptor checks
QCOMPARE(chars[1].descriptors().at(0).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[1].descriptors().at(0).handle(), QLowEnergyHandle(0x87));
QCOMPARE(chars[1].descriptors().at(0).uuid(),
- QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration));
QCOMPARE(chars[1].descriptors().at(0).type(),
- QBluetoothUuid::ClientCharacteristicConfiguration);
+ QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
QVERIFY(verifyClientCharacteristicValue(chars[0].descriptors().at(0).value()));
QVERIFY(info->contains(chars[1].descriptors().at(0)));
QCOMPARE(chars[1].descriptors().at(1).isValid(), true);
// value different in other revisions and test may fail
- HANDLE_COMPARE(chars[1].descriptors().at(1).handle(), QLowEnergyHandle(0x88));
QCOMPARE(chars[1].descriptors().at(1).uuid(),
- QBluetoothUuid(QBluetoothUuid::CharacteristicUserDescription));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::CharacteristicUserDescription));
QCOMPARE(chars[1].descriptors().at(1).type(),
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QCOMPARE(chars[1].descriptors().at(1).value(),
QByteArray::fromHex("496d6720426c6f636b"));
QVERIFY(info->contains(chars[1].descriptors().at(1)));
@@ -1671,44 +1608,50 @@ void tst_QLowEnergyController::tst_defaultBehavior()
const QBluetoothAddress randomAddress("11:22:33:44:55:66");
// Test automatic detection of local adapter
- QLowEnergyController controlDefaultAdapter(randomAddress);
- QCOMPARE(controlDefaultAdapter.remoteAddress(), randomAddress);
- QCOMPARE(controlDefaultAdapter.state(), QLowEnergyController::UnconnectedState);
+ QScopedPointer<QLowEnergyController> controlDefaultAdapter(QLowEnergyController::createCentral(
+ QBluetoothDeviceInfo(randomAddress, QString("random"), 1)));
+
+ QCOMPARE(controlDefaultAdapter->remoteAddress(), randomAddress);
+ QCOMPARE(controlDefaultAdapter->state(), QLowEnergyController::UnconnectedState);
if (foundAddresses.isEmpty()) {
- QVERIFY(controlDefaultAdapter.localAddress().isNull());
+ QVERIFY(controlDefaultAdapter->localAddress().isNull());
} else {
- QCOMPARE(controlDefaultAdapter.error(), QLowEnergyController::NoError);
- QVERIFY(controlDefaultAdapter.errorString().isEmpty());
- QVERIFY(foundAddresses.contains(controlDefaultAdapter.localAddress()));
+ QCOMPARE(controlDefaultAdapter->error(), QLowEnergyController::NoError);
+ QVERIFY(controlDefaultAdapter->errorString().isEmpty());
+ QVERIFY(foundAddresses.contains(controlDefaultAdapter->localAddress()));
// unrelated uuids don't return valid service object
// invalid service uuid
- QVERIFY(!controlDefaultAdapter.createServiceObject(
+ QVERIFY(!controlDefaultAdapter->createServiceObject(
QBluetoothUuid()));
// some random uuid
- QVERIFY(!controlDefaultAdapter.createServiceObject(
- QBluetoothUuid(QBluetoothUuid::DeviceName)));
+ QVERIFY(!controlDefaultAdapter->createServiceObject(
+ QBluetoothUuid(QBluetoothUuid::CharacteristicType::DeviceName)));
}
- QCOMPARE(controlDefaultAdapter.services().count(), 0);
+ QCOMPARE(controlDefaultAdapter->services().size(), 0);
// Test explicit local adapter
if (!foundAddresses.isEmpty()) {
- QLowEnergyController controlExplicitAdapter(randomAddress,
- foundAddresses[0]);
- QCOMPARE(controlExplicitAdapter.remoteAddress(), randomAddress);
- QCOMPARE(controlExplicitAdapter.localAddress(), foundAddresses[0]);
- QCOMPARE(controlExplicitAdapter.state(),
+
+ QScopedPointer<QLowEnergyController> controlExplicitAdapter(
+ QLowEnergyController::createCentral(
+ QBluetoothDeviceInfo(randomAddress, QString("random"), 1),
+ foundAddresses[0]));
+
+ QCOMPARE(controlExplicitAdapter->remoteAddress(), randomAddress);
+ QCOMPARE(controlExplicitAdapter->localAddress(), foundAddresses[0]);
+ QCOMPARE(controlExplicitAdapter->state(),
QLowEnergyController::UnconnectedState);
- QCOMPARE(controlExplicitAdapter.services().count(), 0);
+ QCOMPARE(controlExplicitAdapter->services().size(), 0);
// unrelated uuids don't return valid service object
// invalid service uuid
- QVERIFY(!controlExplicitAdapter.createServiceObject(
+ QVERIFY(!controlExplicitAdapter->createServiceObject(
QBluetoothUuid()));
// some random uuid
- QVERIFY(!controlExplicitAdapter.createServiceObject(
- QBluetoothUuid(QBluetoothUuid::DeviceName)));
+ QVERIFY(!controlExplicitAdapter->createServiceObject(
+ QBluetoothUuid(QBluetoothUuid::CharacteristicType::DeviceName)));
}
}
@@ -1722,42 +1665,43 @@ void tst_QLowEnergyController::tst_writeCharacteristic()
if (!remoteDeviceInfo.isValid())
QSKIP("No remote BTLE device found. Skipping test.");
- QLowEnergyController control(remoteDeviceInfo);
+ QScopedPointer<QLowEnergyController> control(
+ QLowEnergyController::createCentral(remoteDeviceInfo));
- QCOMPARE(control.error(), QLowEnergyController::NoError);
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
- control.connectToDevice();
+ control->connectToDevice();
{
- QTRY_IMPL(control.state() != QLowEnergyController::ConnectingState,
- 30000);
+ QTRY_IMPL(control->state() != QLowEnergyController::ConnectingState,
+ 30000)
}
- if (control.state() == QLowEnergyController::ConnectingState
- || control.error() != QLowEnergyController::NoError) {
+ if (control->state() == QLowEnergyController::ConnectingState
+ || control->error() != QLowEnergyController::NoError) {
// default BTLE backend forever hangs in ConnectingState
QSKIP("Cannot connect to remote device");
}
- QCOMPARE(control.state(), QLowEnergyController::ConnectedState);
- QSignalSpy discoveryFinishedSpy(&control, SIGNAL(discoveryFinished()));
- QSignalSpy stateSpy(&control, SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
- control.discoverServices();
- QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 20000);
- QCOMPARE(stateSpy.count(), 2);
+ QTRY_VERIFY_WITH_TIMEOUT(control->state() == QLowEnergyController::ConnectedState, 20000);
+ QSignalSpy discoveryFinishedSpy(control.data(), SIGNAL(discoveryFinished()));
+ QSignalSpy stateSpy(control.data(), SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
+ control->discoverServices();
+ QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.size() == 1, 20000);
+ QCOMPARE(stateSpy.size(), 2);
QCOMPARE(stateSpy.at(0).at(0).value<QLowEnergyController::ControllerState>(),
QLowEnergyController::DiscoveringState);
QCOMPARE(stateSpy.at(1).at(0).value<QLowEnergyController::ControllerState>(),
QLowEnergyController::DiscoveredState);
const QBluetoothUuid testService(QString("f000aa60-0451-4000-b000-000000000000"));
- QList<QBluetoothUuid> uuids = control.services();
+ QList<QBluetoothUuid> uuids = control->services();
QVERIFY(uuids.contains(testService));
- QLowEnergyService *service = control.createServiceObject(testService, this);
+ QLowEnergyService *service = control->createServiceObject(testService, this);
QVERIFY(service);
service->discoverDetails();
QTRY_VERIFY_WITH_TIMEOUT(
- service->state() == QLowEnergyService::ServiceDiscovered, 30000);
+ service->state() == QLowEnergyService::RemoteServiceDiscovered, 30000);
// test service described by
// http://processors.wiki.ti.com/index.php/CC2650_SensorTag_User%27s_Guide
@@ -1765,7 +1709,7 @@ void tst_QLowEnergyController::tst_writeCharacteristic()
QLowEnergyCharacteristic dataChar;
QLowEnergyCharacteristic configChar;
- for (int i = 0; i < chars.count(); i++) {
+ for (qsizetype i = 0; i < chars.size(); ++i) {
if (chars[i].uuid() == QBluetoothUuid(QString("f000aa61-0451-4000-b000-000000000000")))
dataChar = chars[i];
else if (chars[i].uuid() == QBluetoothUuid(QString("f000aa62-0451-4000-b000-000000000000")))
@@ -1812,7 +1756,7 @@ void tst_QLowEnergyController::tst_writeCharacteristic()
service->readCharacteristic(configChar);
QTRY_VERIFY_WITH_TIMEOUT(!readSpy.isEmpty(), 10000);
QCOMPARE(configChar.value(), QByteArray::fromHex("81"));
- QCOMPARE(readSpy.count(), 1); //expect one characteristicRead signal
+ QCOMPARE(readSpy.size(), 1); //expect one characteristicRead signal
{
//verify the readCharacteristic()
QList<QVariant> firstSignalData = readSpy.first();
@@ -1836,10 +1780,10 @@ void tst_QLowEnergyController::tst_writeCharacteristic()
// *******************************************
// write wrong value -> error response required
- QSignalSpy errorSpy(service, SIGNAL(error(QLowEnergyService::ServiceError)));
+ QSignalSpy errorSpy(service, SIGNAL(errorOccurred(QLowEnergyService::ServiceError)));
writeSpy.clear();
- QCOMPARE(errorSpy.count(), 0);
- QCOMPARE(writeSpy.count(), 0);
+ QCOMPARE(errorSpy.size(), 0);
+ QCOMPARE(writeSpy.size(), 0);
// write 2 byte value to 1 byte characteristic
service->writeCharacteristic(configChar, QByteArray::fromHex("1111"));
@@ -1847,35 +1791,36 @@ void tst_QLowEnergyController::tst_writeCharacteristic()
QCOMPARE(errorSpy[0].at(0).value<QLowEnergyService::ServiceError>(),
QLowEnergyService::CharacteristicWriteError);
QCOMPARE(service->error(), QLowEnergyService::CharacteristicWriteError);
- QCOMPARE(writeSpy.count(), 0);
+ QCOMPARE(writeSpy.size(), 0);
QCOMPARE(configChar.value(), QByteArray::fromHex("00"));
// *******************************************
// write to read-only characteristic -> error
errorSpy.clear();
- QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(errorSpy.size(), 0);
service->writeCharacteristic(dataChar, QByteArray::fromHex("ffff"));
QTRY_VERIFY_WITH_TIMEOUT(!errorSpy.isEmpty(), 10000);
QCOMPARE(errorSpy[0].at(0).value<QLowEnergyService::ServiceError>(),
QLowEnergyService::CharacteristicWriteError);
QCOMPARE(service->error(), QLowEnergyService::CharacteristicWriteError);
- QCOMPARE(writeSpy.count(), 0);
+ QCOMPARE(writeSpy.size(), 0);
QCOMPARE(dataChar.value(), QByteArray::fromHex("3f00"));
- control.disconnectFromDevice();
-
+ control->disconnectFromDevice();
+ QTRY_COMPARE(control->state(), QLowEnergyController::UnconnectedState);
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
// *******************************************
// write value while disconnected -> error
errorSpy.clear();
- QCOMPARE(errorSpy.count(), 0);
+ QCOMPARE(errorSpy.size(), 0);
service->writeCharacteristic(configChar, QByteArray::fromHex("ffff"));
QTRY_VERIFY_WITH_TIMEOUT(!errorSpy.isEmpty(), 2000);
QCOMPARE(errorSpy[0].at(0).value<QLowEnergyService::ServiceError>(),
QLowEnergyService::OperationError);
QCOMPARE(service->error(), QLowEnergyService::OperationError);
- QCOMPARE(writeSpy.count(), 0);
+ QCOMPARE(writeSpy.size(), 0);
QCOMPARE(configChar.value(), QByteArray::fromHex("00"));
// invalid characteristics still belong to their respective service
@@ -1897,73 +1842,77 @@ void tst_QLowEnergyController::tst_readWriteDescriptor()
if (!remoteDeviceInfo.isValid())
QSKIP("No remote BTLE device found. Skipping test.");
- QLowEnergyController control(remoteDeviceInfo);
+ QScopedPointer<QLowEnergyController> control(QLowEnergyController::createCentral(remoteDeviceInfo));
// quick setup - more elaborate test is done by connect()
- control.connectToDevice();
+ control->connectToDevice();
{
- QTRY_IMPL(control.state() != QLowEnergyController::ConnectingState,
- 30000);
+ QTRY_IMPL(control->state() != QLowEnergyController::ConnectingState,
+ 30000)
}
- if (control.state() == QLowEnergyController::ConnectingState
- || control.error() != QLowEnergyController::NoError) {
+ if (control->state() == QLowEnergyController::ConnectingState
+ || control->error() != QLowEnergyController::NoError) {
// default BTLE backend forever hangs in ConnectingState
QSKIP("Cannot connect to remote device");
}
- QCOMPARE(control.state(), QLowEnergyController::ConnectedState);
- QSignalSpy discoveryFinishedSpy(&control, SIGNAL(discoveryFinished()));
- QSignalSpy stateSpy(&control, SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
- control.discoverServices();
- QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 20000);
- QCOMPARE(stateSpy.count(), 2);
+ QCOMPARE(control->state(), QLowEnergyController::ConnectedState);
+ QSignalSpy discoveryFinishedSpy(control.data(), SIGNAL(discoveryFinished()));
+ QSignalSpy stateSpy(control.data(), SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
+ control->discoverServices();
+ QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.size() == 1, 20000);
+ QCOMPARE(stateSpy.size(), 2);
QCOMPARE(stateSpy.at(0).at(0).value<QLowEnergyController::ControllerState>(),
QLowEnergyController::DiscoveringState);
QCOMPARE(stateSpy.at(1).at(0).value<QLowEnergyController::ControllerState>(),
QLowEnergyController::DiscoveredState);
- const QBluetoothUuid testService(QString("f000aa00-0451-4000-b000-000000000000"));
- QList<QBluetoothUuid> uuids = control.services();
+ const QBluetoothUuid testService(QString("f000aa20-0451-4000-b000-000000000000"));
+ QList<QBluetoothUuid> uuids = control->services();
QVERIFY(uuids.contains(testService));
- QLowEnergyService *service = control.createServiceObject(testService, this);
+ QLowEnergyService *service = control->createServiceObject(testService, this);
QVERIFY(service);
service->discoverDetails();
QTRY_VERIFY_WITH_TIMEOUT(
- service->state() == QLowEnergyService::ServiceDiscovered, 30000);
+ service->state() == QLowEnergyService::RemoteServiceDiscovered, 30000);
- // Temperature service described by
+ // Humidity service described by
// http://processors.wiki.ti.com/index.php/CC2650_SensorTag_User%27s_Guide
- // 1. Find temperature data characteristic
- const QLowEnergyCharacteristic tempData = service->characteristic(
- QBluetoothUuid(QStringLiteral("f000aa01-0451-4000-b000-000000000000")));
- const QLowEnergyCharacteristic tempConfig = service->characteristic(
- QBluetoothUuid(QStringLiteral("f000aa02-0451-4000-b000-000000000000")));
+ // 1. Find humidity data characteristic
+ const QLowEnergyCharacteristic humidData = service->characteristic(
+ QBluetoothUuid(QStringLiteral("f000aa21-0451-4000-b000-000000000000")));
+ const QLowEnergyCharacteristic humidConfig = service->characteristic(
+ QBluetoothUuid(QStringLiteral("f000aa22-0451-4000-b000-000000000000")));
- if (!tempData.isValid()) {
+ if (!humidData.isValid()) {
delete service;
- control.disconnectFromDevice();
- QSKIP("Cannot find temperature data characteristic of TI Sensor");
+ control->disconnectFromDevice();
+ QTRY_COMPARE(control->state(), QLowEnergyController::UnconnectedState);
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
+ QSKIP("Cannot find humidity data characteristic of TI Sensor");
}
- // 2. Find temperature data notification descriptor
- const QLowEnergyDescriptor notification = tempData.descriptor(
- QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration));
+ // 2. Find humidity data notification descriptor
+ const QLowEnergyDescriptor notification = humidData.descriptor(
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration));
if (!notification.isValid()) {
delete service;
- control.disconnectFromDevice();
- QSKIP("Cannot find temperature data notification of TI Sensor");
+ control->disconnectFromDevice();
+ QTRY_COMPARE(control->state(), QLowEnergyController::UnconnectedState);
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
+ QSKIP("Cannot find humidity data notification of TI Sensor");
}
QCOMPARE(notification.value(), QByteArray::fromHex("0000"));
QVERIFY(service->contains(notification));
- QVERIFY(service->contains(tempData));
- if (tempConfig.isValid()) {
- QVERIFY(service->contains(tempConfig));
- QCOMPARE(tempConfig.value(), QByteArray::fromHex("00"));
+ QVERIFY(service->contains(humidData));
+ if (humidConfig.isValid()) {
+ QVERIFY(service->contains(humidConfig));
+ QCOMPARE(humidConfig.value(), QByteArray::fromHex("00"));
}
// 3. Test reading and writing to descriptor -> activate notifications
@@ -1994,46 +1943,46 @@ void tst_QLowEnergyController::tst_readWriteDescriptor()
}
// 4. Test reception of notifications
- // activate the temperature sensor if available
- if (tempConfig.isValid()) {
- service->writeCharacteristic(tempConfig, QByteArray::fromHex("01"));
+ // activate the humidity sensor if available
+ if (humidConfig.isValid()) {
+ service->writeCharacteristic(humidConfig, QByteArray::fromHex("01"));
- // first signal is confirmation of tempConfig write
+ // first signal is confirmation of humidConfig write
// subsequent signals are temp data updates
- QTRY_VERIFY_WITH_TIMEOUT(charWrittenSpy.count() == 1, 10000);
- QTRY_VERIFY_WITH_TIMEOUT(charChangedSpy.count() >= 4, 10000);
+ QTRY_VERIFY_WITH_TIMEOUT(charWrittenSpy.size() == 1, 10000);
+ QTRY_VERIFY_WITH_TIMEOUT(charChangedSpy.size() >= 4, 10000);
- QCOMPARE(charWrittenSpy.count(), 1);
+ QCOMPARE(charWrittenSpy.size(), 1);
QLowEnergyCharacteristic writtenChar = charWrittenSpy[0].at(0).value<QLowEnergyCharacteristic>();
QByteArray writtenValue = charWrittenSpy[0].at(1).toByteArray();
- QCOMPARE(tempConfig, writtenChar);
- QCOMPARE(tempConfig.value(), writtenValue);
+ QCOMPARE(humidConfig, writtenChar);
+ QCOMPARE(humidConfig.value(), writtenValue);
QCOMPARE(writtenChar.value(), writtenValue);
QCOMPARE(writtenValue, QByteArray::fromHex("01"));
QList<QVariant> entry;
- for (int i = 0; i < charChangedSpy.count(); i++) {
+ for (qsizetype i = 0; i < charChangedSpy.size(); ++i) {
entry = charChangedSpy[i];
const QLowEnergyCharacteristic ch = entry[0].value<QLowEnergyCharacteristic>();
- QCOMPARE(tempData, ch);
+ QCOMPARE(humidData, ch);
//check last characteristic changed value matches the characteristics current value
- if (i == (charChangedSpy.count() - 1)) {
+ if (i == (charChangedSpy.size() - 1)) {
writtenValue = entry[1].toByteArray();
QCOMPARE(ch.value(), writtenValue);
- QCOMPARE(tempData.value(), writtenValue);
+ QCOMPARE(humidData.value(), writtenValue);
}
}
- service->writeCharacteristic(tempConfig, QByteArray::fromHex("00"));
+ service->writeCharacteristic(humidConfig, QByteArray::fromHex("00"));
}
// 5. Test reading and writing of/to descriptor -> deactivate notifications
service->readDescriptor(notification);
QTRY_VERIFY_WITH_TIMEOUT(!descReadSpy.isEmpty(), 3000);
- QCOMPARE(descReadSpy.count(), 1);
+ QCOMPARE(descReadSpy.size(), 1);
firstSignalData = descReadSpy.first();
signalDesc = firstSignalData[0].value<QLowEnergyDescriptor>();
signalValue = firstSignalData[1].toByteArray();
@@ -2077,10 +2026,10 @@ void tst_QLowEnergyController::tst_readWriteDescriptor()
if (isBluezDbusLE)
QTest::qWait(1000);
- QTRY_VERIFY_WITH_TIMEOUT(descWrittenSpy.count() == 4, 10000);
+ QTRY_VERIFY_WITH_TIMEOUT(descWrittenSpy.size() == 4, 10000);
QCOMPARE(notification.value(), QByteArray::fromHex("0000"));
- for (int i = 0; i < descWrittenSpy.count(); i++) {
+ for (qsizetype i = 0; i < descWrittenSpy.size(); ++i) {
firstSignalData = descWrittenSpy.at(i);
signalDesc = firstSignalData[0].value<QLowEnergyDescriptor>();
signalValue = firstSignalData[1].toByteArray();
@@ -2096,7 +2045,7 @@ void tst_QLowEnergyController::tst_readWriteDescriptor()
service->readDescriptor(notification);
QTRY_VERIFY_WITH_TIMEOUT(!descReadSpy.isEmpty(), 3000);
- QCOMPARE(descReadSpy.count(), 1);
+ QCOMPARE(descReadSpy.size(), 1);
firstSignalData = descReadSpy.first();
signalDesc = firstSignalData[0].value<QLowEnergyDescriptor>();
signalValue = firstSignalData[1].toByteArray();
@@ -2108,10 +2057,10 @@ void tst_QLowEnergyController::tst_readWriteDescriptor()
// *******************************************
// write wrong value -> error response required
- QSignalSpy errorSpy(service, SIGNAL(error(QLowEnergyService::ServiceError)));
+ QSignalSpy errorSpy(service, SIGNAL(errorOccurred(QLowEnergyService::ServiceError)));
descWrittenSpy.clear();
- QCOMPARE(errorSpy.count(), 0);
- QCOMPARE(descWrittenSpy.count(), 0);
+ QCOMPARE(errorSpy.size(), 0);
+ QCOMPARE(descWrittenSpy.size(), 0);
// write 4 byte value to 2 byte characteristic
service->writeDescriptor(notification, QByteArray::fromHex("11112222"));
@@ -2127,10 +2076,12 @@ void tst_QLowEnergyController::tst_readWriteDescriptor()
QCOMPARE(errorSpy[0].at(0).value<QLowEnergyService::ServiceError>(),
QLowEnergyService::DescriptorWriteError);
QCOMPARE(service->error(), QLowEnergyService::DescriptorWriteError);
- QCOMPARE(descWrittenSpy.count(), 0);
+ QCOMPARE(descWrittenSpy.size(), 0);
QCOMPARE(notification.value(), QByteArray::fromHex("0000"));
- control.disconnectFromDevice();
+ control->disconnectFromDevice();
+ QTRY_COMPARE(control->state(), QLowEnergyController::UnconnectedState);
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
// *******************************************
// write value while disconnected -> error
@@ -2140,7 +2091,7 @@ void tst_QLowEnergyController::tst_readWriteDescriptor()
QCOMPARE(errorSpy[0].at(0).value<QLowEnergyService::ServiceError>(),
QLowEnergyService::OperationError);
QCOMPARE(service->error(), QLowEnergyService::OperationError);
- QCOMPARE(descWrittenSpy.count(), 0);
+ QCOMPARE(descWrittenSpy.size(), 0);
QCOMPARE(notification.value(), QByteArray::fromHex("0000"));
delete service;
@@ -2181,45 +2132,46 @@ void tst_QLowEnergyController::tst_customProgrammableDevice()
//The target characteristic must be readble and writable
//under encryption to test dynamic switching of security level
QBluetoothAddress encryptedDevice(QString("00:02:5B:00:15:10"));
- QBluetoothUuid serviceUuid(QBluetoothUuid::GenericAccess);
- QBluetoothUuid characterristicUuid(QBluetoothUuid::DeviceName);
+ QBluetoothUuid serviceUuid(QBluetoothUuid::ServiceClassUuid::GenericAccess);
+ QBluetoothUuid characterristicUuid(QBluetoothUuid::CharacteristicType::DeviceName);
- QLowEnergyController control(encryptedDevice);
- QCOMPARE(control.error(), QLowEnergyController::NoError);
+ QScopedPointer<QLowEnergyController> control(
+ QLowEnergyController::createCentral(QBluetoothDeviceInfo(encryptedDevice, QString("DeviceFoo"), 1)));
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
- control.connectToDevice();
+ control->connectToDevice();
{
- QTRY_IMPL(control.state() != QLowEnergyController::ConnectingState,
- 30000);
+ QTRY_IMPL(control->state() != QLowEnergyController::ConnectingState,
+ 30000)
}
- if (control.state() == QLowEnergyController::ConnectingState
- || control.error() != QLowEnergyController::NoError) {
+ if (control->state() == QLowEnergyController::ConnectingState
+ || control->error() != QLowEnergyController::NoError) {
// default BTLE backend forever hangs in ConnectingState
QSKIP("Cannot connect to remote device");
}
- QCOMPARE(control.state(), QLowEnergyController::ConnectedState);
- QSignalSpy discoveryFinishedSpy(&control, SIGNAL(discoveryFinished()));
- QSignalSpy stateSpy(&control, SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
- control.discoverServices();
- QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 20000);
- QCOMPARE(stateSpy.count(), 2);
+ QCOMPARE(control->state(), QLowEnergyController::ConnectedState);
+ QSignalSpy discoveryFinishedSpy(control.data(), SIGNAL(discoveryFinished()));
+ QSignalSpy stateSpy(control.data(), SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
+ control->discoverServices();
+ QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.size() == 1, 20000);
+ QCOMPARE(stateSpy.size(), 2);
QCOMPARE(stateSpy.at(0).at(0).value<QLowEnergyController::ControllerState>(),
QLowEnergyController::DiscoveringState);
QCOMPARE(stateSpy.at(1).at(0).value<QLowEnergyController::ControllerState>(),
QLowEnergyController::DiscoveredState);
- QList<QBluetoothUuid> uuids = control.services();
+ QList<QBluetoothUuid> uuids = control->services();
QVERIFY(uuids.contains(serviceUuid));
- QLowEnergyService *service = control.createServiceObject(serviceUuid, this);
+ QLowEnergyService *service = control->createServiceObject(serviceUuid, this);
QVERIFY(service);
// 1.) discovery triggers read of device name char which is encrypted
service->discoverDetails();
QTRY_VERIFY_WITH_TIMEOUT(
- service->state() == QLowEnergyService::ServiceDiscovered, 30000);
+ service->state() == QLowEnergyService::RemoteServiceDiscovered, 30000);
QLowEnergyCharacteristic encryptedChar = service->characteristic(
characterristicUuid);
@@ -2232,12 +2184,11 @@ void tst_QLowEnergyController::tst_customProgrammableDevice()
// encryption already.
QSignalSpy encryptedReadSpy(service,
SIGNAL(characteristicRead(QLowEnergyCharacteristic,QByteArray)));
- QSignalSpy encryptedErrorSpy(service,
- SIGNAL(error(QLowEnergyService::ServiceError)));
+ QSignalSpy encryptedErrorSpy(service, SIGNAL(errorOccurred(QLowEnergyService::ServiceError)));
service->readCharacteristic(encryptedChar);
QTRY_VERIFY_WITH_TIMEOUT(!encryptedReadSpy.isEmpty(), 10000);
QVERIFY(encryptedErrorSpy.isEmpty());
- QCOMPARE(encryptedReadSpy.count(), 1);
+ QCOMPARE(encryptedReadSpy.size(), 1);
QList<QVariant> entry = encryptedReadSpy[0];
QVERIFY(entry[0].value<QLowEnergyCharacteristic>() == encryptedChar);
QCOMPARE(entry[1].toByteArray(), encryptedReference);
@@ -2253,7 +2204,7 @@ void tst_QLowEnergyController::tst_customProgrammableDevice()
QTRY_VERIFY_WITH_TIMEOUT(!encryptedWriteSpy.isEmpty(), 10000);
QVERIFY(encryptedErrorSpy.isEmpty());
QVERIFY(encryptedReadSpy.isEmpty());
- QCOMPARE(encryptedWriteSpy.count(), 1);
+ QCOMPARE(encryptedWriteSpy.size(), 1);
entry = encryptedWriteSpy[0];
QVERIFY(entry[0].value<QLowEnergyCharacteristic>() == encryptedChar);
QCOMPARE(entry[1].toByteArray(), newValue);
@@ -2262,31 +2213,30 @@ void tst_QLowEnergyController::tst_customProgrammableDevice()
delete service;
//change to Device Information service
- QVERIFY(uuids.contains(QBluetoothUuid::DeviceInformation));
- service = control.createServiceObject(QBluetoothUuid::DeviceInformation);
+ QVERIFY(uuids.contains(QBluetoothUuid::ServiceClassUuid::DeviceInformation));
+ service = control->createServiceObject(QBluetoothUuid::ServiceClassUuid::DeviceInformation);
QVERIFY(service);
service->discoverDetails();
QTRY_VERIFY_WITH_TIMEOUT(
- service->state() == QLowEnergyService::ServiceDiscovered, 30000);
+ service->state() == QLowEnergyService::RemoteServiceDiscovered, 30000);
// 4.) read of software revision string which is longer than mtu
// tests readCharacteristic() including blob reads
QSignalSpy readSpy(service,
SIGNAL(characteristicRead(QLowEnergyCharacteristic,QByteArray)));
- QSignalSpy errorSpy(service,
- SIGNAL(error(QLowEnergyService::ServiceError)));
+ QSignalSpy errorSpy(service, SIGNAL(errorOccurred(QLowEnergyService::ServiceError)));
const QByteArray expectedSoftRev("Application version 2.3.0.0");
- QLowEnergyCharacteristic softwareRevChar
- = service->characteristic(QBluetoothUuid::SoftwareRevisionString);
+ QLowEnergyCharacteristic softwareRevChar =
+ service->characteristic(QBluetoothUuid::CharacteristicType::SoftwareRevisionString);
QVERIFY(softwareRevChar.isValid());
QCOMPARE(softwareRevChar.value(), expectedSoftRev);
service->readCharacteristic(softwareRevChar);
QTRY_VERIFY_WITH_TIMEOUT(!readSpy.isEmpty(), 10000);
QVERIFY(errorSpy.isEmpty());
- QCOMPARE(readSpy.count(), 1);
+ QCOMPARE(readSpy.size(), 1);
entry = readSpy[0];
QVERIFY(entry[0].value<QLowEnergyCharacteristic>() == softwareRevChar);
QCOMPARE(entry[1].toByteArray(), expectedSoftRev);
@@ -2303,22 +2253,24 @@ void tst_QLowEnergyController::tst_customProgrammableDevice()
// This assumes the manufacturer string was mondified via CSR SDK
// see function description above
const QByteArray expectedManufacturer("Cambridge Silicon Radi");
- QLowEnergyCharacteristic manufacturerChar = service->characteristic(
- QBluetoothUuid::ManufacturerNameString);
+ QLowEnergyCharacteristic manufacturerChar =
+ service->characteristic(QBluetoothUuid::CharacteristicType::ManufacturerNameString);
QVERIFY(manufacturerChar.isValid());
QCOMPARE(manufacturerChar.value(), expectedManufacturer);
service->readCharacteristic(manufacturerChar);
QTRY_VERIFY_WITH_TIMEOUT(!readSpy.isEmpty(), 10000);
QVERIFY(errorSpy.isEmpty());
- QCOMPARE(readSpy.count(), 1);
+ QCOMPARE(readSpy.size(), 1);
entry = readSpy[0];
QVERIFY(entry[0].value<QLowEnergyCharacteristic>() == manufacturerChar);
QCOMPARE(entry[1].toByteArray(), expectedManufacturer);
QCOMPARE(manufacturerChar.value(), expectedManufacturer);
delete service;
- control.disconnectFromDevice();
+ control->disconnectFromDevice();
+ QTRY_COMPARE(control->state(), QLowEnergyController::UnconnectedState);
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
}
@@ -2338,27 +2290,27 @@ void tst_QLowEnergyController::tst_errorCases()
if (!remoteDeviceInfo.isValid())
QSKIP("No remote BTLE device found. Skipping test.");
- QLowEnergyController control(remoteDeviceInfo);
- QCOMPARE(control.error(), QLowEnergyController::NoError);
+ QScopedPointer<QLowEnergyController> control(QLowEnergyController::createCentral(remoteDeviceInfo));
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
- control.connectToDevice();
+ control->connectToDevice();
{
- QTRY_IMPL(control.state() != QLowEnergyController::ConnectingState,
- 30000);
+ QTRY_IMPL(control->state() != QLowEnergyController::ConnectingState,
+ 30000)
}
- if (control.state() == QLowEnergyController::ConnectingState
- || control.error() != QLowEnergyController::NoError) {
+ if (control->state() == QLowEnergyController::ConnectingState
+ || control->error() != QLowEnergyController::NoError) {
// default BTLE backend forever hangs in ConnectingState
QSKIP("Cannot connect to remote device");
}
- QCOMPARE(control.state(), QLowEnergyController::ConnectedState);
- QSignalSpy discoveryFinishedSpy(&control, SIGNAL(discoveryFinished()));
- QSignalSpy stateSpy(&control, SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
- control.discoverServices();
- QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 20000);
- QCOMPARE(stateSpy.count(), 2);
+ QCOMPARE(control->state(), QLowEnergyController::ConnectedState);
+ QSignalSpy discoveryFinishedSpy(control.data(), SIGNAL(discoveryFinished()));
+ QSignalSpy stateSpy(control.data(), SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
+ control->discoverServices();
+ QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.size() == 1, 20000);
+ QCOMPARE(stateSpy.size(), 2);
QCOMPARE(stateSpy.at(0).at(0).value<QLowEnergyController::ControllerState>(),
QLowEnergyController::DiscoveringState);
QCOMPARE(stateSpy.at(1).at(0).value<QLowEnergyController::ControllerState>(),
@@ -2371,17 +2323,17 @@ void tst_QLowEnergyController::tst_errorCases()
const QBluetoothUuid oadServiceUuid(QStringLiteral("f000ffc0-0451-4000-b000-000000000000"));
const QBluetoothUuid oadCharUuid(QString("f000ffc1-0451-4000-b000-000000000000"));
- QVERIFY(control.services().contains(irTemperaturServiceUuid));
- QVERIFY(control.services().contains(oadServiceUuid));
+ QVERIFY(control->services().contains(irTemperaturServiceUuid));
+ QVERIFY(control->services().contains(oadServiceUuid));
// Create service objects and basic tests
- QLowEnergyService *irService = control.createServiceObject(irTemperaturServiceUuid);
+ QLowEnergyService *irService = control->createServiceObject(irTemperaturServiceUuid);
QVERIFY(irService);
- QCOMPARE(irService->state(), QLowEnergyService::DiscoveryRequired);
+ QCOMPARE(irService->state(), QLowEnergyService::RemoteService);
QVERIFY(irService->characteristics().isEmpty());
- QLowEnergyService *oadService = control.createServiceObject(oadServiceUuid);
+ QLowEnergyService *oadService = control->createServiceObject(oadServiceUuid);
QVERIFY(oadService);
- QCOMPARE(oadService->state(), QLowEnergyService::DiscoveryRequired);
+ QCOMPARE(oadService->state(), QLowEnergyService::RemoteService);
QVERIFY(oadService->characteristics().isEmpty());
QLowEnergyCharacteristic invalidChar;
@@ -2390,8 +2342,8 @@ void tst_QLowEnergyController::tst_errorCases()
QVERIFY(!irService->contains(invalidChar));
QVERIFY(!irService->contains(invalidDesc));
- QSignalSpy irErrorSpy(irService, SIGNAL(error(QLowEnergyService::ServiceError)));
- QSignalSpy oadErrorSpy(oadService, SIGNAL(error(QLowEnergyService::ServiceError)));
+ QSignalSpy irErrorSpy(irService, SIGNAL(errorOccurred(QLowEnergyService::ServiceError)));
+ QSignalSpy oadErrorSpy(oadService, SIGNAL(errorOccurred(QLowEnergyService::ServiceError)));
QSignalSpy irReadSpy(irService, SIGNAL(characteristicRead(QLowEnergyCharacteristic,QByteArray)));
QSignalSpy irWrittenSpy(irService, SIGNAL(characteristicWritten(QLowEnergyCharacteristic,QByteArray)));
@@ -2407,7 +2359,7 @@ void tst_QLowEnergyController::tst_errorCases()
// discover IR Service
irService->discoverDetails();
QTRY_VERIFY_WITH_TIMEOUT(
- irService->state() == QLowEnergyService::ServiceDiscovered, 30000);
+ irService->state() == QLowEnergyService::RemoteServiceDiscovered, 30000);
QVERIFY(!irService->contains(invalidChar));
QVERIFY(!irService->contains(invalidDesc));
irErrorSpy.clear();
@@ -2415,7 +2367,7 @@ void tst_QLowEnergyController::tst_errorCases()
// read invalid characteristic
irService->readCharacteristic(invalidChar);
QTRY_VERIFY_WITH_TIMEOUT(!irErrorSpy.isEmpty(), 5000);
- QCOMPARE(irErrorSpy.count(), 1);
+ QCOMPARE(irErrorSpy.size(), 1);
QVERIFY(irWrittenSpy.isEmpty());
QVERIFY(irReadSpy.isEmpty());
QCOMPARE(irErrorSpy[0].at(0).value<QLowEnergyService::ServiceError>(),
@@ -2425,7 +2377,7 @@ void tst_QLowEnergyController::tst_errorCases()
// read invalid descriptor
irService->readDescriptor(invalidDesc);
QTRY_VERIFY_WITH_TIMEOUT(!irErrorSpy.isEmpty(), 5000);
- QCOMPARE(irErrorSpy.count(), 1);
+ QCOMPARE(irErrorSpy.size(), 1);
QVERIFY(irDescWrittenSpy.isEmpty());
QVERIFY(irDescReadSpy.isEmpty());
QCOMPARE(irErrorSpy[0].at(0).value<QLowEnergyService::ServiceError>(),
@@ -2435,7 +2387,7 @@ void tst_QLowEnergyController::tst_errorCases()
// write invalid characteristic
irService->writeCharacteristic(invalidChar, QByteArray("foo"));
QTRY_VERIFY_WITH_TIMEOUT(!irErrorSpy.isEmpty(), 5000);
- QCOMPARE(irErrorSpy.count(), 1);
+ QCOMPARE(irErrorSpy.size(), 1);
QVERIFY(irWrittenSpy.isEmpty());
QVERIFY(irReadSpy.isEmpty());
QCOMPARE(irErrorSpy[0].at(0).value<QLowEnergyService::ServiceError>(),
@@ -2445,7 +2397,7 @@ void tst_QLowEnergyController::tst_errorCases()
// write invalid descriptor
irService->readDescriptor(invalidDesc);
QTRY_VERIFY_WITH_TIMEOUT(!irErrorSpy.isEmpty(), 5000);
- QCOMPARE(irErrorSpy.count(), 1);
+ QCOMPARE(irErrorSpy.size(), 1);
QVERIFY(irDescWrittenSpy.isEmpty());
QVERIFY(irDescReadSpy.isEmpty());
QCOMPARE(irErrorSpy[0].at(0).value<QLowEnergyService::ServiceError>(),
@@ -2459,7 +2411,7 @@ void tst_QLowEnergyController::tst_errorCases()
// read invalid characteristic
oadService->readCharacteristic(invalidChar);
QTRY_VERIFY_WITH_TIMEOUT(!oadErrorSpy.isEmpty(), 5000);
- QCOMPARE(oadErrorSpy.count(), 1);
+ QCOMPARE(oadErrorSpy.size(), 1);
QCOMPARE(oadErrorSpy[0].at(0).value<QLowEnergyService::ServiceError>(),
QLowEnergyService::OperationError);
oadErrorSpy.clear();
@@ -2467,7 +2419,7 @@ void tst_QLowEnergyController::tst_errorCases()
// read invalid descriptor
oadService->readDescriptor(invalidDesc);
QTRY_VERIFY_WITH_TIMEOUT(!oadErrorSpy.isEmpty(), 5000);
- QCOMPARE(oadErrorSpy.count(), 1);
+ QCOMPARE(oadErrorSpy.size(), 1);
QCOMPARE(oadErrorSpy[0].at(0).value<QLowEnergyService::ServiceError>(),
QLowEnergyService::OperationError);
oadErrorSpy.clear();
@@ -2475,7 +2427,7 @@ void tst_QLowEnergyController::tst_errorCases()
// write invalid characteristic
oadService->writeCharacteristic(invalidChar, QByteArray("foo"));
QTRY_VERIFY_WITH_TIMEOUT(!oadErrorSpy.isEmpty(), 5000);
- QCOMPARE(oadErrorSpy.count(), 1);
+ QCOMPARE(oadErrorSpy.size(), 1);
QCOMPARE(oadErrorSpy[0].at(0).value<QLowEnergyService::ServiceError>(),
QLowEnergyService::OperationError);
oadErrorSpy.clear();
@@ -2483,7 +2435,7 @@ void tst_QLowEnergyController::tst_errorCases()
// write invalid descriptor
oadService->readDescriptor(invalidDesc);
QTRY_VERIFY_WITH_TIMEOUT(!oadErrorSpy.isEmpty(), 5000);
- QCOMPARE(oadErrorSpy.count(), 1);
+ QCOMPARE(oadErrorSpy.size(), 1);
QCOMPARE(oadErrorSpy[0].at(0).value<QLowEnergyService::ServiceError>(),
QLowEnergyService::OperationError);
oadErrorSpy.clear();
@@ -2510,7 +2462,7 @@ void tst_QLowEnergyController::tst_errorCases()
// CharacteristicUserDescription is not writable
QLowEnergyDescriptor nonWritableDesc = nonWritableChar.descriptor(
- QBluetoothUuid::CharacteristicUserDescription);
+ QBluetoothUuid::DescriptorType::CharacteristicUserDescription);
QVERIFY(nonWritableDesc.isValid());
irService->writeDescriptor(nonWritableDesc, QByteArray("ABCD"));
QTRY_VERIFY_WITH_TIMEOUT(!irErrorSpy.isEmpty(), 5000);
@@ -2527,7 +2479,7 @@ void tst_QLowEnergyController::tst_errorCases()
// discover OAD Service
oadService->discoverDetails();
QTRY_VERIFY_WITH_TIMEOUT(
- oadService->state() == QLowEnergyService::ServiceDiscovered, 30000);
+ oadService->state() == QLowEnergyService::RemoteServiceDiscovered, 30000);
oadErrorSpy.clear();
// Test reading
@@ -2535,7 +2487,7 @@ void tst_QLowEnergyController::tst_errorCases()
QVERIFY(oadChar.isValid());
oadService->readCharacteristic(oadChar);
QTRY_VERIFY_WITH_TIMEOUT(!oadErrorSpy.isEmpty(), 5000);
- QCOMPARE(oadErrorSpy.count(), 1);
+ QCOMPARE(oadErrorSpy.size(), 1);
QVERIFY(oadCharReadSpy.isEmpty());
QCOMPARE(oadErrorSpy[0].at(0).value<QLowEnergyService::ServiceError>(),
QLowEnergyService::CharacteristicReadError);
@@ -2543,7 +2495,9 @@ void tst_QLowEnergyController::tst_errorCases()
delete irService;
delete oadService;
- control.disconnectFromDevice();
+ control->disconnectFromDevice();
+ QTRY_COMPARE(control->state(), QLowEnergyController::UnconnectedState);
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
}
/*
@@ -2560,28 +2514,28 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse()
if (!remoteDeviceInfo.isValid())
QSKIP("No remote BTLE device found. Skipping test.");
- QLowEnergyController control(remoteDeviceInfo);
+ QScopedPointer<QLowEnergyController> control(QLowEnergyController::createCentral(remoteDeviceInfo));
- QCOMPARE(control.error(), QLowEnergyController::NoError);
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
- control.connectToDevice();
+ control->connectToDevice();
{
- QTRY_IMPL(control.state() != QLowEnergyController::ConnectingState,
- 30000);
+ QTRY_IMPL(control->state() != QLowEnergyController::ConnectingState,
+ 30000)
}
- if (control.state() == QLowEnergyController::ConnectingState
- || control.error() != QLowEnergyController::NoError) {
+ if (control->state() == QLowEnergyController::ConnectingState
+ || control->error() != QLowEnergyController::NoError) {
// default BTLE backend forever hangs in ConnectingState
QSKIP("Cannot connect to remote device");
}
- QCOMPARE(control.state(), QLowEnergyController::ConnectedState);
- QSignalSpy discoveryFinishedSpy(&control, SIGNAL(discoveryFinished()));
- QSignalSpy stateSpy(&control, SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
- control.discoverServices();
- QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 20000);
- QCOMPARE(stateSpy.count(), 2);
+ QTRY_VERIFY_WITH_TIMEOUT(control->state() == QLowEnergyController::ConnectedState, 20000);
+ QSignalSpy discoveryFinishedSpy(control.data(), SIGNAL(discoveryFinished()));
+ QSignalSpy stateSpy(control.data(), SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
+ control->discoverServices();
+ QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.size() == 1, 20000);
+ QCOMPARE(stateSpy.size(), 2);
QCOMPARE(stateSpy.at(0).at(0).value<QLowEnergyController::ControllerState>(),
QLowEnergyController::DiscoveringState);
QCOMPARE(stateSpy.at(1).at(0).value<QLowEnergyController::ControllerState>(),
@@ -2589,14 +2543,14 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse()
// The Over-The-Air update service uuid
const QBluetoothUuid testService(QString("f000ffc0-0451-4000-b000-000000000000"));
- QList<QBluetoothUuid> uuids = control.services();
+ QList<QBluetoothUuid> uuids = control->services();
QVERIFY(uuids.contains(testService));
- QLowEnergyService *service = control.createServiceObject(testService, this);
+ QLowEnergyService *service = control->createServiceObject(testService, this);
QVERIFY(service);
service->discoverDetails();
QTRY_VERIFY_WITH_TIMEOUT(
- service->state() == QLowEnergyService::ServiceDiscovered, 30000);
+ service->state() == QLowEnergyService::RemoteServiceDiscovered, 30000);
// 1. Get "Image Identity" and "Image Block" characteristic
const QLowEnergyCharacteristic imageIdentityChar = service->characteristic(
@@ -2611,15 +2565,17 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse()
// 2. Get "Image Identity" notification descriptor
const QLowEnergyDescriptor identityNotification = imageIdentityChar.descriptor(
- QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration));
const QLowEnergyDescriptor blockNotification = imageBlockChar.descriptor(
- QBluetoothUuid(QBluetoothUuid::ClientCharacteristicConfiguration));
+ QBluetoothUuid(QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration));
if (!identityNotification.isValid()
|| !blockNotification.isValid()
|| !imageIdentityChar.isValid()) {
delete service;
- control.disconnectFromDevice();
+ control->disconnectFromDevice();
+ QTRY_COMPARE(control->state(), QLowEnergyController::UnconnectedState);
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
QSKIP("Cannot find OAD char/notification");
}
@@ -2632,8 +2588,7 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse()
SIGNAL(characteristicWritten(QLowEnergyCharacteristic,QByteArray)));
QSignalSpy charReadSpy(service,
SIGNAL(characteristicRead(QLowEnergyCharacteristic,QByteArray)));
- QSignalSpy errorSpy(service,
- SIGNAL(error(QLowEnergyService::ServiceError)));
+ QSignalSpy errorSpy(service, SIGNAL(errorOccurred(QLowEnergyService::ServiceError)));
//enable notifications on both characteristics
if (identityNotification.value() != QByteArray::fromHex("0100")) {
@@ -2667,7 +2622,7 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse()
QVERIFY(charReadSpy.isEmpty());
service->readCharacteristic(imageIdentityChar);
QTRY_VERIFY_WITH_TIMEOUT(!errorSpy.isEmpty(), 10000);
- QCOMPARE(errorSpy.count(), 1); // should throw CharacteristicReadError
+ QCOMPARE(errorSpy.size(), 1); // should throw CharacteristicReadError
QVERIFY(charReadSpy.isEmpty());
entry = errorSpy[0];
QCOMPARE(entry[0].value<QLowEnergyService::ServiceError>(),
@@ -2680,8 +2635,8 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse()
// Write triggers a notification and write confirmation
service->writeCharacteristic(imageIdentityChar, QByteArray::fromHex("0"));
QTest::qWait(1000);
- QTRY_COMPARE_WITH_TIMEOUT(charChangedSpy.count(), 1, 5000);
- QTRY_COMPARE_WITH_TIMEOUT(charWrittenSpy.count(), 1, 5000);
+ QTRY_COMPARE_WITH_TIMEOUT(charChangedSpy.size(), 1, 5000);
+ QTRY_COMPARE_WITH_TIMEOUT(charWrittenSpy.size(), 1, 5000);
// This is very SensorTag specific logic.
// If the image block is empty the current firmware
@@ -2716,8 +2671,8 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse()
// Image B
service->writeCharacteristic(imageIdentityChar, QByteArray::fromHex("1"));
QTest::qWait(1000);
- QTRY_COMPARE_WITH_TIMEOUT(charChangedSpy.count(), 1, 5000);
- QTRY_COMPARE_WITH_TIMEOUT(charWrittenSpy.count(), 1, 5000);;
+ QTRY_COMPARE_WITH_TIMEOUT(charChangedSpy.size(), 1, 5000);
+ QTRY_COMPARE_WITH_TIMEOUT(charWrittenSpy.size(), 1, 5000);;
entry = charChangedSpy[0];
first = entry[0].value<QLowEnergyCharacteristic>();
@@ -2762,8 +2717,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_COMPARE_WITH_TIMEOUT(charChangedSpy.count(), 1, 10000);
- QTRY_COMPARE_WITH_TIMEOUT(charWrittenSpy.count(), 0, 10000);
+ QTRY_COMPARE_WITH_TIMEOUT(charChangedSpy.size(), 1, 10000);
+ QTRY_COMPARE_WITH_TIMEOUT(charWrittenSpy.size(), 0, 10000);
entry = charChangedSpy[0];
first = entry[0].value<QLowEnergyCharacteristic>();
@@ -2798,8 +2753,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_COMPARE_WITH_TIMEOUT(charWrittenSpy.count(), 0, 10000);
- QTRY_COMPARE_WITH_TIMEOUT(charChangedSpy.count(), 1, 10000);
+ QTRY_COMPARE_WITH_TIMEOUT(charWrittenSpy.size(), 0, 10000);
+ QTRY_COMPARE_WITH_TIMEOUT(charChangedSpy.size(), 1, 10000);
entry = charChangedSpy[0];
first = entry[0].value<QLowEnergyCharacteristic>();
@@ -2828,7 +2783,37 @@ void tst_QLowEnergyController::tst_writeCharacteristicNoResponse()
QVERIFY2(foundOneImage, "The SensorTag doesn't have a valid image? (2)");
delete service;
- control.disconnectFromDevice();
+ control->disconnectFromDevice();
+ QTRY_COMPARE(control->state(), QLowEnergyController::UnconnectedState);
+ QCOMPARE(control->error(), QLowEnergyController::NoError);
+}
+
+using namespace Qt::Literals::StringLiterals;
+
+void tst_QLowEnergyController::tst_rssiError()
+{
+ // Create unconnected/invalid controller instances and verify that
+ // reading RSSI value triggers error signal. For the actual
+ // RSSI read testing see tst_qlowenergycontroller_device
+
+ // Peripheral
+ std::unique_ptr<QLowEnergyController> peripheral{QLowEnergyController::createPeripheral()};
+ QSignalSpy peripheralErrorSpy(peripheral.get(), &QLowEnergyController::errorOccurred);
+ peripheral->readRssi();
+ QTRY_VERIFY(!peripheralErrorSpy.isEmpty());
+ QCOMPARE(peripheralErrorSpy.takeFirst().at(0).value<QLowEnergyController::Error>(),
+ QLowEnergyController::Error::RssiReadError);
+ QCOMPARE(peripheral->error(), QLowEnergyController::Error::RssiReadError);
+
+ // Central
+ QBluetoothDeviceInfo info(QBluetoothAddress{u"11:22:33:44:55:66"_s}, u"invalid"_s, 1);
+ std::unique_ptr<QLowEnergyController> central{QLowEnergyController::createCentral(info)};
+ QSignalSpy centralErrorSpy(central.get(), &QLowEnergyController::errorOccurred);
+ central->readRssi();
+ QTRY_VERIFY(!centralErrorSpy.isEmpty());
+ QCOMPARE(centralErrorSpy.takeFirst().at(0).value<QLowEnergyController::Error>(),
+ QLowEnergyController::Error::RssiReadError);
+ QCOMPARE(central->error(), QLowEnergyController::Error::RssiReadError);
}
QTEST_MAIN(tst_QLowEnergyController)
diff --git a/tests/auto/qlowenergydescriptor/CMakeLists.txt b/tests/auto/qlowenergydescriptor/CMakeLists.txt
new file mode 100644
index 00000000..81b814e1
--- /dev/null
+++ b/tests/auto/qlowenergydescriptor/CMakeLists.txt
@@ -0,0 +1,31 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qlowenergydescriptor Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qlowenergydescriptor LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qlowenergydescriptor
+ SOURCES
+ tst_qlowenergydescriptor.cpp
+ LIBRARIES
+ Qt::Bluetooth
+)
+
+set_target_properties(tst_qlowenergydescriptor PROPERTIES
+ MACOSX_BUNDLE TRUE
+)
+
+if (APPLE AND NOT IOS)
+ # Ninja has trouble with relative paths, convert to absolute as a workaround
+ get_filename_component(SHARED_PLIST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../shared ABSOLUTE)
+ set_target_properties(tst_qlowenergydescriptor PROPERTIES
+ MACOSX_BUNDLE_INFO_PLIST "${SHARED_PLIST_DIR}/Info.macos.plist"
+ )
+endif()
diff --git a/tests/auto/qlowenergydescriptor/qlowenergydescriptor.pro b/tests/auto/qlowenergydescriptor/qlowenergydescriptor.pro
deleted file mode 100644
index 81ec9566..00000000
--- a/tests/auto/qlowenergydescriptor/qlowenergydescriptor.pro
+++ /dev/null
@@ -1,6 +0,0 @@
-SOURCES += tst_qlowenergydescriptor.cpp
-TARGET = tst_qlowenergydescriptor
-CONFIG += testcase
-
-QT = core bluetooth testlib
-
diff --git a/tests/auto/qlowenergydescriptor/tst_qlowenergydescriptor.cpp b/tests/auto/qlowenergydescriptor/tst_qlowenergydescriptor.cpp
index 5ebb0b1d..8d9b04b7 100644
--- a/tests/auto/qlowenergydescriptor/tst_qlowenergydescriptor.cpp
+++ b/tests/auto/qlowenergydescriptor/tst_qlowenergydescriptor.cpp
@@ -1,31 +1,6 @@
-/***************************************************************************
-**
-** Copyright (C) 2016 BlackBerry Limited all rights reserved
-** 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 BlackBerry Limited all rights reserved
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <QUuid>
@@ -37,6 +12,12 @@
#include <QLowEnergyController>
#include <QBluetoothLocalDevice>
+#if QT_CONFIG(permissions)
+#include <QCoreApplication>
+#include <QPermissions>
+#include <QtCore/qnamespace.h>
+#endif
+
QT_USE_NAMESPACE
class tst_QLowEnergyDescriptor : public QObject
@@ -60,12 +41,28 @@ private:
QList<QBluetoothDeviceInfo> remoteLeDeviceInfos;
QLowEnergyController *globalControl;
QLowEnergyService *globalService;
+#if QT_CONFIG(permissions)
+ Qt::PermissionStatus permissionStatus = Qt::PermissionStatus::Undetermined;
+#endif
};
tst_QLowEnergyDescriptor::tst_QLowEnergyDescriptor() :
- globalControl(0), globalService(0)
+ globalControl(nullptr), globalService(nullptr)
{
QLoggingCategory::setFilterRules(QStringLiteral("qt.bluetooth* = true"));
+#if QT_CONFIG(permissions)
+ permissionStatus = qApp->checkPermission(QBluetoothPermission{});
+ const bool ciRun = qEnvironmentVariable("QTEST_ENVIRONMENT").split(' ').contains("ci");
+ if (!ciRun && permissionStatus == Qt::PermissionStatus::Undetermined) {
+ QTestEventLoop loop;
+ qApp->requestPermission(QBluetoothPermission{}, [this, &loop](const QPermission &permission){
+ permissionStatus = permission.status();
+ loop.exitLoop();
+ });
+ if (permissionStatus == Qt::PermissionStatus::Undetermined)
+ loop.enterLoopMSecs(30000);
+ }
+#endif // QT_CONFIG(permissions)
}
tst_QLowEnergyDescriptor::~tst_QLowEnergyDescriptor()
@@ -75,23 +72,36 @@ tst_QLowEnergyDescriptor::~tst_QLowEnergyDescriptor()
void tst_QLowEnergyDescriptor::initTestCase()
{
if (QBluetoothLocalDevice::allDevices().isEmpty()) {
- qWarning("No remote device discovered.");
-
+ qWarning("No local adapter, not discovering remote devices");
return;
}
- // start Bluetooth if not started
QBluetoothLocalDevice device;
- device.powerOn();
+ if (device.hostMode() == QBluetoothLocalDevice::HostPoweredOff) {
+ // Attempt to switch Bluetooth ON
+ device.powerOn();
+ QTest::qWait(1000);
+ if (device.hostMode() == QBluetoothLocalDevice::HostPoweredOff) {
+ qWarning("Bluetooth couldn't be switched ON, not discovering remote devices");
+ return;
+ }
+ }
- // find an arbitrary low energy device in vincinity
+#if QT_CONFIG(permissions)
+ if (permissionStatus != Qt::PermissionStatus::Granted) {
+ qWarning("Use of BLuetooth LE requires the Bluetooth permission granted");
+ return;
+ }
+#endif
+
+ // find an arbitrary low energy device in vicinity
// find an arbitrary service with descriptor
QBluetoothDeviceDiscoveryAgent *devAgent = new QBluetoothDeviceDiscoveryAgent(this);
connect(devAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
this, SLOT(deviceDiscovered(QBluetoothDeviceInfo)));
- QSignalSpy errorSpy(devAgent, SIGNAL(error(QBluetoothDeviceDiscoveryAgent::Error)));
+ QSignalSpy errorSpy(devAgent, SIGNAL(errorOccurred(QBluetoothDeviceDiscoveryAgent::Error)));
QVERIFY(errorSpy.isValid());
QVERIFY(errorSpy.isEmpty());
@@ -101,16 +111,16 @@ void tst_QLowEnergyDescriptor::initTestCase()
QVERIFY(spy.isEmpty());
devAgent->start();
- QTRY_VERIFY_WITH_TIMEOUT(spy.count() > 0, 50000);
+ QTRY_VERIFY_WITH_TIMEOUT(spy.size() > 0, 100000);
// find first service with descriptor
- QLowEnergyController *controller = 0;
- for (const QBluetoothDeviceInfo& remoteDeviceInfo : qAsConst(remoteLeDeviceInfos)) {
+ QLowEnergyController *controller = nullptr;
+ for (const QBluetoothDeviceInfo& remoteDeviceInfo : std::as_const(remoteLeDeviceInfos)) {
controller = QLowEnergyController::createCentral(remoteDeviceInfo, this);
qDebug() << "Connecting to" << remoteDeviceInfo.address();
controller->connectToDevice();
QTRY_IMPL(controller->state() != QLowEnergyController::ConnectingState,
- 20000);
+ 50000)
if (controller->state() != QLowEnergyController::ConnectedState) {
// any error and we skip
delete controller;
@@ -121,8 +131,8 @@ void tst_QLowEnergyDescriptor::initTestCase()
QSignalSpy discoveryFinishedSpy(controller, SIGNAL(discoveryFinished()));
QSignalSpy stateSpy(controller, SIGNAL(stateChanged(QLowEnergyController::ControllerState)));
controller->discoverServices();
- QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.count() == 1, 10000);
- QCOMPARE(stateSpy.count(), 2);
+ QTRY_VERIFY_WITH_TIMEOUT(discoveryFinishedSpy.size() == 1, 10000);
+ QCOMPARE(stateSpy.size(), 2);
QCOMPARE(stateSpy.at(0).at(0).value<QLowEnergyController::ControllerState>(),
QLowEnergyController::DiscoveringState);
QCOMPARE(stateSpy.at(1).at(0).value<QLowEnergyController::ControllerState>(),
@@ -136,7 +146,7 @@ void tst_QLowEnergyDescriptor::initTestCase()
leService->discoverDetails();
QTRY_VERIFY_WITH_TIMEOUT(
- leService->state() == QLowEnergyService::ServiceDiscovered, 10000);
+ leService->state() == QLowEnergyService::RemoteServiceDiscovered, 10000);
const QList<QLowEnergyCharacteristic> chars = leService->characteristics();
for (const QLowEnergyCharacteristic &ch : chars) {
@@ -190,17 +200,15 @@ void tst_QLowEnergyDescriptor::tst_constructionDefault()
QVERIFY(!descriptor.isValid());
QCOMPARE(descriptor.value(), QByteArray());
QVERIFY(descriptor.uuid().isNull());
- QVERIFY(descriptor.handle() == 0);
QCOMPARE(descriptor.name(), QString());
- QCOMPARE(descriptor.type(), QBluetoothUuid::UnknownDescriptorType);
+ QCOMPARE(descriptor.type(), QBluetoothUuid::DescriptorType::UnknownDescriptorType);
QLowEnergyDescriptor copyConstructed(descriptor);
QVERIFY(!copyConstructed.isValid());
QCOMPARE(copyConstructed.value(), QByteArray());
QVERIFY(copyConstructed.uuid().isNull());
- QVERIFY(copyConstructed.handle() == 0);
QCOMPARE(copyConstructed.name(), QString());
- QCOMPARE(copyConstructed.type(), QBluetoothUuid::UnknownDescriptorType);
+ QCOMPARE(copyConstructed.type(), QBluetoothUuid::DescriptorType::UnknownDescriptorType);
QVERIFY(copyConstructed == descriptor);
QVERIFY(descriptor == copyConstructed);
@@ -218,9 +226,8 @@ void tst_QLowEnergyDescriptor::tst_constructionDefault()
QVERIFY(!assigned.isValid());
QCOMPARE(assigned.value(), QByteArray());
QVERIFY(assigned.uuid().isNull());
- QVERIFY(assigned.handle() == 0);
QCOMPARE(assigned.name(), QString());
- QCOMPARE(assigned.type(), QBluetoothUuid::UnknownDescriptorType);
+ QCOMPARE(assigned.type(), QBluetoothUuid::DescriptorType::UnknownDescriptorType);
QVERIFY(assigned == descriptor);
QVERIFY(descriptor == assigned);
@@ -237,22 +244,23 @@ void tst_QLowEnergyDescriptor::tst_assignCompare()
QLowEnergyDescriptor target;
QVERIFY(!target.isValid());
- QCOMPARE(target.type(), QBluetoothUuid::UnknownDescriptorType);
+ QCOMPARE(target.type(), QBluetoothUuid::DescriptorType::UnknownDescriptorType);
QCOMPARE(target.name(), QString());
- QCOMPARE(target.handle(), QLowEnergyHandle(0));
QCOMPARE(target.uuid(), QBluetoothUuid());
QCOMPARE(target.value(), QByteArray());
- int index = -1;
+ qsizetype index = 0;
+ bool valueFound = false;
QList<QLowEnergyDescriptor> targets;
const QList<QLowEnergyCharacteristic> chars = globalService->characteristics();
for (const QLowEnergyCharacteristic &ch : chars) {
if (!ch.descriptors().isEmpty()) {
targets = ch.descriptors();
- for (int i = 0; i < targets.size(); ++i) {
+ for (qsizetype i = 0; i < targets.size(); ++i) {
// try to get a descriptor we can read
- if (targets[i].type() == QBluetoothUuid::CharacteristicUserDescription) {
+ if (targets[i].type() == QBluetoothUuid::DescriptorType::CharacteristicUserDescription) {
index = i;
+ valueFound = true;
break;
}
}
@@ -263,16 +271,13 @@ void tst_QLowEnergyDescriptor::tst_assignCompare()
if (targets.isEmpty())
QSKIP("No descriptor found despite prior indication.");
- QVERIFY(index != -1);
-
// test assignment operator
target = targets[index];
QVERIFY(target.isValid());
- QVERIFY(target.type() != QBluetoothUuid::UnknownDescriptorType);
+ QVERIFY(target.type() != QBluetoothUuid::DescriptorType::UnknownDescriptorType);
QVERIFY(!target.name().isEmpty());
- QVERIFY(target.handle() > 0);
QVERIFY(!target.uuid().isNull());
- QVERIFY(!target.value().isEmpty());
+ QVERIFY(!valueFound || !target.value().isEmpty());
QVERIFY(target == targets[index]);
QVERIFY(targets[index] == target);
@@ -282,7 +287,6 @@ void tst_QLowEnergyDescriptor::tst_assignCompare()
QCOMPARE(target.isValid(), targets[index].isValid());
QCOMPARE(target.type(), targets[index].type());
QCOMPARE(target.name(), targets[index].name());
- QCOMPARE(target.handle(), targets[index].handle());
QCOMPARE(target.uuid(), targets[index].uuid());
QCOMPARE(target.value(), targets[index].value());
@@ -291,7 +295,6 @@ void tst_QLowEnergyDescriptor::tst_assignCompare()
QCOMPARE(copyConstructed.isValid(), targets[index].isValid());
QCOMPARE(copyConstructed.type(), targets[index].type());
QCOMPARE(copyConstructed.name(), targets[index].name());
- QCOMPARE(copyConstructed.handle(), targets[index].handle());
QCOMPARE(copyConstructed.uuid(), targets[index].uuid());
QCOMPARE(copyConstructed.value(), targets[index].value());
@@ -306,9 +309,8 @@ void tst_QLowEnergyDescriptor::tst_assignCompare()
QVERIFY(!target.isValid());
QCOMPARE(target.value(), QByteArray());
QVERIFY(target.uuid().isNull());
- QVERIFY(target.handle() == 0);
QCOMPARE(target.name(), QString());
- QCOMPARE(target.type(), QBluetoothUuid::UnknownDescriptorType);
+ QCOMPARE(target.type(), QBluetoothUuid::DescriptorType::UnknownDescriptorType);
QVERIFY(invalid == target);
QVERIFY(target == invalid);
@@ -320,7 +322,7 @@ void tst_QLowEnergyDescriptor::tst_assignCompare()
QVERIFY(targets[index] != target);
QVERIFY(target != targets[index]);
- if (targets.count() >= 2) {
+ if (targets.size() >= 2) {
QLowEnergyDescriptor second = targets[(index+1)%2];
// at least two descriptors
QVERIFY(!(targets[index] == second));
diff --git a/tests/auto/qlowenergyservice/CMakeLists.txt b/tests/auto/qlowenergyservice/CMakeLists.txt
new file mode 100644
index 00000000..eba5db0e
--- /dev/null
+++ b/tests/auto/qlowenergyservice/CMakeLists.txt
@@ -0,0 +1,19 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qlowenergyservice Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qlowenergyservice LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qlowenergyservice
+ SOURCES
+ tst_qlowenergyservice.cpp
+ LIBRARIES
+ Qt::Bluetooth
+)
diff --git a/tests/auto/qlowenergyservice/qlowenergyservice.pro b/tests/auto/qlowenergyservice/qlowenergyservice.pro
deleted file mode 100644
index 6d074d82..00000000
--- a/tests/auto/qlowenergyservice/qlowenergyservice.pro
+++ /dev/null
@@ -1,6 +0,0 @@
-SOURCES += tst_qlowenergyservice.cpp
-TARGET = tst_qlowenergyservice
-CONFIG += testcase
-
-QT = core bluetooth testlib
-
diff --git a/tests/auto/qlowenergyservice/tst_qlowenergyservice.cpp b/tests/auto/qlowenergyservice/tst_qlowenergyservice.cpp
index 19fa059d..670a592d 100644
--- a/tests/auto/qlowenergyservice/tst_qlowenergyservice.cpp
+++ b/tests/auto/qlowenergyservice/tst_qlowenergyservice.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
diff --git a/tests/auto/qndeffilter/CMakeLists.txt b/tests/auto/qndeffilter/CMakeLists.txt
new file mode 100644
index 00000000..e7fb1e51
--- /dev/null
+++ b/tests/auto/qndeffilter/CMakeLists.txt
@@ -0,0 +1,15 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qndeffilter LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qndeffilter
+ SOURCES
+ tst_qndeffilter.cpp
+ LIBRARIES
+ Qt::Nfc
+)
diff --git a/tests/auto/qndeffilter/tst_qndeffilter.cpp b/tests/auto/qndeffilter/tst_qndeffilter.cpp
new file mode 100644
index 00000000..90493e42
--- /dev/null
+++ b/tests/auto/qndeffilter/tst_qndeffilter.cpp
@@ -0,0 +1,485 @@
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+#include <QTest>
+
+#include <QNdefFilter>
+#include <QNdefNfcSmartPosterRecord>
+#include <QNdefNfcTextRecord>
+#include <QNdefNfcUriRecord>
+#include <QNdefMessage>
+
+QT_USE_NAMESPACE
+
+class tst_QNdefFilter : public QObject
+{
+ Q_OBJECT
+private slots:
+ void construct();
+ void copyConstruct();
+ void assingmentOperator();
+
+ void clearFilter();
+
+ void orderMatch();
+
+ void appendRecord();
+ void appendRecord_data();
+
+ void appendRecordParameters();
+ void appendRecordParameters_data();
+
+ void appendRecordTemplate();
+ void appendRecordTemplate_data();
+
+ void match();
+ void match_data();
+};
+
+void tst_QNdefFilter::construct()
+{
+ QNdefFilter filter;
+ QCOMPARE(filter.recordCount(), 0);
+ QCOMPARE(filter.orderMatch(), false);
+}
+
+void tst_QNdefFilter::copyConstruct()
+{
+ QNdefFilter filter;
+ filter.setOrderMatch(true);
+ filter.appendRecord<QNdefNfcTextRecord>(1, 2);
+ filter.appendRecord(QNdefRecord::Empty, "", 0, 1);
+
+ QNdefFilter filterCopy(filter);
+ QCOMPARE(filterCopy.orderMatch(), true);
+ QCOMPARE(filterCopy.recordCount(), 2);
+ QNdefFilter::Record rec = filterCopy.recordAt(1);
+ QCOMPARE(rec.typeNameFormat, QNdefRecord::Empty);
+ QCOMPARE(rec.type, QByteArray());
+ QCOMPARE(rec.minimum, 0U);
+ QCOMPARE(rec.maximum, 1U);
+}
+
+void tst_QNdefFilter::assingmentOperator()
+{
+ QNdefFilter filter;
+ filter.setOrderMatch(true);
+ filter.appendRecord<QNdefNfcTextRecord>(1, 2);
+ filter.appendRecord(QNdefRecord::Empty, "", 0, 1);
+
+ QNdefFilter filterCopy;
+ filterCopy = filter;
+
+ QCOMPARE(filterCopy.orderMatch(), true);
+ QCOMPARE(filterCopy.recordCount(), 2);
+ QNdefFilter::Record rec = filterCopy.recordAt(1);
+ QCOMPARE(rec.typeNameFormat, QNdefRecord::Empty);
+ QCOMPARE(rec.type, QByteArray());
+ QCOMPARE(rec.minimum, 0U);
+ QCOMPARE(rec.maximum, 1U);
+}
+
+void tst_QNdefFilter::clearFilter()
+{
+ QNdefFilter filter;
+ filter.setOrderMatch(true);
+ filter.appendRecord<QNdefNfcTextRecord>(1, 2);
+ filter.appendRecord(QNdefRecord::Empty, "", 0, 1);
+
+ filter.clear();
+
+ QCOMPARE(filter.orderMatch(), false);
+ QCOMPARE(filter.recordCount(), 0);
+}
+
+void tst_QNdefFilter::orderMatch()
+{
+ QNdefFilter filter;
+ QCOMPARE(filter.orderMatch(), false);
+
+ filter.setOrderMatch(true);
+ QCOMPARE(filter.orderMatch(), true);
+
+ filter.setOrderMatch(false);
+ QCOMPARE(filter.orderMatch(), false);
+}
+
+void tst_QNdefFilter::appendRecord()
+{
+ QFETCH(QNdefRecord::TypeNameFormat, typeNameFormat);
+ QFETCH(QByteArray, type);
+ QFETCH(unsigned int, minimum);
+ QFETCH(unsigned int, maximum);
+ QFETCH(bool, result);
+
+ QNdefFilter filter;
+
+ const QNdefFilter::Record record { typeNameFormat, type, minimum, maximum };
+ QVERIFY(filter.appendRecord(record) == result);
+ const int desiredRecordCount = result ? 1 : 0;
+ QCOMPARE(filter.recordCount(), desiredRecordCount);
+}
+
+void tst_QNdefFilter::appendRecord_data()
+{
+ QTest::addColumn<QNdefRecord::TypeNameFormat>("typeNameFormat");
+ QTest::addColumn<QByteArray>("type");
+ QTest::addColumn<unsigned int>("minimum");
+ QTest::addColumn<unsigned int>("maximum");
+ QTest::addColumn<bool>("result");
+
+ constexpr struct {
+ const char *type;
+ QNdefRecord::TypeNameFormat format;
+ } inputs[] = {
+ { "Empty", QNdefRecord::Empty },
+ { "NfcRtd", QNdefRecord::NfcRtd },
+ { "Mime", QNdefRecord::Mime },
+ { "Uri", QNdefRecord::Uri},
+ { "ExternalRtd", QNdefRecord::ExternalRtd },
+ { "Unknown", QNdefRecord::Unknown }
+ };
+
+ for (auto [typeC, format] : inputs) {
+ const auto type = QByteArray::fromRawData(typeC, strlen(typeC));
+ QTest::addRow("%s; min < max", typeC) << format << type << 1u << 2u << true;
+ QTest::addRow("%s; min == max", typeC) << format << type << 2u << 2u << true;
+ QTest::addRow("%s; min > max", typeC) << format << type << 2u << 1u << false;
+ }
+}
+
+void tst_QNdefFilter::appendRecordParameters()
+{
+ QFETCH(QNdefRecord::TypeNameFormat, typeNameFormat);
+ QFETCH(QByteArray, type);
+ QFETCH(unsigned int, minimum);
+ QFETCH(unsigned int, maximum);
+ QFETCH(bool, result);
+
+ QNdefFilter filter;
+
+ QVERIFY(filter.appendRecord(typeNameFormat, type, minimum, maximum) == result);
+ const int desiredRecordCount = result ? 1 : 0;
+ QCOMPARE(filter.recordCount(), desiredRecordCount);
+}
+
+void tst_QNdefFilter::appendRecordParameters_data()
+{
+ appendRecord_data();
+}
+
+void tst_QNdefFilter::appendRecordTemplate()
+{
+ QFETCH(QByteArray, type);
+ QFETCH(unsigned int, minimum);
+ QFETCH(unsigned int, maximum);
+ QFETCH(bool, result);
+
+ QNdefFilter filter;
+ if (type == QByteArray("SmartPoster"))
+ QVERIFY(filter.appendRecord<QNdefNfcSmartPosterRecord>(minimum, maximum) == result);
+ else if (type == QByteArray("Text"))
+ QVERIFY(filter.appendRecord<QNdefNfcTextRecord>(minimum, maximum) == result);
+ else if (type == QByteArray("Uri"))
+ QVERIFY(filter.appendRecord<QNdefNfcUriRecord>(minimum, maximum) == result);
+
+ const int desiredRecordCount = result ? 1 : 0;
+ QCOMPARE(filter.recordCount(), desiredRecordCount);
+}
+
+void tst_QNdefFilter::appendRecordTemplate_data()
+{
+ QTest::addColumn<QByteArray>("type");
+ QTest::addColumn<unsigned int>("minimum");
+ QTest::addColumn<unsigned int>("maximum");
+ QTest::addColumn<bool>("result");
+
+ const QList<QByteArray> types {"SmartPoster", "Text", "Uri"};
+ for (const auto &type : types) {
+ QTest::newRow(type + "; min < max") << type << 1u << 2u << true;
+ QTest::newRow(type + "; min == max") << type << 2u << 2u << true;
+ QTest::newRow(type + "; min > max") << type << 2u << 1u << false;
+ }
+}
+
+void tst_QNdefFilter::match()
+{
+ QFETCH(QNdefFilter, filter);
+ QFETCH(QNdefMessage, message);
+ QFETCH(bool, result);
+
+ QCOMPARE(filter.match(message), result);
+}
+
+void tst_QNdefFilter::match_data()
+{
+ QTest::addColumn<QNdefFilter>("filter");
+ QTest::addColumn<QNdefMessage>("message");
+ QTest::addColumn<bool>("result");
+
+ QNdefFilter filter;
+ filter.appendRecord<QNdefNfcTextRecord>(1, 2);
+ filter.appendRecord(QNdefRecord::Mime, "image/png", 1, 1);
+ filter.appendRecord(QNdefRecord::Empty, "", 0, 100);
+
+ QNdefNfcTextRecord textRec;
+ textRec.setPayload("text");
+
+ QNdefRecord mimeRec;
+ mimeRec.setTypeNameFormat(QNdefRecord::Mime);
+ mimeRec.setType("image/png");
+ mimeRec.setPayload("some image should be here");
+
+ QNdefRecord emptyRec;
+ emptyRec.setTypeNameFormat(QNdefRecord::Empty);
+
+ {
+ QTest::addRow("empty filter, empty message, match")
+ << QNdefFilter() << QNdefMessage() << true;
+
+ QNdefMessage message;
+ message.push_back(emptyRec);
+
+ QTest::addRow("empty filter, non-empty message, no match")
+ << QNdefFilter() << message << false;
+
+ QTest::addRow("non-empty filter, empty message, no match")
+ << filter << QNdefMessage() << false;
+
+ QNdefFilter f;
+ f.appendRecord<QNdefNfcUriRecord>(0, 1);
+
+ QTest::addRow("filter with 0 or 1 rec, empty message, match")
+ << f << QNdefMessage() << true;
+
+ QNdefMessage uriMsg;
+ uriMsg.push_back(QNdefNfcUriRecord());
+
+ QTest::addRow("filter with 0 or 1 rec, one record, match") << f << uriMsg << true;
+
+ uriMsg.push_back(QNdefNfcUriRecord());
+
+ QTest::addRow("filter with 0 or 1 rec, too many records, no match") << f << uriMsg << false;
+ }
+
+ {
+ filter.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(mimeRec);
+
+ QTest::addRow("No optional records, no ordering, match") << filter << message << true;
+
+ message.push_back(emptyRec);
+ message.push_back(emptyRec);
+
+ QTest::addRow("Multiple records with optional, no ordering, match")
+ << filter << message << true;
+
+ filter.setOrderMatch(true);
+
+ QTest::addRow("Multiple records with optional, with ordering, match")
+ << filter << message << true;
+ }
+
+ {
+ filter.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(mimeRec);
+ message.push_back(emptyRec);
+ message.push_back(textRec);
+ message.push_back(emptyRec);
+ message.push_back(textRec);
+
+ QTest::addRow("Random order, no ordering, match") << filter << message << true;
+
+ filter.setOrderMatch(true);
+ QTest::addRow("Random order, with ordering, no match") << filter << message << false;
+ }
+
+ {
+ filter.setOrderMatch(false);
+
+ QNdefRecord rec;
+ rec.setTypeNameFormat(QNdefRecord::NfcRtd);
+ rec.setType("image/png");
+ rec.setPayload("borken image with invalid format");
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(rec);
+
+ QTest::addRow("TypeNameFormat mismatch, no ordering, no match")
+ << filter << message << false;
+
+ filter.setOrderMatch(true);
+ QTest::addRow("TypeNameFormat mismatch, with ordering, no match")
+ << filter << message << false;
+ }
+
+ {
+ filter.setOrderMatch(false);
+
+ QNdefRecord rec;
+ rec.setTypeNameFormat(QNdefRecord::Mime);
+ rec.setType("image/jpeg");
+ rec.setPayload("Good image with invalid type");
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(rec);
+
+ QTest::addRow("Type mismatch, no ordering, no match") << filter << message << false;
+
+ filter.setOrderMatch(true);
+ QTest::addRow("Type mismatch, with ordering, no match") << filter << message << false;
+ }
+
+ {
+ filter.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(QNdefNfcUriRecord());
+ message.push_back(textRec);
+ message.push_back(textRec);
+ message.push_back(mimeRec);
+ message.push_back(emptyRec);
+ message.push_back(emptyRec);
+
+ QTest::addRow("Type not from filter in the beginning, no ordering, no match")
+ << filter << message << false;
+
+ filter.setOrderMatch(true);
+
+ QTest::addRow("Type not from filter in the beginning, with ordering, no match")
+ << filter << message << false;
+ }
+
+ {
+ filter.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(textRec);
+ message.push_back(mimeRec);
+ message.push_back(emptyRec);
+ message.push_back(QNdefNfcUriRecord());
+ message.push_back(emptyRec);
+
+ QTest::addRow("Type not from filter in the middle, no ordering, no match")
+ << filter << message << false;
+
+ filter.setOrderMatch(true);
+
+ QTest::addRow("Type not from filter in the middle, with ordering, no match")
+ << filter << message << false;
+ }
+
+ {
+ filter.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(textRec);
+ message.push_back(mimeRec);
+ message.push_back(emptyRec);
+ message.push_back(emptyRec);
+ message.push_back(QNdefNfcUriRecord());
+
+ QTest::addRow("Type not from filter in the end, no ordering, no match")
+ << filter << message << false;
+
+ filter.setOrderMatch(true);
+
+ QTest::addRow("Type not from filter in the end, with ordering, no match")
+ << filter << message << false;
+ }
+
+ QNdefFilter repeatedFilter;
+ // These 2 consecutive QNdefNfcTextRecord's are the same as
+ // repeatedFilter.appendRecord<QNdefNfcTextRecord>(0, 2);
+ repeatedFilter.appendRecord<QNdefNfcTextRecord>(0, 1);
+ repeatedFilter.appendRecord<QNdefNfcTextRecord>(0, 1);
+ repeatedFilter.appendRecord(QNdefRecord::Mime, "", 1, 1);
+ repeatedFilter.appendRecord<QNdefNfcTextRecord>(1, 1);
+
+ {
+ repeatedFilter.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(textRec);
+ message.push_back(mimeRec);
+
+ QTest::addRow("Filter with repeated type format, no ordering, match")
+ << repeatedFilter << message << true;
+
+ repeatedFilter.setOrderMatch(true);
+
+ QTest::addRow("Filter with repeated type format, with ordering, no match")
+ << repeatedFilter << message << false;
+ }
+
+ {
+ repeatedFilter.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(mimeRec);
+ message.push_back(textRec);
+
+ QTest::addRow("Filter with repeated type format 2, no ordering, match")
+ << repeatedFilter << message << true;
+
+ repeatedFilter.setOrderMatch(true);
+
+ QTest::addRow("Filter with repeated type format 2, with ordering, match")
+ << repeatedFilter << message << true;
+ }
+
+ QNdefFilter repeatedFilter2;
+ repeatedFilter2.appendRecord<QNdefNfcTextRecord>(0, 2);
+ repeatedFilter2.appendRecord<QNdefNfcTextRecord>(1, 1);
+ repeatedFilter2.appendRecord(QNdefRecord::Mime, "", 1, 1);
+
+ {
+ repeatedFilter2.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(mimeRec);
+
+ QTest::addRow("Filter with repeated type format 3, no ordering, match")
+ << repeatedFilter2 << message << true;
+
+ repeatedFilter2.setOrderMatch(true);
+
+ QTest::addRow("Filter with repeated type format 3, with ordering, match")
+ << repeatedFilter2 << message << true;
+ }
+
+ {
+ repeatedFilter2.setOrderMatch(false);
+
+ QNdefMessage message;
+ message.push_back(textRec);
+ message.push_back(textRec);
+ message.push_back(textRec);
+ message.push_back(textRec);
+ message.push_back(mimeRec);
+
+ QTest::addRow("Filter with repeated type format 4, no ordering, no match")
+ << repeatedFilter2 << message << false;
+
+ repeatedFilter2.setOrderMatch(true);
+
+ QTest::addRow("Filter with repeated type format 4, with ordering, no match")
+ << repeatedFilter2 << message << false;
+ }
+}
+
+QTEST_MAIN(tst_QNdefFilter)
+
+#include "tst_qndeffilter.moc"
diff --git a/tests/auto/qndefmessage/CMakeLists.txt b/tests/auto/qndefmessage/CMakeLists.txt
new file mode 100644
index 00000000..6ed6fc2c
--- /dev/null
+++ b/tests/auto/qndefmessage/CMakeLists.txt
@@ -0,0 +1,19 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qndefmessage Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qndefmessage LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qndefmessage
+ SOURCES
+ tst_qndefmessage.cpp
+ LIBRARIES
+ Qt::Nfc
+)
diff --git a/tests/auto/qndefmessage/qndefmessage.pro b/tests/auto/qndefmessage/qndefmessage.pro
deleted file mode 100644
index c1309387..00000000
--- a/tests/auto/qndefmessage/qndefmessage.pro
+++ /dev/null
@@ -1,5 +0,0 @@
-SOURCES += tst_qndefmessage.cpp
-TARGET = tst_qndefmessage
-CONFIG += testcase
-
-QT = core nfc testlib
diff --git a/tests/auto/qndefmessage/tst_qndefmessage.cpp b/tests/auto/qndefmessage/tst_qndefmessage.cpp
index eb9bb507..d31f3b68 100644
--- a/tests/auto/qndefmessage/tst_qndefmessage.cpp
+++ b/tests/auto/qndefmessage/tst_qndefmessage.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
@@ -46,9 +21,13 @@ public:
~tst_QNdefMessage();
private slots:
- void tst_parse_data();
- void tst_parse();
- void messageParsingFromByteArray();
+ void equality();
+ void equality_data();
+ void parseSingleRecordMessage_data();
+ void parseSingleRecordMessage();
+ void parseCorruptedMessage();
+ void parseCorruptedMessage_data();
+ void parseComplexMessage();
};
tst_QNdefMessage::tst_QNdefMessage()
@@ -59,7 +38,82 @@ tst_QNdefMessage::~tst_QNdefMessage()
{
}
-void tst_QNdefMessage::tst_parse_data()
+void tst_QNdefMessage::equality()
+{
+ QFETCH(QNdefMessage, lhs);
+ QFETCH(QNdefMessage, rhs);
+ QFETCH(bool, result);
+
+ QCOMPARE(lhs == rhs, result);
+ QCOMPARE(rhs == lhs, result);
+}
+
+void tst_QNdefMessage::equality_data()
+{
+ QTest::addColumn<QNdefMessage>("lhs");
+ QTest::addColumn<QNdefMessage>("rhs");
+ QTest::addColumn<bool>("result");
+
+ QTest::newRow("empty vs empty") << QNdefMessage() << QNdefMessage() << true;
+ {
+ QNdefRecord rec;
+ rec.setTypeNameFormat(QNdefRecord::Empty);
+
+ QNdefMessage message;
+ message.push_back(rec);
+
+ QTest::newRow("empty vs empty record") << QNdefMessage() << message << true;
+ }
+ {
+ QNdefMessage message;
+ message.push_back(QNdefNfcTextRecord());
+
+ QTest::newRow("empty vs non-empty record") << QNdefMessage() << message << false;
+ }
+ {
+ QNdefMessage lhs;
+ lhs.push_back(QNdefNfcTextRecord());
+
+ QNdefMessage rhs;
+ rhs.push_back(QNdefNfcUriRecord());
+
+ QTest::newRow("different records") << lhs << rhs << false;
+ }
+ {
+ QNdefMessage lhs;
+ lhs.push_back(QNdefNfcTextRecord());
+ lhs.push_back(QNdefNfcUriRecord());
+
+ QNdefMessage rhs;
+ rhs.push_back(QNdefNfcUriRecord());
+
+ QTest::newRow("different amount of records") << lhs << rhs << false;
+ }
+ {
+ QNdefMessage lhs;
+ lhs.push_back(QNdefNfcTextRecord());
+ lhs.push_back(QNdefNfcUriRecord());
+
+ QNdefMessage rhs;
+ rhs.push_back(QNdefNfcUriRecord());
+ rhs.push_back(QNdefNfcTextRecord());
+
+ QTest::newRow("same records, different order") << lhs << rhs << false;
+ }
+ {
+ QNdefMessage lhs;
+ lhs.push_back(QNdefNfcTextRecord());
+ lhs.push_back(QNdefNfcUriRecord());
+
+ QNdefMessage rhs;
+ rhs.push_back(QNdefNfcTextRecord());
+ rhs.push_back(QNdefNfcUriRecord());
+
+ QTest::newRow("same records, same order") << lhs << rhs << true;
+ }
+}
+
+void tst_QNdefMessage::parseSingleRecordMessage_data()
{
QTest::addColumn<QByteArray>("data");
QTest::addColumn<QNdefMessage>("message");
@@ -106,12 +160,12 @@ void tst_QNdefMessage::tst_parse_data()
QByteArray data;
data.append(char(0xcd)); // MB=1, ME=1, IL=1, TNF=5
- data.append(char(type.length())); // TYPE LENGTH
- data.append(char((payload.length() >> 24) & 0xff)); // PAYLOAD LENGTH 3
- data.append(char((payload.length() >> 16) & 0xff)); // PAYLOAD LENGTH 2
- data.append(char((payload.length() >> 8) & 0xff)); // PAYLOAD LENGTH 1
- data.append(char((payload.length() >> 0) & 0xff)); // PAYLOAD LENGTH 0
- data.append(char(id.length())); // ID LENGTH
+ data.append(char(type.size())); // TYPE LENGTH
+ data.append(char((payload.size() >> 24) & 0xff)); // PAYLOAD LENGTH 3
+ data.append(char((payload.size() >> 16) & 0xff)); // PAYLOAD LENGTH 2
+ data.append(char((payload.size() >> 8) & 0xff)); // PAYLOAD LENGTH 1
+ data.append(char((payload.size() >> 0) & 0xff)); // PAYLOAD LENGTH 0
+ data.append(char(id.size())); // ID LENGTH
data.append(type);
data.append(id);
data.append(payload);
@@ -134,14 +188,14 @@ void tst_QNdefMessage::tst_parse_data()
QByteArray data;
data.append(char(0xbd)); // MB=1, CF=1, SR=1, IL=1, TNF=5
- data.append(char(type.length())); // TYPE LENGTH
+ data.append(char(type.size())); // TYPE LENGTH
data.append(char(1)); // PAYLOAD LENGTH
- data.append(char(id.length())); // ID LENGTH
+ data.append(char(id.size())); // ID LENGTH
data.append(type); // TYPE
data.append(id); // ID
data.append(payload.at(0)); // PAYLOAD[0]
- for (int i = 1; i < payload.length() - 1; ++i) {
+ for (int i = 1; i < payload.size() - 1; ++i) {
data.append(char(0x36)); // CF=1, SR=1, TNF=6
data.append(char(0)); // TYPE LENGTH
data.append(char(1)); // PAYLOAD LENGTH
@@ -151,7 +205,7 @@ void tst_QNdefMessage::tst_parse_data()
data.append(char(0x56)); // ME=1, SR=1, TNF=6
data.append(char(0)); // TYPE LENGTH
data.append(char(1)); // PAYLOAD LENGTH
- data.append(payload.at(payload.length() - 1)); // PAYLOAD[length - 1]
+ data.append(payload.at(payload.size() - 1)); // PAYLOAD[length - 1]
QNdefRecord record;
record.setTypeNameFormat(QNdefRecord::Unknown);
@@ -177,11 +231,11 @@ void tst_QNdefMessage::tst_parse_data()
QByteArray data;
data.append(char(0xc1)); // MB=1, ME=1, IL=0, TNF=1
- data.append(char(type.length())); // TYPE LENGTH
- data.append(char((payload.length() >> 24) & 0xff)); // PAYLOAD LENGTH 3
- data.append(char((payload.length() >> 16) & 0xff)); // PAYLOAD LENGTH 2
- data.append(char((payload.length() >> 8) & 0xff)); // PAYLOAD LENGTH 1
- data.append(char((payload.length() >> 0) & 0xff)); // PAYLOAD LENGTH 0
+ data.append(char(type.size())); // TYPE LENGTH
+ data.append(char((payload.size() >> 24) & 0xff)); // PAYLOAD LENGTH 3
+ data.append(char((payload.size() >> 16) & 0xff)); // PAYLOAD LENGTH 2
+ data.append(char((payload.size() >> 8) & 0xff)); // PAYLOAD LENGTH 1
+ data.append(char((payload.size() >> 0) & 0xff)); // PAYLOAD LENGTH 0
data.append(type);
data.append(payload);
@@ -211,11 +265,11 @@ void tst_QNdefMessage::tst_parse_data()
QByteArray data;
data.append(char(0xc1)); // MB=1, ME=1, IL=0, TNF=1
- data.append(char(type.length())); // TYPE LENGTH
- data.append(char((payload.length() >> 24) & 0xff)); // PAYLOAD LENGTH 3
- data.append(char((payload.length() >> 16) & 0xff)); // PAYLOAD LENGTH 2
- data.append(char((payload.length() >> 8) & 0xff)); // PAYLOAD LENGTH 1
- data.append(char((payload.length() >> 0) & 0xff)); // PAYLOAD LENGTH 0
+ data.append(char(type.size())); // TYPE LENGTH
+ data.append(char((payload.size() >> 24) & 0xff)); // PAYLOAD LENGTH 3
+ data.append(char((payload.size() >> 16) & 0xff)); // PAYLOAD LENGTH 2
+ data.append(char((payload.size() >> 8) & 0xff)); // PAYLOAD LENGTH 1
+ data.append(char((payload.size() >> 0) & 0xff)); // PAYLOAD LENGTH 0
data.append(type);
data.append(payload);
@@ -246,11 +300,11 @@ void tst_QNdefMessage::tst_parse_data()
QByteArray data;
data.append(char(0xc1));
- data.append(char(type.length()));
- data.append(char((payload.length() >> 24) & 0xff)); // PAYLOAD LENGTH 3
- data.append(char((payload.length() >> 16) & 0xff)); // PAYLOAD LENGTH 2
- data.append(char((payload.length() >> 8) & 0xff)); // PAYLOAD LENGTH 1
- data.append(char((payload.length() >> 0) & 0xff)); // PAYLOAD LENGTH 0
+ data.append(char(type.size()));
+ data.append(char((payload.size() >> 24) & 0xff)); // PAYLOAD LENGTH 3
+ data.append(char((payload.size() >> 16) & 0xff)); // PAYLOAD LENGTH 2
+ data.append(char((payload.size() >> 8) & 0xff)); // PAYLOAD LENGTH 1
+ data.append(char((payload.size() >> 0) & 0xff)); // PAYLOAD LENGTH 0
data.append(type);
data.append(payload);
@@ -279,11 +333,11 @@ void tst_QNdefMessage::tst_parse_data()
QByteArray data;
data.append(char(0xc1));
- data.append(char(type.length()));
- data.append(char((payload.length() >> 24) & 0xff)); // PAYLOAD LENGTH 3
- data.append(char((payload.length() >> 16) & 0xff)); // PAYLOAD LENGTH 2
- data.append(char((payload.length() >> 8) & 0xff)); // PAYLOAD LENGTH 1
- data.append(char((payload.length() >> 0) & 0xff)); // PAYLOAD LENGTH 0
+ data.append(char(type.size()));
+ data.append(char((payload.size() >> 24) & 0xff)); // PAYLOAD LENGTH 3
+ data.append(char((payload.size() >> 16) & 0xff)); // PAYLOAD LENGTH 2
+ data.append(char((payload.size() >> 8) & 0xff)); // PAYLOAD LENGTH 1
+ data.append(char((payload.size() >> 0) & 0xff)); // PAYLOAD LENGTH 0
data.append(type);
data.append(payload);
@@ -312,11 +366,11 @@ void tst_QNdefMessage::tst_parse_data()
QByteArray data;
data.append(char(0xc1));
- data.append(char(type.length()));
- data.append(char((payload.length() >> 24) & 0xff)); // PAYLOAD LENGTH 3
- data.append(char((payload.length() >> 16) & 0xff)); // PAYLOAD LENGTH 2
- data.append(char((payload.length() >> 8) & 0xff)); // PAYLOAD LENGTH 1
- data.append(char((payload.length() >> 0) & 0xff)); // PAYLOAD LENGTH 0
+ data.append(char(type.size()));
+ data.append(char((payload.size() >> 24) & 0xff)); // PAYLOAD LENGTH 3
+ data.append(char((payload.size() >> 16) & 0xff)); // PAYLOAD LENGTH 2
+ data.append(char((payload.size() >> 8) & 0xff)); // PAYLOAD LENGTH 1
+ data.append(char((payload.size() >> 0) & 0xff)); // PAYLOAD LENGTH 0
data.append(type);
data.append(payload);
@@ -336,6 +390,46 @@ void tst_QNdefMessage::tst_parse_data()
QByteArray::fromHex(QByteArray("55052b31323334353637383930")));
}
+ // Chunk payload - the NFC-RTD URI split into 3 chunks
+ {
+ const QByteArray type("U");
+ const QByteArray id("test");
+ QByteArray payload1;
+ payload1.append(char(0x05));
+ payload1.append("+123");
+
+ const QByteArray payload2("456");
+ const QByteArray payload3("7890");
+
+ QByteArray data;
+ data.append(char(0xB9)); // MB=1, ME=0, CF=1, SR=1, IL=1, TNF=1 (NFC-RTD)
+ data.append(type.size());
+ data.append(payload1.size() & 0xff); // length fits into 1 byte
+ data.append(id.size());
+ data.append(type);
+ data.append(id);
+ data.append(payload1);
+ data.append(char(0x36)); // MB=0, ME=0, CF=1, SR=1, IL=0, TNF=6 (Unchanged)
+ data.append(char(0x00));
+ data.append(payload2.size());
+ data.append(payload2);
+ data.append(char(0x56)); // MB=0, ME=1, CF=0, SR=1, IL=0, TNF=6 (Unchanged)
+ data.append(char(0x00));
+ data.append(payload3.size());
+ data.append(payload3);
+
+ QNdefRecord record;
+ record.setTypeNameFormat(QNdefRecord::NfcRtd);
+ record.setType(type);
+ record.setId(id);
+ record.setPayload(QByteArray("\005+1234567890", 12));
+ QList<QNdefRecord> recordList;
+ recordList.append(record);
+ QTest::newRow("chunk payloads nfc-rtd uri tel:+1234567890")
+ << data << QNdefMessage(recordList)
+ << (QVariantList() << QUrl(QStringLiteral("tel:+1234567890")));
+ }
+
// Truncated message
{
QByteArray type("U");
@@ -348,22 +442,22 @@ void tst_QNdefMessage::tst_parse_data()
QTest::newRow("truncated 1") << data << QNdefMessage() << QVariantList();
- data.append(char(type.length())); // TYPE LENGTH
+ data.append(char(type.size())); // TYPE LENGTH
QTest::newRow("truncated 2") << data << QNdefMessage() << QVariantList();
- data.append(char((payload.length() >> 24) & 0xff)); // PAYLOAD LENGTH 3
+ data.append(char((payload.size() >> 24) & 0xff)); // PAYLOAD LENGTH 3
QTest::newRow("truncated 3") << data << QNdefMessage() << QVariantList();
- data.append(char((payload.length() >> 16) & 0xff)); // PAYLOAD LENGTH 2
+ data.append(char((payload.size() >> 16) & 0xff)); // PAYLOAD LENGTH 2
QTest::newRow("truncated 4") << data << QNdefMessage() << QVariantList();
- data.append(char((payload.length() >> 8) & 0xff)); // PAYLOAD LENGTH 1
+ data.append(char((payload.size() >> 8) & 0xff)); // PAYLOAD LENGTH 1
QTest::newRow("truncated 5") << data << QNdefMessage() << QVariantList();
- data.append(char((payload.length() >> 0) & 0xff)); // PAYLOAD LENGTH 0
+ data.append(char((payload.size() >> 0) & 0xff)); // PAYLOAD LENGTH 0
QTest::newRow("truncated 6") << data << QNdefMessage() << QVariantList();
- data.append(char(id.length())); // ID LENGTH
+ data.append(char(id.size())); // ID LENGTH
QTest::newRow("truncated 7") << data << QNdefMessage() << QVariantList();
data.append(type);
@@ -378,7 +472,7 @@ void tst_QNdefMessage::tst_parse_data()
}
}
-void tst_QNdefMessage::tst_parse()
+void tst_QNdefMessage::parseSingleRecordMessage()
{
QFETCH(QByteArray, data);
QFETCH(QNdefMessage, message);
@@ -397,7 +491,7 @@ void tst_QNdefMessage::tst_parse()
QVERIFY(message == reparsedMessage);
QVERIFY(reparsedMessage == message);
- for (int i = 0; i < message.count(); ++i) {
+ for (qsizetype i = 0; i < message.size(); ++i) {
const QNdefRecord &record = message.at(i);
const QNdefRecord &parsedRecord = parsedMessage.at(i);
@@ -414,7 +508,7 @@ void tst_QNdefMessage::tst_parse()
QCOMPARE(textRecord.text(), parsedTextRecord.text());
QCOMPARE(textRecord.locale(), parsedTextRecord.locale());
- if (expectedData.count() == 2) {
+ if (expectedData.size() == 2) {
QCOMPARE(parsedTextRecord.text(), expectedData.at(0).toString());
QCOMPARE(parsedTextRecord.locale(), expectedData.at(1).toString());
}
@@ -424,7 +518,7 @@ void tst_QNdefMessage::tst_parse()
QCOMPARE(uriRecord.uri(), parsedUriRecord.uri());
- if (expectedData.count() == 1)
+ if (expectedData.size() == 1)
QCOMPARE(parsedUriRecord.uri(), expectedData.at(0).toUrl());
} else if (record.isRecordType<QNdefRecord>()) {
QVERIFY(record.isEmpty());
@@ -432,7 +526,175 @@ void tst_QNdefMessage::tst_parse()
}
}
-void tst_QNdefMessage::messageParsingFromByteArray()
+void tst_QNdefMessage::parseCorruptedMessage()
+{
+ // This test is needed to check that all the potential errors in the
+ // input data are handled correctly.
+
+ QFETCH(QByteArray, data);
+ QFETCH(QByteArray, warningMessage);
+
+ if (!warningMessage.isEmpty())
+ QTest::ignoreMessage(QtWarningMsg, warningMessage.constData());
+
+ QNdefMessage parsedMessage = QNdefMessage::fromByteArray(data);
+ // corrupted data always results in an empty message
+ QVERIFY(parsedMessage.isEmpty());
+}
+
+void tst_QNdefMessage::parseCorruptedMessage_data()
+{
+ QTest::addColumn<QByteArray>("data");
+ QTest::addColumn<QByteArray>("warningMessage");
+
+ {
+ QByteArray data;
+ data.append(char(0x50)); // MB=0, ME=1, SR=1
+ data.append(char(0)); // TYPE LENGTH
+ data.append(char(0)); // PAYLOAD LENGTH
+
+ const QByteArray warningMsg = "Haven't got message begin yet";
+
+ QTest::newRow("No message begin") << data << warningMsg;
+ }
+ {
+ QByteArray data;
+ data.append(char(0x90)); // MB=1, ME=0, SR=1
+ data.append(char(0)); // TYPE LENGTH
+ data.append(char(0)); // PAYLOAD LENGTH
+
+ const QByteArray warningMsg = "Malformed NDEF Message, missing begin or end";
+
+ QTest::newRow("No message end") << data << warningMsg;
+ }
+ {
+ QByteArray data;
+ data.append(char(0x90)); // MB=1, ME=0, SR=1
+ data.append(char(0)); // TYPE LENGTH
+ data.append(char(0)); // PAYLOAD LENGTH
+ data.append(char(0xd0)); // MB=1, ME=1, SR=1
+ data.append(char(0)); // TYPE LENGTH
+ data.append(char(0)); // PAYLOAD LENGTH
+
+ const QByteArray warningMsg = "Got message begin but already parsed some records";
+
+ QTest::newRow("Multiple message begin") << data << warningMsg;
+ }
+ {
+ QByteArray data;
+ data.append(char(0xB1)); // MB=1, ME=0, CF=1, SR=1, IL=0, TNF=1 (NFC-RTD)
+ data.append(char(0x01)); // type length
+ data.append(char(0x01)); // payload length
+ data.append('U'); // type
+ data.append('a'); // payload
+ data.append(char(0x76)); // MB=0, ME=1 (incorrect), CF=1, SR=1, IL=0, TNF=6 (Unchanged)
+ data.append(char(0x00)); // type length
+ data.append(char(0x01)); // payload length
+ data.append('b'); // payload
+ data.append(char(0x56)); // MB=0, ME=1, CF=0, SR=1, IL=0, TNF=6 (Unchanged)
+ data.append(char(0x00)); // type length
+ data.append(char(0x01)); // payload length
+ data.append('c'); // payload
+
+ const QByteArray warningMsg = "Got message end but already parsed final record";
+
+ QTest::newRow("Multiple message end") << data << warningMsg;
+ }
+ {
+ QByteArray data;
+ data.append(char(0xB1)); // MB=1, ME=0, CF=1, SR=1, IL=0, TNF=1 (NFC-RTD)
+ data.append(char(0x01)); // type length
+ data.append(char(0x01)); // payload length
+ data.append('U'); // type
+ data.append('a'); // payload
+ data.append(char(0x36)); // MB=0, ME=0, CF=1, SR=1, IL=0, TNF=6 (Unchanged)
+ data.append(char(0x00)); // type length
+ data.append(char(0x01)); // payload length
+ data.append('b'); // payload
+ data.append(char(0x51)); // MB=0, ME=1, CF=0, SR=1, IL=0, TNF=1 (NFC-RTD - incorrect)
+ data.append(char(0x00)); // type length
+ data.append(char(0x01)); // payload length
+ data.append('c'); // payload
+
+ const QByteArray warningMsg = "Partial chunk not empty, but TNF not 0x06 as expected";
+
+ QTest::newRow("Incorrect TNF in chunk") << data << warningMsg;
+ }
+ {
+ QByteArray data;
+ data.append(char(0xB1)); // MB=1, ME=0, CF=1, SR=1, IL=0, TNF=1 (NFC-RTD)
+ data.append(char(0x01)); // type length
+ data.append(char(0x01)); // payload length
+ data.append('U'); // type
+ data.append('a'); // payload
+ data.append(char(0x36)); // MB=0, ME=0, CF=1, SR=1, IL=0, TNF=6 (Unchanged)
+ data.append(char(0x01)); // type length (incorrect)
+ data.append(char(0x01)); // payload length
+ data.append('U'); // type (incorrect)
+ data.append('b'); // payload
+ data.append(char(0x56)); // MB=0, ME=1, CF=0, SR=1, IL=0, TNF=6 (Unchanged)
+ data.append(char(0x00)); // type length
+ data.append(char(0x01)); // payload length
+ data.append('c'); // payload
+
+ const QByteArray warningMsg = "Invalid chunked data, TYPE_LENGTH != 0";
+
+ QTest::newRow("Incorrect TYPE_LENGTH in chunk") << data << warningMsg;
+ }
+ {
+ QByteArray data;
+ data.append(char(0xB1)); // MB=1, ME=0, CF=1, SR=1, IL=0, TNF=1 (NFC-RTD)
+ data.append(char(0x01)); // type length
+ data.append(char(0x01)); // payload length
+ data.append('U'); // type
+ data.append('a'); // payload
+ data.append(char(0x3E)); // MB=0, ME=0, CF=1, SR=1, IL=1 (incorrect), TNF=6 (Unchanged)
+ data.append(char(0x00)); // type length
+ data.append(char(0x01)); // payload length
+ data.append(char(0x01)); // id length (incorrect)
+ data.append('i'); // id (incorrect)
+ data.append('b'); // payload
+ data.append(char(0x56)); // MB=0, ME=1, CF=0, SR=1, IL=0, TNF=6 (Unchanged)
+ data.append(char(0x00)); // type length
+ data.append(char(0x01)); // payload length
+ data.append('c'); // payload
+
+ const QByteArray warningMsg = "Invalid chunked data, IL != 0";
+
+ QTest::newRow("Incorrect IL in chunk") << data << warningMsg;
+ }
+ {
+ QByteArray data;
+ data.append(char(0xC8)); // MB=1, ME=1, CF=0, SR=0, IL=1, TNF=0
+ data.append(char(0)); // type legnth
+ data.append(char(0)); // payload length (incorrect, 4 bytes expected)
+
+ const QByteArray warningMsg = "Unexpected end of message";
+
+ QTest::newRow("Invalid header length") << data << warningMsg;
+ }
+ {
+ QByteArray data;
+ data.append(char(0xC1)); // MB=1, ME=1, CF=0, SR=0, IL=0, TNF=1
+ data.append(char(0x01)); // type legnth
+ data.append(char(0xFF)); // payload length 3
+ data.append(char(0xFF)); // payload length 2
+ data.append(char(0xFF)); // payload length 1
+ data.append(char(0xFF)); // payload length 0
+ data.append('U'); // type
+ data.append('a'); // payload
+
+ // In case of 32 bit the code path will be different from 64 bit, so
+ // the warning message is also different.
+ const QByteArray warningMsg = (sizeof(qsizetype) <= sizeof(quint32))
+ ? "Payload can't fit into QByteArray"
+ : "Unexpected end of message";
+
+ QTest::newRow("Max payload length") << data << warningMsg;
+ }
+}
+
+void tst_QNdefMessage::parseComplexMessage()
{
const QByteArray reference("1234567890");
QNdefMessage message;
diff --git a/tests/auto/qndefnfcsmartposterrecord/CMakeLists.txt b/tests/auto/qndefnfcsmartposterrecord/CMakeLists.txt
new file mode 100644
index 00000000..6776fa36
--- /dev/null
+++ b/tests/auto/qndefnfcsmartposterrecord/CMakeLists.txt
@@ -0,0 +1,19 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qndefnfcsmartposterrecord Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qndefnfcsmartposterrecord LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qndefnfcsmartposterrecord
+ SOURCES
+ tst_qndefnfcsmartposterrecord.cpp
+ LIBRARIES
+ Qt::Nfc
+)
diff --git a/tests/auto/qndefnfcsmartposterrecord/qndefnfcsmartposterrecord.pro b/tests/auto/qndefnfcsmartposterrecord/qndefnfcsmartposterrecord.pro
deleted file mode 100644
index 52766cfd..00000000
--- a/tests/auto/qndefnfcsmartposterrecord/qndefnfcsmartposterrecord.pro
+++ /dev/null
@@ -1,5 +0,0 @@
-SOURCES += tst_qndefnfcsmartposterrecord.cpp
-TARGET = tst_qndefnfcsmartposterrecord
-CONFIG += testcase
-
-QT = core nfc testlib
diff --git a/tests/auto/qndefnfcsmartposterrecord/tst_qndefnfcsmartposterrecord.cpp b/tests/auto/qndefnfcsmartposterrecord/tst_qndefnfcsmartposterrecord.cpp
index fdc1abc2..c5c5d88f 100644
--- a/tests/auto/qndefnfcsmartposterrecord/tst_qndefnfcsmartposterrecord.cpp
+++ b/tests/auto/qndefnfcsmartposterrecord/tst_qndefnfcsmartposterrecord.cpp
@@ -1,30 +1,5 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 Research In Motion
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the QtNfc module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 Research In Motion
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
@@ -136,16 +111,12 @@ QString tst_QNdefNfcSmartPosterRecord::getTitle(const QString& locale)
void tst_QNdefNfcSmartPosterRecord::checkLocale(const QNdefNfcSmartPosterRecord& record, const QStringList& localeList)
{
- QList<QString> locales = _textRecords.keys();
-
- for (int i = 0; i < locales.size(); i++) {
- if (localeList.contains(locales[i])) {
- QVERIFY(record.hasTitle(locales[i]));
- }
-
- else {
- QVERIFY(!record.hasTitle(locales[i]));
- }
+ for (auto it = _textRecords.cbegin(), end = _textRecords.cend(); it != end; ++it) {
+ const QString &locale = it.key();
+ if (localeList.contains(locale))
+ QVERIFY(record.hasTitle(locale));
+ else
+ QVERIFY(!record.hasTitle(locale));
}
if (localeList.empty()) {
@@ -187,7 +158,7 @@ void tst_QNdefNfcSmartPosterRecord::tst_emptyRecord()
quint32 size = 0;
QCOMPARE(record.size(), size);
- QCOMPARE(record.typeInfo(), QByteArray());
+ QCOMPARE(record.typeInfo(), QString());
QVERIFY(record.isRecordType<QNdefNfcSmartPosterRecord>());
QVERIFY(!record.isRecordType<QNdefNfcTextRecord>());
@@ -229,6 +200,7 @@ void tst_QNdefNfcSmartPosterRecord::tst_titles()
QVERIFY(record.addTitle(deRecord));
QCOMPARE(record.titleCount(), 2);
+ QCOMPARE(record.titleRecord(1), deRecord);
{
QStringList locales;
locales << "en" << "de";
@@ -240,6 +212,7 @@ void tst_QNdefNfcSmartPosterRecord::tst_titles()
QVERIFY(record.addTitle(frRecord));
QCOMPARE(record.titleCount(), 3);
+ QCOMPARE(record.titleRecord(2), frRecord);
{
QStringList locales;
locales << "en" << "de" << "fr";
@@ -324,6 +297,7 @@ void tst_QNdefNfcSmartPosterRecord::tst_uri()
void tst_QNdefNfcSmartPosterRecord::tst_action()
{
QNdefNfcSmartPosterRecord record;
+ QVERIFY(!record.hasAction());
record.setAction(QNdefNfcSmartPosterRecord::DoAction);
QVERIFY(record.hasAction());
@@ -333,6 +307,10 @@ void tst_QNdefNfcSmartPosterRecord::tst_action()
QVERIFY(record.hasAction());
QCOMPARE(record.action(), QNdefNfcSmartPosterRecord::SaveAction);
+ record.setAction(QNdefNfcSmartPosterRecord::EditAction);
+ QVERIFY(record.hasAction());
+ QCOMPARE(record.action(), QNdefNfcSmartPosterRecord::EditAction);
+
record.setAction(QNdefNfcSmartPosterRecord::UnspecifiedAction);
QVERIFY(record.hasAction());
QCOMPARE(record.action(), QNdefNfcSmartPosterRecord::UnspecifiedAction);
@@ -341,6 +319,7 @@ void tst_QNdefNfcSmartPosterRecord::tst_action()
void tst_QNdefNfcSmartPosterRecord::tst_icon()
{
QNdefNfcSmartPosterRecord record;
+ QVERIFY(!record.hasIcon());
QNdefNfcIconRecord icon;
record.addIcon(icon);
@@ -366,6 +345,8 @@ void tst_QNdefNfcSmartPosterRecord::tst_icon()
QCOMPARE(record.iconCount(), 1);
QCOMPARE(record.icon(), QByteArray("icondata"));
QCOMPARE(record.icon(mimeType), QByteArray("icondata"));
+ // invalid type => empty data
+ QCOMPARE(record.icon(QByteArray("mime")), QByteArray());
QNdefNfcIconRecord icon2;
icon2.setData("iconrecorddata");
@@ -387,36 +368,49 @@ void tst_QNdefNfcSmartPosterRecord::tst_icon()
QCOMPARE(iconRecords[1], icon2);
QVERIFY(record.removeIcon(mimeType));
+ QVERIFY(!record.removeIcon(QByteArray("mime")));
QCOMPARE(record.iconCount(), 1);
iconRecords = record.iconRecords();
QCOMPARE(iconRecords.size(), 1);
QCOMPARE(iconRecords[0], icon2);
+ QVERIFY(record.removeIcon(icon2));
+ QVERIFY(!record.removeIcon(icon3)); // already removed
+ QCOMPARE(record.iconCount(), 0);
+
QList<QNdefNfcIconRecord> iconList;
QNdefNfcIconRecord testIcon;
testIcon.setData("testicondata");
testIcon.setType("test/data");
- iconList << testIcon;
+ iconList << testIcon << icon2;
record.setIcons(iconList);
- QCOMPARE(record.iconCount(), 1);
+ QCOMPARE(record.iconCount(), 2);
iconRecords = record.iconRecords();
- QCOMPARE(iconRecords.size(), 1);
+ QCOMPARE(iconRecords.size(), 2);
QCOMPARE(iconRecords[0], testIcon);
+ QCOMPARE(iconRecords[1], icon2);
}
void tst_QNdefNfcSmartPosterRecord::tst_size()
{
QNdefNfcSmartPosterRecord record;
+ QVERIFY(!record.hasSize());
+ QCOMPARE(record.size(), 0U);
quint32 size = 1024;
record.setSize(size);
QCOMPARE(record.size(), size);
QVERIFY(record.hasSize());
+ size = 0x12345678; // check that all bytes are stored correctly
+ record.setSize(size);
+ QCOMPARE(record.size(), size);
+ QVERIFY(record.hasSize());
+
size = 0;
record.setSize(size);
QCOMPARE(record.size(), size);
@@ -426,8 +420,10 @@ void tst_QNdefNfcSmartPosterRecord::tst_size()
void tst_QNdefNfcSmartPosterRecord::tst_typeInfo()
{
QNdefNfcSmartPosterRecord record;
+ QVERIFY(!record.hasTypeInfo());
+ QVERIFY(record.typeInfo().isEmpty());
- QByteArray typeInfo("typeinfo");
+ QString typeInfo("typeinfo");
record.setTypeInfo(typeInfo);
QCOMPARE(record.typeInfo(), typeInfo);
QVERIFY(record.hasTypeInfo());
@@ -436,6 +432,11 @@ void tst_QNdefNfcSmartPosterRecord::tst_typeInfo()
record.setTypeInfo(typeInfo);
QCOMPARE(record.typeInfo(), typeInfo);
QVERIFY(record.hasTypeInfo());
+
+ typeInfo = QString();
+ record.setTypeInfo(typeInfo);
+ QCOMPARE(record.typeInfo(), typeInfo);
+ QVERIFY(record.hasTypeInfo());
}
void tst_QNdefNfcSmartPosterRecord::tst_construct()
@@ -480,11 +481,11 @@ void tst_QNdefNfcSmartPosterRecord::tst_construct()
QVERIFY(iconRecords.value(1).data().isEmpty());
QVERIFY(sprecord.hasSize());
- quint32 size = 1024;
+ const quint32 size = 1024;
QCOMPARE(sprecord.size(), size);
QVERIFY(sprecord.hasTypeInfo());
- QCOMPARE(sprecord.typeInfo(), QByteArray("text/html"));
+ QCOMPARE(sprecord.typeInfo(), QString("text/html"));
QVERIFY(record == sprecord);
QVERIFY(!(record != sprecord));
@@ -531,7 +532,7 @@ void tst_QNdefNfcSmartPosterRecord::tst_downcast()
QByteArray spPayload = sprecord.payload();
// Check length is longer on the base
- QVERIFY(basePayload.length() > record.payload().length());
+ QVERIFY(basePayload.size() > record.payload().size());
// Check the payloads are the same
QCOMPARE(basePayload, spPayload);
diff --git a/tests/auto/qndefrecord/CMakeLists.txt b/tests/auto/qndefrecord/CMakeLists.txt
new file mode 100644
index 00000000..74b5bed2
--- /dev/null
+++ b/tests/auto/qndefrecord/CMakeLists.txt
@@ -0,0 +1,19 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#####################################################################
+## tst_qndefrecord Test:
+#####################################################################
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qndefrecord LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+qt_internal_add_test(tst_qndefrecord
+ SOURCES
+ tst_qndefrecord.cpp
+ LIBRARIES
+ Qt::Nfc
+)
diff --git a/tests/auto/qndefrecord/qndefrecord.pro b/tests/auto/qndefrecord/qndefrecord.pro
deleted file mode 100644
index e87f8b62..00000000
--- a/tests/auto/qndefrecord/qndefrecord.pro
+++ /dev/null
@@ -1,5 +0,0 @@
-SOURCES += tst_qndefrecord.cpp
-TARGET = tst_qndefrecord
-CONFIG += testcase
-
-QT = core nfc testlib
diff --git a/tests/auto/qndefrecord/tst_qndefrecord.cpp b/tests/auto/qndefrecord/tst_qndefrecord.cpp
index 26e993b2..d6671296 100644
--- a/tests/auto/qndefrecord/tst_qndefrecord.cpp
+++ b/tests/auto/qndefrecord/tst_qndefrecord.cpp
@@ -1,37 +1,11 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
#include <qndefrecord.h>
#include <qndefnfctextrecord.h>
#include <qndefnfcurirecord.h>
-#include <qqmlndefrecord.h>
QT_USE_NAMESPACE
@@ -47,6 +21,9 @@ public:
private slots:
void tst_record();
+ void tst_comparison();
+ void tst_comparison_data();
+ void tst_isRecordType();
void tst_textRecord_data();
void tst_textRecord();
@@ -54,10 +31,8 @@ private slots:
void tst_uriRecord_data();
void tst_uriRecord();
- void tst_declarative_record_data();
- void tst_declarative_record();
-
- void tst_declarativeChangedSignals();
+ void tst_ndefRecord_data();
+ void tst_ndefRecord();
};
tst_QNdefRecord::tst_QNdefRecord()
@@ -85,11 +60,6 @@ void tst_QNdefRecord::tst_record()
QCOMPARE(record, QNdefRecord());
QVERIFY(!(record != QNdefRecord()));
-
- QQmlNdefRecord declRecord;
- QCOMPARE(declRecord.record(), record);
- QCOMPARE(declRecord.type(), QString());
- QCOMPARE(declRecord.typeNameFormat(), QQmlNdefRecord::Empty);
}
// test type name format
@@ -179,22 +149,113 @@ void tst_QNdefRecord::tst_record()
QVERIFY(record != QNdefRecord());
}
- // test comparison
+ // test clear
{
QNdefRecord record;
- record.setTypeNameFormat(QNdefRecord::ExternalRtd);
- record.setType("qt-project.org:test-rtd");
- record.setId("test id");
- record.setPayload("test payload");
+ record.setTypeNameFormat(QNdefRecord::NfcRtd);
+ record.setId("id");
+ record.setType("type");
+ record.setPayload("Some random data");
+
+ record.clear();
+ QCOMPARE(record.typeNameFormat(), QNdefRecord::Empty);
+ QVERIFY(record.id().isEmpty());
+ QVERIFY(record.type().isEmpty());
+ QVERIFY(record.payload().isEmpty());
+ QVERIFY(record.isEmpty());
+ }
+}
+
+void tst_QNdefRecord::tst_comparison()
+{
+ QFETCH(QNdefRecord, lhs);
+ QFETCH(QNdefRecord, rhs);
+ QFETCH(bool, result);
+
+ QCOMPARE(lhs == rhs, result);
+ QCOMPARE(lhs != rhs, !result);
+
+ QCOMPARE(rhs == lhs, result);
+ QCOMPARE(rhs != lhs, !result);
+}
+
+void tst_QNdefRecord::tst_comparison_data()
+{
+ QTest::addColumn<QNdefRecord>("lhs");
+ QTest::addColumn<QNdefRecord>("rhs");
+ QTest::addColumn<bool>("result");
+
+ QTest::newRow("default-constructed records") << QNdefRecord() << QNdefRecord() << true;
+ {
+ QNdefRecord rec;
+ rec.setTypeNameFormat(QNdefRecord::Empty);
+
+ QTest::newRow("default-constructed vs empty") << QNdefRecord() << rec << false;
+ }
+
+ QNdefRecord record;
+ record.setTypeNameFormat(QNdefRecord::NfcRtd);
+ record.setType("T");
+ record.setId("text-record");
+ record.setPayload("Some random text");
+
+ {
+ QNdefRecord lhs = record;
+ QNdefRecord rhs = record;
+ rhs.setTypeNameFormat(QNdefRecord::ExternalRtd);
+
+ QTest::newRow("typeNameFormat mismatch") << lhs << rhs << false;
+ }
+ {
+ QNdefRecord lhs = record;
+ QNdefRecord rhs = record;
+ rhs.setType("t");
+
+ QTest::newRow("type mismatch") << lhs << rhs << false;
+ }
+ {
+ QNdefRecord lhs = record;
+ QNdefRecord rhs = record;
+ rhs.setId("random id");
- QNdefRecord other;
- other.setTypeNameFormat(QNdefRecord::ExternalRtd);
- other.setType("qt-project.org:test-other-rtd");
- other.setId("test other id");
- other.setPayload("test other payload");
+ QTest::newRow("id mismatch") << lhs << rhs << false;
+ }
+ {
+ QNdefRecord lhs = record;
+ QNdefRecord rhs = record;
+ rhs.setPayload("another random text");
- QVERIFY(record != other);
+ QTest::newRow("payload mismatch") << lhs << rhs << false;
}
+ {
+ QNdefRecord lhs = record;
+ QNdefRecord rhs = record;
+
+ QTest::newRow("same records") << lhs << rhs << true;
+ }
+}
+
+class PngNdefRecord : public QNdefRecord
+{
+public:
+ PngNdefRecord() : QNdefRecord(QNdefRecord::Mime, "image/png") { }
+};
+
+class JpegNdefRecord : public QNdefRecord
+{
+public:
+ JpegNdefRecord() : QNdefRecord(QNdefRecord::Mime, "image/jpeg") { }
+};
+
+void tst_QNdefRecord::tst_isRecordType()
+{
+ QNdefRecord rec;
+ rec.setTypeNameFormat(QNdefRecord::Mime);
+ rec.setType("image/png");
+
+ QVERIFY(!rec.isRecordType<QNdefRecord>());
+ QVERIFY(!rec.isRecordType<JpegNdefRecord>());
+ QVERIFY(rec.isRecordType<PngNdefRecord>());
}
void tst_QNdefRecord::tst_textRecord_data()
@@ -239,14 +300,11 @@ void tst_QNdefRecord::tst_textRecord()
record.setText(text);
record.setEncoding(utf8 ? QNdefNfcTextRecord::Utf8 : QNdefNfcTextRecord::Utf16);
+ QCOMPARE(record.typeNameFormat(), QNdefRecord::NfcRtd);
+ QCOMPARE(record.type(), QByteArray("T"));
QCOMPARE(record.payload(), payload);
QVERIFY(record != QNdefRecord());
-
- QQmlNdefRecord declRecord(record);
- QCOMPARE(declRecord.record(), QNdefRecord(record));
- QCOMPARE(declRecord.type(), QString("T"));
- QCOMPARE(declRecord.typeNameFormat(), QQmlNdefRecord::NfcRtd);
}
// test getters
@@ -308,14 +366,11 @@ void tst_QNdefRecord::tst_uriRecord()
QNdefNfcUriRecord record;
record.setUri(QUrl(url));
+ QCOMPARE(record.typeNameFormat(), QNdefRecord::NfcRtd);
+ QCOMPARE(record.type(), QByteArray("U"));
QCOMPARE(record.payload(), payload);
QVERIFY(record != QNdefRecord());
-
- QQmlNdefRecord declRecord(record);
- QCOMPARE(declRecord.record(), QNdefRecord(record));
- QCOMPARE(declRecord.type(), QString("U"));
- QCOMPARE(declRecord.typeNameFormat(), QQmlNdefRecord::NfcRtd);
}
// test getters
@@ -347,7 +402,7 @@ void tst_QNdefRecord::tst_uriRecord()
}
}
-void tst_QNdefRecord::tst_declarative_record_data()
+void tst_QNdefRecord::tst_ndefRecord_data()
{
QTest::addColumn<QNdefRecord::TypeNameFormat>("typeNameFormat");
QTest::addColumn<QByteArray>("type");
@@ -359,9 +414,10 @@ void tst_QNdefRecord::tst_declarative_record_data()
QTest::newRow("Unknown") << QNdefRecord::Unknown << QByteArray("BLAHfoo");
QTest::newRow("Mime") << QNdefRecord::Mime << QByteArray("foobar");
QTest::newRow("ExternalRtd") << QNdefRecord::ExternalRtd << QByteArray("");
+ QTest::newRow("Uri") << QNdefRecord::Uri << QByteArray("example.com/uri");
}
-void tst_QNdefRecord::tst_declarative_record()
+void tst_QNdefRecord::tst_ndefRecord()
{
QFETCH(QNdefRecord::TypeNameFormat, typeNameFormat);
QFETCH(QByteArray, type);
@@ -372,101 +428,9 @@ void tst_QNdefRecord::tst_declarative_record()
record.setType(type);
QCOMPARE(record.typeNameFormat(), typeNameFormat);
QCOMPARE(record.type(), type);
-
- QQmlNdefRecord declRecord(record);
- QCOMPARE(declRecord.record(), record);
- QCOMPARE(declRecord.record().typeNameFormat(), typeNameFormat);
- QCOMPARE(declRecord.record().type(), type);
- QCOMPARE(declRecord.type(), QString(type));
- QCOMPARE(declRecord.typeNameFormat(), static_cast<QQmlNdefRecord::TypeNameFormat>(typeNameFormat));
-
- QQmlNdefRecord declRecord2;
- declRecord2.setRecord(record);
- QCOMPARE(declRecord2.record(), record);
- QCOMPARE(declRecord2.record().typeNameFormat(), typeNameFormat);
- QCOMPARE(declRecord2.record().type(), type);
- QCOMPARE(declRecord2.type(), QString(type));
- QCOMPARE(declRecord2.typeNameFormat(), static_cast<QQmlNdefRecord::TypeNameFormat>(typeNameFormat));
-
- QQmlNdefRecord declRecord3;
- declRecord3.setTypeNameFormat((QQmlNdefRecord::TypeNameFormat)typeNameFormat);
- declRecord3.setType(type);
- QCOMPARE(declRecord3.type(), QString(type));
- QCOMPARE(declRecord3.record().typeNameFormat(), typeNameFormat);
- QCOMPARE(declRecord3.record().type(), type);
- QCOMPARE(declRecord3.typeNameFormat(), static_cast<QQmlNdefRecord::TypeNameFormat>(typeNameFormat));
}
}
-void tst_QNdefRecord::tst_declarativeChangedSignals()
-{
- QQmlNdefRecord record;
- QSignalSpy typeSpy(&record, SIGNAL(typeChanged()));
- QSignalSpy tnfSpy(&record, SIGNAL(typeNameFormatChanged()));
- QSignalSpy recordSpy(&record, SIGNAL(recordChanged()));
-
- QCOMPARE(typeSpy.count(), 0);
- QCOMPARE(recordSpy.count(), 0);
-
- record.setType("U");
- record.setTypeNameFormat(QQmlNdefRecord::NfcRtd);
- QCOMPARE(typeSpy.count(), 1);
- QCOMPARE(tnfSpy.count(), 1);
- QCOMPARE(recordSpy.count(), 0);
- QCOMPARE(record.type(), QString("U"));
- QCOMPARE(record.record().type(), QByteArray("U"));
- QCOMPARE(record.record().typeNameFormat(), QNdefRecord::NfcRtd);
- QCOMPARE(record.typeNameFormat(), QQmlNdefRecord::NfcRtd);
-
- record.setType("U"); //same value, no signal
- QCOMPARE(typeSpy.count(), 1);
- QCOMPARE(tnfSpy.count(), 1);
- QCOMPARE(recordSpy.count(), 0);
- QCOMPARE(record.type(), QString("U"));
- QCOMPARE(record.record().type(), QByteArray("U"));
- QCOMPARE(record.record().typeNameFormat(), QNdefRecord::NfcRtd);
- QCOMPARE(record.typeNameFormat(), QQmlNdefRecord::NfcRtd);
-
- record.setType("blah");
- record.setType("blah2");
- record.setTypeNameFormat(QQmlNdefRecord::ExternalRtd);
- QCOMPARE(typeSpy.count(), 3);
- QCOMPARE(tnfSpy.count(), 2);
- QCOMPARE(recordSpy.count(), 0);
- QCOMPARE(record.type(), QString("blah2"));
- QCOMPARE(record.record().type(), QByteArray("blah2"));
- QCOMPARE(record.record().typeNameFormat(), QNdefRecord::ExternalRtd);
- QCOMPARE(record.typeNameFormat(), QQmlNdefRecord::ExternalRtd);
-
- record.setType("Rubbish");
- QCOMPARE(typeSpy.count(), 4);
- QCOMPARE(tnfSpy.count(), 2);
- QCOMPARE(recordSpy.count(), 0);
- QCOMPARE(record.type(), QString("Rubbish"));
- QCOMPARE(record.record().type(), QByteArray("Rubbish"));
- QCOMPARE(record.record().typeNameFormat(), QNdefRecord::ExternalRtd);
- QCOMPARE(record.typeNameFormat(), QQmlNdefRecord::ExternalRtd);
-
- record.setType("QQQQ");
- record.setTypeNameFormat(QQmlNdefRecord::Mime);
- QCOMPARE(typeSpy.count(), 5);
- QCOMPARE(tnfSpy.count(), 3);
- QCOMPARE(recordSpy.count(), 0);
- QCOMPARE(record.type(), QString("QQQQ"));
- QCOMPARE(record.record().type(), QByteArray("QQQQ"));
- QCOMPARE(record.record().typeNameFormat(), QNdefRecord::Mime);
- QCOMPARE(record.typeNameFormat(), QQmlNdefRecord::Mime);
-
- record.setRecord(QNdefRecord());
- QCOMPARE(typeSpy.count(), 5); //setting record -> no recordChanged signal
- QCOMPARE(tnfSpy.count(), 3);
- QCOMPARE(recordSpy.count(), 1);
- QCOMPARE(record.type(), QString(""));
- QCOMPARE(record.record().type(), QByteArray());
- QCOMPARE(record.record().typeNameFormat(), QNdefRecord::Empty);
- QCOMPARE(record.typeNameFormat(), QQmlNdefRecord::Empty);
-}
-
QTEST_MAIN(tst_QNdefRecord)
#include "tst_qndefrecord.moc"
diff --git a/tests/auto/qnearfieldmanager/CMakeLists.txt b/tests/auto/qnearfieldmanager/CMakeLists.txt
new file mode 100644
index 00000000..9fa74032
--- /dev/null
+++ b/tests/auto/qnearfieldmanager/CMakeLists.txt
@@ -0,0 +1,49 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qnearfieldmanager LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+if (NOT QT_FEATURE_private_tests)
+ return()
+endif()
+
+#####################################################################
+## tst_qnearfieldmanager Test:
+#####################################################################
+
+# Collect test data
+list(APPEND test_data "../nfcdata/Qt Labs Website Tag Type1.nfc")
+list(APPEND test_data "../nfcdata/Qt Website Tag Type1.nfc")
+
+qt_internal_add_test(tst_qnearfieldmanager
+ SOURCES
+ ../nfccommons/qnearfieldmanager_emulator.cpp ../nfccommons/qnearfieldmanager_emulator_p.h
+ ../nfccommons/qnearfieldtarget_emulator.cpp ../nfccommons/qnearfieldtarget_emulator_p.h
+ ../nfccommons/targetemulator.cpp ../nfccommons/targetemulator_p.h
+ ../nfccommons/qnearfieldtagtype1.cpp ../nfccommons/qnearfieldtagtype1_p.h
+ ../nfccommons/qnearfieldtagtype2.cpp ../nfccommons/qnearfieldtagtype2_p.h
+ ../nfccommons/qtlv.cpp ../nfccommons/qtlv_p.h
+ tst_qnearfieldmanager.cpp
+ DEFINES
+ SRCDIR="${CMAKE_CURRENT_SOURCE_DIR}/../nfcdata"
+ INCLUDE_DIRECTORIES
+ ../nfccommons
+ LIBRARIES
+ Qt::NfcPrivate
+ TESTDATA ${test_data}
+)
+
+#### Keys ignored in scope 1:.:.:qnearfieldmanager.pro:<TRUE>:
+# _REQUIREMENTS = "contains(QT_CONFIG, private_tests)"
+
+## Scopes:
+#####################################################################
+
+qt_internal_extend_target(tst_qnearfieldmanager CONDITION builtin_testdata
+ DEFINES
+ BUILTIN_TESTDATA
+)
diff --git a/tests/auto/qnearfieldmanager/qnearfieldmanager.pro b/tests/auto/qnearfieldmanager/qnearfieldmanager.pro
deleted file mode 100644
index e01f9b84..00000000
--- a/tests/auto/qnearfieldmanager/qnearfieldmanager.pro
+++ /dev/null
@@ -1,29 +0,0 @@
-requires(contains(QT_CONFIG, private_tests))
-
-SOURCES += tst_qnearfieldmanager.cpp
-TARGET = tst_qnearfieldmanager
-CONFIG += testcase
-
-QT = core nfc-private testlib
-
-INCLUDEPATH += ../../../src/nfc
-VPATH += ../../../src/nfc
-
-HEADERS += \
- qnearfieldmanagervirtualbase_p.h \
- qnearfieldmanager_emulator_p.h \
- qnearfieldtarget_emulator_p.h \
- targetemulator_p.h
-
-SOURCES += \
- qnearfieldmanagervirtualbase.cpp \
- qnearfieldmanager_emulator.cpp \
- qnearfieldtarget_emulator.cpp \
- targetemulator.cpp
-
-DEFINES += SRCDIR=\\\"$$PWD/../nfcdata\\\"
-
-TESTDATA += "$$PWD/../nfcdata/Qt Labs Website Tag Type1.nfc" \
- "$$PWD/../nfcdata/Qt Website Tag Type1.nfc"
-
-builtin_testdata: DEFINES += BUILTIN_TESTDATA
diff --git a/tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp b/tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp
index c3c457e9..a902ac5d 100644
--- a/tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp
+++ b/tests/auto/qnearfieldmanager/tst_qnearfieldmanager.cpp
@@ -1,39 +1,14 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2021 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
-#include <private/qnearfieldmanager_emulator_p.h>
-#include <qnearfieldmanager.h>
-#include <qndefnfctextrecord.h>
-#include <qndefnfcurirecord.h>
-#include <qndefmessage.h>
-#include <qndefrecord.h>
+#include <qnearfieldmanager_emulator_p.h>
+#include <QtNfc/qnearfieldmanager.h>
+#include <QtNfc/qndefnfctextrecord.h>
+#include <QtNfc/qndefnfcurirecord.h>
+#include <QtNfc/qndefmessage.h>
+#include <QtNfc/qndefrecord.h>
QT_USE_NAMESPACE
@@ -52,18 +27,13 @@ public:
private slots:
void initTestCase();
- void targetDetected_data();
- void targetDetected();
-
- void unregisterNdefMessageHandler();
-
- void registerNdefMessageHandler();
+ void isSupported();
+ void isSupported_data();
- void registerNdefMessageHandler_type_data();
- void registerNdefMessageHandler_type();
+ void userInformation();
- void registerNdefMessageHandler_filter_data();
- void registerNdefMessageHandler_filter();
+ void targetDetected_data();
+ void targetDetected();
};
tst_QNearFieldManager::tst_QNearFieldManager()
@@ -79,202 +49,108 @@ void tst_QNearFieldManager::initTestCase()
QNearFieldManagerPrivateImpl *emulatorBackend = new QNearFieldManagerPrivateImpl;
QNearFieldManager manager(emulatorBackend, 0);
- QVERIFY(manager.isAvailable());
+ QVERIFY(manager.isEnabled());
}
-void tst_QNearFieldManager::targetDetected_data()
+void tst_QNearFieldManager::isSupported()
{
- QTest::addColumn<bool>("deleteTarget");
-
- QTest::newRow("AnyTarget") << false;
- QTest::newRow("NfcTagType1") << false;
- QTest::newRow("Delete Target") << true;
-}
-
-void tst_QNearFieldManager::targetDetected()
-{
- QFETCH(bool, deleteTarget);
+ QFETCH(QNearFieldTarget::AccessMethod, accessMethod);
+ QFETCH(bool, supported);
QNearFieldManagerPrivateImpl *emulatorBackend = new QNearFieldManagerPrivateImpl;
- QNearFieldManager manager(emulatorBackend, 0);
+ QNearFieldManager manager(emulatorBackend, nullptr);
- QSignalSpy targetDetectedSpy(&manager, SIGNAL(targetDetected(QNearFieldTarget*)));
- QSignalSpy targetLostSpy(&manager, SIGNAL(targetLost(QNearFieldTarget*)));
-
- manager.startTargetDetection();
-
- QTRY_VERIFY(!targetDetectedSpy.isEmpty());
-
- QNearFieldTarget *target = targetDetectedSpy.first().at(0).value<QNearFieldTarget *>();
-
- QSignalSpy disconnectedSpy(target, SIGNAL(disconnected()));
-
- QVERIFY(target);
-
- QVERIFY(!target->uid().isEmpty());
-
- if (!deleteTarget) {
- QTRY_VERIFY(!targetLostSpy.isEmpty());
-
- QNearFieldTarget *lostTarget = targetLostSpy.first().at(0).value<QNearFieldTarget *>();
-
- QCOMPARE(target, lostTarget);
-
- QVERIFY(!disconnectedSpy.isEmpty());
- } else {
- delete target;
-
- // wait for another targetDetected() without a targetLost() signal in between.
- targetDetectedSpy.clear();
- targetLostSpy.clear();
-
- QTRY_VERIFY(targetLostSpy.isEmpty() && !targetDetectedSpy.isEmpty());
- }
-
- manager.stopTargetDetection();
+ QCOMPARE(manager.isSupported(accessMethod), supported);
}
-void tst_QNearFieldManager::unregisterNdefMessageHandler()
+void tst_QNearFieldManager::isSupported_data()
{
- QNearFieldManagerPrivateImpl *emulatorBackend = new QNearFieldManagerPrivateImpl;
- QNearFieldManager manager(emulatorBackend, 0);
+ QTest::addColumn<QNearFieldTarget::AccessMethod>("accessMethod");
+ QTest::addColumn<bool>("supported");
- QVERIFY(!manager.unregisterNdefMessageHandler(-1));
- QVERIFY(!manager.unregisterNdefMessageHandler(0));
+ QTest::newRow("UnknownAccess") << QNearFieldTarget::UnknownAccess << false;
+ QTest::newRow("NdefAccess") << QNearFieldTarget::NdefAccess << true;
+ QTest::newRow("TagTypeSpecificAccess") << QNearFieldTarget::TagTypeSpecificAccess << false;
+ QTest::newRow("AnyAccess") << QNearFieldTarget::AnyAccess << true;
}
-class MessageListener : public QObject
-{
- Q_OBJECT
-
-signals:
- void matchedNdefMessage(const QNdefMessage &message, QNearFieldTarget *target);
-};
-
-void tst_QNearFieldManager::registerNdefMessageHandler()
+void tst_QNearFieldManager::userInformation()
{
QNearFieldManagerPrivateImpl *emulatorBackend = new QNearFieldManagerPrivateImpl;
- QNearFieldManager manager(emulatorBackend, 0);
+ QNearFieldManager manager(emulatorBackend, nullptr);
- MessageListener listener;
- QSignalSpy messageSpy(&listener, SIGNAL(matchedNdefMessage(QNdefMessage,QNearFieldTarget*)));
+ QSignalSpy spy(emulatorBackend, &QNearFieldManagerPrivateImpl::userInformationChanged);
- int id = manager.registerNdefMessageHandler(&listener,
- SIGNAL(matchedNdefMessage(QNdefMessage,QNearFieldTarget*)));
+ manager.startTargetDetection(QNearFieldTarget::AnyAccess);
- QVERIFY(id != -1);
+ const QString progressString("NFC target detection in progress");
+ manager.setUserInformation(progressString);
- QTRY_VERIFY(!messageSpy.isEmpty());
+ const QString errorString("Failed to detect NFC targets");
+ manager.stopTargetDetection(errorString);
- const QNdefMessage message = messageSpy.first().at(0).value<QNdefMessage>();
- QNearFieldTarget *target = messageSpy.first().at(1).value<QNearFieldTarget *>();
-
- QVERIFY(target);
-
- QVERIFY(manager.unregisterNdefMessageHandler(id));
+ QCOMPARE(spy.size(), 2);
+ QCOMPARE(spy.at(0).at(0).toString(), progressString);
+ QCOMPARE(spy.at(1).at(0).toString(), errorString);
}
-void tst_QNearFieldManager::registerNdefMessageHandler_type_data()
+void tst_QNearFieldManager::targetDetected_data()
{
- QTest::addColumn<QNdefRecord::TypeNameFormat>("typeNameFormat");
- QTest::addColumn<QByteArray>("type");
+ QTest::addColumn<QNearFieldTarget::AccessMethod>("accessMethod");
+ QTest::addColumn<bool>("deleteTarget");
- QTest::newRow("Image") << QNdefRecord::Mime << QByteArray("image/png");
- QTest::newRow("URI") << QNdefRecord::NfcRtd << QByteArray("U");
- QTest::newRow("Text") << QNdefRecord::NfcRtd << QByteArray("T");
+ QTest::newRow("UnknownAccess") << QNearFieldTarget::UnknownAccess << false;
+ QTest::newRow("NdefAccess, no delete") << QNearFieldTarget::NdefAccess << false;
+ QTest::newRow("AnyAccess, delete") << QNearFieldTarget::AnyAccess << true;
}
-void tst_QNearFieldManager::registerNdefMessageHandler_type()
+void tst_QNearFieldManager::targetDetected()
{
- QFETCH(QNdefRecord::TypeNameFormat, typeNameFormat);
- QFETCH(QByteArray, type);
+ QFETCH(QNearFieldTarget::AccessMethod, accessMethod);
+ QFETCH(bool, deleteTarget);
QNearFieldManagerPrivateImpl *emulatorBackend = new QNearFieldManagerPrivateImpl;
- QNearFieldManager manager(emulatorBackend, 0);
+ QNearFieldManager manager(emulatorBackend, nullptr);
- MessageListener listener;
- QSignalSpy messageSpy(&listener, SIGNAL(matchedNdefMessage(QNdefMessage,QNearFieldTarget*)));
+ QSignalSpy targetDetectedSpy(&manager, &QNearFieldManager::targetDetected);
+ QSignalSpy targetLostSpy(&manager, &QNearFieldManager::targetLost);
+ QSignalSpy detectionStoppedSpy(&manager, &QNearFieldManager::targetDetectionStopped);
- int id = manager.registerNdefMessageHandler(typeNameFormat, type, &listener,
- SIGNAL(matchedNdefMessage(QNdefMessage,QNearFieldTarget*)));
+ const bool started = manager.startTargetDetection(accessMethod);
- QVERIFY(id != -1);
+ if (started) {
+ QTRY_VERIFY(!targetDetectedSpy.isEmpty());
- QTRY_VERIFY(!messageSpy.isEmpty());
+ QNearFieldTarget *target = targetDetectedSpy.first().at(0).value<QNearFieldTarget *>();
- const QNdefMessage message = messageSpy.first().at(0).value<QNdefMessage>();
+ QSignalSpy disconnectedSpy(target, SIGNAL(disconnected()));
- bool hasRecord = false;
- for (const QNdefRecord &record : message) {
- if (record.typeNameFormat() == typeNameFormat && record.type() == type) {
- hasRecord = true;
- break;
- }
- }
+ QVERIFY(target);
- QVERIFY(hasRecord);
+ QVERIFY(!target->uid().isEmpty());
- QNearFieldTarget *target = messageSpy.first().at(1).value<QNearFieldTarget *>();
+ if (!deleteTarget) {
+ QTRY_VERIFY(!targetLostSpy.isEmpty());
- QVERIFY(target);
-}
+ QNearFieldTarget *lostTarget = targetLostSpy.first().at(0).value<QNearFieldTarget *>();
-void tst_QNearFieldManager::registerNdefMessageHandler_filter_data()
-{
- QTest::addColumn<QNdefFilter>("filter");
-
- QNdefFilter filter;
-
- QTest::newRow("Empty") << filter;
-
- filter.clear();
- filter.setOrderMatch(true);
- filter.appendRecord(QNdefRecord::Mime, "image/png");
- filter.appendRecord<QNdefNfcTextRecord>(2, 10);
- filter.appendRecord<QNdefNfcUriRecord>(1, 1);
- QTest::newRow("Image + Multiple Text + URI") << filter;
-
- filter.clear();
- filter.setOrderMatch(true);
- filter.appendRecord<QNdefNfcTextRecord>(1, 1);
- filter.appendRecord<QNdefNfcUriRecord>(1, 1);
- QTest::newRow("Text + URI") << filter;
-
- QNdefFilter::Record record;
-
- filter.clear();
- filter.setOrderMatch(false);
- filter.appendRecord<QNdefNfcUriRecord>(1, 1);
- record.typeNameFormat = QNdefRecord::NfcRtd;
- record.type = "T";
- record.minimum = 1;
- record.maximum = 1;
- filter.appendRecord(record);
- QTest::newRow("Unordered Text + URI") << filter;
-}
+ QCOMPARE(target, lostTarget);
-void tst_QNearFieldManager::registerNdefMessageHandler_filter()
-{
- QFETCH(QNdefFilter, filter);
+ QVERIFY(!disconnectedSpy.isEmpty());
+ } else {
+ delete target;
- QNearFieldManagerPrivateImpl *emulatorBackend = new QNearFieldManagerPrivateImpl;
- QNearFieldManager manager(emulatorBackend, 0);
+ // wait for another targetDetected() without a targetLost() signal in between.
+ targetDetectedSpy.clear();
+ targetLostSpy.clear();
- MessageListener listener;
- QSignalSpy messageSpy(&listener, SIGNAL(matchedNdefMessage(QNdefMessage,QNearFieldTarget*)));
-
- int id = manager.registerNdefMessageHandler(filter, &listener,
- SIGNAL(matchedNdefMessage(QNdefMessage,QNearFieldTarget*)));
-
- QVERIFY(id != -1);
-
- QTRY_VERIFY(!messageSpy.isEmpty());
-
- const QNdefMessage message = messageSpy.first().at(0).value<QNdefMessage>();
+ QTRY_VERIFY(targetLostSpy.isEmpty() && !targetDetectedSpy.isEmpty());
+ }
+ }
- QNearFieldTarget *target = messageSpy.first().at(1).value<QNearFieldTarget *>();
+ manager.stopTargetDetection();
- QVERIFY(target);
+ QCOMPARE(detectionStoppedSpy.size(), 1);
}
QTEST_MAIN(tst_QNearFieldManager)
diff --git a/tests/auto/qnearfieldtagtype1/CMakeLists.txt b/tests/auto/qnearfieldtagtype1/CMakeLists.txt
new file mode 100644
index 00000000..03189bfd
--- /dev/null
+++ b/tests/auto/qnearfieldtagtype1/CMakeLists.txt
@@ -0,0 +1,48 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qnearfieldtagtype1 LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+if (NOT QT_FEATURE_private_tests)
+ return()
+endif()
+
+#####################################################################
+## tst_qnearfieldtagtype1 Test:
+#####################################################################
+
+# Collect test data
+list(APPEND test_data "../nfcdata/Qt Labs Website Tag Type1.nfc")
+list(APPEND test_data "../nfcdata/Qt Website Tag Type1.nfc")
+
+qt_internal_add_test(tst_qnearfieldtagtype1
+ SOURCES
+ ../nfccommons/qnearfieldtarget_emulator.cpp ../nfccommons/qnearfieldtarget_emulator_p.h
+ ../nfccommons/targetemulator.cpp ../nfccommons/targetemulator_p.h
+ ../nfccommons/qnearfieldtagtype1.cpp ../nfccommons/qnearfieldtagtype1_p.h
+ ../nfccommons/qnearfieldtagtype2.cpp ../nfccommons/qnearfieldtagtype2_p.h
+ ../nfccommons/qtlv.cpp ../nfccommons/qtlv_p.h
+ tst_qnearfieldtagtype1.cpp
+ DEFINES
+ SRCDIR="${CMAKE_CURRENT_SOURCE_DIR}/../nfcdata"
+ INCLUDE_DIRECTORIES
+ ../nfccommons
+ LIBRARIES
+ Qt::NfcPrivate
+ TESTDATA ${test_data}
+)
+
+#### Keys ignored in scope 1:.:.:qnearfieldtagtype1.pro:<TRUE>:
+# _REQUIREMENTS = "contains(QT_CONFIG, private_tests)"
+
+## Scopes:
+#####################################################################
+
+qt_internal_extend_target(tst_qnearfieldtagtype1 CONDITION builtin_testdata
+ DEFINES
+ BUILTIN_TESTDATA
+)
diff --git a/tests/auto/qnearfieldtagtype1/qnearfieldtagtype1.pro b/tests/auto/qnearfieldtagtype1/qnearfieldtagtype1.pro
deleted file mode 100644
index e765151d..00000000
--- a/tests/auto/qnearfieldtagtype1/qnearfieldtagtype1.pro
+++ /dev/null
@@ -1,29 +0,0 @@
-requires(contains(QT_CONFIG, private_tests))
-
-SOURCES += tst_qnearfieldtagtype1.cpp
-TARGET = tst_qnearfieldtagtype1
-CONFIG += testcase
-
-QT = core nfc-private testlib
-
-INCLUDEPATH += ../../../src/nfc
-VPATH += ../../../src/nfc
-
-HEADERS += \
- qnearfieldmanagervirtualbase_p.h \
- qnearfieldmanager_emulator_p.h \
- qnearfieldtarget_emulator_p.h \
- targetemulator_p.h
-
-SOURCES += \
- qnearfieldmanagervirtualbase.cpp \
- qnearfieldmanager_emulator.cpp \
- qnearfieldtarget_emulator.cpp \
- targetemulator.cpp
-
-DEFINES += SRCDIR=\\\"$$PWD/../nfcdata\\\"
-
-TESTDATA += "$$PWD/../nfcdata/Qt Labs Website Tag Type1.nfc" \
- "$$PWD/../nfcdata/Qt Website Tag Type1.nfc"
-
-builtin_testdata: DEFINES += BUILTIN_TESTDATA
diff --git a/tests/auto/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp b/tests/auto/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp
index fb7aa7ae..8f540589 100644
--- a/tests/auto/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp
+++ b/tests/auto/qnearfieldtagtype1/tst_qnearfieldtagtype1.cpp
@@ -1,38 +1,13 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
-#include <private/qnearfieldmanager_emulator_p.h>
-#include <qnearfieldmanager.h>
-#include <qndefmessage.h>
-#include <private/qnearfieldtagtype1_p.h>
-#include <qndefnfctextrecord.h>
+#include <qnearfieldtarget_emulator_p.h>
+#include <qnearfieldtagtype1_p.h>
+
+#include <QtNfc/qndefmessage.h>
+#include <QtNfc/qndefnfctextrecord.h>
QT_USE_NAMESPACE
@@ -57,48 +32,45 @@ private slots:
private:
void waitForMatchingTarget();
- QNearFieldManagerPrivateImpl *emulatorBackend;
- QNearFieldManager *manager;
+ QObject *targetParent;
QNearFieldTagType1 *target;
};
tst_QNearFieldTagType1::tst_QNearFieldTagType1()
-: emulatorBackend(0), manager(0), target(0)
+: targetParent(0), target(0)
{
QDir::setCurrent(QLatin1String(SRCDIR));
qRegisterMetaType<QNdefMessage>();
+ qRegisterMetaType<TagBase *>();
qRegisterMetaType<QNearFieldTarget *>();
}
void tst_QNearFieldTagType1::init()
{
- emulatorBackend = new QNearFieldManagerPrivateImpl;
- manager = new QNearFieldManager(emulatorBackend, 0);
+ targetParent = new QObject();
+
+ TagActivator::instance()->initialize();
+ TagActivator::instance()->start();
}
void tst_QNearFieldTagType1::cleanup()
{
- emulatorBackend->reset();
+ TagActivator::instance()->reset();
- delete manager;
- manager = 0;
- emulatorBackend = 0;
+ delete targetParent;
+ targetParent = 0;
target = 0;
}
void tst_QNearFieldTagType1::waitForMatchingTarget()
{
- QSignalSpy targetDetectedSpy(manager, SIGNAL(targetDetected(QNearFieldTarget*)));
-
- manager->startTargetDetection();
+ TagActivator *activator = TagActivator::instance();
+ QSignalSpy targetDetectedSpy(activator, SIGNAL(tagActivated(TagBase*)));
QTRY_VERIFY(!targetDetectedSpy.isEmpty());
- target =
- qobject_cast<QNearFieldTagType1 *>(targetDetectedSpy.first().at(0).value<QNearFieldTarget *>());
-
- manager->stopTargetDetection();
+ target = new TagType1(targetDetectedSpy.first().at(0).value<TagBase *>(), targetParent);
QVERIFY(target);
@@ -108,6 +80,8 @@ void tst_QNearFieldTagType1::waitForMatchingTarget()
void tst_QNearFieldTagType1::staticMemoryModel()
{
waitForMatchingTarget();
+ if (QTest::currentTestFailed())
+ return;
QVERIFY(target->accessMethods() & QNearFieldTarget::TagTypeSpecificAccess);
@@ -120,7 +94,7 @@ void tst_QNearFieldTagType1::staticMemoryModel()
const QByteArray data = target->requestResponse(id).toByteArray();
- QCOMPARE(data.length(), 6);
+ QCOMPARE(data.size(), 6);
quint8 hr0 = data.at(0);
//quint8 hr1 = data.at(1);
@@ -139,7 +113,7 @@ void tst_QNearFieldTagType1::staticMemoryModel()
QVERIFY(target->waitForRequestCompleted(id));
const QByteArray data = target->requestResponse(id).toByteArray();
- QCOMPARE(data.length(), 122);
+ QCOMPARE(data.size(), 122);
// verify NfcTagType1.
QVERIFY(data.at(0) & 0x10);
@@ -174,8 +148,7 @@ void tst_QNearFieldTagType1::staticMemoryModel()
quint8 byte = target->requestResponse(id).toUInt();
id = target->writeByte(i, 0x55);
- QVERIFY(!target->waitForRequestCompleted(id,50));
-
+ QVERIFY(target->waitForRequestCompleted(id));
QVERIFY(!target->requestResponse(id).isValid());
id = target->readByte(i);
@@ -224,8 +197,7 @@ void tst_QNearFieldTagType1::staticMemoryModel()
quint8 byte = target->requestResponse(id).toUInt();
id = target->writeByte(i, 0x55);
- QVERIFY(!target->waitForRequestCompleted(id,50));
-
+ QVERIFY(target->waitForRequestCompleted(id));
QVERIFY(!target->requestResponse(id).isValid());
id = target->readByte(i);
@@ -245,6 +217,8 @@ void tst_QNearFieldTagType1::dynamicMemoryModel()
QList<QByteArray> seenIds;
forever {
waitForMatchingTarget();
+ if (QTest::currentTestFailed())
+ return;
QNearFieldTarget::RequestId id = target->readIdentification();
QVERIFY(target->waitForRequestCompleted(id));
@@ -272,7 +246,7 @@ void tst_QNearFieldTagType1::dynamicMemoryModel()
QCOMPARE(quint8(block.at(7)), quint8(0x00));
id = target->writeBlock(0x00, QByteArray(8, quint8(0x55)));
- QVERIFY(!target->waitForRequestCompleted(id,50));
+ QVERIFY(target->waitForRequestCompleted(id));
QVERIFY(!target->requestResponse(id).isValid());
QCOMPARE(target->uid(), block.left(7));
@@ -338,7 +312,7 @@ void tst_QNearFieldTagType1::dynamicMemoryModel()
QByteArray block = target->requestResponse(id).toByteArray();
id = target->writeBlock(i, QByteArray(8, quint8(0x55)));
- QVERIFY(!target->waitForRequestCompleted(id,50));
+ QVERIFY(target->waitForRequestCompleted(id));
QVERIFY(!target->requestResponse(id).isValid());
id = target->readBlock(i);
@@ -350,14 +324,17 @@ void tst_QNearFieldTagType1::dynamicMemoryModel()
for (int i = 0; i < 256; ++i) {
QNearFieldTarget::RequestId id = target->readBlock(i);
- QVERIFY(!target->waitForRequestCompleted(id,50));
+ QVERIFY(target->waitForRequestCompleted(id));
+ QVERIFY(!target->requestResponse(id).isValid());
id = target->writeBlock(i, QByteArray(8, quint8(0x55)));
- QVERIFY(!target->waitForRequestCompleted(id,50));
+ QVERIFY(target->waitForRequestCompleted(id));
+ QVERIFY(!target->requestResponse(id).isValid());
}
for (int i = 0; i < 16; ++i) {
QNearFieldTarget::RequestId id = target->readSegment(i);
- QVERIFY(!target->waitForRequestCompleted(id,50));
+ QVERIFY(target->waitForRequestCompleted(id));
+ QVERIFY(!target->requestResponse(id).isValid());
}
}
}
@@ -371,6 +348,8 @@ void tst_QNearFieldTagType1::ndefMessages()
QByteArray firstId;
forever {
waitForMatchingTarget();
+ if (QTest::currentTestFailed())
+ return;
QNearFieldTarget::RequestId id = target->readIdentification();
QVERIFY(target->waitForRequestCompleted(id));
@@ -403,7 +382,7 @@ void tst_QNearFieldTagType1::ndefMessages()
}
QList<QNdefMessage> ndefMessages;
- for (int i = 0; i < ndefMessageReadSpy.count(); ++i)
+ for (qsizetype i = 0; i < ndefMessageReadSpy.size(); ++i)
ndefMessages.append(ndefMessageReadSpy.at(i).first().value<QNdefMessage>());
QList<QNdefMessage> messages;
@@ -426,7 +405,6 @@ void tst_QNearFieldTagType1::ndefMessages()
requestCompletedSpy.clear();
errorSpy.clear();
- QSignalSpy ndefMessageWriteSpy(target, SIGNAL(ndefMessagesWritten()));
QNearFieldTarget::RequestId writeId = target->writeNdefMessages(messages);
QVERIFY(writeId.isValid());
@@ -440,8 +418,6 @@ void tst_QNearFieldTagType1::ndefMessages()
requestCompletedSpy.takeFirst().first().value<QNearFieldTarget::RequestId>();
}
- QVERIFY(!ndefMessageWriteSpy.isEmpty());
-
QVERIFY(target->hasNdefMessage());
ndefMessageReadSpy.clear();
@@ -462,7 +438,7 @@ void tst_QNearFieldTagType1::ndefMessages()
}
QList<QNdefMessage> storedMessages;
- for (int i = 0; i < ndefMessageReadSpy.count(); ++i)
+ for (qsizetype i = 0; i < ndefMessageReadSpy.size(); ++i)
storedMessages.append(ndefMessageReadSpy.at(i).first().value<QNdefMessage>());
QVERIFY(ndefMessages != storedMessages);
diff --git a/tests/auto/qnearfieldtagtype2/CMakeLists.txt b/tests/auto/qnearfieldtagtype2/CMakeLists.txt
new file mode 100644
index 00000000..cc6d6f32
--- /dev/null
+++ b/tests/auto/qnearfieldtagtype2/CMakeLists.txt
@@ -0,0 +1,48 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qnearfieldtagtype2 LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
+if (NOT QT_FEATURE_private_tests)
+ return()
+endif()
+
+#####################################################################
+## tst_qnearfieldtagtype2 Test:
+#####################################################################
+
+# Collect test data
+list(APPEND test_data "nfcdata/Dynamic Empty Tag.nfc")
+list(APPEND test_data "nfcdata/Empty Tag.nfc")
+
+qt_internal_add_test(tst_qnearfieldtagtype2
+ SOURCES
+ ../nfccommons/qnearfieldtarget_emulator.cpp ../nfccommons/qnearfieldtarget_emulator_p.h
+ ../nfccommons/targetemulator.cpp ../nfccommons/targetemulator_p.h
+ ../nfccommons/qnearfieldtagtype1.cpp ../nfccommons/qnearfieldtagtype1_p.h
+ ../nfccommons/qnearfieldtagtype2.cpp ../nfccommons/qnearfieldtagtype2_p.h
+ ../nfccommons/qtlv.cpp ../nfccommons/qtlv_p.h
+ tst_qnearfieldtagtype2.cpp
+ DEFINES
+ SRCDIR="${CMAKE_CURRENT_SOURCE_DIR}/nfcdata"
+ INCLUDE_DIRECTORIES
+ ../nfccommons
+ LIBRARIES
+ Qt::NfcPrivate
+ TESTDATA ${test_data}
+)
+
+#### Keys ignored in scope 1:.:.:qnearfieldtagtype2.pro:<TRUE>:
+# _REQUIREMENTS = "contains(QT_CONFIG, private_tests)"
+
+## Scopes:
+#####################################################################
+
+qt_internal_extend_target(tst_qnearfieldtagtype2 CONDITION builtin_testdata
+ DEFINES
+ BUILTIN_TESTDATA
+)
diff --git a/tests/auto/qnearfieldtagtype2/qnearfieldtagtype2.pro b/tests/auto/qnearfieldtagtype2/qnearfieldtagtype2.pro
deleted file mode 100644
index aa388312..00000000
--- a/tests/auto/qnearfieldtagtype2/qnearfieldtagtype2.pro
+++ /dev/null
@@ -1,29 +0,0 @@
-requires(contains(QT_CONFIG, private_tests))
-
-SOURCES += tst_qnearfieldtagtype2.cpp
-TARGET = tst_qnearfieldtagtype2
-CONFIG += testcase
-
-QT = core nfc-private testlib
-
-INCLUDEPATH += ../../../src/nfc
-VPATH += ../../../src/nfc
-
-HEADERS += \
- qnearfieldmanagervirtualbase_p.h \
- qnearfieldtarget_emulator_p.h \
- qnearfieldmanager_emulator_p.h \
- targetemulator_p.h
-
-SOURCES += \
- qnearfieldmanagervirtualbase.cpp \
- qnearfieldtarget_emulator.cpp \
- qnearfieldmanager_emulator.cpp \
- targetemulator.cpp
-
-DEFINES += SRCDIR=\\\"$$PWD/nfcdata\\\"
-
-TESTDATA += "$$PWD/nfcdata/Dynamic Empty Tag.nfc" \
- "$$PWD/nfcdata/Empty Tag.nfc"
-
-builtin_testdata: DEFINES += BUILTIN_TESTDATA
diff --git a/tests/auto/qnearfieldtagtype2/tst_qnearfieldtagtype2.cpp b/tests/auto/qnearfieldtagtype2/tst_qnearfieldtagtype2.cpp
index 456216b9..59b1dd27 100644
--- a/tests/auto/qnearfieldtagtype2/tst_qnearfieldtagtype2.cpp
+++ b/tests/auto/qnearfieldtagtype2/tst_qnearfieldtagtype2.cpp
@@ -1,38 +1,12 @@
-/****************************************************************************
-**
-** Copyright (C) 2016 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:GPL-EXCEPT$
-** 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 General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** 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-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#include <QtTest/QtTest>
-#include <private/qnearfieldmanager_emulator_p.h>
-#include <qnearfieldmanager.h>
-#include <qndefmessage.h>
-#include <private/qnearfieldtagtype2_p.h>
-#include <qndefnfctextrecord.h>
+#include <qnearfieldtarget_emulator_p.h>
+#include <qnearfieldtagtype2_p.h>
+#include <QtNfc/qndefmessage.h>
+#include <QtNfc/qndefnfctextrecord.h>
QT_USE_NAMESPACE
@@ -59,47 +33,45 @@ private slots:
private:
void waitForMatchingTarget();
- QNearFieldManagerPrivateImpl *emulatorBackend;
- QNearFieldManager *manager;
+ QObject *targetParent;
QNearFieldTagType2 *target;
};
tst_QNearFieldTagType2::tst_QNearFieldTagType2()
-: emulatorBackend(0), manager(0), target(0)
+: targetParent(0), target(0)
{
QDir::setCurrent(QLatin1String(SRCDIR));
qRegisterMetaType<QNdefMessage>();
+ qRegisterMetaType<TagBase *>();
qRegisterMetaType<QNearFieldTarget *>();
}
void tst_QNearFieldTagType2::init()
{
- emulatorBackend = new QNearFieldManagerPrivateImpl;
- manager = new QNearFieldManager(emulatorBackend, 0);
+ targetParent = new QObject();
+
+ TagActivator::instance()->initialize();
+ TagActivator::instance()->start();
}
void tst_QNearFieldTagType2::cleanup()
{
- emulatorBackend->reset();
+ TagActivator::instance()->reset();
- delete manager;
- manager = 0;
- emulatorBackend = 0;
+ delete targetParent;
+ targetParent = 0;
target = 0;
}
void tst_QNearFieldTagType2::waitForMatchingTarget()
{
- QSignalSpy targetDetectedSpy(manager, SIGNAL(targetDetected(QNearFieldTarget*)));
-
- manager->startTargetDetection();
+ TagActivator *activator = TagActivator::instance();
+ QSignalSpy targetDetectedSpy(activator, SIGNAL(tagActivated(TagBase*)));
QTRY_VERIFY(!targetDetectedSpy.isEmpty());
- target = qobject_cast<QNearFieldTagType2 *>(targetDetectedSpy.first().at(0).value<QNearFieldTarget *>());
-
- manager->stopTargetDetection();
+ target = new TagType2(targetDetectedSpy.first().at(0).value<TagBase *>(), targetParent);
QVERIFY(target);
@@ -109,6 +81,8 @@ void tst_QNearFieldTagType2::waitForMatchingTarget()
void tst_QNearFieldTagType2::staticMemoryModel()
{
waitForMatchingTarget();
+ if (QTest::currentTestFailed())
+ return;
QVERIFY(target->accessMethods() & QNearFieldTarget::TagTypeSpecificAccess);
@@ -170,6 +144,8 @@ void tst_QNearFieldTagType2::dynamicMemoryModel()
QList<QByteArray> seenIds;
forever {
waitForMatchingTarget();
+ if (QTest::currentTestFailed())
+ return;
QVERIFY(target->accessMethods() & QNearFieldTarget::TagTypeSpecificAccess);
@@ -271,6 +247,8 @@ void tst_QNearFieldTagType2::ndefMessages()
QByteArray firstId;
forever {
waitForMatchingTarget();
+ if (QTest::currentTestFailed())
+ return;
QNearFieldTarget::RequestId id = target->readBlock(0);
QVERIFY(target->waitForRequestCompleted(id));
@@ -295,7 +273,7 @@ void tst_QNearFieldTagType2::ndefMessages()
QTRY_VERIFY(!ndefMessageReadSpy.isEmpty());
QList<QNdefMessage> ndefMessages;
- for (int i = 0; i < ndefMessageReadSpy.count(); ++i)
+ for (qsizetype i = 0; i < ndefMessageReadSpy.size(); ++i)
ndefMessages.append(ndefMessageReadSpy.at(i).first().value<QNdefMessage>());
QList<QNdefMessage> messages;
@@ -315,10 +293,13 @@ void tst_QNearFieldTagType2::ndefMessages()
messages.append(message);
- QSignalSpy ndefMessageWriteSpy(target, SIGNAL(ndefMessagesWritten()));
- target->writeNdefMessages(messages);
+ QSignalSpy requestCompleteSpy(target, &QNearFieldTagType2::requestCompleted);
+ id = target->writeNdefMessages(messages);
- QTRY_VERIFY(!ndefMessageWriteSpy.isEmpty());
+ QTRY_VERIFY(!requestCompleteSpy.isEmpty());
+ const auto completedId =
+ requestCompleteSpy.takeFirst().first().value<QNearFieldTarget::RequestId>();
+ QCOMPARE(completedId, id);
QVERIFY(target->hasNdefMessage());
@@ -329,7 +310,7 @@ void tst_QNearFieldTagType2::ndefMessages()
QTRY_VERIFY(!ndefMessageReadSpy.isEmpty());
QList<QNdefMessage> storedMessages;
- for (int i = 0; i < ndefMessageReadSpy.count(); ++i)
+ for (qsizetype i = 0; i < ndefMessageReadSpy.size(); ++i)
storedMessages.append(ndefMessageReadSpy.at(i).first().value<QNdefMessage>());
QVERIFY(ndefMessages != storedMessages);