Home | History | Annotate | Download | only in Common
      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