xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Common/ArchiveOpenCallback.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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