Source code

Revision control

Copy as Markdown

Other Tools

// ArchiveExtractCallback.h↩
#ifndef __ARCHIVE_EXTRACT_CALLBACK_H↩
#define __ARCHIVE_EXTRACT_CALLBACK_H↩
#include "../../../Common/MyCom.h"
#include "../../../Common/Wildcard.h"
#include "../../IPassword.h"
#include "../../Common/FileStreams.h"
#include "../../Common/ProgressUtils.h"
#include "../../Archive/IArchive.h"
#include "ExtractMode.h"
#include "IFileExtractCallback.h"
#include "OpenArchive.h"
#include "HashCalc.h"
#ifndef _SFX↩
class COutStreamWithHash:↩
public ISequentialOutStream,↩
public CMyUnknownImp↩
{↩
CMyComPtr<ISequentialOutStream> _stream;↩
UInt64 _size;↩
bool _calculate;↩
public:↩
IHashCalc *_hash;↩
MY_UNKNOWN_IMP↩
STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize);↩
void SetStream(ISequentialOutStream *stream) { _stream = stream; }↩
void ReleaseStream() { _stream.Release(); }↩
void Init(bool calculate = true)↩
{↩
InitCRC();↩
_size = 0;↩
_calculate = calculate;↩
}↩
void EnableCalc(bool calculate) { _calculate = calculate; }↩
void InitCRC() { _hash->InitForNewFile(); }↩
UInt64 GetSize() const { return _size; }↩
};↩
#endif
struct CExtractNtOptions↩
{↩
CBoolPair NtSecurity;↩
CBoolPair SymLinks;↩
CBoolPair HardLinks;↩
CBoolPair AltStreams;↩
bool ReplaceColonForAltStream;↩
bool WriteToAltStreamIfColon;↩
bool PreAllocateOutFile;↩
CExtractNtOptions():↩
ReplaceColonForAltStream(false),↩
WriteToAltStreamIfColon(false)↩
{↩
SymLinks.Val = true;↩
HardLinks.Val = true;↩
AltStreams.Val = true;↩
PreAllocateOutFile =↩
#ifdef _WIN32↩
true;↩
#else
false;↩
#endif
}↩
};↩
#ifndef _SFX↩
class CGetProp:↩
public IGetProp,↩
public CMyUnknownImp↩
{↩
public:↩
const CArc *Arc;↩
UInt32 IndexInArc;↩
// UString Name; // relative path↩
MY_UNKNOWN_IMP1(IGetProp)↩
INTERFACE_IGetProp(;)↩
};↩
#endif
#ifndef _SFX↩
#ifndef UNDER_CE↩
#define SUPPORT_LINKS↩
#endif
#endif
#ifdef SUPPORT_LINKS↩
struct CHardLinkNode↩
{↩
UInt64 StreamId;↩
UInt64 INode;↩
int Compare(const CHardLinkNode &a) const;↩
};↩
class CHardLinks↩
{↩
public:↩
CRecordVector<CHardLinkNode> IDs;↩
CObjectVector<FString> Links;↩
void Clear()↩
{↩
IDs.Clear();↩
Links.Clear();↩
}↩
void PrepareLinks()↩
{↩
while (Links.Size() < IDs.Size())↩
Links.AddNew();↩
}↩
};↩
#endif
#ifdef SUPPORT_ALT_STREAMS↩
struct CIndexToPathPair↩
{↩
UInt32 Index;↩
FString Path;↩
CIndexToPathPair(UInt32 index): Index(index) {}↩
CIndexToPathPair(UInt32 index, const FString &path): Index(index), Path(path) {}↩
int Compare(const CIndexToPathPair &pair) const
{↩
return MyCompare(Index, pair.Index);↩
}↩
};↩
#endif
struct CDirPathTime↩
{↩
FILETIME CTime;↩
FILETIME ATime;↩
FILETIME MTime;↩
bool CTimeDefined;↩
bool ATimeDefined;↩
bool MTimeDefined;↩
FString Path;↩
bool SetDirTime();↩
};↩
class CArchiveExtractCallback:↩
public IArchiveExtractCallback,↩
public IArchiveExtractCallbackMessage,↩
public ICryptoGetTextPassword,↩
public ICompressProgressInfo,↩
public CMyUnknownImp↩
{↩
const CArc *_arc;↩
CExtractNtOptions _ntOptions;↩
const NWildcard::CCensorNode *_wildcardCensor; // we need wildcard for single pass mode (stdin)↩
CMyComPtr<IFolderArchiveExtractCallback> _extractCallback2;↩
CMyComPtr<ICompressProgressInfo> _compressProgress;↩
CMyComPtr<ICryptoGetTextPassword> _cryptoGetTextPassword;↩
CMyComPtr<IArchiveExtractCallbackMessage> _callbackMessage;↩
CMyComPtr<IFolderArchiveExtractCallback2> _folderArchiveExtractCallback2;↩
FString _dirPathPrefix;↩
FString _dirPathPrefix_Full;↩
NExtract::NPathMode::EEnum _pathMode;↩
NExtract::NOverwriteMode::EEnum _overwriteMode;↩
bool _keepAndReplaceEmptyDirPrefixes; // replace them to "_";↩
#ifndef _SFX↩
CMyComPtr<IFolderExtractToStreamCallback> ExtractToStreamCallback;↩
CGetProp *GetProp_Spec;↩
CMyComPtr<IGetProp> GetProp;↩
#endif
CReadArcItem _item;↩
FString _diskFilePath;↩
UInt64 _position;↩
bool _isSplit;↩
bool _extractMode;↩
bool WriteCTime;↩
bool WriteATime;↩
bool WriteMTime;↩
bool _encrypted;↩
struct CProcessedFileInfo↩
{↩
FILETIME CTime;↩
FILETIME ATime;↩
FILETIME MTime;↩
UInt32 Attrib;↩
bool CTimeDefined;↩
bool ATimeDefined;↩
bool MTimeDefined;↩
bool AttribDefined;↩
} _fi;↩
UInt32 _index;↩
UInt64 _curSize;↩
bool _curSizeDefined;↩
bool _fileLengthWasSet;↩
COutFileStream *_outFileStreamSpec;↩
CMyComPtr<ISequentialOutStream> _outFileStream;↩
#ifndef _SFX↩
COutStreamWithHash *_hashStreamSpec;↩
CMyComPtr<ISequentialOutStream> _hashStream;↩
bool _hashStreamWasUsed;↩
#endif
bool _removePartsForAltStreams;↩
UStringVector _removePathParts;↩
#ifndef _SFX↩
bool _use_baseParentFolder_mode;↩
UInt32 _baseParentFolder;↩
#endif
bool _stdOutMode;↩
bool _testMode;↩
bool _multiArchives;↩
CMyComPtr<ICompressProgressInfo> _localProgress;↩
UInt64 _packTotal;↩
UInt64 _progressTotal;↩
bool _progressTotal_Defined;↩
CObjectVector<CDirPathTime> _extractedFolders;↩
#if defined(_WIN32) && !defined(UNDER_CE) && !defined(_SFX)↩
bool _saclEnabled;↩
#endif
void CreateComplexDirectory(const UStringVector &dirPathParts, FString &fullPath);↩
HRESULT GetTime(UInt32 index, PROPID propID, FILETIME &filetime, bool &filetimeIsDefined);↩
HRESULT GetUnpackSize();↩
HRESULT SendMessageError(const char *message, const FString &path);↩
HRESULT SendMessageError_with_LastError(const char *message, const FString &path);↩
HRESULT SendMessageError2(const char *message, const FString &path1, const FString &path2);↩
public:↩
CLocalProgress *LocalProgressSpec;↩
UInt64 NumFolders;↩
UInt64 NumFiles;↩
UInt64 NumAltStreams;↩
UInt64 UnpackSize;↩
UInt64 AltStreams_UnpackSize;↩
MY_UNKNOWN_IMP3(IArchiveExtractCallbackMessage, ICryptoGetTextPassword, ICompressProgressInfo)↩
INTERFACE_IArchiveExtractCallback(;)↩
INTERFACE_IArchiveExtractCallbackMessage(;)↩
STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);↩
STDMETHOD(CryptoGetTextPassword)(BSTR *password);↩
CArchiveExtractCallback();↩
void InitForMulti(bool multiArchives,↩
NExtract::NPathMode::EEnum pathMode,↩
NExtract::NOverwriteMode::EEnum overwriteMode,↩
bool keepAndReplaceEmptyDirPrefixes)↩
{↩
_multiArchives = multiArchives;↩
_pathMode = pathMode;↩
_overwriteMode = overwriteMode;↩
_keepAndReplaceEmptyDirPrefixes = keepAndReplaceEmptyDirPrefixes;↩
NumFolders = NumFiles = NumAltStreams = UnpackSize = AltStreams_UnpackSize = 0;↩
}↩
#ifndef _SFX↩
void SetHashMethods(IHashCalc *hash)↩
{↩
if (!hash)↩
return;↩
_hashStreamSpec = new COutStreamWithHash;↩
_hashStream = _hashStreamSpec;↩
_hashStreamSpec->_hash = hash;↩
}↩
#endif
void Init(↩
const CExtractNtOptions &ntOptions,↩
const NWildcard::CCensorNode *wildcardCensor,↩
const CArc *arc,↩
IFolderArchiveExtractCallback *extractCallback2,↩
bool stdOutMode, bool testMode,↩
const FString &directoryPath,↩
const UStringVector &removePathParts, bool removePartsForAltStreams,↩
UInt64 packSize);↩
#ifdef SUPPORT_LINKS↩
private:↩
CHardLinks _hardLinks;↩
UString linkPath;↩
// FString _CopyFile_Path;↩
// HRESULT MyCopyFile(ISequentialOutStream *outStream);↩
public:↩
// call PrepareHardLinks() after Init()↩
HRESULT PrepareHardLinks(const CRecordVector<UInt32> *realIndices); // NULL means all items↩
#endif
#ifdef SUPPORT_ALT_STREAMS↩
CObjectVector<CIndexToPathPair> _renamedFiles;↩
#endif
// call it after Init()↩
#ifndef _SFX↩
void SetBaseParentFolderIndex(UInt32 indexInArc)↩
{↩
_baseParentFolder = indexInArc;↩
_use_baseParentFolder_mode = true;↩
}↩
#endif
HRESULT CloseArc();↩
private:↩
void ClearExtractedDirsInfo()↩
{↩
_extractedFolders.Clear();↩
}↩
HRESULT CloseFile();↩
HRESULT SetDirsTimes();↩
};↩
struct CArchiveExtractCallback_Closer↩
{↩
CArchiveExtractCallback *_ref;↩
CArchiveExtractCallback_Closer(CArchiveExtractCallback *ref): _ref(ref) {}↩
HRESULT Close()↩
{↩
HRESULT res = S_OK;↩
if (_ref)↩
{↩
res = _ref->CloseArc();↩
_ref = NULL;↩
}↩
return res;↩
}↩
~CArchiveExtractCallback_Closer()↩
{↩
Close();↩
}↩
};↩
bool CensorNode_CheckPath(const NWildcard::CCensorNode &node, const CReadArcItem &item);↩
#endif