diff --git a/NEWS b/NEWS index a7b0d9f9..0b051d5e 100644 --- a/NEWS +++ b/NEWS @@ -69,6 +69,9 @@ Noteworthy changes in version 1.19.0 (unreleased) qt: Protocol::encryptArchiveJob NEW. qt: Protocol::signArchiveJob NEW. qt: Protocol::signEncryptArchiveJob NEW. + qt: Job::jobProgress NEW. + qt: Job::rawProgress NEW. + qt: Job::progress DEPRECATED. Release-info: https://dev.gnupg.org/T6341 diff --git a/lang/qt/src/job.h b/lang/qt/src/job.h index 8b974b4f..46c5e717 100644 --- a/lang/qt/src/job.h +++ b/lang/qt/src/job.h @@ -106,7 +106,38 @@ public Q_SLOTS: virtual void slotCancel() = 0; Q_SIGNALS: - void progress(const QString &what, int current, int total); + /** + * This signal is emitted whenever the backend sends a progress status + * message. For most jobs, \a current is the amount of processed data + * (or files) and \a total is the total amount of data (of files). If + * \a total is 0, then the total amount is unknown or not yet known. + * For GnuPG 2.1.13 and later, \a current and \a total do not exceed + * 2^20, i.e. for larger values they are scaled down and you should not + * assume that they represent absolute values. + * + * Check the documentation on progress in the GpgME manual for details. + * + * Note: Some jobs provide special progress signals, e.g. for file-count- + * or data-based progress. + */ + void jobProgress(int current, int total); + + /** + * This signal is emitted whenever the backend sends a progress status + * message. Compared to the jobProgress signal this signal also provides the + * what value and the type value reported by the backend. Usually, these + * values can safely be ignored, so that you are better off using the + * simpler jobProgress signal. + * Check the documentation on progress in the GpgME manual for details + * on what and type. + * + * Note: Some jobs provide special progress signals, so that you do not + * have to deal with what and type yourself. + */ + void rawProgress(const QString &what, int type, int current, int total); + + QGPGME_DEPRECATED void progress(const QString &what, int current, int total); + void done(); }; diff --git a/lang/qt/src/multideletejob.cpp b/lang/qt/src/multideletejob.cpp index c3e6520d..d660a931 100644 --- a/lang/qt/src/multideletejob.cpp +++ b/lang/qt/src/multideletejob.cpp @@ -97,7 +97,13 @@ void QGpgME::MultiDeleteJob::slotResult(const GpgME::Error &err) const int current = mIt - mKeys.begin(); const int total = mKeys.size(); - Q_EMIT progress(QStringLiteral("%1/%2").arg(current).arg(total), current, total); + const QString what = QStringLiteral("%1/%2").arg(current).arg(total); + Q_EMIT jobProgress(current, total); + Q_EMIT rawProgress(what, '?', current, total); + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED + Q_EMIT progress(what, current, total); + QT_WARNING_POP } GpgME::Error QGpgME::MultiDeleteJob::startAJob() diff --git a/lang/qt/src/qgpgmerefreshsmimekeysjob.cpp b/lang/qt/src/qgpgmerefreshsmimekeysjob.cpp index 3e430ad7..cff115ec 100644 --- a/lang/qt/src/qgpgmerefreshsmimekeysjob.cpp +++ b/lang/qt/src/qgpgmerefreshsmimekeysjob.cpp @@ -209,7 +209,7 @@ void QGpgMERefreshSMIMEKeysJob::slotStatus(QProcess *proc, const QString &type, } const QString what = *++it; ok = false; - (*++it).toInt(&ok); + const int type = (*++it).toInt(&ok); if (!ok) { qCDebug(QGPGME_LOG) << "expected number for \"type\", got something else"; return; @@ -226,9 +226,12 @@ void QGpgMERefreshSMIMEKeysJob::slotStatus(QProcess *proc, const QString &type, qCDebug(QGPGME_LOG) << "expected number for \"total\", got something else"; return; } - // TODO port - Q_EMIT progress(QString(), cur, total); - + Q_EMIT jobProgress(cur, total); + Q_EMIT rawProgress(what, type, cur, total); + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED + Q_EMIT progress(what, cur, total); + QT_WARNING_POP } } diff --git a/lang/qt/src/threadedjobmixin.h b/lang/qt/src/threadedjobmixin.h index afabae3b..e92d02d7 100644 --- a/lang/qt/src/threadedjobmixin.h +++ b/lang/qt/src/threadedjobmixin.h @@ -250,17 +250,21 @@ protected: { return m_auditLogError; } - void showProgress(const char * /*what*/, - int /*type*/, int current, int total) override { - // will be called from the thread exec'ing the operation, so - // just bounce everything to the owning thread: - // ### hope this is thread-safe (meta obj is const, and - // ### portEvent is thread-safe, so should be ok) - QMetaObject::invokeMethod(this, "progress", Qt::QueuedConnection, - // TODO port - Q_ARG(QString, QString()), - Q_ARG(int, current), - Q_ARG(int, total)); + void showProgress(const char *what, + int type, int current, int total) override { + QMetaObject::invokeMethod(this, [this, current, total]() { + Q_EMIT this->jobProgress(current, total); + }, Qt::QueuedConnection); + const QString what_ = QString::fromUtf8(what); + QMetaObject::invokeMethod(this, [this, what_, type, current, total]() { + Q_EMIT this->rawProgress(what_, type, current, total); + }, Qt::QueuedConnection); + QMetaObject::invokeMethod(this, [this, what_, current, total]() { + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED + Q_EMIT this->progress(what_, current, total); + QT_WARNING_POP + }, Qt::QueuedConnection); } private: template diff --git a/lang/qt/tests/t-encrypt.cpp b/lang/qt/tests/t-encrypt.cpp index 6a4c68e9..35b9bbf9 100644 --- a/lang/qt/tests/t-encrypt.cpp +++ b/lang/qt/tests/t-encrypt.cpp @@ -120,7 +120,22 @@ private Q_SLOTS: bool initSeen = false; bool finishSeen = false; - connect(job, &Job::progress, this, [this, &initSeen, &finishSeen] (const QString&, int current, int total) { + connect(job, &Job::jobProgress, this, [&initSeen, &finishSeen] (int current, int total) { + // We only check for progress 0 and max progress as the other progress + // lines depend on the system speed and are as such unreliable to test. + QVERIFY(total == PROGRESS_TEST_SIZE); + if (current == 0) { + initSeen = true; + } + if (current == total) { + finishSeen = true; + } + QVERIFY(current >= 0 && current <= total); + }); + connect(job, &Job::rawProgress, this, [&initSeen, &finishSeen] (const QString &what, int type, int current, int total) { + // `what` is something like "-&12", i.e. a special fd passed to gpg; we only check that it's not empty + QVERIFY(!what.isEmpty()); + QCOMPARE(type, '?'); // We only check for progress 0 and max progress as the other progress // lines depend on the system speed and are as such unreliable to test. QVERIFY(total == PROGRESS_TEST_SIZE);