// ArchiveOpenCallback.h | |
#ifndef __ARCHIVE_OPEN_CALLBACK_H | |
#define __ARCHIVE_OPEN_CALLBACK_H | |
#include "Common/MyCom.h" | |
#include "Common/MyString.h" | |
#include "Windows/FileFind.h" | |
#ifndef _NO_CRYPTO | |
#include "../../IPassword.h" | |
#endif | |
#include "../../Archive/IArchive.h" | |
#ifdef _NO_CRYPTO | |
#define INTERFACE_IOpenCallbackUI_Crypto(x) | |
#else | |
#define INTERFACE_IOpenCallbackUI_Crypto(x) \ | |
virtual HRESULT Open_CryptoGetTextPassword(BSTR *password) x; \ | |
virtual HRESULT Open_GetPasswordIfAny(UString &password) x; \ | |
virtual bool Open_WasPasswordAsked() x; \ | |
virtual void Open_ClearPasswordWasAskedFlag() x; \ | |
#endif | |
#define INTERFACE_IOpenCallbackUI(x) \ | |
virtual HRESULT Open_CheckBreak() x; \ | |
virtual HRESULT Open_SetTotal(const UInt64 *files, const UInt64 *bytes) x; \ | |
virtual HRESULT Open_SetCompleted(const UInt64 *files, const UInt64 *bytes) x; \ | |
INTERFACE_IOpenCallbackUI_Crypto(x) | |
struct IOpenCallbackUI | |
{ | |
INTERFACE_IOpenCallbackUI(=0) | |
}; | |
class COpenCallbackImp: | |
public IArchiveOpenCallback, | |
public IArchiveOpenVolumeCallback, | |
public IArchiveOpenSetSubArchiveName, | |
#ifndef _NO_CRYPTO | |
public ICryptoGetTextPassword, | |
#endif | |
public CMyUnknownImp | |
{ | |
public: | |
#ifndef _NO_CRYPTO | |
MY_UNKNOWN_IMP3( | |
IArchiveOpenVolumeCallback, | |
ICryptoGetTextPassword, | |
IArchiveOpenSetSubArchiveName | |
) | |
#else | |
MY_UNKNOWN_IMP2( | |
IArchiveOpenVolumeCallback, | |
IArchiveOpenSetSubArchiveName | |
) | |
#endif | |
INTERFACE_IArchiveOpenCallback(;) | |
INTERFACE_IArchiveOpenVolumeCallback(;) | |
#ifndef _NO_CRYPTO | |
STDMETHOD(CryptoGetTextPassword)(BSTR *password); | |
#endif | |
STDMETHOD(SetSubArchiveName(const wchar_t *name)) | |
{ | |
_subArchiveMode = true; | |
_subArchiveName = name; | |
TotalSize = 0; | |
return S_OK; | |
} | |
private: | |
UString _folderPrefix; | |
NWindows::NFile::NFind::CFileInfoW _fileInfo; | |
bool _subArchiveMode; | |
UString _subArchiveName; | |
public: | |
UStringVector FileNames; | |
IOpenCallbackUI *Callback; | |
CMyComPtr<IArchiveOpenCallback> ReOpenCallback; | |
UInt64 TotalSize; | |
COpenCallbackImp(): Callback(NULL) {} | |
void Init(const UString &folderPrefix, const UString &fileName) | |
{ | |
_folderPrefix = folderPrefix; | |
if (!_fileInfo.Find(_folderPrefix + fileName)) | |
throw 1; | |
FileNames.Clear(); | |
_subArchiveMode = false; | |
TotalSize = 0; | |
} | |
int FindName(const UString &name); | |
}; | |
#endif |