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{
27 friend class Env;
28
29 private:
30 static QList<std::function<void()>> cMainThreadInit;
31
32 mutable QMutex mMutex;
33 QThread mThread;
35 QMap<QString, ReaderInfo> mReaderInfoCache;
37
38 protected:
40 ~ReaderManager() override;
41
42 public:
43 static void addMainThreadInit(const std::function<void()>& pFunc);
44
49 void init();
50
55
59 void insert(const ReaderInfo& pReaderInfo, const QVariant& pData = QVariant());
60
64 void shelve();
65
69 void startScanAll(bool pAutoConnect = true);
70
75
79 void stopScanAll(const QString& pError = QString());
80
86 void stopScan(ReaderManagerPluginType pType, const QString& pError = QString());
87
88 bool isInitialScanFinished() const;
89
91 virtual QList<ReaderInfo> getReaderInfos(const ReaderFilter& pFilter = ReaderFilter()) const;
92 ReaderInfo getReaderInfo(const QString& pReaderName) const;
93 void updateReaderInfo(const QString& pReaderName);
94
95 bool isWorkerThread() const
96 {
97 return QThread::currentThread() == &mThread;
98 }
99
100
101 template<typename T>
102 static bool isResultType(const QVariant& pResult)
103 {
104 return pResult.metaType() == QMetaType::fromType<T>();
105 }
106
107
114 template<typename T>
115 QMetaObject::Connection callExecuteCommand(const std::function<QVariant()>& pFunc, const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pSlot)
116 {
117 const QMutexLocker mutexLocker(&mMutex);
118
119 if (!mThread.isRunning())
120 {
121 qCWarning(card) << "Cannot call ExecuteCommand if ReaderManager-Thread is not active";
122 return QMetaObject::Connection();
123 }
124
125 auto* command = new ExecuteCommand(pFunc);
126 command->moveToThread(&mThread);
127 QMetaObject::Connection connection = connect(command, &ExecuteCommand::fireCommandDone, pReceiver, pSlot, Qt::QueuedConnection);
128 if (connection)
129 {
130 command->run();
131 }
132 else
133 {
134 qCCritical(card) << "Cannot invoke ExecuteCommand command";
135 command->deleteLater();
136 }
137
138 return connection;
139 }
140
141
142#ifndef QT_NO_DEBUG
143
148 template<typename Func>
150 {
151 if (!mThread.isRunning())
152 {
153 qCWarning(card) << "Cannot call Execute if ReaderManager-Thread is not active";
154 return;
155 }
156
157 if (isWorkerThread())
158 {
159 pFunc();
160 return;
161 }
162
163 const QMutexLocker mutexLocker(&mMutex);
164
165 QMetaObject::invokeMethod(mWorker.data(), pFunc, Qt::BlockingQueuedConnection);
166 }
167
168
169#endif
170
171
178 template<typename T>
179 QMetaObject::Connection callCreateCardConnectionCommand(const QString& pReaderName, const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pSlot)
180 {
181 auto* command = new CreateCardConnectionCommand(pReaderName, mWorker);
183 if (connection)
184 {
185 command->run();
186 }
187 else
188 {
189 qCCritical(card) << "Cannot invoke CreateCardConnectionCommand command";
190 command->deleteLater();
191 }
192
193 return connection;
194 }
195
196 Q_SIGNALS:
207
208 private Q_SLOTS:
209 void doUpdateCacheEntry(const ReaderInfo& pInfo);
210 void doRemoveCacheEntry(const ReaderInfo& pInfo);
211 void doUpdatePluginCache(const ReaderManagerPluginInfo& pInfo);
212
213 public Q_SLOTS:
218 void shutdown();
219};
220
221} // 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)
ReaderInfo getReaderInfo(const QString &pReaderName) const
Definition ReaderManager.cpp:293
void updateReaderInfo(const QString &pReaderName)
Definition ReaderManager.cpp:303
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:179
void fireReaderPropertiesUpdated(const ReaderInfo &pInfo)
void fireStatusChanged(const ReaderManagerPluginInfo &pInfo)
bool isInitialScanFinished() const
Definition ReaderManager.cpp:219
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:149
void init()
Initialize the reader manager service.
Definition ReaderManager.cpp:50
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:176
void fireCardInfoChanged(const ReaderInfo &pInfo)
bool isWorkerThread() const
Definition ReaderManager.h:95
void stopScan(ReaderManagerPluginType pType, const QString &pError=QString())
Stops started scan for devices.
Definition ReaderManager.cpp:202
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:115
static bool isResultType(const QVariant &pResult)
Definition ReaderManager.h:102
void shelve()
Shelve all cards that were shelved and inserted before.
Definition ReaderManager.cpp:138
virtual ReaderManagerPluginInfo getPluginInfo(ReaderManagerPluginType pType) const
Definition ReaderManager.cpp:239
void stopScanAll(const QString &pError=QString())
Stops scan for all device types.
Definition ReaderManager.cpp:230
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:285
void reset(ReaderManagerPluginType pType)
Resets the plugins matching the given type.
Definition ReaderManager.cpp:104
#define T(v)
Definition http_parser.cpp:237
Implementation of GeneralAuthenticate response APDUs.
Definition CommandApdu.h:17
QSharedPointer< T > decodeObject(const QByteArray &pData, bool pLogging=true)
Template function for decoding an OpenSSL type from DER encoded QByteArray.
Definition ASN1TemplateUtil.h:114
Definition Env.h:47