1 /* -*- mode: c++; c-basic-offset:4 -*-
2     smartcard/readerstatus.h
3 
4     This file is part of Kleopatra, the KDE keymanager
5     SPDX-FileCopyrightText: 2009 Klarälvdalens Datakonsult AB
6 
7     SPDX-License-Identifier: GPL-2.0-or-later
8 */
9 
10 #pragma once
11 
12 #include <QObject>
13 #include <QMetaType>
14 
15 #include "card.h"
16 
17 #include <vector>
18 #include <memory>
19 
20 namespace GpgME
21 {
22 class AssuanTransaction;
23 class Context;
24 class Error;
25 }
26 
27 namespace Kleo
28 {
29 namespace SmartCard
30 {
31 
32 class ReaderStatus : public QObject
33 {
34     Q_OBJECT
35 public:
36     explicit ReaderStatus(QObject *parent = nullptr);
37     ~ReaderStatus() override;
38 
39     static const ReaderStatus *instance();
40     static ReaderStatus *mutableInstance();
41 
42     void startSimpleTransaction(const std::shared_ptr<Card> &card, const QByteArray &cmd, QObject *receiver, const char *slot);
43     void startTransaction(const std::shared_ptr<Card> &card, const QByteArray &cmd, QObject *receiver, const char *slot,
44                           std::unique_ptr<GpgME::AssuanTransaction> transaction);
45 
46     Card::Status cardStatus(unsigned int slot) const;
47     std::string firstCardWithNullPin() const;
48     bool anyCardCanLearnKeys() const;
49 
50     std::vector<std::shared_ptr<Card> > getCards() const;
51 
52     std::shared_ptr<Card> getCard(const std::string &serialNumber, const std::string &appName) const;
53 
54     template <typename T>
getCard(const std::string & serialNumber)55     std::shared_ptr<T> getCard(const std::string &serialNumber) const
56     {
57         return std::dynamic_pointer_cast<T>(getCard(serialNumber, T::AppName));
58     }
59 
60     static std::string switchCard(std::shared_ptr<GpgME::Context> &ctx, const std::string &serialNumber, GpgME::Error &err);
61     static std::string switchApp(std::shared_ptr<GpgME::Context> &ctx, const std::string &serialNumber,
62                                  const std::string &appName, GpgME::Error &err);
63     static GpgME::Error switchCardAndApp(const std::string &serialNumber, const std::string &appName);
64 
65 public Q_SLOTS:
66     void updateStatus();
67     void startMonitoring();
68 
69 Q_SIGNALS:
70     void firstCardWithNullPinChanged(const std::string &serialNumber);
71     void anyCardCanLearnKeysChanged(bool);
72     void cardAdded(const std::string &serialNumber, const std::string &appName);
73     void cardChanged(const std::string &serialNumber, const std::string &appName);
74     void cardRemoved(const std::string &serialNumber, const std::string &appName);
75 
76 private:
77     class Private;
78     std::shared_ptr<Private> d;
79 };
80 
81 } // namespace SmartCard
82 } // namespace Kleo
83 
84 Q_DECLARE_METATYPE(Kleo::SmartCard::Card::Status)
85 
86