File indexing completed on 2024-05-12 05:50:23

0001 /*
0002     SPDX-FileCopyrightText: 2017 Ragnar Thomsen <rthomsen6@gmail.com>
0003 
0004     SPDX-License-Identifier: BSD-2-Clause
0005 */
0006 
0007 #ifndef LIBZIPPLUGIN_H
0008 #define LIBZIPPLUGIN_H
0009 
0010 #include "archiveinterface.h"
0011 
0012 #include <zip.h>
0013 
0014 using namespace Kerfuffle;
0015 
0016 class ZipSource;
0017 
0018 class LibzipPlugin : public ReadWriteArchiveInterface
0019 {
0020     Q_OBJECT
0021 
0022 public:
0023     explicit LibzipPlugin(QObject *parent, const QVariantList &args);
0024     ~LibzipPlugin() override;
0025 
0026     bool list() override;
0027     bool doKill() override;
0028     bool extractFiles(const QVector<Archive::Entry *> &files, const QString &destinationDirectory, const ExtractionOptions &options) override;
0029 
0030     bool addFiles(const QVector<Archive::Entry *> &files,
0031                   const Archive::Entry *destination,
0032                   const CompressionOptions &options,
0033                   uint numberOfEntriesToAdd = 0) override;
0034     bool deleteFiles(const QVector<Archive::Entry *> &files) override;
0035     bool moveFiles(const QVector<Archive::Entry *> &files, Archive::Entry *destination, const CompressionOptions &options) override;
0036     bool copyFiles(const QVector<Archive::Entry *> &files, Archive::Entry *destination, const CompressionOptions &options) override;
0037     bool addComment(const QString &comment) override;
0038     bool testArchive() override;
0039     bool hasBatchExtractionProgress() const override;
0040 
0041     bool isReadOnly() const override;
0042     QString multiVolumeName() const override;
0043 
0044 private:
0045     bool extractEntry(zip_t *archive, const QString &entry, const QString &rootNode, const QString &destDir, bool preservePaths, bool removeRootNode);
0046     bool writeEntry(zip_t *archive, const QString &entry, const Archive::Entry *destination, const CompressionOptions &options, bool isDir = false);
0047     bool emitEntryForIndex(zip_t *archive, qlonglong index);
0048     void emitProgress(double percentage);
0049     QString fromUnixSeparator(const QString &path);
0050     QString toUnixSeparator(const QString &path);
0051     static void progressCallback(zip_t *, double progress, void *that);
0052     static int cancelCallback(zip_t *, void *that);
0053 
0054     QVector<Archive::Entry *> m_emittedEntries;
0055     bool m_overwriteAll;
0056     bool m_skipAll;
0057     bool m_listAfterAdd;
0058     bool m_backslashedZip;
0059     QString m_multiVolumeName;
0060     std::unique_ptr<ZipSource> m_zipSource;
0061 };
0062 
0063 #endif // LIBZIPPLUGIN_H