Page MenuHome GnuPG

No OneTemporary

diff --git a/client/reencrypt/reencryptprogressdialog.cpp b/client/reencrypt/reencryptprogressdialog.cpp
index 3a29a71..aa96ea1 100644
--- a/client/reencrypt/reencryptprogressdialog.cpp
+++ b/client/reencrypt/reencryptprogressdialog.cpp
@@ -1,223 +1,227 @@
// SPDX-FileCopyrightText: 2025 g10 code GmbH
// SPDX-FileContributor: Thomas Friedrichsmeier <thomas.friedrichsmeier@gnupg.com>
// SPDX-License-Identifier: GPL-2.0-or-later
#include "reencryptprogressdialog.h"
#include <QCloseEvent>
#include <QDialogButtonBox>
#include <QLabel>
#include <QListView>
#include <QProgressBar>
#include <QPushButton>
#include <QStandardItemModel>
#include <QStyledItemDelegate>
#include <QVBoxLayout>
#include <KLocalizedString>
#include <KMessageBox>
using namespace Qt::StringLiterals;
ReencryptProgressDialog::ReencryptProgressDialog(UnencryptedMode skipMode, KJob* reencrypt_job, QWidget *parent)
: QDialog(parent),
m_itemModel(new QStandardItemModel(this)),
m_messagesTotalCount(-1),
m_messagesSuccessCount(0),
m_messagesSkippedCount(0),
m_messagesErrorCount(0),
m_skipMode(skipMode),
m_allowClose(false),
m_reencrypt_job(reencrypt_job)
{
auto layout = new QVBoxLayout(this);
m_title = new QLabel(i18nc("@status", "Initializing..."));
layout->addWidget(m_title);
m_progressBar = new QProgressBar;
layout->addWidget(m_progressBar);
auto listView = new QListView;
listView->setModel(m_itemModel);
listView->setItemDelegate(new QStyledItemDelegate);
layout->addWidget(listView);
auto hbox = new QHBoxLayout;
layout->addLayout(hbox);
m_notes = new QLabel();
m_notes->setWordWrap(true);
hbox->addWidget(m_notes);
m_errorLogButton = new QPushButton(i18nc("@button", "Show log"));
m_errorLogButton->setVisible(false);
connect(m_errorLogButton, &QPushButton::clicked, this, &ReencryptProgressDialog::showErrorLog);
hbox->addWidget(m_errorLogButton);
auto bb = new QDialogButtonBox();
layout->addWidget(bb);
m_abortButton = bb->addButton(QDialogButtonBox::Cancel);
m_abortButton->setText(i18nc("@button", "Abort"));
connect(m_abortButton, &QAbstractButton::clicked, this, &ReencryptProgressDialog::askAbort);
m_doneButton = bb->addButton(QDialogButtonBox::Close);
m_doneButton->setText(i18nc("@button", "Close"));
m_doneButton->setVisible(false);
connect(m_doneButton, &QPushButton::clicked, this, &QDialog::accept);
connect(m_reencrypt_job, &KJob::result, this, &ReencryptProgressDialog::setFinished);
}
void ReencryptProgressDialog::askAbort()
{
const auto res = KMessageBox::warningTwoActions(this,
i18n("Abort reencryption? Messages that have already been copied/reencrypted will not be deleted."),
i18nc("@title:window", "Abort reencryption"),
KGuiItem(i18nc("@action:button", "Abort")),
KStandardGuiItem::cont());
if (res == KMessageBox::ButtonCode::PrimaryAction) {
m_allowClose = true;
m_reencrypt_job->kill(KJob::EmitResult);
close();
}
}
void ReencryptProgressDialog::closeEvent(QCloseEvent *event)
{
if (m_allowClose) {
QDialog::closeEvent(event);
} else {
event->ignore();
askAbort();
}
}
void ReencryptProgressDialog::setTotalMessageCount(int totalMails)
{
m_messagesTotalCount = totalMails;
m_progressBar->setMaximum(m_messagesTotalCount);
updateStatus();
}
void ReencryptProgressDialog::addMessage(const QString& itemId, const QString& subject)
{
getOrAddItem(itemId, subject);
}
void ReencryptProgressDialog::setMessageError(const QString& itemId, const QString& errorMessage)
{
auto item = updateMessageItem(itemId, FinishedWithError);
auto tip = item->toolTip();
if (!tip.isEmpty()) tip.append(u'\n');
item->setToolTip(tip + errorMessage);
}
void ReencryptProgressDialog::setMessageSkipped(const QString& itemId)
{
auto item = updateMessageItem(itemId, Skipped);
auto tip = item->toolTip();
if (!tip.isEmpty()) tip.append(u'\n');
if (m_skipMode == UnencryptedMode::Skip) {
item->setToolTip(tip + i18n("Message was skipped"));
} else {
item->setToolTip(tip + i18n("Message was copied unencrypted"));
}
}
void ReencryptProgressDialog::setMessageFinished(const QString& itemId)
{
updateMessageItem(itemId, Finished);
}
void ReencryptProgressDialog::setFinished(KJob *job)
{
m_abortButton->setVisible(false);
m_doneButton->setVisible(true);
if (m_messagesErrorCount || job->error()) {
if (m_messagesErrorCount) {
m_doneButton->setIcon(QIcon::fromTheme(u"dialog-close"_s));
} else {
// this may happen for errors that could not be attributed to a particular message, e.g.
// if target folder cannot be created, or the source folder cannot be read
- m_notes->setText(i18n("Operation failed with the following message:<br>%1", job->errorText()));
+ m_otherError = i18n("<b>Operation failed with the following message:</b><br>%1", job->errorText());
+ updateStatus();
}
} else {
m_doneButton->setIcon(QIcon::fromTheme(u"dialog-ok"_s));
}
m_allowClose = true;
}
void ReencryptProgressDialog::showErrorLog()
{
QStringList messages;
int n = m_itemModel->rowCount();
for (int i = 0; i < n; ++i) {
auto item = m_itemModel->item(i);
if (!item->toolTip().isEmpty()) {
messages.append(item->text() + u": "_s + item->toolTip());
}
}
KMessageBox::informationList(this, i18n("The following messages had errors or warnings:"), messages, i18nc("@window:title", "Message log"));
}
QStandardItem* ReencryptProgressDialog::updateMessageItem(const QString& itemId, const MessageState newState)
{
auto item = getOrAddItem(itemId);
const auto oldState = item->data().toInt();
if (oldState < newState) {
if (oldState == Finished) {
m_messagesSuccessCount--;
} else if (oldState == Skipped) {
m_messagesSkippedCount--;
}
item->setData(static_cast<int>(newState));
if (newState == Finished) {
item->setIcon(QIcon::fromTheme(u"data-success"_s));
m_messagesSuccessCount++;
} else if (newState == Skipped) {
item->setIcon(QIcon::fromTheme(u"data-information"_s));
m_messagesSkippedCount++;
} else {
item->setIcon(QIcon::fromTheme(u"data-error"_s));
m_messagesErrorCount++;
}
updateStatus();
}
return item;
}
QStandardItem* ReencryptProgressDialog::getOrAddItem(const QString& itemid, const QString& subject)
{
auto item = items.value(itemid);
if (!item) {
item = new QStandardItem(subject.isEmpty() ? u"no subject"_s : subject);
item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
item->setIcon(QIcon::fromTheme(u"view-refresh-symbolic"_s)); // u"cloud-upload-symbolic"_s ?
item->setData(static_cast<int>(Processing));
items[itemid] = item;
m_itemModel->appendRow(item);
}
return item;
}
void ReencryptProgressDialog::updateStatus()
{
if (m_messagesTotalCount >= 0) {
m_title->setText(i18nc("@status", "Processed %1 out of %2 emails", completedCount(), m_messagesTotalCount));
m_progressBar->setValue(completedCount());
} else {
m_title->setText(i18nc("@status", "Processed %1 emails", completedCount()));
}
QStringList msg;
if (m_messagesSkippedCount) {
if (m_skipMode == UnencryptedMode::Skip) {
msg.append(i18n("%1 messages were skipped", m_messagesSkippedCount));
} else {
msg.append(i18n("%1 messages were copied unencrypted", m_messagesSkippedCount));
}
}
if (m_messagesErrorCount) {
msg.append(i18n("<b>Errors were encountered while processing %1 messages</b>", m_messagesErrorCount));
}
+ if (!m_otherError.isEmpty()) {
+ msg.append(m_otherError);
+ }
m_notes->setText(msg.join(u"<br>"_s));
if (m_messagesSkippedCount || m_messagesErrorCount) {
m_errorLogButton->setVisible(true);
}
}
diff --git a/client/reencrypt/reencryptprogressdialog.h b/client/reencrypt/reencryptprogressdialog.h
index 0c95e4c..d1d93c8 100644
--- a/client/reencrypt/reencryptprogressdialog.h
+++ b/client/reencrypt/reencryptprogressdialog.h
@@ -1,60 +1,61 @@
// SPDX-FileCopyrightText: 2025 g10 code GmbH
// SPDX-FileContributor: Thomas Friedrichsmeier <thomas.friedrichsmeier@gnupg.com>
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <QDialog>
#include "reencryptjob.h"
class QProgressBar;
class QPushButton;
class ReencryptProgressDialog : public QDialog {
public:
ReencryptProgressDialog(UnencryptedMode skipMode, KJob* reencrypt_job, QWidget *parent=nullptr);
void addMessage(const QString& itemId, const QString& subject);
void setMessageSkipped(const QString& itemId);
void setMessageFinished(const QString& itemId);
void setMessageError(const QString& itemId, const QString& errorMessage);
void setTotalMessageCount(int totalMails);
private:
void askAbort();
void closeEvent(QCloseEvent *event) override;
void setFinished(KJob *job);
void showErrorLog();
enum MessageState {
Processing,
Finished,
Skipped,
FinishedWithError
};
QStandardItem* updateMessageItem(const QString& itemId, const MessageState newState);
QStandardItem* getOrAddItem(const QString& itemid, const QString& subject=QString());
void updateStatus();
int completedCount() const
{
return m_messagesSuccessCount + m_messagesSkippedCount + m_messagesErrorCount;
}
QHash<QString, QStandardItem*> items;
QStandardItemModel *m_itemModel;
QLabel *m_title;
QLabel *m_notes;
int m_messagesTotalCount;
int m_messagesSuccessCount;
int m_messagesSkippedCount;
int m_messagesErrorCount;
UnencryptedMode m_skipMode;
+ QString m_otherError;
bool m_allowClose;
QPushButton* m_abortButton;
QPushButton* m_doneButton;
QPushButton* m_errorLogButton;
QProgressBar* m_progressBar;
KJob* m_reencrypt_job;
};

File Metadata

Mime Type
text/x-diff
Expires
Thu, Feb 5, 9:24 PM (23 h, 26 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
2a/d5/2d32e6627508a6a5689a62c7958d

Event Timeline