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