AusweisApp2
ReaderManager.h
gehe zur Dokumentation dieser Datei
1 
5 #pragma once
6 
7 #include "Env.h"
8 #include "ReaderFilter.h"
9 #include "ReaderManagerWorker.h"
11 #include "command/ExecuteCommand.h"
12 
13 #include <QMutex>
14 #include <QPointer>
15 #include <QThread>
16 
17 #include <functional>
18 
19 
20 namespace 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:
40  ReaderManager();
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 
85  bool isScanRunning() const;
86 
90  bool isScanRunning(ReaderManagerPlugInType pType) const;
91 
97  void stopScan(ReaderManagerPlugInType pType, const QString& pError = QString());
98 
99  ReaderManagerPlugInInfo getPlugInInfo(ReaderManagerPlugInType pType) const;
100  virtual QVector<ReaderInfo> getReaderInfos(const ReaderFilter& pFilter = ReaderFilter()) const;
101  ReaderInfo getReaderInfo(const QString& pReaderName) const;
102  void updateReaderInfo(const QString& pReaderName);
103 
104  bool isWorkerThread() const
105  {
106  return QThread::currentThread() == &mThread;
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(card) << "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(card) << "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(card) << "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 
171 #endif
172 
173 
180  template<typename T>
181  QMetaObject::Connection callCreateCardConnectionCommand(const QString& pReaderName, const typename QtPrivate::FunctionPointer<T>::Object* pReceiver, T pSlot)
182  {
183  auto* command = new CreateCardConnectionCommand(pReaderName, mWorker);
184  QMetaObject::Connection connection = connect(command, &CreateCardConnectionCommand::fireCommandDone, pReceiver, pSlot, Qt::UniqueConnection);
185  if (connection)
186  {
187  command->run();
188  }
189  else
190  {
191  qCCritical(card) << "Cannot invoke CreateCardConnectionCommand command";
192  command->deleteLater();
193  }
194 
195  return connection;
196  }
197 
198 
199  void updateRetryCounters();
200 
201  Q_SIGNALS:
202  void firePluginAdded(const ReaderManagerPlugInInfo& pInfo);
203  void fireStatusChanged(const ReaderManagerPlugInInfo& pInfo);
204  void fireReaderAdded(const ReaderInfo& pInfo);
205  void fireReaderRemoved(const ReaderInfo& pInfo);
207  void fireCardInserted(const ReaderInfo& pInfo);
208  void fireCardRemoved(const ReaderInfo& pInfo);
209  void fireCardInfoChanged(const ReaderInfo& pInfo);
211 
212  private Q_SLOTS:
213  void doUpdateCacheEntry(const ReaderInfo& pInfo);
214  void doRemoveCacheEntry(const ReaderInfo& pInfo);
215  void doUpdatePluginCache(const ReaderManagerPlugInInfo& pInfo);
216 
217  public Q_SLOTS:
222  void shutdown();
223 };
224 
225 } // 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: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:306
ReaderManagerPlugInInfo getPlugInInfo(ReaderManagerPlugInType pType) const
Definition: ReaderManager.cpp:256
void updateReaderInfo(const QString &pReaderName)
Definition: ReaderManager.cpp:316
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:181
void fireReaderPropertiesUpdated(const ReaderInfo &pInfo)
void fireReaderAdded(const ReaderInfo &pInfo)
void updateRetryCounters()
Definition: ReaderManager.cpp:325
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:151
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:104
virtual QVector< ReaderInfo > getReaderInfos(const ReaderFilter &pFilter=ReaderFilter()) const
Definition: ReaderManager.cpp:291
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
void reset(ReaderManagerPlugInType pType)
Resets the plugins matching the given type.
Definition: ReaderManager.cpp:104
bool isScanRunning() const
Queries if any plugin is currently scanning.
Definition: ReaderManager.cpp:228
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:49