AusweisApp2
ReaderManager.h
gehe zur Dokumentation dieser Datei
1
5#pragma once
6
7#include "Env.h"
8#include "Reader.h"
9#include "ReaderFilter.h"
10#include "ReaderManagerWorker.h"
13
14#include <QMutex>
15#include <QPointer>
16#include <QThread>
17
18#include <functional>
19
20namespace governikus
21{
23 : public QObject
24 , private Env::ThreadSafe
25{
26 Q_OBJECT
27 friend class Env;
28
29 private:
30 static QVector<std::function<void()>> cMainThreadInit;
31
32 mutable QMutex mMutex;
33 QThread mThread;
34 QPointer<ReaderManagerWorker> mWorker;
35 QMap<QString, ReaderInfo> mReaderInfoCache;
36 QMap<ReaderManagerPlugInType, ReaderManagerPlugInInfo> mPlugInInfoCache;
37
38 protected:
40 ~ReaderManager() override;
41
42 public:
43 static void addMainThreadInit(const std::function<void()>& pFunc);
44
49 void init();
50
54 void reset(ReaderManagerPlugInType pType);
55
59 void insert(const ReaderInfo& pReaderInfo, const QVariant& pData = QVariant());
60
64 void shelve();
65
69 void startScanAll(bool pAutoConnect = true);
70
74 void startScan(ReaderManagerPlugInType pType, bool pAutoConnect = true);
75
79 void stopScanAll(const QString& pError = QString());
80
84 bool isScanRunning() const;
85
89 bool isScanRunning(ReaderManagerPlugInType pType) const;
90
96 void stopScan(ReaderManagerPlugInType pType, const QString& pError = QString());
97
98 QVector<ReaderManagerPlugInInfo> getPlugInInfos() const;
99 virtual QVector<ReaderInfo> getReaderInfos(const ReaderFilter& pFilter = ReaderFilter()) const;
100 ReaderInfo getReaderInfo(const QString& pReaderName) const;
101 void updateReaderInfo(const QString& pReaderName);
102
103 bool isWorkerThread() const
104 {
105 return QThread::currentThread() == &mThread;
106 }
107
108
115 template<typename T>
116 QMetaObject::Connection callExecuteCommand(const std::function<QVariant()>& pFunc, const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pSlot)
117 {
118 const QMutexLocker mutexLocker(&mMutex);
119
120 if (!mThread.isRunning())
121 {
122 qCWarning(card) << "Cannot call ExecuteCommand if ReaderManager-Thread is not active";
123 return QMetaObject::Connection();
124 }
125
126 auto* command = new ExecuteCommand(pFunc);
127 command->moveToThread(&mThread);
128 QMetaObject::Connection connection = connect(command, &ExecuteCommand::fireCommandDone, pReceiver, pSlot, Qt::QueuedConnection);
129 if (connection)
130 {
131 command->run();
132 }
133 else
134 {
135 qCCritical(card) << "Cannot invoke ExecuteCommand command";
136 command->deleteLater();
137 }
138
139 return connection;
140 }
141
142
143#ifndef QT_NO_DEBUG
144
149 template<typename Func>
150 void callExecute(Func pFunc)
151 {
152 if (!mThread.isRunning())
153 {
154 qCWarning(card) << "Cannot call Execute if ReaderManager-Thread is not active";
155 return;
156 }
157
158 if (isWorkerThread())
159 {
160 pFunc();
161 return;
162 }
163
164 const QMutexLocker mutexLocker(&mMutex);
165
166 QMetaObject::invokeMethod(mWorker.data(), pFunc, Qt::BlockingQueuedConnection);
167 }
168
169
170#endif
171
172
179 template<typename T>
180 QMetaObject::Connection callCreateCardConnectionCommand(const QString& pReaderName, const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pSlot)
181 {
182 auto* command = new CreateCardConnectionCommand(pReaderName, mWorker);
183 QMetaObject::Connection connection = connect(command, &CreateCardConnectionCommand::fireCommandDone, pReceiver, pSlot, Qt::UniqueConnection);
184 if (connection)
185 {
186 command->run();
187 }
188 else
189 {
190 qCCritical(card) << "Cannot invoke CreateCardConnectionCommand command";
191 command->deleteLater();
192 }
193
194 return connection;
195 }
196
197
198 void updateRetryCounters();
199
200 Q_SIGNALS:
201 void firePluginAdded(const ReaderManagerPlugInInfo& pInfo);
202 void fireStatusChanged(const ReaderManagerPlugInInfo& pInfo);
203 void fireReaderAdded(const ReaderInfo& pInfo);
204 void fireReaderRemoved(const ReaderInfo& pInfo);
206 void fireCardInserted(const ReaderInfo& pInfo);
207 void fireCardRemoved(const ReaderInfo& pInfo);
208 void fireCardInfoChanged(const ReaderInfo& pInfo);
210
211 private Q_SLOTS:
212 void doUpdateCacheEntry(const ReaderInfo& pInfo);
213 void doRemoveCacheEntry(const ReaderInfo& pInfo);
214 void doUpdatePluginCache(const ReaderManagerPlugInInfo& pInfo);
215
216 public Q_SLOTS:
221 void shutdown();
222};
223
224} // namespace governikus
Definition: CreateCardConnectionCommand.h:24
void fireCommandDone(QSharedPointer< CreateCardConnectionCommand > pCommand)
Definition: Env.h:44
Definition: ExecuteCommand.h:18
void fireCommandDone(const QVariant &pResult)
Definition: ReaderFilter.h:21
Definition: ReaderInfo.h:18
Definition: ReaderManager.h:25
void insert(const ReaderInfo &pReaderInfo, const QVariant &pData=QVariant())
Insert a "virtual" card if plugin supports it.
Definition: ReaderManager.cpp:118
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:173
ReaderInfo getReaderInfo(const QString &pReaderName) const
Definition: ReaderManager.cpp:310
void updateReaderInfo(const QString &pReaderName)
Definition: ReaderManager.cpp:320
void startScanAll(bool pAutoConnect=true)
Starts a scan for all device types.
Definition: ReaderManager.cpp:190
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:180
void fireReaderPropertiesUpdated(const ReaderInfo &pInfo)
void fireReaderAdded(const ReaderInfo &pInfo)
void updateRetryCounters()
Definition: ReaderManager.cpp:329
void shutdown()
Shuts down the reader manager service.
Definition: ReaderManager.cpp:152
void callExecute(Func pFunc)
Executes a blocking function on ReaderManager-Thread.
Definition: ReaderManager.h:150
void init()
Initialize the reader manager service.
Definition: ReaderManager.cpp:47
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:199
bool isWorkerThread() const
Definition: ReaderManager.h:103
virtual QVector< ReaderInfo > getReaderInfos(const ReaderFilter &pFilter=ReaderFilter()) const
Definition: ReaderManager.cpp:295
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:116
void reset(ReaderManagerPlugInType pType)
Resets the plugins matching the given type.
Definition: ReaderManager.cpp:101
bool isScanRunning() const
Queries if any plugin is currently scanning.
Definition: ReaderManager.cpp:225
void shelve()
Shelve all cards that were shelved and inserted before.
Definition: ReaderManager.cpp:135
void stopScanAll(const QString &pError=QString())
Stops scan for all device types.
Definition: ReaderManager.cpp:216
QVector< ReaderManagerPlugInInfo > getPlugInInfos() const
Definition: ReaderManager.cpp:253
ReaderManager()
Definition: ReaderManager.cpp:16
static void addMainThreadInit(const std::function< void()> &pFunc)
Definition: ReaderManager.cpp:41
~ReaderManager() override
Definition: ReaderManager.cpp:26
#define T(v)
Definition: http_parser.cpp:237
A simple template renderer.
Definition: ActivationContext.h:15
Definition: Env.h:49