1*f6dc9357SAndroid Build Coastguard Worker // ArchiveOpenCallback.h
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_ARCHIVE_OPEN_CALLBACK_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_ARCHIVE_OPEN_CALLBACK_H
5*f6dc9357SAndroid Build Coastguard Worker
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h"
7*f6dc9357SAndroid Build Coastguard Worker
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileFind.h"
9*f6dc9357SAndroid Build Coastguard Worker
10*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/FileStreams.h"
11*f6dc9357SAndroid Build Coastguard Worker
12*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
13*f6dc9357SAndroid Build Coastguard Worker #include "../../IPassword.h"
14*f6dc9357SAndroid Build Coastguard Worker #endif
15*f6dc9357SAndroid Build Coastguard Worker #include "../../Archive/IArchive.h"
16*f6dc9357SAndroid Build Coastguard Worker
17*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_BEGIN
18*f6dc9357SAndroid Build Coastguard Worker
19*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_NO_CRYPTO
20*f6dc9357SAndroid Build Coastguard Worker
21*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IOpenCallbackUI_Crypto(x)
22*f6dc9357SAndroid Build Coastguard Worker
23*f6dc9357SAndroid Build Coastguard Worker #else
24*f6dc9357SAndroid Build Coastguard Worker
25*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEM_IOpenCallbackUI_Crypto(x) \
26*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT Open_CryptoGetTextPassword(BSTR *password) x \
27*f6dc9357SAndroid Build Coastguard Worker /* virtual HRESULT Open_GetPasswordIfAny(bool &passwordIsDefined, UString &password) x */ \
28*f6dc9357SAndroid Build Coastguard Worker /* virtual bool Open_WasPasswordAsked() x */ \
29*f6dc9357SAndroid Build Coastguard Worker /* virtual void Open_Clear_PasswordWasAsked_Flag() x */ \
30*f6dc9357SAndroid Build Coastguard Worker
31*f6dc9357SAndroid Build Coastguard Worker #endif
32*f6dc9357SAndroid Build Coastguard Worker
33*f6dc9357SAndroid Build Coastguard Worker #define Z7_IFACEN_IOpenCallbackUI(x) \
34*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT Open_CheckBreak() x \
35*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT Open_SetTotal(const UInt64 *files, const UInt64 *bytes) x \
36*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT Open_SetCompleted(const UInt64 *files, const UInt64 *bytes) x \
37*f6dc9357SAndroid Build Coastguard Worker virtual HRESULT Open_Finished() x \
38*f6dc9357SAndroid Build Coastguard Worker Z7_IFACEM_IOpenCallbackUI_Crypto(x)
39*f6dc9357SAndroid Build Coastguard Worker
Z7_IFACE_DECL_PURE(IOpenCallbackUI)40*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_DECL_PURE(IOpenCallbackUI)
41*f6dc9357SAndroid Build Coastguard Worker
42*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_END
43*f6dc9357SAndroid Build Coastguard Worker
44*f6dc9357SAndroid Build Coastguard Worker
45*f6dc9357SAndroid Build Coastguard Worker class CMultiStreams Z7_final
46*f6dc9357SAndroid Build Coastguard Worker {
47*f6dc9357SAndroid Build Coastguard Worker public:
48*f6dc9357SAndroid Build Coastguard Worker struct CSubStream
49*f6dc9357SAndroid Build Coastguard Worker {
50*f6dc9357SAndroid Build Coastguard Worker CMyComPtr<IInStream> Stream;
51*f6dc9357SAndroid Build Coastguard Worker CInFileStream *FileSpec;
52*f6dc9357SAndroid Build Coastguard Worker FString Path;
53*f6dc9357SAndroid Build Coastguard Worker // UInt64 Size;
54*f6dc9357SAndroid Build Coastguard Worker UInt64 LocalPos;
55*f6dc9357SAndroid Build Coastguard Worker int Next; // next older
56*f6dc9357SAndroid Build Coastguard Worker int Prev; // prev newer
57*f6dc9357SAndroid Build Coastguard Worker // bool IsOpen;
58*f6dc9357SAndroid Build Coastguard Worker
59*f6dc9357SAndroid Build Coastguard Worker CSubStream():
60*f6dc9357SAndroid Build Coastguard Worker FileSpec(NULL),
61*f6dc9357SAndroid Build Coastguard Worker // Size(0),
62*f6dc9357SAndroid Build Coastguard Worker LocalPos(0),
63*f6dc9357SAndroid Build Coastguard Worker Next(-1),
64*f6dc9357SAndroid Build Coastguard Worker Prev(-1)
65*f6dc9357SAndroid Build Coastguard Worker // IsOpen(false)
66*f6dc9357SAndroid Build Coastguard Worker {}
67*f6dc9357SAndroid Build Coastguard Worker };
68*f6dc9357SAndroid Build Coastguard Worker
69*f6dc9357SAndroid Build Coastguard Worker CObjectVector<CSubStream> Streams;
70*f6dc9357SAndroid Build Coastguard Worker private:
71*f6dc9357SAndroid Build Coastguard Worker // we must use critical section here, if we want to access from different volumnes simultaneously
72*f6dc9357SAndroid Build Coastguard Worker int Head; // newest
73*f6dc9357SAndroid Build Coastguard Worker int Tail; // oldest
74*f6dc9357SAndroid Build Coastguard Worker unsigned NumListItems;
75*f6dc9357SAndroid Build Coastguard Worker unsigned NumOpenFiles_AllowedMax;
76*f6dc9357SAndroid Build Coastguard Worker public:
77*f6dc9357SAndroid Build Coastguard Worker
78*f6dc9357SAndroid Build Coastguard Worker CMultiStreams();
79*f6dc9357SAndroid Build Coastguard Worker void Init();
80*f6dc9357SAndroid Build Coastguard Worker HRESULT PrepareToOpenNew();
81*f6dc9357SAndroid Build Coastguard Worker void InsertToList(unsigned index);
82*f6dc9357SAndroid Build Coastguard Worker void RemoveFromList(CSubStream &s);
83*f6dc9357SAndroid Build Coastguard Worker void CloseFile(unsigned index);
84*f6dc9357SAndroid Build Coastguard Worker HRESULT EnsureOpen(unsigned index);
85*f6dc9357SAndroid Build Coastguard Worker };
86*f6dc9357SAndroid Build Coastguard Worker
87*f6dc9357SAndroid Build Coastguard Worker
88*f6dc9357SAndroid Build Coastguard Worker /*
89*f6dc9357SAndroid Build Coastguard Worker We need COpenCallbackImp class for multivolume processing.
90*f6dc9357SAndroid Build Coastguard Worker Also we use it as proxy from COM interfaces (IArchiveOpenCallback) to internal (IOpenCallbackUI) interfaces.
91*f6dc9357SAndroid Build Coastguard Worker If archive is multivolume:
92*f6dc9357SAndroid Build Coastguard Worker COpenCallbackImp object will exist after Open stage.
93*f6dc9357SAndroid Build Coastguard Worker COpenCallbackImp object will be deleted when last reference
94*f6dc9357SAndroid Build Coastguard Worker from each volume object (CInFileStreamVol) will be closed (when archive will be closed).
95*f6dc9357SAndroid Build Coastguard Worker */
96*f6dc9357SAndroid Build Coastguard Worker
97*f6dc9357SAndroid Build Coastguard Worker class COpenCallbackImp Z7_final:
98*f6dc9357SAndroid Build Coastguard Worker public IArchiveOpenCallback,
99*f6dc9357SAndroid Build Coastguard Worker public IArchiveOpenVolumeCallback,
100*f6dc9357SAndroid Build Coastguard Worker public IArchiveOpenSetSubArchiveName,
101*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
102*f6dc9357SAndroid Build Coastguard Worker public ICryptoGetTextPassword,
103*f6dc9357SAndroid Build Coastguard Worker #endif
104*f6dc9357SAndroid Build Coastguard Worker public IProgress, // IProgress is used for 7zFM
105*f6dc9357SAndroid Build Coastguard Worker public CMyUnknownImp
106*f6dc9357SAndroid Build Coastguard Worker {
107*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_BEGIN2(IArchiveOpenCallback)
108*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(IArchiveOpenVolumeCallback)
109*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(IArchiveOpenSetSubArchiveName)
110*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
111*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_ENTRY(ICryptoGetTextPassword)
112*f6dc9357SAndroid Build Coastguard Worker #endif
113*f6dc9357SAndroid Build Coastguard Worker // Z7_COM_QI_ENTRY(IProgress) // the code doesn't require it
114*f6dc9357SAndroid Build Coastguard Worker Z7_COM_QI_END
115*f6dc9357SAndroid Build Coastguard Worker Z7_COM_ADDREF_RELEASE
116*f6dc9357SAndroid Build Coastguard Worker
117*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IArchiveOpenCallback)
118*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IArchiveOpenVolumeCallback)
119*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IProgress)
120*f6dc9357SAndroid Build Coastguard Worker public:
121*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(IArchiveOpenSetSubArchiveName)
122*f6dc9357SAndroid Build Coastguard Worker private:
123*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_NO_CRYPTO
124*f6dc9357SAndroid Build Coastguard Worker Z7_IFACE_COM7_IMP(ICryptoGetTextPassword)
125*f6dc9357SAndroid Build Coastguard Worker #endif
126*f6dc9357SAndroid Build Coastguard Worker
127*f6dc9357SAndroid Build Coastguard Worker bool _subArchiveMode;
128*f6dc9357SAndroid Build Coastguard Worker
129*f6dc9357SAndroid Build Coastguard Worker public:
130*f6dc9357SAndroid Build Coastguard Worker bool PasswordWasAsked;
131*f6dc9357SAndroid Build Coastguard Worker UStringVector FileNames;
132*f6dc9357SAndroid Build Coastguard Worker CBoolVector FileNames_WasUsed;
133*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt64> FileSizes;
134*f6dc9357SAndroid Build Coastguard Worker
AtCloseFile(unsigned fileIndex)135*f6dc9357SAndroid Build Coastguard Worker void AtCloseFile(unsigned fileIndex)
136*f6dc9357SAndroid Build Coastguard Worker {
137*f6dc9357SAndroid Build Coastguard Worker FileNames_WasUsed[fileIndex] = false;
138*f6dc9357SAndroid Build Coastguard Worker Volumes.CloseFile(fileIndex);
139*f6dc9357SAndroid Build Coastguard Worker }
140*f6dc9357SAndroid Build Coastguard Worker
141*f6dc9357SAndroid Build Coastguard Worker /* we have two ways to Callback from this object
142*f6dc9357SAndroid Build Coastguard Worker 1) IArchiveOpenCallback * ReOpenCallback - for ReOpen function, when IOpenCallbackUI is not available
143*f6dc9357SAndroid Build Coastguard Worker 2) IOpenCallbackUI *Callback - for usual callback
144*f6dc9357SAndroid Build Coastguard Worker we can't transfer IOpenCallbackUI pointer via internal interface,
145*f6dc9357SAndroid Build Coastguard Worker so we use ReOpenCallback to callback without IOpenCallbackUI.
146*f6dc9357SAndroid Build Coastguard Worker */
147*f6dc9357SAndroid Build Coastguard Worker
148*f6dc9357SAndroid Build Coastguard Worker /* we use Callback/ReOpenCallback only at Open stage.
149*f6dc9357SAndroid Build Coastguard Worker So the CMyComPtr reference counter is not required,
150*f6dc9357SAndroid Build Coastguard Worker and we don't want additional reference to unused object,
151*f6dc9357SAndroid Build Coastguard Worker if COpenCallbackImp is not closed
152*f6dc9357SAndroid Build Coastguard Worker */
153*f6dc9357SAndroid Build Coastguard Worker IArchiveOpenCallback *ReOpenCallback;
154*f6dc9357SAndroid Build Coastguard Worker // CMyComPtr<IArchiveOpenCallback> ReOpenCallback;
155*f6dc9357SAndroid Build Coastguard Worker IOpenCallbackUI *Callback;
156*f6dc9357SAndroid Build Coastguard Worker // CMyComPtr<IUnknown> Callback_Ref;
157*f6dc9357SAndroid Build Coastguard Worker
158*f6dc9357SAndroid Build Coastguard Worker private:
159*f6dc9357SAndroid Build Coastguard Worker FString _folderPrefix;
160*f6dc9357SAndroid Build Coastguard Worker UString _subArchiveName;
161*f6dc9357SAndroid Build Coastguard Worker NWindows::NFile::NFind::CFileInfo _fileInfo;
162*f6dc9357SAndroid Build Coastguard Worker
163*f6dc9357SAndroid Build Coastguard Worker public:
164*f6dc9357SAndroid Build Coastguard Worker CMultiStreams Volumes;
165*f6dc9357SAndroid Build Coastguard Worker
166*f6dc9357SAndroid Build Coastguard Worker // UInt64 TotalSize;
167*f6dc9357SAndroid Build Coastguard Worker
COpenCallbackImp()168*f6dc9357SAndroid Build Coastguard Worker COpenCallbackImp():
169*f6dc9357SAndroid Build Coastguard Worker _subArchiveMode(false),
170*f6dc9357SAndroid Build Coastguard Worker PasswordWasAsked(false),
171*f6dc9357SAndroid Build Coastguard Worker ReOpenCallback(NULL),
172*f6dc9357SAndroid Build Coastguard Worker Callback(NULL) {}
173*f6dc9357SAndroid Build Coastguard Worker
174*f6dc9357SAndroid Build Coastguard Worker HRESULT Init2(const FString &folderPrefix, const FString &fileName);
175*f6dc9357SAndroid Build Coastguard Worker
SetSecondFileInfo(CFSTR newName)176*f6dc9357SAndroid Build Coastguard Worker bool SetSecondFileInfo(CFSTR newName)
177*f6dc9357SAndroid Build Coastguard Worker {
178*f6dc9357SAndroid Build Coastguard Worker return _fileInfo.Find_FollowLink(newName) && !_fileInfo.IsDir();
179*f6dc9357SAndroid Build Coastguard Worker }
180*f6dc9357SAndroid Build Coastguard Worker };
181*f6dc9357SAndroid Build Coastguard Worker
182*f6dc9357SAndroid Build Coastguard Worker #endif
183