AusweisApp
 
Lade ...
Suche ...
Keine Treffer
ReaderManager.h
gehe zur Dokumentation dieser Datei
1
4
5#pragma once
6
7#include "Env.h"
8#include "ReaderFilter.h"
12
13#include <QLoggingCategory>
14#include <QMutex>
15#include <QPointer>
16#include <QThread>
17
18#include <functional>
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 QList<std::function<void()>> cMainThreadInit;
32 static const QLoggingCategory& getLoggingCategory();
33
34 mutable QMutex mMutex;
35 QThread mThread;
36 QPointer<ReaderManagerWorker> mWorker;
37 QMap<QString, ReaderInfo> mReaderInfoCache;
38 QMap<ReaderManagerPluginType, ReaderManagerPluginInfo> mPluginInfoCache;
39
40 protected:
42 ~ReaderManager() override;
43
44 public:
45 static void addMainThreadInit(const std::function<void()>& pFunc);
46
51 void init();
52
56 void reset(ReaderManagerPluginType pType);
57
61 void insert(const ReaderInfo& pReaderInfo, const QVariant& pData = QVariant());
62
66 void shelve();
67
71 void startScanAll(bool pAutoConnect = true);
72
76 void startScan(ReaderManagerPluginType pType, bool pAutoConnect = true);
77
81 void stopScanAll(const QString& pError = QString());
82
88 void stopScan(ReaderManagerPluginType pType, const QString& pError = QString());
89
90 bool isInitialScanFinished() const;
91
92 virtual ReaderManagerPluginInfo getPluginInfo(ReaderManagerPluginType pType) const;
93 virtual QList<ReaderInfo> getReaderInfos(const ReaderFilter& pFilter = ReaderFilter()) const;
94 ReaderInfo getReaderInfo(const QString& pReaderName) const;
95 void updateReaderInfo(const QString& pReaderName) const;
96
97 bool isWorkerThread() const
98 {
99 return QThread::currentThread() == &mThread;
100 }
101
102
103 template<typename T>
104 static bool isResultType(const QVariant& pResult)
105 {
106 return pResult.metaType() == QMetaType::fromType<T>();
107 }
108
109
116 template<typename T>
117 QMetaObject::Connection callExecuteCommand(const std::function<QVariant()>& pFunc, const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pSlot)
118 {
119 const QMutexLocker mutexLocker(&mMutex);
120
121 if (!mThread.isRunning())
122 {
123 qCWarning(getLoggingCategory()) << "Cannot call ExecuteCommand if ReaderManager-Thread is not active";
124 return QMetaObject::Connection();
125 }
126
127 auto* command = new ExecuteCommand(pFunc);
128 command->moveToThread(&mThread);
129 QMetaObject::Connection connection = connect(command, &ExecuteCommand::fireCommandDone, pReceiver, pSlot, Qt::QueuedConnection);
130 if (connection)
131 {
132 command->run();
133 }
134 else
135 {
136 qCCritical(getLoggingCategory()) << "Cannot invoke ExecuteCommand command";
137 command->deleteLater();
138 }
139
140 return connection;
141 }
142
143
144#ifndef QT_NO_DEBUG
145
150 template<typename Func>
151 void callExecute(Func pFunc)
152 {
153 if (!mThread.isRunning())
154 {
155 qCWarning(getLoggingCategory()) << "Cannot call Execute if ReaderManager-Thread is not active";
156 return;
157 }
158
159 if (isWorkerThread())
160 {
161 pFunc();
162 return;
163 }
164
165 const QMutexLocker mutexLocker(&mMutex);
166
167 QMetaObject::invokeMethod(mWorker.data(), pFunc, Qt::BlockingQueuedConnection);
168 }
169
170
172 {
173 mReaderInfoCache.clear();
174 mPluginInfoCache.clear();
175 }
176
177
178#endif
179
180
187 template<typename T>
188 QMetaObject::Connection callCreateCardConnectionCommand(const QString& pReaderName, const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pSlot)
189 {
190 auto* command = new CreateCardConnectionCommand(pReaderName, mWorker);
191 QMetaObject::Connection connection = connect(command, &CreateCardConnectionCommand::fireCommandDone, pReceiver, pSlot);
192 if (connection)
193 {
194 command->run();
195 }
196 else
197 {
198 qCCritical(getLoggingCategory()) << "Cannot invoke CreateCardConnectionCommand command";
199 command->deleteLater();
200 }
201
202 return connection;
203 }
204
205 Q_SIGNALS:
206 void firePluginAdded(const ReaderManagerPluginInfo& pInfo);
207 void fireStatusChanged(const ReaderManagerPluginInfo& pInfo);
208 void fireReaderAdded(const ReaderInfo& pInfo);
209 void fireReaderRemoved(const ReaderInfo& pInfo);
211 void fireCardInserted(const ReaderInfo& pInfo);
212 void fireCardRemoved(const ReaderInfo& pInfo);
213 void fireCardInfoChanged(const ReaderInfo& pInfo);
216
217 private Q_SLOTS:
218 void doUpdateCacheEntry(const ReaderInfo& pInfo);
219 void doRemoveCacheEntry(const ReaderInfo& pInfo);
220 void doUpdatePluginCache(const ReaderManagerPluginInfo& pInfo);
221
222 public Q_SLOTS:
227 void shutdown();
228};
229
230} // namespace governikus
Definition CreateCardConnectionCommand.h:24
void fireCommandDone(QSharedPointer< CreateCardConnectionCommand > pCommand)
Definition ExecuteCommand.h:17
void fireCommandDone(const QVariant &pResult)
Definition ReaderFilter.h:18
Definition ReaderInfo.h:18
void insert(const ReaderInfo &pReaderInfo, const QVariant &pData=QVariant())
Insert a "virtual" card if plugin supports it.
Definition ReaderManager.cpp:125
void fireCardRemoved(const ReaderInfo &pInfo)
void fireCardInserted(const ReaderInfo &pInfo)
void firePluginAdded(const ReaderManagerPluginInfo &pInfo)
ReaderInfo getReaderInfo(const QString &pReaderName) const
Definition ReaderManager.cpp:297
void startScanAll(bool pAutoConnect=true)
Starts a scan for all device types.
Definition ReaderManager.cpp:197
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:188
void fireReaderPropertiesUpdated(const ReaderInfo &pInfo)
void fireStatusChanged(const ReaderManagerPluginInfo &pInfo)
bool isInitialScanFinished() const
Definition ReaderManager.cpp:223
void fireReaderAdded(const ReaderInfo &pInfo)
void shutdown()
Shuts down the reader manager service.
Definition ReaderManager.cpp:159
void callExecute(Func pFunc)
Executes a blocking function on ReaderManager-Thread.
Definition ReaderManager.h:151
void updateReaderInfo(const QString &pReaderName) const
Definition ReaderManager.cpp:307
void clearCache()
Definition ReaderManager.h:171
void init()
Initialize the reader manager service.
Definition ReaderManager.cpp:54
void fireReaderRemoved(const ReaderInfo &pInfo)
void startScan(ReaderManagerPluginType pType, bool pAutoConnect=true)
Starts a scan for devices if registered plugin don't scan anytime.
Definition ReaderManager.cpp:180
void fireCardInfoChanged(const ReaderInfo &pInfo)
bool isWorkerThread() const
Definition ReaderManager.h:97
void stopScan(ReaderManagerPluginType pType, const QString &pError=QString())
Stops started scan for devices.
Definition ReaderManager.cpp:206
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:117
static bool isResultType(const QVariant &pResult)
Definition ReaderManager.h:104
friend class Env
Definition ReaderManager.h:28
void shelve()
Shelve all cards that were shelved and inserted before.
Definition ReaderManager.cpp:142
virtual ReaderManagerPluginInfo getPluginInfo(ReaderManagerPluginType pType) const
Definition ReaderManager.cpp:243
void stopScanAll(const QString &pError=QString())
Stops scan for all device types.
Definition ReaderManager.cpp:234
ReaderManager()
Definition ReaderManager.cpp:23
static void addMainThreadInit(const std::function< void()> &pFunc)
Definition ReaderManager.cpp:48
~ReaderManager() override
Definition ReaderManager.cpp:33
virtual QList< ReaderInfo > getReaderInfos(const ReaderFilter &pFilter=ReaderFilter()) const
Definition ReaderManager.cpp:289
void reset(ReaderManagerPluginType pType)
Resets the plugins matching the given type.
Definition ReaderManager.cpp:108
#define T(v)
Definition http_parser.cpp:237
Defines the AccessRight and AccessRole enum.
Definition CommandApdu.h:17
Definition Env.h:45