#pragma once #include "nglcompression_export.h" #include #include #include #include #include #include class QIODevice; class TarFilter; class BZip2IODevice; namespace NGL { class NGLCOMPRESSION_EXPORT Compress : public QObject { Q_OBJECT public: struct FileInformations { QString inputFileName; QString outputFileName; QByteArray fileData; bool bAbsInputPath = true; FileInformations() = default; FileInformations(const QString &name, bool isAbsolute) : inputFileName(name) , bAbsInputPath(isAbsolute) {} }; struct FileSizeInfo { qint64 realSize = 0; qint64 compressedSize = 0; }; explicit Compress(QObject *parent = nullptr); ~Compress(); QVector getMemFiles() const { return m_u2_memFiles; } FileSizeInfo getFileSizeInfo() const { return m_c_sizeInfo; } bool success() const; void compress(QIODevice *out, const QString &sourceRootDir, const QVector &files, const QVector &memFiles, const QString &destRootDir); void compress(QIODevice *out, const QString &sourceDir, const QString &destRootDir); void uncompress(QIODevice *in, const QString &outDir); void uncompress(QIODevice *in); QString lastError() const { return m_lastError; } bool waitForFinished(); public Q_SLOTS: void abort(); Q_SIGNALS: void uncompressInfo(qint64 totalSize, qint64 curPos, const QString &curName); void compressInfo(qint64 totalFiles, qint64 curFile, const QString &curName); void compressInfoEx(qint64 totalFiles, qint64 curFile, qint64 totalSize, qint64 curPos, const QString &curName, const qint64 bytesTotal); void error(const QString &errorString); void finished(); private: NGL::INGLLogger &m_logger; bool _compress(QIODevice *output, const QString &filesRootDir, const QVector &files, const QVector &memFiles, const QString &_destRootDir); bool _uncompressDirectory(QIODevice *input, const QString &outDir); bool _uncompressBuffer(QIODevice *input); void reset(); void setupFutureWatcher(const QFuture &future); QVector directoryFileList(const QString &dir, bool recursive = false); FileSizeInfo m_c_sizeInfo; QVector m_u2_memFiles; QString m_lastError; QAtomicInt m_aborted; TarFilter *m_currentTarFilter { nullptr }; BZip2IODevice *m_currentBzipDevice { nullptr }; QFuture m_future; bool m_success { false }; }; } Q_DECLARE_TYPEINFO(NGL::Compress::FileInformations, Q_MOVABLE_TYPE);