diff options
Diffstat (limited to '')
| -rw-r--r-- | lang/qt/src/Makefile.am | 3 | ||||
| -rw-r--r-- | lang/qt/src/dataprovider.h | 6 | ||||
| -rw-r--r-- | lang/qt/src/filelistdataprovider.cpp | 98 | ||||
| -rw-r--r-- | lang/qt/src/filelistdataprovider.h | 79 | 
4 files changed, 186 insertions, 0 deletions
diff --git a/lang/qt/src/Makefile.am b/lang/qt/src/Makefile.am index 510802a8..40a73861 100644 --- a/lang/qt/src/Makefile.am +++ b/lang/qt/src/Makefile.am @@ -34,6 +34,7 @@ EXTRA_DIST = QGpgmeConfig.cmake.in.in QGpgmeConfigVersion.cmake.in \  qgpgme_sources = \      dataprovider.cpp \      debug.cpp \ +    filelistdataprovider.cpp \      job.cpp multideletejob.cpp qgpgmeadduseridjob.cpp \      qgpgmeaddexistingsubkeyjob.cpp \      qgpgmebackend.cpp qgpgmechangeexpiryjob.cpp qgpgmechangeownertrustjob.cpp \ @@ -72,6 +73,7 @@ qgpgme_headers= \      downloadjob.h \      encryptjob.h \      exportjob.h \ +    filelistdataprovider.h \      hierarchicalkeylistjob.h \      job.h \      keyformailboxjob.h \ @@ -120,6 +122,7 @@ camelcase_headers= \      DownloadJob \      EncryptJob \      ExportJob \ +    FileListDataProvider \      HierarchicalKeyKistJob \      Job \      MultiDeleteJob \ diff --git a/lang/qt/src/dataprovider.h b/lang/qt/src/dataprovider.h index 636d6fb6..b14e7d54 100644 --- a/lang/qt/src/dataprovider.h +++ b/lang/qt/src/dataprovider.h @@ -25,7 +25,13 @@  #define __QGPGME_DATAPROVIDER_H__  #include "qgpgme_export.h" + +#ifdef BUILDING_QGPGME  #include <interfaces/dataprovider.h> +#else +#include <gpgme++/interfaces/dataprovider.h> +#endif +  #include <memory>  #include <QtCore/QByteArray> diff --git a/lang/qt/src/filelistdataprovider.cpp b/lang/qt/src/filelistdataprovider.cpp new file mode 100644 index 00000000..004854ef --- /dev/null +++ b/lang/qt/src/filelistdataprovider.cpp @@ -0,0 +1,98 @@ +/* +    filelistdataprovider.cpp + +    This file is part of qgpgme, the Qt API binding for gpgme +    Copyright (c) 2023 g10 Code GmbH +    Software engineering by Ingo Klöcker <[email protected]> + +    QGpgME is free software; you can redistribute it and/or +    modify it under the terms of the GNU General Public License as +    published by the Free Software Foundation; either version 2 of the +    License, or (at your option) any later version. + +    QGpgME is distributed in the hope that it will be useful, +    but WITHOUT ANY WARRANTY; without even the implied warranty of +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +    General Public License for more details. + +    You should have received a copy of the GNU General Public License +    along with this program; if not, write to the Free Software +    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + +    In addition, as a special exception, the copyright holders give +    permission to link the code of this program with any edition of +    the Qt library by Trolltech AS, Norway (or with modified versions +    of Qt that use the same license as Qt), and distribute linked +    combinations including the two.  You must obey the GNU General +    Public License in all respects for all of the code used other than +    Qt.  If you modify this file, you may extend this exception to +    your version of the file, but you are not obligated to do so.  If +    you do not wish to do so, delete this exception statement from +    your version. +*/ + +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#include "filelistdataprovider.h" + +#include "dataprovider.h" + +#include <QString> + +#include <gpgme++/error.h> + +#include <numeric> + +using namespace QGpgME; +using namespace GpgME; + +static QByteArray encodeFilenames(const std::vector<QString> &filenames) +{ +    QByteArray ret; +    if (filenames.empty()) { +        return ret; +    } +    // calculate and reserve the needed minimum size of the result +    const auto addSize = [](unsigned int n, const QString &s) { return n + s.size(); }; +    const unsigned int minSize = filenames.size() +        + std::accumulate(filenames.cbegin(), filenames.cend(), 0u, addSize); +    ret.reserve(minSize); +    // pack the filenames into the byte array +    for (const auto &f : filenames) { +        if (!f.isEmpty()) { +            ret += f.toUtf8() + '\0'; +        } +    } +    ret.chop(1); // remove the trailing nul +    return ret; +} + +FileListDataProvider::FileListDataProvider(const std::vector<QString> &filenames) +    : mProvider{new QByteArrayDataProvider{encodeFilenames(filenames)}} +{ +} + +FileListDataProvider::~FileListDataProvider() = default; + +ssize_t FileListDataProvider::read(void* buffer, size_t bufSize) +{ +    return mProvider->read(buffer, bufSize); +} + +ssize_t FileListDataProvider::write(const void *, size_t) +{ +    Error::setSystemError(GPG_ERR_EBADF); +    return -1; +} + +off_t FileListDataProvider::seek(off_t offset, int whence) +{ +    return mProvider->seek(offset, whence); +} + +void FileListDataProvider::release() +{ +    mProvider->release(); +} diff --git a/lang/qt/src/filelistdataprovider.h b/lang/qt/src/filelistdataprovider.h new file mode 100644 index 00000000..25e52e41 --- /dev/null +++ b/lang/qt/src/filelistdataprovider.h @@ -0,0 +1,79 @@ +/* +    filelistdataprovider.h + +    This file is part of qgpgme, the Qt API binding for gpgme +    Copyright (c) 2023 g10 Code GmbH +    Software engineering by Ingo Klöcker <[email protected]> + +    QGpgME is free software; you can redistribute it and/or +    modify it under the terms of the GNU General Public License as +    published by the Free Software Foundation; either version 2 of the +    License, or (at your option) any later version. + +    QGpgME is distributed in the hope that it will be useful, +    but WITHOUT ANY WARRANTY; without even the implied warranty of +    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +    General Public License for more details. + +    You should have received a copy of the GNU General Public License +    along with this program; if not, write to the Free Software +    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + +    In addition, as a special exception, the copyright holders give +    permission to link the code of this program with any edition of +    the Qt library by Trolltech AS, Norway (or with modified versions +    of Qt that use the same license as Qt), and distribute linked +    combinations including the two.  You must obey the GNU General +    Public License in all respects for all of the code used other than +    Qt.  If you modify this file, you may extend this exception to +    your version of the file, but you are not obligated to do so.  If +    you do not wish to do so, delete this exception statement from +    your version. +*/ + +#ifndef __QGPGME_FILELISTDATAPROVIDER_H__ +#define __QGPGME_FILELISTDATAPROVIDER_H__ + +#include "qgpgme_export.h" + +#ifdef BUILDING_QGPGME +#include <interfaces/dataprovider.h> +#else +#include <gpgme++/interfaces/dataprovider.h> +#endif + +#include <memory> +#include <vector> + +class QString; + +namespace QGpgME +{ + +/** + * This read-only data provider simplifies providing a nul-separated list of + * UTF-8-encoded filenames, e.g. for creating signed or encrypted archives. + */ +class QGPGME_EXPORT FileListDataProvider : public GpgME::DataProvider +{ +public: +    explicit FileListDataProvider(const std::vector<QString> &filenames); +    ~FileListDataProvider() override; + +private: +    bool isSupported(Operation op) const override +    { +        return op != Operation::Write; +    } +    ssize_t read(void *buffer, size_t bufSize) override; +    ssize_t write(const void *buffer, size_t bufSize) override; +    off_t seek(off_t offset, int whence) override; +    void release() override; + +private: +    std::unique_ptr<GpgME::DataProvider> mProvider; +}; + +} + +#endif // __QGPGME_FILELISTDATAPROVIDER_H__  | 
