AusweisApp
Lade ...
Suche ...
Keine Treffer
ReaderManager.h
gehe zur Dokumentation dieser Datei
1
5#pragma once
6
7#include "Env.h"
8#include "ReaderFilter.h"
12
13#include <QMutex>
14#include <QPointer>
15#include <QThread>
16
17#include <functional>
18
19
20namespace governikus
21{
22
24 : public QObject
25 , private Env::ThreadSafe
26{
27 Q_OBJECT
28 friend class Env;
29
30 private:
31 static QVector<std::function<void()>> cMainThreadInit;
32
33 mutable QMutex mMutex;
34 QThread mThread;
35 QPointer<ReaderManagerWorker> mWorker;
36 QMap<QString, ReaderInfo> mReaderInfoCache;
37 QMap<ReaderManagerPlugInType, ReaderManagerPlugInInfo> mPlugInInfoCache;
38
39 protected:
41 ~ReaderManager() override;
42
43 public:
44 static void addMainThreadInit(const std::function<void()>& pFunc);
45
50 void init();
51
55 void reset(ReaderManagerPlugInType pType);
56
60 void insert(const ReaderInfo& pReaderInfo, const QVariant& pData = QVariant());
61
65 void shelve();
66
70 void startScanAll(bool pAutoConnect = true);
71
75 void startScan(ReaderManagerPlugInType pType, bool pAutoConnect = true);
76
80 void stopScanAll(const QString& pError = QString());
81
87 void stopScan(ReaderManagerPlugInType pType, const QString& pError = QString());
88
89 ReaderManagerPlugInInfo getPlugInInfo(ReaderManagerPlugInType pType) const;
90 virtual QVector<ReaderInfo> getReaderInfos(const ReaderFilter& pFilter = ReaderFilter()) const;
91 ReaderInfo getReaderInfo(const QString& pReaderName) const;
92 void updateReaderInfo(const QString& pReaderName);
93
94 bool isWorkerThread() const
95 {
96 return QThread::currentThread() == &mThread;
97 }
98
99
100 template<typename T>
101 static bool isResultType(const QVariant& pResult)
102 {
103 return pResult.metaType() == QMetaType::fromType<T>();
104 }
105
106
113 template<typename T>
114 QMetaObject::Connection callExecuteCommand(const std::function<QVariant()>& pFunc, const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pSlot)
115 {
116 const QMutexLocker mutexLocker(&mMutex);
117
118 if (!mThread.isRunning())
119 {
120 qCWarning(card) << "Cannot call ExecuteCommand if ReaderManager-Thread is not active";
121 return QMetaObject::Connection();
122 }
123
124 auto* command = new ExecuteCommand(pFunc);
125 command->moveToThread(&mThread);
126 QMetaObject::Connection connection = connect(command, &ExecuteCommand::fireCommandDone, pReceiver, pSlot, Qt::QueuedConnection);
127 if (connection)
128 {
129 command->run();
130 }
131 else
132 {
133 qCCritical(card) << "Cannot invoke ExecuteCommand command";
134 command->deleteLater();
135 }
136
137 return connection;
138 }
139
140
141#ifndef QT_NO_DEBUG
142
147 template<typename Func>
148 void callExecute(Func pFunc)
149 {
150 if (!mThread.isRunning())
151 {
152 qCWarning(card) << "Cannot call Execute if ReaderManager-Thread is not active";
153 return;
154 }
155
156 if (isWorkerThread())
157 {
158 pFunc();
159 return;
160 }
161
162 const QMutexLocker mutexLocker(&mMutex);
163
164 QMetaObject::invokeMethod(mWorker.data(), pFunc, Qt::BlockingQueuedConnection);
165 }
166
167
168#endif
169
170
177 template<typename T>
178 QMetaObject::Connection callCreateCardConnectionCommand(const QString& pReaderName, const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pSlot)
179 {
180 auto* command = new CreateCardConnectionCommand(pReaderName, mWorker);
181 QMetaObject::Connection connection = connect(command, &CreateCardConnectionCommand::fireCommandDone, pReceiver, pSlot, Qt::UniqueConnection);
182 if (connection)
183 {
184 command->run();
185 }
186 else
187 {
188 qCCritical(card) << "Cannot invoke CreateCardConnectionCommand command";
189 command->deleteLater();
190 }
191
192 return connection;
193 }
194
195 Q_SIGNALS:
196 void firePluginAdded(const ReaderManagerPlugInInfo& pInfo);
197 void fireStatusChanged(const ReaderManagerPlugInInfo& pInfo);
198 void fireReaderAdded(const ReaderInfo& pInfo);
199 void fireReaderRemoved(const ReaderInfo& pInfo);
201 void fireCardInserted(const ReaderInfo& pInfo);
202 void fireCardRemoved(const ReaderInfo& pInfo);
203 void fireCardInfoChanged(const ReaderInfo& pInfo);
205
206 private Q_SLOTS:
207 void doUpdateCacheEntry(const ReaderInfo& pInfo);
208 void doRemoveCacheEntry(const ReaderInfo& pInfo);
209 void doUpdatePluginCache(const ReaderManagerPlugInInfo& pInfo);
210
211 public Q_SLOTS:
216 void shutdown();
217};
218
219} // namespace governikus
Definition CreateCardConnectionCommand.h:26
void fireCommandDone(QSharedPointer< CreateCardConnectionCommand > pCommand)
Definition Env.h:42
Definition ExecuteCommand.h:20
void fireCommandDone(const QVariant &pResult)
Definition ReaderFilter.h:21
Definition ReaderInfo.h:18
Definition ReaderManager.h:26
void insert(const ReaderInfo &pReaderInfo, const QVariant &pData=QVariant())
Insert a "virtual" card if plugin supports it.
Definition ReaderManager.cpp:121
void fireCardRemoved(const ReaderInfo &pInfo)
void fireCardInserted(const ReaderInfo &pInfo)
void firePluginAdded(const ReaderManagerPlugInInfo &pInfo)
void startScan(ReaderManagerPlugInType pType, bool pAutoConnect=true)
Starts a scan for devices if registered plugin don't scan anytime.
Definition ReaderManager.cpp:176
ReaderInfo getReaderInfo(const QString &pReaderName) const
Definition ReaderManager.cpp:271
ReaderManagerPlugInInfo getPlugInInfo(ReaderManagerPlugInType pType) const
Definition ReaderManager.cpp:228
void updateReaderInfo(const QString &pReaderName)
Definition ReaderManager.cpp:281
void startScanAll(bool pAutoConnect=true)
Starts a scan for all device types.
Definition ReaderManager.cpp:193
QMetaObject::Connection callCreateCardConnectionCommand(const QString &pReaderName, const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pSlot)
Executes a command to create a CardConnection for a specified reader.
Definition ReaderManager.h:178
void fireReaderPropertiesUpdated(const ReaderInfo &pInfo)
void fireReaderAdded(const ReaderInfo &pInfo)
void shutdown()
Shuts down the reader manager service.
Definition ReaderManager.cpp:155
void callExecute(Func pFunc)
Executes a blocking function on ReaderManager-Thread.
Definition ReaderManager.h:148
void init()
Initialize the reader manager service.
Definition ReaderManager.cpp:50
void fireReaderRemoved(const ReaderInfo &pInfo)
void fireCardInfoChanged(const ReaderInfo &pInfo)
void fireStatusChanged(const ReaderManagerPlugInInfo &pInfo)
void stopScan(ReaderManagerPlugInType pType, const QString &pError=QString())
Stops started scan for devices.
Definition ReaderManager.cpp:202
bool isWorkerThread() const
Definition ReaderManager.h:94
virtual QVector< ReaderInfo > getReaderInfos(const ReaderFilter &pFilter=ReaderFilter()) const
Definition ReaderManager.cpp:263
QMetaObject::Connection callExecuteCommand(const std::function< QVariant()> &pFunc, const typename QtPrivate::FunctionPointer< T >::Object *pReceiver, T pSlot)
Executes a function on ReaderManager-Thread.
Definition ReaderManager.h:114
static bool isResultType(const QVariant &pResult)
Definition ReaderManager.h:101
void reset(ReaderManagerPlugInType pType)
Resets the plugins matching the given type.
Definition ReaderManager.cpp:104
void shelve()
Shelve all cards that were shelved and inserted before.
Definition ReaderManager.cpp:138
void stopScanAll(const QString &pError=QString())
Stops scan for all device types.
Definition ReaderManager.cpp:219
ReaderManager()
Definition ReaderManager.cpp:19
static void addMainThreadInit(const std::function< void()> &pFunc)
Definition ReaderManager.cpp:44
~ReaderManager() override
Definition ReaderManager.cpp:29
#define T(v)
Definition http_parser.cpp:237
Implementation of GeneralAuthenticate response APDUs.
Definition CommandApdu.h:16
Definition Env.h:47