148 lines
5.1 KiB
C++
148 lines
5.1 KiB
C++
#pragma once
|
|
|
|
#include "../mischelpers_global.h"
|
|
|
|
#include "../Common/MT/ThreadLock.h"
|
|
#include "Archive.h"
|
|
|
|
class CArchiveWorker: public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
virtual double GetProgress() = 0;
|
|
virtual const QString& GetArchivePath() = 0;
|
|
virtual quint64 GetPartSize() = 0;
|
|
virtual QString GetPassword() = 0;
|
|
virtual bool HasUsedPassword() = 0;
|
|
|
|
virtual QMap<QString, quint64> GetFileList() = 0;
|
|
|
|
public slots:
|
|
virtual void OnExtractAllFiles() = 0;
|
|
virtual void OnInsertAllFiles() = 0;
|
|
virtual void OnExtractFiles(QStringList FileList) = 0;
|
|
virtual void OnInsertFiles(QStringList FileList) = 0;
|
|
|
|
protected:
|
|
friend class CArchiveThread;
|
|
|
|
virtual void LogError(const QString &Error) {m_Errors.append(Error);}
|
|
|
|
QMutex m_Mutex;
|
|
CThreadLock m_Lock;
|
|
QString m_WorkingPath;
|
|
|
|
QStringList m_Errors;
|
|
};
|
|
|
|
class MISCHELPERS_EXPORT CArchiveThread: public QThread
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
CArchiveThread(const QString &ArchivePath, const QString &WorkingPath, const QString &Password = QString(), quint64 PartSize = -1, const QStringList& Parts = QStringList());
|
|
CArchiveThread(const QString &WinRarPath, const QString &ArchivePath, const QString &WorkingPath, const QString &Password = QString(), quint64 PartSize = -1, const QString &CommentPath = "");
|
|
void Terminate();
|
|
|
|
static QStringList ListParts(const QString &ArchivePath, bool NamesOnly = false);
|
|
QMap<QString, quint64> GetFileList() {return m_Worker->GetFileList();}
|
|
|
|
void ExtractAllFiles() {m_Worker->m_Lock.Reset(); emit AsyncExtractAllFiles(); m_Worker->m_Lock.Lock();}
|
|
void InsertAllFiles() {m_Worker->m_Lock.Reset(); emit AsyncInsertAllFiles(); m_Worker->m_Lock.Lock();}
|
|
void ExtractFiles(QStringList FileList) {m_Worker->m_Lock.Reset(); emit AsyncExtractFiles(FileList);m_Worker->m_Lock.Lock();} // paths in archive
|
|
void InsertFiles(QStringList FileList) {m_Worker->m_Lock.Reset(); emit AsyncInsertFiles(FileList); m_Worker->m_Lock.Lock();} // paths relative to the WorkingPath
|
|
|
|
bool IsBusy() {if(!m_Worker->m_Mutex.tryLock()) return true; m_Worker->m_Mutex.unlock(); return false;}
|
|
double GetProgress() {return m_Worker->GetProgress();}
|
|
QStringList GetArchiveParts(bool NamesOnly = false) {return ListParts(m_Worker->GetArchivePath(), NamesOnly);}
|
|
quint64 GetPartSize() {return m_Worker->GetPartSize();}
|
|
QStringList GetErrors();
|
|
bool HasUsedPassword() {return m_Worker->HasUsedPassword();}
|
|
QString GetPassword() {return m_Worker->GetPassword();}
|
|
|
|
void run()
|
|
{
|
|
connect(this, SIGNAL(AsyncExtractAllFiles()), m_Worker, SLOT(OnExtractAllFiles()));
|
|
connect(this, SIGNAL(AsyncInsertAllFiles()), m_Worker, SLOT(OnInsertAllFiles()));
|
|
connect(this, SIGNAL(AsyncExtractFiles(QStringList)), m_Worker, SLOT(OnExtractFiles(QStringList)));
|
|
connect(this, SIGNAL(AsyncInsertFiles(QStringList)), m_Worker, SLOT(OnInsertFiles(QStringList)));
|
|
m_Worker->m_Lock.Release();
|
|
exec();
|
|
}
|
|
|
|
void stop()
|
|
{
|
|
quit();
|
|
wait();
|
|
}
|
|
|
|
signals:
|
|
void AsyncExtractAllFiles();
|
|
void AsyncInsertAllFiles();
|
|
void AsyncExtractFiles(QStringList FileList);
|
|
void AsyncInsertFiles(QStringList FileList);
|
|
|
|
protected:
|
|
CArchiveWorker* m_Worker;
|
|
};
|
|
|
|
#ifdef USE_7Z
|
|
|
|
class MISCHELPERS_EXPORT C7zWorker: public CArchiveWorker, protected CArchive
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
C7zWorker(const QString &ArchivePath, const QString &WorkingPath, const QString &Password = QString(), quint64 PartSize = -1, const QStringList& Parts = QStringList());
|
|
~C7zWorker();
|
|
|
|
virtual double GetProgress() {return CArchive::GetProgress();}
|
|
virtual const QString& GetArchivePath() {return CArchive::GetArchivePath();}
|
|
quint64 GetPartSize() {return CArchive::GetPartSize();}
|
|
virtual bool HasUsedPassword() {return CArchive::HasUsedPassword();}
|
|
virtual QString GetPassword() {return CArchive::GetPassword();}
|
|
|
|
virtual QMap<QString, quint64> GetFileList();
|
|
|
|
public slots:
|
|
virtual void OnExtractAllFiles();
|
|
virtual void OnInsertAllFiles();
|
|
virtual void OnExtractFiles(QStringList FileList);
|
|
virtual void OnInsertFiles(QStringList FileList);
|
|
|
|
};
|
|
|
|
#endif
|
|
|
|
class MISCHELPERS_EXPORT CRarWorker: public CArchiveWorker
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
CRarWorker(const QString &WinRarPath, const QString &ArchivePath, const QString &WorkingPath, const QString &Password = QString(), quint64 PartSize = -1, const QString &CommentPath = "");
|
|
|
|
virtual double GetProgress() {return 0;}
|
|
virtual const QString& GetArchivePath() {return m_ArchivePath;}
|
|
quint64 GetPartSize() {return m_PartSize;}
|
|
virtual bool HasUsedPassword() {ASSERT(0); return false;} // rar should notbe used for unpacking
|
|
virtual QString GetPassword() {return m_Password;}
|
|
|
|
virtual QMap<QString, quint64> GetFileList();
|
|
|
|
public slots:
|
|
virtual void OnExtractAllFiles();
|
|
virtual void OnInsertAllFiles();
|
|
virtual void OnExtractFiles(QStringList FileList);
|
|
virtual void OnInsertFiles(QStringList FileList);
|
|
|
|
protected:
|
|
QString m_ArchivePath;
|
|
QString m_Password;
|
|
quint64 m_PartSize;
|
|
|
|
QString m_WinRarPath;
|
|
QString m_CommentPath;
|
|
};
|