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"
12 #include "command/ExecuteCommand.h"
13 
14 #include <QMutex>
15 #include <QPointer>
16 #include <QThread>
17 
18 #include <functional>
19 
20 namespace 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:
39  ReaderManager();
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