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
19namespace governikus
20{
21
23 : public QObject
24 , private Env::ThreadSafe
25{
26 Q_OBJECT
27 friend class Env;
28
29 private:
30 static QList<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
86 void stopScan(ReaderManagerPlugInType pType, const QString& pError = QString());
87
88 virtual ReaderManagerPlugInInfo getPlugInInfo(ReaderManagerPlugInType pType) const;
89 virtual QList<ReaderInfo> getReaderInfos(const ReaderFilter& pFilter = ReaderFilter()) const;
90 ReaderInfo getReaderInfo(const QString& pReaderName) const;
91 void updateReaderInfo(const QString& pReaderName);
92
93 bool isWorkerThread() const
94 {
95 return QThread::currentThread() == &mThread;
96 }
97
98
99 template<typename T>
100 static bool isResultType(const QVariant& pResult)
101 {
102 return pResult.metaType() == QMetaType::fromType<T>();
103 }
104
105
112 template<typename T>
113 QMetaObject::Connection callExecuteCommand(const std::function<QVariant()>& pFunc, const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pSlot)
114 {
115 const QMutexLocker mutexLocker(&mMutex);
116
117 if (!mThread.isRunning())
118 {
119 qCWarning(card) << "Cannot call ExecuteCommand if ReaderManager-Thread is not active";
120 return QMetaObject::Connection();
121 }
122
123 auto* command = new ExecuteCommand(pFunc);
124 command->moveToThread(&mThread);
125 QMetaObject::Connection connection = connect(command, &ExecuteCommand::fireCommandDone, pReceiver, pSlot, Qt::QueuedConnection);
126 if (connection)
127 {
128 command->run();
129 }
130 else
131 {
132 qCCritical(card) << "Cannot invoke ExecuteCommand command";
133 command->deleteLater();
134 }
135
136 return connection;
137 }
138
139
140#ifndef QT_NO_DEBUG
141
146 template<typename Func>
147 void callExecute(Func pFunc)
148 {
149 if (!mThread.isRunning())
150 {
151 qCWarning(card) << "Cannot call Execute if ReaderManager-Thread is not active";
152 return;
153 }
154
155 if (isWorkerThread())
156 {
157 pFunc();
158 return;
159 }
160
161 const QMutexLocker mutexLocker(&mMutex);
162
163 QMetaObject::invokeMethod(mWorker.data(), pFunc, Qt::BlockingQueuedConnection);
164 }
165
166
167#endif
168
169
176 template<typename T>
177 QMetaObject::Connection callCreateCardConnectionCommand(const QString& pReaderName, const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pSlot)
178 {
179 auto* command = new CreateCardConnectionCommand(pReaderName, mWorker);
180 QMetaObject::Connection connection = connect(command, &CreateCardConnectionCommand::fireCommandDone, pReceiver, pSlot, Qt::UniqueConnection);
181 if (connection)
182 {
183 command->run();
184 }
185 else
186 {
187 qCCritical(card) << "Cannot invoke CreateCardConnectionCommand command";
188 command->deleteLater();
189 }
190
191 return connection;
192 }
193
194 Q_SIGNALS:
195 void firePluginAdded(const ReaderManagerPlugInInfo& pInfo);
196 void fireStatusChanged(const ReaderManagerPlugInInfo& pInfo);
197 void fireReaderAdded(const ReaderInfo& pInfo);
198 void fireReaderRemoved(const ReaderInfo& pInfo);
200 void fireCardInserted(const ReaderInfo& pInfo);
201 void fireCardRemoved(const ReaderInfo& pInfo);
202 void fireCardInfoChanged(const ReaderInfo& pInfo);
204
205 private Q_SLOTS:
206 void doUpdateCacheEntry(const ReaderInfo& pInfo);
207 void doRemoveCacheEntry(const ReaderInfo& pInfo);
208 void doUpdatePluginCache(const ReaderManagerPlugInInfo& pInfo);
209
210 public Q_SLOTS:
215 void shutdown();
216};
217
218} // 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:25
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
virtual 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:177
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:147
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:93
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:113
static bool isResultType(const QVariant &pResult)
Definition: ReaderManager.h:100
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
virtual QList< ReaderInfo > getReaderInfos(const ReaderFilter &pFilter=ReaderFilter()) const
Definition: ReaderManager.cpp:263
#define T(v)
Definition: http_parser.cpp:237
Implementation of GeneralAuthenticate response APDUs.
Definition: CommandApdu.h:16
Definition: Env.h:47