From 7b7f4d264caebaf344f56d94e77acd22f67f1ffa Mon Sep 17 00:00:00 2001 From: Kai Uwe Broulik Date: Fri, 3 Jan 2025 13:55:20 +0100 Subject: [PATCH] Handle transfer job being canceled Set KilledJobError to indicate it was canceled by the user to avoid a bogus "finished" notification. Sadly, fileTransferCanceled has been removed from libQuotient so this lambda botch checking transfer status needs to be done. --- src/filetransferpseudojob.cpp | 9 +++++++++ src/filetransferpseudojob.h | 5 +++++ src/neochatroom.cpp | 18 ++++++++++++++++-- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/filetransferpseudojob.cpp b/src/filetransferpseudojob.cpp index b87c357d1..0de21d406 100644 --- a/src/filetransferpseudojob.cpp +++ b/src/filetransferpseudojob.cpp @@ -41,6 +41,15 @@ void FileTransferPseudoJob::fileTransferFailed(const QString &id, const QString emitResult(); } +void FileTransferPseudoJob::fileTransferCanceled(const QString &id) +{ + if (id != m_eventId) { + return; + } + setError(KJob::KilledJobError); + emitResult(); +} + void FileTransferPseudoJob::start() { setTotalAmount(Unit::Files, 1); diff --git a/src/filetransferpseudojob.h b/src/filetransferpseudojob.h index 6de698d6c..b26ea1dc6 100644 --- a/src/filetransferpseudojob.h +++ b/src/filetransferpseudojob.h @@ -38,6 +38,11 @@ public: */ void fileTransferFailed(const QString &id, const QString &errorMessage = {}); + /** + * @brief Set the file transfer as canceled. + */ + void fileTransferCanceled(const QString &id); + /** * @brief Start the file transfer. */ diff --git a/src/neochatroom.cpp b/src/neochatroom.cpp index 4497f34fc..3ed7fc682 100644 --- a/src/neochatroom.cpp +++ b/src/neochatroom.cpp @@ -256,7 +256,14 @@ QCoro::Task NeoChatRoom::doUploadFile(QUrl url, QString body) auto job = new FileTransferPseudoJob(FileTransferPseudoJob::Upload, url.toLocalFile(), txnId); connect(this, &Room::fileTransferProgress, job, &FileTransferPseudoJob::fileTransferProgress); connect(this, &Room::fileTransferCompleted, job, &FileTransferPseudoJob::fileTransferCompleted); - connect(this, &Room::fileTransferFailed, job, &FileTransferPseudoJob::fileTransferFailed); + connect(this, &Room::fileTransferFailed, job, [this, job, txnId] { + auto info = fileTransferInfo(txnId); + if (info.status == FileTransferInfo::Cancelled) { + job->fileTransferCanceled(txnId); + } else { + job->fileTransferFailed(txnId); + } + }); KIO::getJobTracker()->registerJob(job); job->start(); #endif @@ -1511,7 +1518,14 @@ void NeoChatRoom::download(const QString &eventId, const QUrl &localFilename) auto job = new FileTransferPseudoJob(FileTransferPseudoJob::Download, localFilename.toLocalFile(), eventId); connect(this, &Room::fileTransferProgress, job, &FileTransferPseudoJob::fileTransferProgress); connect(this, &Room::fileTransferCompleted, job, &FileTransferPseudoJob::fileTransferCompleted); - connect(this, &Room::fileTransferFailed, job, &FileTransferPseudoJob::fileTransferFailed); + connect(this, &Room::fileTransferFailed, job, [this, job, eventId] { + auto info = fileTransferInfo(eventId); + if (info.status == FileTransferInfo::Cancelled) { + job->fileTransferCanceled(eventId); + } else { + job->fileTransferFailed(eventId); + } + }); KIO::getJobTracker()->registerJob(job); job->start(); #endif