1 // Update.h
2
3 #ifndef ZIP7_INC_COMMON_UPDATE_H
4 #define ZIP7_INC_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
CArchivePathCArchivePath35 CArchivePath(): Temp(false) {}
36
37 void ParseFromPath(const UString &path, EArcNameMode mode);
GetPathWithoutExtCArchivePath38 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
CCompressionMethodModeCCompressionMethodMode57 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
CRenamePairCRenamePair74 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 bool UpdateArchiveItself;
83 bool SfxMode;
84
85 bool PreserveATime;
86 bool OpenShareForWrite;
87 bool StopAfterOpenError;
88
89 bool StdInMode;
90 bool StdOutMode;
91
92 bool EMailMode;
93 bool EMailRemoveAfter;
94
95 bool DeleteAfterCompressing;
96 bool SetArcMTime;
97
98 CBoolPair NtSecurity;
99 CBoolPair AltStreams;
100 CBoolPair HardLinks;
101 CBoolPair SymLinks;
102
103 CBoolPair StoreOwnerId;
104 CBoolPair StoreOwnerName;
105
106 EArcNameMode ArcNameMode;
107 NWildcard::ECensorPathMode PathMode;
108
109 CCompressionMethodMode MethodMode;
110
111 CObjectVector<CUpdateArchiveCommand> Commands;
112 CArchivePath ArchivePath;
113
114 FString SfxModule;
115 UString StdInFileName;
116 UString EMailAddress;
117 FString WorkingDir;
118 // UString AddPathPrefix;
119
120 CObjectVector<CRenamePair> RenamePairs;
121 CRecordVector<UInt64> VolumesSizes;
122
123 bool InitFormatIndex(const CCodecs *codecs, const CObjectVector<COpenType> &types, const UString &arcPath);
124 bool SetArcPath(const CCodecs *codecs, const UString &arcPath);
125
CUpdateOptionsCUpdateOptions126 CUpdateOptions():
127 UpdateArchiveItself(true),
128 SfxMode(false),
129
130 PreserveATime(false),
131 OpenShareForWrite(false),
132 StopAfterOpenError(false),
133
134 StdInMode(false),
135 StdOutMode(false),
136
137 EMailMode(false),
138 EMailRemoveAfter(false),
139
140 DeleteAfterCompressing(false),
141 SetArcMTime(false),
142
143 ArcNameMode(k_ArcNameMode_Smart),
144 PathMode(NWildcard::k_RelatPath)
145
146 {}
147
SetActionCommand_AddCUpdateOptions148 void SetActionCommand_Add()
149 {
150 Commands.Clear();
151 CUpdateArchiveCommand c;
152 c.ActionSet = NUpdateArchive::k_ActionSet_Add;
153 Commands.Add(c);
154 }
155 };
156
157
158 struct CUpdateErrorInfo
159 {
160 DWORD SystemError; // it's DWORD (WRes) only;
161 AString Message;
162 FStringVector FileNames;
163
ThereIsErrorCUpdateErrorInfo164 bool ThereIsError() const { return SystemError != 0 || !Message.IsEmpty() || !FileNames.IsEmpty(); }
Get_HRESULT_ErrorCUpdateErrorInfo165 HRESULT Get_HRESULT_Error() const { return SystemError == 0 ? E_FAIL : HRESULT_FROM_WIN32(SystemError); }
166 void SetFromLastError(const char *message);
167 HRESULT SetFromLastError(const char *message, const FString &fileName);
168 HRESULT SetFromError_DWORD(const char *message, const FString &fileName, DWORD error);
169
CUpdateErrorInfoCUpdateErrorInfo170 CUpdateErrorInfo(): SystemError(0) {}
171 };
172
173 struct CFinishArchiveStat
174 {
175 UInt64 OutArcFileSize;
176 unsigned NumVolumes;
177 bool IsMultiVolMode;
178
CFinishArchiveStatCFinishArchiveStat179 CFinishArchiveStat(): OutArcFileSize(0), NumVolumes(0), IsMultiVolMode(false) {}
180 };
181
182 Z7_PURE_INTERFACES_BEGIN
183
184 // INTERFACE_IUpdateCallbackUI(x)
185 // INTERFACE_IDirItemsCallback(x)
186
187 #define Z7_IFACEN_IUpdateCallbackUI2(x) \
188 virtual HRESULT OpenResult(const CCodecs *codecs, const CArchiveLink &arcLink, const wchar_t *name, HRESULT result) x \
189 virtual HRESULT StartScanning() x \
190 virtual HRESULT FinishScanning(const CDirItemsStat &st) x \
191 virtual HRESULT StartOpenArchive(const wchar_t *name) x \
192 virtual HRESULT StartArchive(const wchar_t *name, bool updating) x \
193 virtual HRESULT FinishArchive(const CFinishArchiveStat &st) x \
194 virtual HRESULT DeletingAfterArchiving(const FString &path, bool isDir) x \
195 virtual HRESULT FinishDeletingAfterArchiving() x \
196 virtual HRESULT MoveArc_Start(const wchar_t *srcTempPath, const wchar_t *destFinalPath, UInt64 size, Int32 updateMode) x \
197 virtual HRESULT MoveArc_Progress(UInt64 total, UInt64 current) x \
198 virtual HRESULT MoveArc_Finish() x \
199
DECLARE_INTERFACE(IUpdateCallbackUI2)200 DECLARE_INTERFACE(IUpdateCallbackUI2):
201 public IUpdateCallbackUI,
202 public IDirItemsCallback
203 {
204 Z7_IFACE_PURE(IUpdateCallbackUI2)
205 };
206 Z7_PURE_INTERFACES_END
207
208 HRESULT UpdateArchive(
209 CCodecs *codecs,
210 const CObjectVector<COpenType> &types,
211 const UString &cmdArcPath2,
212 NWildcard::CCensor &censor,
213 CUpdateOptions &options,
214 CUpdateErrorInfo &errorInfo,
215 IOpenCallbackUI *openCallback,
216 IUpdateCallbackUI2 *callback,
217 bool needSetPath);
218
219 #endif
220