diff options
| author | Ingo Klöcker <[email protected]> | 2023-06-21 15:24:00 +0200 |
|---|---|---|
| committer | Ingo Klöcker <[email protected]> | 2023-06-21 15:25:11 +0200 |
| commit | 1c2459a5927866931808141ac6c4157cd5e3a157 (patch) | |
| tree | 510b6b55fb6fd2553052caf9cd255336635cac2e /lang/qt/src/qgpgmedecryptverifyarchivejob.cpp | |
| parent | core: Support reading the archive to decrypt/verify directly from a file (diff) | |
| download | gpgme-1c2459a5927866931808141ac6c4157cd5e3a157.tar.gz gpgme-1c2459a5927866931808141ac6c4157cd5e3a157.zip | |
qt: Support reading signed/encrypted archives directly from a file
* lang/qt/src/decryptverifyarchivejob.cpp,
lang/qt/src/decryptverifyarchivejob.h (DecryptVerifyArchiveJob): Add
member functions setInputFile, inputFile.
* lang/qt/src/decryptverifyarchivejob_p.h
(DecryptVerifyArchiveJobPrivate): Add member m_inputFilePath.
* lang/qt/src/qgpgmedecryptverifyarchivejob.cpp (decrypt_verify): Move
creation of indata to decrypt_verify_from_io_device.
(decrypt_verify_from_io_device, decrypt_verify_from_file_name): New.
(QGpgMEDecryptVerifyArchiveJob::start): Use
decrypt_verify_from_io_device instead of decrypt_verify.
(QGpgMEDecryptVerifyArchiveJobPrivate::startIt): Start the job with the
values from member variables.
* lang/qt/tests/run-decryptverifyarchivejob.cpp (createInput): Remove.
(main): Remove creation of input. Make the job read the archive directly
from the given archive name.
--
This makes it possible to tell gpgtar to read the signed/encrypted
archive directly from a specified file bypassing GpgME's Data IO.
GnuPG-bug-id: 6530
Diffstat (limited to 'lang/qt/src/qgpgmedecryptverifyarchivejob.cpp')
| -rw-r--r-- | lang/qt/src/qgpgmedecryptverifyarchivejob.cpp | 61 |
1 files changed, 44 insertions, 17 deletions
diff --git a/lang/qt/src/qgpgmedecryptverifyarchivejob.cpp b/lang/qt/src/qgpgmedecryptverifyarchivejob.cpp index 3fd58e35..98ca7403 100644 --- a/lang/qt/src/qgpgmedecryptverifyarchivejob.cpp +++ b/lang/qt/src/qgpgmedecryptverifyarchivejob.cpp @@ -43,6 +43,8 @@ #include "dataprovider.h" #include "decryptverifyarchivejob_p.h" +#include <QFile> + #include <data.h> using namespace QGpgME; @@ -64,11 +66,7 @@ public: ~QGpgMEDecryptVerifyArchiveJobPrivate() override = default; private: - GpgME::Error startIt() override - { - Q_ASSERT(!"Not supported by this Job class."); - return Error::fromCode(GPG_ERR_NOT_SUPPORTED); - } + GpgME::Error startIt() override; void startNow() override { @@ -89,19 +87,9 @@ QGpgMEDecryptVerifyArchiveJob::QGpgMEDecryptVerifyArchiveJob(Context *context) } static QGpgMEDecryptVerifyArchiveJob::result_type decrypt_verify(Context *ctx, - QThread *thread, - const std::weak_ptr<QIODevice> &cipherText_, + const GpgME::Data &indata, const QString &outputDirectory) { - const std::shared_ptr<QIODevice> cipherText = cipherText_.lock(); - const _detail::ToThreadMover ctMover(cipherText, thread); - - QGpgME::QIODeviceDataProvider in{cipherText}; - Data indata(&in); - if (!cipherText->isSequential()) { - indata.setSizeHint(cipherText->size()); - } - Data outdata; if (!outputDirectory.isEmpty()) { outdata.setFileName(outputDirectory.toStdString()); @@ -113,13 +101,39 @@ static QGpgMEDecryptVerifyArchiveJob::result_type decrypt_verify(Context *ctx, return std::make_tuple(res.first, res.second, log, ae); } +static QGpgMEDecryptVerifyArchiveJob::result_type decrypt_verify_from_io_device(Context *ctx, + QThread *thread, + const std::weak_ptr<QIODevice> &cipherText_, + const QString &outputDirectory) +{ + const std::shared_ptr<QIODevice> cipherText = cipherText_.lock(); + const _detail::ToThreadMover ctMover(cipherText, thread); + QGpgME::QIODeviceDataProvider in{cipherText}; + Data indata(&in); + if (!cipherText->isSequential()) { + indata.setSizeHint(cipherText->size()); + } + + return decrypt_verify(ctx, indata, outputDirectory); +} + +static QGpgMEDecryptVerifyArchiveJob::result_type decrypt_verify_from_file_name(Context *ctx, + const QString &inputFile, + const QString &outputDirectory) +{ + Data indata; + indata.setFileName(QFile::encodeName(inputFile).constData()); + + return decrypt_verify(ctx, indata, outputDirectory); +} + GpgME::Error QGpgMEDecryptVerifyArchiveJob::start(const std::shared_ptr<QIODevice> &cipherText) { if (!cipherText) { return Error::fromCode(GPG_ERR_INV_VALUE); } - run(std::bind(&decrypt_verify, + run(std::bind(&decrypt_verify_from_io_device, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, @@ -128,4 +142,17 @@ GpgME::Error QGpgMEDecryptVerifyArchiveJob::start(const std::shared_ptr<QIODevic return {}; } +GpgME::Error QGpgMEDecryptVerifyArchiveJobPrivate::startIt() +{ + if (m_inputFilePath.isEmpty()) { + return Error::fromCode(GPG_ERR_INV_VALUE); + } + + q->run([=](Context *ctx) { + return decrypt_verify_from_file_name(ctx, m_inputFilePath, m_outputDirectory); + }); + + return {}; +} + #include "qgpgmedecryptverifyarchivejob.moc" |
