File indexing completed on 2024-06-16 04:55:59

0001 /* -*- mode: c++; c-basic-offset:4 -*-
0002     crypto/task.h
0003 
0004     This file is part of Kleopatra, the KDE keymanager
0005     SPDX-FileCopyrightText: 2007 Klarälvdalens Datakonsult AB
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #pragma once
0011 
0012 #include <QObject>
0013 #include <QString>
0014 
0015 #include <utils/pimpl_ptr.h>
0016 
0017 #include <gpgme++/global.h>
0018 
0019 #include <QPointer>
0020 #include <memory>
0021 
0022 namespace Kleo
0023 {
0024 class AuditLogEntry;
0025 }
0026 
0027 namespace Kleo
0028 {
0029 namespace Crypto
0030 {
0031 
0032 class Task : public QObject
0033 {
0034     Q_OBJECT
0035 public:
0036     explicit Task(QObject *parent = nullptr);
0037     ~Task() override;
0038 
0039     class Result;
0040 
0041     void setAsciiArmor(bool armor);
0042     bool asciiArmor() const;
0043 
0044     virtual GpgME::Protocol protocol() const = 0;
0045 
0046     void start();
0047 
0048     virtual QString label() const = 0;
0049 
0050     virtual QString tag() const;
0051 
0052     int currentProgress() const;
0053     int totalProgress() const;
0054 
0055     int id() const;
0056 
0057     static std::shared_ptr<Task> makeErrorTask(const GpgME::Error &error, const QString &details, const QString &label);
0058 
0059 public Q_SLOTS:
0060     virtual void cancel() = 0;
0061 
0062 Q_SIGNALS:
0063     void progress(int processed, int total, QPrivateSignal);
0064     void result(const std::shared_ptr<const Kleo::Crypto::Task::Result> &, QPrivateSignal);
0065     void started(QPrivateSignal);
0066 
0067 protected:
0068     std::shared_ptr<Result> makeErrorResult(const GpgME::Error &error, const QString &details);
0069 
0070     void emitResult(const std::shared_ptr<const Task::Result> &result);
0071 
0072 protected Q_SLOTS:
0073     void setProgress(int processed, int total);
0074 
0075 private Q_SLOTS:
0076     void emitError(const GpgME::Error &error, const QString &details);
0077 
0078 private:
0079     virtual void doStart() = 0;
0080     virtual unsigned long long inputSize() const = 0;
0081 
0082 private:
0083     class Private;
0084     kdtools::pimpl_ptr<Private> d;
0085 };
0086 
0087 class Task::Result
0088 {
0089     const QString m_nonce;
0090 
0091 public:
0092     class Content;
0093 
0094     Result();
0095     virtual ~Result();
0096 
0097     const QString &nonce() const
0098     {
0099         return m_nonce;
0100     }
0101 
0102     bool hasError() const;
0103 
0104     enum VisualCode {
0105         AllGood,
0106         Warning,
0107         Danger,
0108         NeutralSuccess,
0109         NeutralError,
0110     };
0111 
0112     enum class ContentType {
0113         None,
0114         Mime,
0115         Mbox,
0116     };
0117 
0118     virtual QString icon() const;
0119     virtual QString overview() const = 0;
0120     virtual QString details() const = 0;
0121     virtual GpgME::Error error() const = 0;
0122     virtual QString errorString() const = 0;
0123     virtual VisualCode code() const = 0;
0124     virtual AuditLogEntry auditLog() const = 0;
0125     virtual QPointer<Task> parentTask() const
0126     {
0127         return QPointer<Task>();
0128     }
0129     virtual ContentType viewableContentType() const;
0130 
0131 protected:
0132     static QString iconPath(VisualCode code);
0133     static QString makeOverview(const QString &msg);
0134 
0135 private:
0136     class Private;
0137     kdtools::pimpl_ptr<Private> d;
0138 };
0139 }
0140 }