1 // ArchiveOpenCallback.h
2 
3 #ifndef __ARCHIVE_OPEN_CALLBACK_H
4 #define __ARCHIVE_OPEN_CALLBACK_H
5 
6 #include "../../../Common/MyCom.h"
7 
8 #include "../../../Windows/FileFind.h"
9 
10 #ifndef _NO_CRYPTO
11 #include "../../IPassword.h"
12 #endif
13 #include "../../Archive/IArchive.h"
14 
15 #ifdef _NO_CRYPTO
16 
17 #define INTERFACE_IOpenCallbackUI_Crypto(x)
18 
19 #else
20 
21 #define INTERFACE_IOpenCallbackUI_Crypto(x) \
22   virtual HRESULT Open_CryptoGetTextPassword(BSTR *password) x; \
23   /* virtual HRESULT Open_GetPasswordIfAny(bool &passwordIsDefined, UString &password) x; */ \
24   /* virtual bool Open_WasPasswordAsked() x; */ \
25   /* virtual void Open_Clear_PasswordWasAsked_Flag() x; */  \
26 
27 #endif
28 
29 #define INTERFACE_IOpenCallbackUI(x) \
30   virtual HRESULT Open_CheckBreak() x; \
31   virtual HRESULT Open_SetTotal(const UInt64 *files, const UInt64 *bytes) x; \
32   virtual HRESULT Open_SetCompleted(const UInt64 *files, const UInt64 *bytes) x; \
33   virtual HRESULT Open_Finished() x; \
34   INTERFACE_IOpenCallbackUI_Crypto(x)
35 
36 struct IOpenCallbackUI
37 {
38   INTERFACE_IOpenCallbackUI(=0)
39 };
40 
41 class COpenCallbackImp:
42   public IArchiveOpenCallback,
43   public IArchiveOpenVolumeCallback,
44   public IArchiveOpenSetSubArchiveName,
45   #ifndef _NO_CRYPTO
46   public ICryptoGetTextPassword,
47   #endif
48   public CMyUnknownImp
49 {
50 public:
51   MY_QUERYINTERFACE_BEGIN2(IArchiveOpenVolumeCallback)
52   MY_QUERYINTERFACE_ENTRY(IArchiveOpenSetSubArchiveName)
53   #ifndef _NO_CRYPTO
54   MY_QUERYINTERFACE_ENTRY(ICryptoGetTextPassword)
55   #endif
56   MY_QUERYINTERFACE_END
57   MY_ADDREF_RELEASE
58 
59   INTERFACE_IArchiveOpenCallback(;)
60   INTERFACE_IArchiveOpenVolumeCallback(;)
61 
62   #ifndef _NO_CRYPTO
63   STDMETHOD(CryptoGetTextPassword)(BSTR *password);
64   #endif
65 
66   STDMETHOD(SetSubArchiveName(const wchar_t *name))
67   {
68     _subArchiveMode = true;
69     _subArchiveName = name;
70     // TotalSize = 0;
71     return S_OK;
72   }
73 
74 private:
75   FString _folderPrefix;
76   NWindows::NFile::NFind::CFileInfo _fileInfo;
77   bool _subArchiveMode;
78   UString _subArchiveName;
79 
80 public:
81   UStringVector FileNames;
82   CBoolVector FileNames_WasUsed;
83   CRecordVector<UInt64> FileSizes;
84 
85   bool PasswordWasAsked;
86 
87   IOpenCallbackUI *Callback;
88   CMyComPtr<IArchiveOpenCallback> ReOpenCallback;
89   // UInt64 TotalSize;
90 
91   COpenCallbackImp(): Callback(NULL), _subArchiveMode(false) {}
92 
93   void Init(const FString &folderPrefix, const FString &fileName)
94   {
95     _folderPrefix = folderPrefix;
96     if (!_fileInfo.Find(_folderPrefix + fileName))
97       throw 20121118;
98     FileNames.Clear();
99     FileNames_WasUsed.Clear();
100     FileSizes.Clear();
101     _subArchiveMode = false;
102     // TotalSize = 0;
103     PasswordWasAsked = false;
104   }
105 
106   bool SetSecondFileInfo(CFSTR newName)
107   {
108     return _fileInfo.Find(newName) && !_fileInfo.IsDir();
109   }
110 };
111 
112 #endif
113