1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
// ExtractCallback.h
#ifndef __EXTRACT_CALLBACK_H
#define __EXTRACT_CALLBACK_H
#include "Common/MyCom.h"
#include "Windows/ResourceString.h"
#include "../Agent/IFolderArchive.h"
#include "../Common/ArchiveOpenCallback.h"
#ifndef _NO_CRYPTO
#include "../../IPassword.h"
#endif
#include "IFolder.h"
#include "ProgressDialog2.h"
#ifdef LANG
#include "LangUtils.h"
#endif
class CExtractCallbackImp:
public IExtractCallbackUI,
public IOpenCallbackUI,
public IFolderOperationsExtractCallback,
// public IFolderArchiveExtractCallback, // mkultiple from IProgress
#ifndef _SFX
public ICompressProgressInfo,
#endif
#ifndef _NO_CRYPTO
public ICryptoGetTextPassword,
#endif
public CMyUnknownImp
{
HRESULT MessageError(const char *message, const FString &path);
public:
MY_QUERYINTERFACE_BEGIN2(IFolderOperationsExtractCallback)
MY_QUERYINTERFACE_ENTRY(IFolderArchiveExtractCallback)
#ifndef _SFX
MY_QUERYINTERFACE_ENTRY(ICompressProgressInfo)
#endif
#ifndef _NO_CRYPTO
MY_QUERYINTERFACE_ENTRY(ICryptoGetTextPassword)
#endif
MY_QUERYINTERFACE_END
MY_ADDREF_RELEASE
#ifndef _SFX
STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize);
#endif
INTERFACE_IProgress(;)
INTERFACE_IOpenCallbackUI(;)
// IFolderArchiveExtractCallback
// STDMETHOD(SetTotalFiles)(UInt64 total);
// STDMETHOD(SetCompletedFiles)(const UInt64 *value);
STDMETHOD(AskOverwrite)(
const wchar_t *existName, const FILETIME *existTime, const UInt64 *existSize,
const wchar_t *newName, const FILETIME *newTime, const UInt64 *newSize,
Int32 *answer);
STDMETHOD (PrepareOperation)(const wchar_t *name, bool isFolder, Int32 askExtractMode, const UInt64 *position);
STDMETHOD(MessageError)(const wchar_t *message);
STDMETHOD(SetOperationResult)(Int32 operationResult, bool encrypted);
// IExtractCallbackUI
HRESULT BeforeOpen(const wchar_t *name);
HRESULT OpenResult(const wchar_t *name, HRESULT result, bool encrypted);
HRESULT ThereAreNoFiles();
HRESULT ExtractResult(HRESULT result);
#ifndef _NO_CRYPTO
HRESULT SetPassword(const UString &password);
#endif
// IFolderOperationsExtractCallback
STDMETHOD(AskWrite)(
const wchar_t *srcPath,
Int32 srcIsFolder,
const FILETIME *srcTime,
const UInt64 *srcSize,
const wchar_t *destPathRequest,
BSTR *destPathResult,
Int32 *writeAnswer);
STDMETHOD(ShowMessage)(const wchar_t *message);
STDMETHOD(SetCurrentFilePath)(const wchar_t *filePath);
STDMETHOD(SetNumFiles)(UInt64 numFiles);
// ICryptoGetTextPassword
#ifndef _NO_CRYPTO
STDMETHOD(CryptoGetTextPassword)(BSTR *password);
#endif
private:
UString _currentArchivePath;
bool _needWriteArchivePath;
UString _currentFilePath;
bool _isFolder;
HRESULT SetCurrentFilePath2(const wchar_t *filePath);
void AddErrorMessage(LPCWSTR message);
public:
CProgressDialog *ProgressDialog;
#ifndef _SFX
UInt64 NumFolders;
UInt64 NumFiles;
bool NeedAddFile;
#endif
UInt32 NumArchiveErrors;
bool ThereAreMessageErrors;
NExtract::NOverwriteMode::EEnum OverwriteMode;
#ifndef _NO_CRYPTO
bool PasswordIsDefined;
bool PasswordWasAsked;
UString Password;
#endif
CExtractCallbackImp():
#ifndef _NO_CRYPTO
PasswordIsDefined(false),
PasswordWasAsked(false),
#endif
OverwriteMode(NExtract::NOverwriteMode::kAskBefore)
{}
~CExtractCallbackImp();
void Init();
bool IsOK() const { return NumArchiveErrors == 0 && !ThereAreMessageErrors; }
};
#endif
|