• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
96   bool StdInMode;
97   UString StdInFileName;
98   bool StdOutMode;
99 
100   bool EMailMode;
101   bool EMailRemoveAfter;
102   UString EMailAddress;
103 
104   FString WorkingDir;
105   NWildcard::ECensorPathMode PathMode;
106   UString AddPathPrefix;
107 
108   CBoolPair NtSecurity;
109   CBoolPair AltStreams;
110   CBoolPair HardLinks;
111   CBoolPair SymLinks;
112 
113   bool DeleteAfterCompressing;
114 
115   bool SetArcMTime;
116 
117   CObjectVector<CRenamePair> RenamePairs;
118 
119   bool InitFormatIndex(const CCodecs *codecs, const CObjectVector<COpenType> &types, const UString &arcPath);
120   bool SetArcPath(const CCodecs *codecs, const UString &arcPath);
121 
CUpdateOptionsCUpdateOptions122   CUpdateOptions():
123     UpdateArchiveItself(true),
124     SfxMode(false),
125     StdInMode(false),
126     StdOutMode(false),
127     EMailMode(false),
128     EMailRemoveAfter(false),
129     OpenShareForWrite(false),
130     ArcNameMode(k_ArcNameMode_Smart),
131     PathMode(NWildcard::k_RelatPath),
132 
133     DeleteAfterCompressing(false),
134     SetArcMTime(false)
135 
136       {};
137 
SetActionCommand_AddCUpdateOptions138   void SetActionCommand_Add()
139   {
140     Commands.Clear();
141     CUpdateArchiveCommand c;
142     c.ActionSet = NUpdateArchive::k_ActionSet_Add;
143     Commands.Add(c);
144   }
145 
146   CRecordVector<UInt64> VolumesSizes;
147 };
148 
149 struct CUpdateErrorInfo
150 {
151   DWORD SystemError;
152   AString Message;
153   FStringVector FileNames;
154 
ThereIsErrorCUpdateErrorInfo155   bool ThereIsError() const { return SystemError != 0 || !Message.IsEmpty() || !FileNames.IsEmpty(); }
Get_HRESULT_ErrorCUpdateErrorInfo156   HRESULT Get_HRESULT_Error() const { return SystemError == 0 ? E_FAIL : HRESULT_FROM_WIN32(SystemError); }
157   void SetFromLastError(const char *message);
158   HRESULT SetFromLastError(const char *message, const FString &fileName);
159 
CUpdateErrorInfoCUpdateErrorInfo160   CUpdateErrorInfo(): SystemError(0) {};
161 };
162 
163 struct CFinishArchiveStat
164 {
165   UInt64 OutArcFileSize;
166 
CFinishArchiveStatCFinishArchiveStat167   CFinishArchiveStat(): OutArcFileSize(0) {}
168 };
169 
170 #define INTERFACE_IUpdateCallbackUI2(x) \
171   INTERFACE_IUpdateCallbackUI(x) \
172   INTERFACE_IDirItemsCallback(x) \
173   virtual HRESULT OpenResult(const CCodecs *codecs, const CArchiveLink &arcLink, const wchar_t *name, HRESULT result) x; \
174   virtual HRESULT StartScanning() x; \
175   virtual HRESULT FinishScanning(const CDirItemsStat &st) x; \
176   virtual HRESULT StartOpenArchive(const wchar_t *name) x; \
177   virtual HRESULT StartArchive(const wchar_t *name, bool updating) x; \
178   virtual HRESULT FinishArchive(const CFinishArchiveStat &st) x; \
179   virtual HRESULT DeletingAfterArchiving(const FString &path, bool isDir) x; \
180   virtual HRESULT FinishDeletingAfterArchiving() x; \
181 
182 struct IUpdateCallbackUI2: public IUpdateCallbackUI, public IDirItemsCallback
183 {
184   INTERFACE_IUpdateCallbackUI2(=0)
185 };
186 
187 HRESULT UpdateArchive(
188     CCodecs *codecs,
189     const CObjectVector<COpenType> &types,
190     const UString &cmdArcPath2,
191     NWildcard::CCensor &censor,
192     CUpdateOptions &options,
193     CUpdateErrorInfo &errorInfo,
194     IOpenCallbackUI *openCallback,
195     IUpdateCallbackUI2 *callback,
196     bool needSetPath);
197 
198 #endif
199