Page Menu
Home
GnuPG
Search
Configure Global Search
Log In
Files
F35313367
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Size
10 KB
Subscribers
None
View Options
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
Details
Attached
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
Attached To
rOJ GpgOL.js
Event Timeline
Log In to Comment