xref: /third_party/lzma/CPP/7zip/UI/Common/Update.h (revision 370b324c)
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#include "DirItem.h"
16
17enum EArcNameMode
18{
19  k_ArcNameMode_Smart,
20  k_ArcNameMode_Exact,
21  k_ArcNameMode_Add
22};
23
24struct 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
37  CArchivePath(): Temp(false) {}
38
39  void ParseFromPath(const UString &path, EArcNameMode mode);
40  UString GetPathWithoutExt() const { return Prefix + Name; }
41  UString GetFinalPath() const;
42  UString GetFinalVolPath() const;
43  FString GetTempPath() const;
44};
45
46struct CUpdateArchiveCommand
47{
48  UString UserArchivePath;
49  CArchivePath ArchivePath;
50  NUpdateArchive::CActionSet ActionSet;
51};
52
53struct CCompressionMethodMode
54{
55  bool Type_Defined;
56  COpenType Type;
57  CObjectVector<CProperty> Properties;
58
59  CCompressionMethodMode(): Type_Defined(false) {}
60};
61
62namespace NRecursedType { enum EEnum
63{
64  kRecursed,
65  kWildcardOnlyRecursed,
66  kNonRecursed
67};}
68
69struct CRenamePair
70{
71  UString OldName;
72  UString NewName;
73  bool WildcardParsing;
74  NRecursedType::EEnum RecursedType;
75
76  CRenamePair(): WildcardParsing(true), RecursedType(NRecursedType::kNonRecursed) {}
77
78  bool Prepare();
79  bool GetNewPath(bool isFolder, const UString &src, UString &dest) const;
80};
81
82struct CUpdateOptions
83{
84  bool UpdateArchiveItself;
85  bool SfxMode;
86
87  bool PreserveATime;
88  bool OpenShareForWrite;
89  bool StopAfterOpenError;
90
91  bool StdInMode;
92  bool StdOutMode;
93
94  bool EMailMode;
95  bool EMailRemoveAfter;
96
97  bool DeleteAfterCompressing;
98  bool SetArcMTime;
99
100  CBoolPair NtSecurity;
101  CBoolPair AltStreams;
102  CBoolPair HardLinks;
103  CBoolPair SymLinks;
104
105  CBoolPair StoreOwnerId;
106  CBoolPair StoreOwnerName;
107
108  EArcNameMode ArcNameMode;
109  NWildcard::ECensorPathMode PathMode;
110
111  CCompressionMethodMode MethodMode;
112
113  CObjectVector<CUpdateArchiveCommand> Commands;
114  CArchivePath ArchivePath;
115
116  FString SfxModule;
117  UString StdInFileName;
118  UString EMailAddress;
119  FString WorkingDir;
120  // UString AddPathPrefix;
121
122  CObjectVector<CRenamePair> RenamePairs;
123  CRecordVector<UInt64> VolumesSizes;
124
125  bool InitFormatIndex(const CCodecs *codecs, const CObjectVector<COpenType> &types, const UString &arcPath);
126  bool SetArcPath(const CCodecs *codecs, const UString &arcPath);
127
128  CUpdateOptions():
129    UpdateArchiveItself(true),
130    SfxMode(false),
131
132    PreserveATime(false),
133    OpenShareForWrite(false),
134    StopAfterOpenError(false),
135
136    StdInMode(false),
137    StdOutMode(false),
138
139    EMailMode(false),
140    EMailRemoveAfter(false),
141
142    DeleteAfterCompressing(false),
143    SetArcMTime(false),
144
145    ArcNameMode(k_ArcNameMode_Smart),
146    PathMode(NWildcard::k_RelatPath)
147
148    {}
149
150  void SetActionCommand_Add()
151  {
152    Commands.Clear();
153    CUpdateArchiveCommand c;
154    c.ActionSet = NUpdateArchive::k_ActionSet_Add;
155    Commands.Add(c);
156  }
157};
158
159
160struct CUpdateErrorInfo
161{
162  DWORD SystemError; // it's DWORD (WRes) only;
163  AString Message;
164  FStringVector FileNames;
165
166  bool ThereIsError() const { return SystemError != 0 || !Message.IsEmpty() || !FileNames.IsEmpty(); }
167  HRESULT Get_HRESULT_Error() const { return SystemError == 0 ? E_FAIL : HRESULT_FROM_WIN32(SystemError); }
168  void SetFromLastError(const char *message);
169  HRESULT SetFromLastError(const char *message, const FString &fileName);
170  HRESULT SetFromError_DWORD(const char *message, const FString &fileName, DWORD error);
171
172  CUpdateErrorInfo(): SystemError(0) {}
173};
174
175struct CFinishArchiveStat
176{
177  UInt64 OutArcFileSize;
178  unsigned NumVolumes;
179  bool IsMultiVolMode;
180
181  CFinishArchiveStat(): OutArcFileSize(0), NumVolumes(0), IsMultiVolMode(false) {}
182};
183
184Z7_PURE_INTERFACES_BEGIN
185
186// INTERFACE_IUpdateCallbackUI(x)
187// INTERFACE_IDirItemsCallback(x)
188
189#define Z7_IFACEN_IUpdateCallbackUI2(x) \
190  virtual HRESULT OpenResult(const CCodecs *codecs, const CArchiveLink &arcLink, const wchar_t *name, HRESULT result) x \
191  virtual HRESULT StartScanning() x \
192  virtual HRESULT FinishScanning(const CDirItemsStat &st) x \
193  virtual HRESULT StartOpenArchive(const wchar_t *name) x \
194  virtual HRESULT StartArchive(const wchar_t *name, bool updating) x \
195  virtual HRESULT FinishArchive(const CFinishArchiveStat &st) x \
196  virtual HRESULT DeletingAfterArchiving(const FString &path, bool isDir) x \
197  virtual HRESULT FinishDeletingAfterArchiving() x \
198
199DECLARE_INTERFACE(IUpdateCallbackUI2):
200    public IUpdateCallbackUI,
201    public IDirItemsCallback
202{
203  Z7_IFACE_PURE(IUpdateCallbackUI2)
204};
205Z7_PURE_INTERFACES_END
206
207HRESULT UpdateArchive(
208    CCodecs *codecs,
209    const CObjectVector<COpenType> &types,
210    const UString &cmdArcPath2,
211    NWildcard::CCensor &censor,
212    CUpdateOptions &options,
213    CUpdateErrorInfo &errorInfo,
214    IOpenCallbackUI *openCallback,
215    IUpdateCallbackUI2 *callback,
216    bool needSetPath);
217
218#endif
219