Sandboxie/SandboxiePlus/MiscHelpers/Archive/Archive.h

139 lines
3.5 KiB
C++

#pragma once
#include "../mischelpers_global.h"
// *Note* no archiver specific includes here
#define USE_7Z
#ifdef USE_7Z
#define ERR_7Z_OK 0
#define ERR_7Z_NO_INTERFACE 1
#define ERR_7Z_ALREADY_OPEN 2
#define ERR_7Z_FILE_NOT_EXIST 3
#define ERR_7Z_OPEN_FAILED 4
#define ERR_7Z_PASSWORD_REQUIRED 5
#define ERR_7Z_UNSUPPORTED_FORMAT 6
struct SCompressParams
{
int iLevel = 0;
bool bSolid = false;
};
class MISCHELPERS_EXPORT CArchive
{
public:
CArchive(const QString &ArchivePath, QIODevice* pDevice = NULL);
static void Init();
static bool IsInit();
~CArchive();
QString GetPassword(bool bSet = false) {if(bSet) m_PasswordUsed = true; return m_Password;}
void SetPassword(const QString& Password) {m_Password = Password; m_PasswordUsed = false;}
bool HasUsedPassword() {return m_PasswordUsed;}
bool SetPartSize(quint64 PartSize) {if(m_Archive) return false; m_PartSize = PartSize; return true;}
int Open();
bool Extract(QString Path = "");
bool Extract(QMap<int, QIODevice*> *FileList, bool bDelete = true);
bool Close();
bool Update(QMap<int, QIODevice*> *FileList, bool bDelete = true, const SCompressParams* Params = NULL, QMap<int, quint32> *AttribList = NULL);
int AddFile(QString Path);
int FileCount() {return m_Files.count();}
int FindByPath(QString Path);
int FindByIndex(int Index);
void RemoveFile(int ArcIndex);
QVariant FileProperty(int ArcIndex, QString Name);
void FileProperty(int ArcIndex, QString Name, QVariant Value);
quint64 GetPartSize() {return m_PartSize;}
const QString& GetArchivePath() {return m_ArchivePath;}
double GetProgress() {return m_Progress.GetValue();}
void SetPartList(const QStringList& Parts) {m_AuxParts = Parts;}
static QString PrepareExtraction(QString FileName, QString Path);
protected:
int GetIndex(int ArcIndex);
QString GetNextPart(QString FileName);
virtual void LogError(const QString& Error);
friend class CArchiveOpener;
friend class CArchiveExtractor;
friend class CArchiveUpdater;
QString m_ArchivePath;
QIODevice* m_pDevice;
QString m_Password;
bool m_PasswordUsed;
quint64 m_PartSize;
QStringList m_AuxParts;
struct SArchive;
SArchive* m_Archive;
struct SFile
{
SFile(int Index = -1)
{
ArcIndex = Index;
//NewData = false;
//NewInfo = false;
}
int ArcIndex;
QVariantMap Properties;
//bool NewData;
//bool NewInfo;
};
QVector<SFile> m_Files;
struct SProgress
{
SProgress(){
uTotal = 0;
uCompleted = 0;
}
void SetTotal(quint64 Total) {uTotal = Total;}
void SetCompleted(quint64 Completed) {uCompleted = Completed;}
double GetValue()
{
double Total = uTotal;
double Completed = uCompleted;
return (Total > 0) ? Completed/Total : 0;
}
quint64 uTotal;
quint64 uCompleted;
} m_Progress;
};
#endif
struct MISCHELPERS_EXPORT SArcInfo
{
SArcInfo()
{
PartNumber = -1; // Single Part
FormatIndex = 0; // Not an archive (only a split file) or unsupported format
FixRar = false; // indicates if rar file name needs fixing
}
QString FileName; // Filename after extension removal
QString ArchiveExt; // Archive Extension
int FormatIndex; // Archive format Index
int PartNumber; // Part Number, -1 means not a multipart , 1 means first part
bool FixRar;
};
SArcInfo MISCHELPERS_EXPORT GetArcInfo(const QString &FileName);
class CArchiveInterface;
extern CArchiveInterface theArc;