Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qnearfieldmanager_pcsc.cpp
Go to the documentation of this file.
1// Copyright (C) 2022 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
6#include "pcsc/qpcscmanager_p.h"
7#include "pcsc/qpcsccard_p.h"
8#include <QtCore/QLoggingCategory>
9#include <QtCore/QThread>
10
12
13using namespace Qt::StringLiterals;
14
15Q_DECLARE_LOGGING_CATEGORY(QT_NFC_PCSC)
16
17/*
18 Constructs a new near field manager private implementation.
19
20 This object creates a worker thread with an instance of QPcscManager in
21 it. All the communication with QPcscManager is done using signal-slot
22 mechanism.
23*/
24QNearFieldManagerPrivateImpl::QNearFieldManagerPrivateImpl()
25{
26 qCDebug(QT_NFC_PCSC) << Q_FUNC_INFO;
27
28 m_worker = new QPcscManager;
29 m_workerThread = new QThread(this);
30 m_workerThread->setObjectName(u"QtNfcThread"_s);
31 m_worker->moveToThread(m_workerThread);
32
33 connect(m_worker, &QPcscManager::cardInserted, this,
34 &QNearFieldManagerPrivateImpl::onCardInserted);
35 connect(this, &QNearFieldManagerPrivateImpl::startTargetDetectionRequest, m_worker,
36 &QPcscManager::onStartTargetDetectionRequest);
37 connect(this, &QNearFieldManagerPrivateImpl::stopTargetDetectionRequest, m_worker,
38 &QPcscManager::onStopTargetDetectionRequest);
39
40 m_workerThread->start();
41}
42
43/*
44 Destroys the near field manager private implementation.
45*/
47{
48 qCDebug(QT_NFC_PCSC) << Q_FUNC_INFO;
49
50 // Destroy the worker. It calls QThread::quit() on the working thread in
51 // its destructor.
52 QMetaObject::invokeMethod(m_worker, &QObject::deleteLater, Qt::QueuedConnection);
53 m_workerThread->wait();
54}
55
57{
58 return true;
59}
60
61bool QNearFieldManagerPrivateImpl::isSupported(QNearFieldTarget::AccessMethod accessMethod) const
62{
63 switch (accessMethod) {
64 case QNearFieldTarget::TagTypeSpecificAccess:
65 case QNearFieldTarget::NdefAccess:
66 return true;
67 default:
68 return false;
69 }
70}
71
72bool QNearFieldManagerPrivateImpl::startTargetDetection(QNearFieldTarget::AccessMethod accessMethod)
73{
74 qCDebug(QT_NFC_PCSC) << Q_FUNC_INFO;
75
76 Q_EMIT startTargetDetectionRequest(accessMethod);
77
78 return true;
79}
80
81void QNearFieldManagerPrivateImpl::stopTargetDetection(const QString &errorMessage)
82{
83 Q_UNUSED(errorMessage);
84
85 qCDebug(QT_NFC_PCSC) << Q_FUNC_INFO;
86
87 Q_EMIT stopTargetDetectionRequest();
88}
89
90/*
91 Invoked when the worker has detected a new card.
92
93 The worker will ensure that the card object remains valid until the manager
94 emits targetCreatedForCard() signal.
95*/
96void QNearFieldManagerPrivateImpl::onCardInserted(QPcscCard *card, const QByteArray &uid,
97 QNearFieldTarget::AccessMethods accessMethods,
98 int maxInputLength)
99{
100 qCDebug(QT_NFC_PCSC) << Q_FUNC_INFO;
101
102 auto priv = new QNearFieldTargetPrivateImpl(uid, accessMethods, maxInputLength, this);
103
104 connect(priv, &QNearFieldTargetPrivateImpl::disconnectRequest, card,
105 &QPcscCard::onDisconnectRequest);
106 connect(priv, &QNearFieldTargetPrivateImpl::destroyed, card, &QPcscCard::onTargetDestroyed);
107 connect(priv, &QNearFieldTargetPrivateImpl::sendCommandRequest, card,
108 &QPcscCard::onSendCommandRequest);
109 connect(priv, &QNearFieldTargetPrivateImpl::readNdefMessagesRequest, card,
110 &QPcscCard::onReadNdefMessagesRequest);
111 connect(priv, &QNearFieldTargetPrivateImpl::writeNdefMessagesRequest, card,
112 &QPcscCard::onWriteNdefMessagesRequest);
113
114 connect(priv, &QNearFieldTargetPrivateImpl::targetLost, this,
116
117 connect(card, &QPcscCard::disconnected, priv, &QNearFieldTargetPrivateImpl::onDisconnected);
119 connect(card, &QPcscCard::requestCompleted, priv,
120 &QNearFieldTargetPrivateImpl::onRequestCompleted);
121 connect(card, &QPcscCard::ndefMessageRead, priv,
123
124 auto target = new QNearFieldTarget(priv, this);
125
126 Q_EMIT targetDetected(target);
127
128 // Let the worker know that the card object can be deleted if it is no
129 // longer needed.
130 QMetaObject::invokeMethod(card, &QPcscCard::enableAutodelete, Qt::QueuedConnection);
131}
132
133void QNearFieldManagerPrivateImpl::onTargetLost(QNearFieldTargetPrivate *target)
134{
135 Q_EMIT targetLost(target->q_ptr);
136}
137
138Q_LOGGING_CATEGORY(QT_NFC_PCSC, "qt.nfc.pcsc")
139
140QT_END_NAMESPACE
bool isSupported(QNearFieldTarget::AccessMethod accessMethod) const override
bool startTargetDetection(QNearFieldTarget::AccessMethod accessMethod) override
void stopTargetDetection(const QString &errorMessage) override
void onTargetLost(QNearFieldTargetPrivate *target)
void targetLost(QNearFieldTargetPrivate *target)
void onNdefMessageRead(const QNdefMessage &message)
void ndefMessageRead(const QNdefMessage &message)
void invalidated()
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")