Home | History | Annotate | Download | only in Common
      1 // Update.h
      2 
      3 #ifndef __COMMON_UPDATE_H
      4 #define __COMMON_UPDATE_H
      5 
      6 #include "../../../Common/Wildcard.h"
      7 
      8 #include "ArchiveOpenCallback.h"
      9 #include "LoadCodecs.h"
     10 #include "OpenArchive.h"
     11 #include "Property.h"
     12 #include "UpdateAction.h"
     13 #include "UpdateCallback.h"
     14 
     15 enum EArcNameMode
     16 {
     17   k_ArcNameMode_Smart,
     18   k_ArcNameMode_Exact,
     19   k_ArcNameMode_Add,
     20 };
     21 
     22 struct CArchivePath
     23 {
     24   UString OriginalPath;
     25 
     26   UString Prefix;   // path(folder) prefix including slash
     27   UString Name; // base name
     28   UString BaseExtension; // archive type extension or "exe" extension
     29   UString VolExtension;  // archive type extension for volumes
     30 
     31   bool Temp;
     32   FString TempPrefix;  // path(folder) for temp location
     33   FString TempPostfix;
     34 
     35   CArchivePath(): Temp(false) {};
     36 
     37   void ParseFromPath(const UString &path, EArcNameMode mode);
     38   UString GetPathWithoutExt() const { return Prefix + Name; }
     39   UString GetFinalPath() const;
     40   UString GetFinalVolPath() const;
     41   FString GetTempPath() const;
     42 };
     43 
     44 struct CUpdateArchiveCommand
     45 {
     46   UString UserArchivePath;
     47   CArchivePath ArchivePath;
     48   NUpdateArchive::CActionSet ActionSet;
     49 };
     50 
     51 struct CCompressionMethodMode
     52 {
     53   bool Type_Defined;
     54   COpenType Type;
     55   CObjectVector<CProperty> Properties;
     56 
     57   CCompressionMethodMode(): Type_Defined(false) {}
     58 };
     59 
     60 namespace NRecursedType { enum EEnum
     61 {
     62   kRecursed,
     63   kWildcardOnlyRecursed,
     64   kNonRecursed
     65 };}
     66 
     67 struct CRenamePair
     68 {
     69   UString OldName;
     70   UString NewName;
     71   bool WildcardParsing;
     72   NRecursedType::EEnum RecursedType;
     73 
     74   CRenamePair(): WildcardParsing(true), RecursedType(NRecursedType::kNonRecursed) {}
     75 
     76   bool Prepare();
     77   bool GetNewPath(bool isFolder, const UString &src, UString &dest) const;
     78 };
     79 
     80 struct CUpdateOptions
     81 {
     82   CCompressionMethodMode MethodMode;
     83 
     84   CObjectVector<CUpdateArchiveCommand> Commands;
     85   bool UpdateArchiveItself;
     86   CArchivePath ArchivePath;
     87   EArcNameMode ArcNameMode;
     88 
     89   bool SfxMode;
     90   FString SfxModule;
     91 
     92   bool OpenShareForWrite;
     93 
     94   bool StdInMode;
     95   UString StdInFileName;
     96   bool StdOutMode;
     97 
     98   bool EMailMode;
     99   bool EMailRemoveAfter;
    100   UString EMailAddress;
    101 
    102   FString WorkingDir;
    103   NWildcard::ECensorPathMode PathMode;
    104   UString AddPathPrefix;
    105 
    106   CBoolPair NtSecurity;
    107   CBoolPair AltStreams;
    108   CBoolPair HardLinks;
    109   CBoolPair SymLinks;
    110 
    111   bool DeleteAfterCompressing;
    112 
    113   bool SetArcMTime;
    114 
    115   CObjectVector<CRenamePair> RenamePairs;
    116 
    117   bool InitFormatIndex(const CCodecs *codecs, const CObjectVector<COpenType> &types, const UString &arcPath);
    118   bool SetArcPath(const CCodecs *codecs, const UString &arcPath);
    119 
    120   CUpdateOptions():
    121     UpdateArchiveItself(true),
    122     SfxMode(false),
    123     StdInMode(false),
    124     StdOutMode(false),
    125     EMailMode(false),
    126     EMailRemoveAfter(false),
    127     OpenShareForWrite(false),
    128     ArcNameMode(k_ArcNameMode_Smart),
    129     PathMode(NWildcard::k_RelatPath),
    130 
    131     DeleteAfterCompressing(false),
    132     SetArcMTime(false)
    133 
    134       {};
    135 
    136   void SetActionCommand_Add()
    137   {
    138     Commands.Clear();
    139     CUpdateArchiveCommand c;
    140     c.ActionSet = NUpdateArchive::k_ActionSet_Add;
    141     Commands.Add(c);
    142   }
    143 
    144   CRecordVector<UInt64> VolumesSizes;
    145 };
    146 
    147 struct CErrorInfo
    148 {
    149   DWORD SystemError;
    150   FString FileName;
    151   FString FileName2;
    152   UString Message;
    153   // UStringVector ErrorPaths;
    154   // CRecordVector<DWORD> ErrorCodes;
    155   CErrorInfo(): SystemError(0) {};
    156 };
    157 
    158 struct CUpdateErrorInfo: public CErrorInfo
    159 {
    160 };
    161 
    162 #define INTERFACE_IUpdateCallbackUI2(x) \
    163   INTERFACE_IUpdateCallbackUI(x) \
    164   virtual HRESULT OpenResult(const wchar_t *name, HRESULT result, const wchar_t *errorArcType) x; \
    165   virtual HRESULT StartScanning() x; \
    166   virtual HRESULT ScanProgress(UInt64 numFolders, UInt64 numFiles, UInt64 totalSize, const wchar_t *path, bool isDir) x; \
    167   virtual HRESULT CanNotFindError(const wchar_t *name, DWORD systemError) x; \
    168   virtual HRESULT FinishScanning() x; \
    169   virtual HRESULT StartArchive(const wchar_t *name, bool updating) x; \
    170   virtual HRESULT FinishArchive() x; \
    171 
    172 struct IUpdateCallbackUI2: public IUpdateCallbackUI
    173 {
    174   INTERFACE_IUpdateCallbackUI2(=0)
    175 };
    176 
    177 HRESULT UpdateArchive(
    178     CCodecs *codecs,
    179     const CObjectVector<COpenType> &types,
    180     const UString &cmdArcPath2,
    181     NWildcard::CCensor &censor,
    182     CUpdateOptions &options,
    183     CUpdateErrorInfo &errorInfo,
    184     IOpenCallbackUI *openCallback,
    185     IUpdateCallbackUI2 *callback,
    186     bool needSetPath);
    187 
    188 #endif
    189