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 #include "DirItem.h" 16 17 enum EArcNameMode 18 { 19 k_ArcNameMode_Smart, 20 k_ArcNameMode_Exact, 21 k_ArcNameMode_Add, 22 }; 23 24 struct CArchivePath 25 { 26 UString OriginalPath; 27 28 UString Prefix; // path(folder) prefix including slash 29 UString Name; // base name 30 UString BaseExtension; // archive type extension or "exe" extension 31 UString VolExtension; // archive type extension for volumes 32 33 bool Temp; 34 FString TempPrefix; // path(folder) for temp location 35 FString TempPostfix; 36 CArchivePathCArchivePath37 CArchivePath(): Temp(false) {}; 38 39 void ParseFromPath(const UString &path, EArcNameMode mode); GetPathWithoutExtCArchivePath40 UString GetPathWithoutExt() const { return Prefix + Name; } 41 UString GetFinalPath() const; 42 UString GetFinalVolPath() const; 43 FString GetTempPath() const; 44 }; 45 46 struct CUpdateArchiveCommand 47 { 48 UString UserArchivePath; 49 CArchivePath ArchivePath; 50 NUpdateArchive::CActionSet ActionSet; 51 }; 52 53 struct CCompressionMethodMode 54 { 55 bool Type_Defined; 56 COpenType Type; 57 CObjectVector<CProperty> Properties; 58 CCompressionMethodModeCCompressionMethodMode59 CCompressionMethodMode(): Type_Defined(false) {} 60 }; 61 62 namespace NRecursedType { enum EEnum 63 { 64 kRecursed, 65 kWildcardOnlyRecursed, 66 kNonRecursed 67 };} 68 69 struct CRenamePair 70 { 71 UString OldName; 72 UString NewName; 73 bool WildcardParsing; 74 NRecursedType::EEnum RecursedType; 75 CRenamePairCRenamePair76 CRenamePair(): WildcardParsing(true), RecursedType(NRecursedType::kNonRecursed) {} 77 78 bool Prepare(); 79 bool GetNewPath(bool isFolder, const UString &src, UString &dest) const; 80 }; 81 82 struct CUpdateOptions 83 { 84 CCompressionMethodMode MethodMode; 85 86 CObjectVector<CUpdateArchiveCommand> Commands; 87 bool UpdateArchiveItself; 88 CArchivePath ArchivePath; 89 EArcNameMode ArcNameMode; 90 91 bool SfxMode; 92 FString SfxModule; 93 94 bool OpenShareForWrite; 95 bool StopAfterOpenError; 96 97 bool StdInMode; 98 UString StdInFileName; 99 bool StdOutMode; 100 101 bool EMailMode; 102 bool EMailRemoveAfter; 103 UString EMailAddress; 104 105 FString WorkingDir; 106 NWildcard::ECensorPathMode PathMode; 107 UString AddPathPrefix; 108 109 CBoolPair NtSecurity; 110 CBoolPair AltStreams; 111 CBoolPair HardLinks; 112 CBoolPair SymLinks; 113 114 bool DeleteAfterCompressing; 115 116 bool SetArcMTime; 117 118 CObjectVector<CRenamePair> RenamePairs; 119 120 bool InitFormatIndex(const CCodecs *codecs, const CObjectVector<COpenType> &types, const UString &arcPath); 121 bool SetArcPath(const CCodecs *codecs, const UString &arcPath); 122 CUpdateOptionsCUpdateOptions123 CUpdateOptions(): 124 UpdateArchiveItself(true), 125 SfxMode(false), 126 StdInMode(false), 127 StdOutMode(false), 128 EMailMode(false), 129 EMailRemoveAfter(false), 130 OpenShareForWrite(false), 131 StopAfterOpenError(false), 132 ArcNameMode(k_ArcNameMode_Smart), 133 PathMode(NWildcard::k_RelatPath), 134 135 DeleteAfterCompressing(false), 136 SetArcMTime(false) 137 138 {}; 139 SetActionCommand_AddCUpdateOptions140 void SetActionCommand_Add() 141 { 142 Commands.Clear(); 143 CUpdateArchiveCommand c; 144 c.ActionSet = NUpdateArchive::k_ActionSet_Add; 145 Commands.Add(c); 146 } 147 148 CRecordVector<UInt64> VolumesSizes; 149 }; 150 151 struct CUpdateErrorInfo 152 { 153 DWORD SystemError; 154 AString Message; 155 FStringVector FileNames; 156 ThereIsErrorCUpdateErrorInfo157 bool ThereIsError() const { return SystemError != 0 || !Message.IsEmpty() || !FileNames.IsEmpty(); } Get_HRESULT_ErrorCUpdateErrorInfo158 HRESULT Get_HRESULT_Error() const { return SystemError == 0 ? E_FAIL : HRESULT_FROM_WIN32(SystemError); } 159 void SetFromLastError(const char *message); 160 HRESULT SetFromLastError(const char *message, const FString &fileName); 161 CUpdateErrorInfoCUpdateErrorInfo162 CUpdateErrorInfo(): SystemError(0) {}; 163 }; 164 165 struct CFinishArchiveStat 166 { 167 UInt64 OutArcFileSize; 168 CFinishArchiveStatCFinishArchiveStat169 CFinishArchiveStat(): OutArcFileSize(0) {} 170 }; 171 172 #define INTERFACE_IUpdateCallbackUI2(x) \ 173 INTERFACE_IUpdateCallbackUI(x) \ 174 INTERFACE_IDirItemsCallback(x) \ 175 virtual HRESULT OpenResult(const CCodecs *codecs, const CArchiveLink &arcLink, const wchar_t *name, HRESULT result) x; \ 176 virtual HRESULT StartScanning() x; \ 177 virtual HRESULT FinishScanning(const CDirItemsStat &st) x; \ 178 virtual HRESULT StartOpenArchive(const wchar_t *name) x; \ 179 virtual HRESULT StartArchive(const wchar_t *name, bool updating) x; \ 180 virtual HRESULT FinishArchive(const CFinishArchiveStat &st) x; \ 181 virtual HRESULT DeletingAfterArchiving(const FString &path, bool isDir) x; \ 182 virtual HRESULT FinishDeletingAfterArchiving() x; \ 183 184 struct IUpdateCallbackUI2: public IUpdateCallbackUI, public IDirItemsCallback 185 { 186 INTERFACE_IUpdateCallbackUI2(=0) 187 }; 188 189 HRESULT UpdateArchive( 190 CCodecs *codecs, 191 const CObjectVector<COpenType> &types, 192 const UString &cmdArcPath2, 193 NWildcard::CCensor &censor, 194 CUpdateOptions &options, 195 CUpdateErrorInfo &errorInfo, 196 IOpenCallbackUI *openCallback, 197 IUpdateCallbackUI2 *callback, 198 bool needSetPath); 199 200 #endif 201