xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Common/Update.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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