diff options
Diffstat (limited to 'tests/auto')
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); |