From 9f00179a95ef729fa7871b4d408c76bc50e4eb4e Mon Sep 17 00:00:00 2001 From: Lars Schmertmann Date: Wed, 20 Jun 2018 11:56:19 +0200 Subject: Introduce reportError to fix "QMetaObject::invokeMethod: No such method" Task-number: QTBUG-67958 Change-Id: Ia5a21cb19f0318844ac436adcc3f0fff9a3185b5 Reviewed-by: Alex Blasche --- src/nfc/qnearfieldtagtype1.cpp | 8 ++---- src/nfc/qnearfieldtarget.cpp | 13 ++++++++++ src/nfc/qnearfieldtarget.h | 2 ++ src/nfc/qnearfieldtarget_android.cpp | 36 +++++++-------------------- src/nfc/qnearfieldtarget_emulator.cpp | 20 ++++----------- src/nfc/qnearfieldtarget_neard_p.h | 8 ++---- 6 files changed, 33 insertions(+), 54 deletions(-) diff --git x/qtconnectivity/src/nfc/qnearfieldtagtype1.cpp y/qtconnectivity/src/nfc/qnearfieldtagtype1.cpp index 34f2c8b8..7f27fbe9 100644 --- x/qtconnectivity/src/nfc/qnearfieldtagtype1.cpp +++ y/qtconnectivity/src/nfc/qnearfieldtagtype1.cpp @@ -440,9 +440,7 @@ QNearFieldTarget::RequestId QNearFieldTagType1::readNdefMessages() if (d->m_readNdefMessageState == QNearFieldTagType1Private::NotReadingNdefMessage) { d->progressToNextNdefReadMessageState(); } else { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, NdefReadError), - Q_ARG(QNearFieldTarget::RequestId, d->m_readNdefRequestId)); + reportError(QNearFieldTarget::NdefReadError, d->m_readNdefRequestId); } return d->m_readNdefRequestId; @@ -462,9 +460,7 @@ QNearFieldTarget::RequestId QNearFieldTagType1::writeNdefMessages(const QListm_ndefWriteMessages = messages; d->progressToNextNdefWriteMessageState(); } else { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, NdefWriteError), - Q_ARG(QNearFieldTarget::RequestId, d->m_readNdefRequestId)); + reportError(QNearFieldTarget::NdefWriteError, d->m_readNdefRequestId); } return d->m_writeNdefRequestId; diff --git x/qtconnectivity/src/nfc/qnearfieldtarget.cpp y/qtconnectivity/src/nfc/qnearfieldtarget.cpp index e642824b..e9a6fa11 100644 --- x/qtconnectivity/src/nfc/qnearfieldtarget.cpp +++ y/qtconnectivity/src/nfc/qnearfieldtarget.cpp @@ -530,4 +530,17 @@ bool QNearFieldTarget::handleResponse(const QNearFieldTarget::RequestId &id, return true; } +/*! + \since 5.12 + + Reports the \a error for the request \a id by appending the signal emission to the event queue. +*/ +void QNearFieldTarget::reportError(QNearFieldTarget::Error error, + const QNearFieldTarget::RequestId &id) +{ + QMetaObject::invokeMethod(this, [this, error, id]() { + Q_EMIT this->error(error, id); + }, Qt::QueuedConnection); +} + QT_END_NAMESPACE diff --git x/qtconnectivity/src/nfc/qnearfieldtarget.h y/qtconnectivity/src/nfc/qnearfieldtarget.h index e51960f7..868b52d5 100644 --- x/qtconnectivity/src/nfc/qnearfieldtarget.h +++ y/qtconnectivity/src/nfc/qnearfieldtarget.h @@ -153,6 +153,8 @@ protected: Q_INVOKABLE virtual bool handleResponse(const QNearFieldTarget::RequestId &id, const QByteArray &response); + void reportError(QNearFieldTarget::Error error, const QNearFieldTarget::RequestId &id); + Q_SIGNALS: void disconnected(); diff --git x/qtconnectivity/src/nfc/qnearfieldtarget_android.cpp y/qtconnectivity/src/nfc/qnearfieldtarget_android.cpp index e656996e..78da6ac2 100644 --- x/qtconnectivity/src/nfc/qnearfieldtarget_android.cpp +++ y/qtconnectivity/src/nfc/qnearfieldtarget_android.cpp @@ -147,25 +147,19 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages() // Making sure that target is still in range QNearFieldTarget::RequestId requestId(new QNearFieldTarget::RequestIdPrivate); if (!m_intent.isValid()) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError), - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + reportError(QNearFieldTarget::TargetOutOfRangeError, requestId); return requestId; } // Getting Ndef technology object if (!setTagTechnology({NDEFTECHNOLOGY})) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnsupportedError), - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + reportError(QNearFieldTarget::UnsupportedError, requestId); return requestId; } // Connect if (!connect()) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError), - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + reportError(QNearFieldTarget::TargetOutOfRangeError, requestId); return requestId; } @@ -174,9 +168,7 @@ QNearFieldTarget::RequestId NearFieldTarget::readNdefMessages() if (catchJavaExceptions()) ndefMessage = QAndroidJniObject(); if (!ndefMessage.isValid()) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::NdefReadError), - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + reportError(QNearFieldTarget::NdefReadError, requestId); return requestId; } @@ -249,9 +241,7 @@ QNearFieldTarget::RequestId NearFieldTarget::sendCommand(const QByteArray &comma // Connecting QNearFieldTarget::RequestId requestId = QNearFieldTarget::RequestId(new QNearFieldTarget::RequestIdPrivate()); if (!connect()) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::TargetOutOfRangeError), - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + reportError(QNearFieldTarget::TargetOutOfRangeError, requestId); return requestId; } @@ -263,9 +253,7 @@ QNearFieldTarget::RequestId NearFieldTarget::sendCommand(const QByteArray &comma // Writing QAndroidJniObject myNewVal = m_tagTech.callObjectMethod("transceive", "([B)[B", jba); if (catchJavaExceptions()) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::CommandError), - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + reportError(QNearFieldTarget::CommandError, requestId); return requestId; } QByteArray result = jbyteArrayToQByteArray(myNewVal.object()); @@ -315,9 +303,7 @@ QNearFieldTarget::RequestId NearFieldTarget::writeNdefMessages(const QListSetByteArrayRegion(jba.object(), 0, ba.size(), reinterpret_cast(ba.data())); QAndroidJniObject jmessage = QAndroidJniObject("android/nfc/NdefMessage", "([B)V", jba.object()); if (catchJavaExceptions()) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnknownError), - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + reportError(QNearFieldTarget::UnknownError, requestId); return requestId; } // Writing m_tagTech.callMethod(writeMethod, "(Landroid/nfc/NdefMessage;)V", jmessage.object()); if (catchJavaExceptions()) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::NdefWriteError), - Q_ARG(QNearFieldTarget::RequestId&, requestId)); + reportError(QNearFieldTarget::NdefWriteError, requestId); return requestId; } diff --git x/qtconnectivity/src/nfc/qnearfieldtarget_emulator.cpp y/qtconnectivity/src/nfc/qnearfieldtarget_emulator.cpp index 29b1f74d..030718cc 100644 --- x/qtconnectivity/src/nfc/qnearfieldtarget_emulator.cpp +++ y/qtconnectivity/src/nfc/qnearfieldtarget_emulator.cpp @@ -82,9 +82,7 @@ QNearFieldTarget::RequestId TagType1::sendCommand(const QByteArray &command) // tag not in proximity if (!tagMap.value(m_tag)) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, TargetOutOfRangeError), - Q_ARG(QNearFieldTarget::RequestId, id)); + reportError(QNearFieldTarget::TargetOutOfRangeError, id); return id; } @@ -93,17 +91,13 @@ QNearFieldTarget::RequestId TagType1::sendCommand(const QByteArray &command) QByteArray response = m_tag->processCommand(command + char(crc & 0xff) + char(crc >> 8)); if (response.isEmpty()) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, NoResponseError), - Q_ARG(QNearFieldTarget::RequestId, id)); + reportError(QNearFieldTarget::NoResponseError, id); return id; } // check crc if (qChecksum(response.constData(), response.length(), Qt::ChecksumItuV41) != 0) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, ChecksumMismatchError), - Q_ARG(QNearFieldTarget::RequestId, id)); + reportError(QNearFieldTarget::ChecksumMismatchError, id); return id; } @@ -152,9 +146,7 @@ QNearFieldTarget::RequestId TagType2::sendCommand(const QByteArray &command) // tag not in proximity if (!tagMap.value(m_tag)) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, TargetOutOfRangeError), - Q_ARG(QNearFieldTarget::RequestId, id)); + reportError(QNearFieldTarget::TargetOutOfRangeError, id); return id; } @@ -168,9 +160,7 @@ QNearFieldTarget::RequestId TagType2::sendCommand(const QByteArray &command) if (response.length() > 1) { // check crc if (qChecksum(response.constData(), response.length(), Qt::ChecksumItuV41) != 0) { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, ChecksumMismatchError), - Q_ARG(QNearFieldTarget::RequestId, id)); + reportError(QNearFieldTarget::ChecksumMismatchError, id); return id; } diff --git x/qtconnectivity/src/nfc/qnearfieldtarget_neard_p.h y/qtconnectivity/src/nfc/qnearfieldtarget_neard_p.h index 053df141..625cee67 100644 --- x/qtconnectivity/src/nfc/qnearfieldtarget_neard_p.h +++ y/qtconnectivity/src/nfc/qnearfieldtarget_neard_p.h @@ -359,9 +359,7 @@ private: Q_EMIT this->requestCompleted(this->m_currentReadRequestId); }, Qt::QueuedConnection); } else { - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnknownError), - Q_ARG(QNearFieldTarget::RequestId, m_currentReadRequestId)); + this->reportError(QNearFieldTarget::UnknownError, m_currentReadRequestId); } m_readRequested = false; @@ -389,9 +387,7 @@ private: reply.waitForFinished(); if (reply.isError()) { qCWarning(QT_NFC_NEARD) << "Error writing to NFC tag" << reply.error(); - QMetaObject::invokeMethod(this, "error", Qt::QueuedConnection, - Q_ARG(QNearFieldTarget::Error, QNearFieldTarget::UnknownError), - Q_ARG(QNearFieldTarget::RequestId, m_currentWriteRequestId)); + this->reportError(QNearFieldTarget::UnknownError, m_currentWriteRequestId); } QMetaObject::invokeMethod(this, "ndefMessagesWritten", Qt::QueuedConnection); -- 2.19.1