xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Agent/Agent.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1 // Agent/Agent.h
2 
3 #ifndef ZIP7_INC_AGENT_AGENT_H
4 #define ZIP7_INC_AGENT_AGENT_H
5 
6 #include "../../../Common/MyCom.h"
7 
8 #include "../../../Windows/PropVariant.h"
9 
10 #include "../Common/LoadCodecs.h"
11 #include "../Common/OpenArchive.h"
12 #include "../Common/UpdateAction.h"
13 
14 #include "../FileManager/IFolder.h"
15 
16 #include "AgentProxy.h"
17 #include "IFolderArchive.h"
18 
19 extern CCodecs *g_CodecsObj;
20 HRESULT LoadGlobalCodecs();
21 void FreeGlobalCodecs();
22 
23 class CAgentFolder;
24 
25 Z7_PURE_INTERFACES_BEGIN
26 
27 #define Z7_IFACEM_IArchiveFolderInternal(x) \
28   x(GetAgentFolder(CAgentFolder **agentFolder))
29 Z7_IFACE_CONSTR_FOLDERARC(IArchiveFolderInternal, 0xC)
30 
31 Z7_PURE_INTERFACES_END
32 
33 struct CProxyItem
34 {
35   unsigned DirIndex;
36   unsigned Index;
37 };
38 
39 class CAgent;
40 
41 enum AGENT_OP
42 {
43   AGENT_OP_Uni,
44   AGENT_OP_Delete,
45   AGENT_OP_CreateFolder,
46   AGENT_OP_Rename,
47   AGENT_OP_CopyFromFile,
48   AGENT_OP_Comment
49 };
50 
51 class CAgentFolder Z7_final:
52   public IFolderFolder,
53   public IFolderAltStreams,
54   public IFolderProperties,
55   public IArchiveGetRawProps,
56   public IGetFolderArcProps,
57   public IFolderCompare,
58   public IFolderGetItemName,
59   public IArchiveFolder,
60   public IArchiveFolderInternal,
61   public IInArchiveGetStream,
62   public IFolderSetZoneIdMode,
63   public IFolderSetZoneIdFile,
64   public IFolderOperations,
65   public IFolderSetFlatMode,
66   public CMyUnknownImp
67 {
68   Z7_COM_QI_BEGIN2(IFolderFolder)
69     Z7_COM_QI_ENTRY(IFolderAltStreams)
70     Z7_COM_QI_ENTRY(IFolderProperties)
71     Z7_COM_QI_ENTRY(IArchiveGetRawProps)
72     Z7_COM_QI_ENTRY(IGetFolderArcProps)
73     Z7_COM_QI_ENTRY(IFolderCompare)
74     Z7_COM_QI_ENTRY(IFolderGetItemName)
75     Z7_COM_QI_ENTRY(IArchiveFolder)
76     Z7_COM_QI_ENTRY(IArchiveFolderInternal)
77     Z7_COM_QI_ENTRY(IInArchiveGetStream)
78     Z7_COM_QI_ENTRY(IFolderSetZoneIdMode)
79     Z7_COM_QI_ENTRY(IFolderSetZoneIdFile)
80     Z7_COM_QI_ENTRY(IFolderOperations)
81     Z7_COM_QI_ENTRY(IFolderSetFlatMode)
82   Z7_COM_QI_END
83   Z7_COM_ADDREF_RELEASE
84 
85   Z7_IFACE_COM7_IMP(IFolderFolder)
86   Z7_IFACE_COM7_IMP(IFolderAltStreams)
87   Z7_IFACE_COM7_IMP(IFolderProperties)
88   Z7_IFACE_COM7_IMP(IArchiveGetRawProps)
89   Z7_IFACE_COM7_IMP(IGetFolderArcProps)
90   Z7_IFACE_COM7_IMP(IFolderCompare)
91   Z7_IFACE_COM7_IMP(IFolderGetItemName)
92   Z7_IFACE_COM7_IMP(IArchiveFolder)
93   Z7_IFACE_COM7_IMP(IArchiveFolderInternal)
94   Z7_IFACE_COM7_IMP(IInArchiveGetStream)
95   Z7_IFACE_COM7_IMP(IFolderSetZoneIdMode)
96   Z7_IFACE_COM7_IMP(IFolderSetZoneIdFile)
97   Z7_IFACE_COM7_IMP(IFolderOperations)
98   Z7_IFACE_COM7_IMP(IFolderSetFlatMode)
99 
100    void LoadFolder(unsigned proxyDirIndex);
101 public:
102   HRESULT BindToFolder_Internal(unsigned proxyDirIndex, IFolderFolder **resultFolder);
103   HRESULT BindToAltStreams_Internal(unsigned proxyDirIndex, IFolderFolder **resultFolder);
104   int GetRealIndex(unsigned index) const;
105   void GetRealIndices(const UInt32 *indices, UInt32 numItems,
106       bool includeAltStreams, bool includeFolderSubItemsInFlatMode, CUIntVector &realIndices) const;
107 
108   int CompareItems3(UInt32 index1, UInt32 index2, PROPID propID);
109   int CompareItems2(UInt32 index1, UInt32 index2, PROPID propID, Int32 propIsRaw);
110 
CAgentFolder()111   CAgentFolder():
112       _isAltStreamFolder(false),
113       _flatMode(false),
114       _loadAltStreams(false), // _loadAltStreams alt streams works in flat mode, but we don't use it now
115       _proxyDirIndex(0),
116       _zoneMode(NExtract::NZoneIdMode::kNone)
117       /* , _replaceAltStreamCharsMode(0) */
118       {}
119 
Init(const CProxyArc * proxy,const CProxyArc2 * proxy2,unsigned proxyDirIndex,CAgent * agent)120   void Init(const CProxyArc *proxy, const CProxyArc2 *proxy2,
121       unsigned proxyDirIndex,
122       /* IFolderFolder *parentFolder, */
123       CAgent *agent)
124   {
125     _proxy = proxy;
126     _proxy2 = proxy2;
127     _proxyDirIndex = proxyDirIndex;
128     _isAltStreamFolder = false;
129     if (_proxy2)
130       _isAltStreamFolder = _proxy2->IsAltDir(proxyDirIndex);
131     // _parentFolder = parentFolder;
132     _agent = (IInFolderArchive *)agent;
133     _agentSpec = agent;
134   }
135 
136   void GetPathParts(UStringVector &pathParts, bool &isAltStreamFolder);
137   HRESULT CommonUpdateOperation(
138       AGENT_OP operation,
139       bool moveMode,
140       const wchar_t *newItemName,
141       const NUpdateArchive::CActionSet *actionSet,
142       const UInt32 *indices, UInt32 numItems,
143       IProgress *progress);
144 
145 
146   void GetPrefix(UInt32 index, UString &prefix) const;
147   UString GetName(UInt32 index) const;
148   UString GetFullPrefix(UInt32 index) const; // relative too root folder of archive
149 
150 public:
151   bool _isAltStreamFolder;
152   bool _flatMode;
153   bool _loadAltStreams; // in Flat mode
154   const CProxyArc *_proxy;
155   const CProxyArc2 *_proxy2;
156   unsigned _proxyDirIndex;
157   NExtract::NZoneIdMode::EEnum _zoneMode;
158   CByteBuffer _zoneBuf;
159   // Int32 _replaceAltStreamCharsMode;
160   // CMyComPtr<IFolderFolder> _parentFolder;
161   CMyComPtr<IInFolderArchive> _agent;
162   CAgent *_agentSpec;
163   CRecordVector<CProxyItem> _items;
164 };
165 
166 
167 
168 class CAgent Z7_final:
169   public IInFolderArchive,
170   public IFolderArcProps,
171  #ifndef Z7_EXTRACT_ONLY
172   public IOutFolderArchive,
173   public ISetProperties,
174  #endif
175   public CMyUnknownImp
176 {
177   Z7_COM_QI_BEGIN2(IInFolderArchive)
178     Z7_COM_QI_ENTRY(IFolderArcProps)
179  #ifndef Z7_EXTRACT_ONLY
180     Z7_COM_QI_ENTRY(IOutFolderArchive)
181     Z7_COM_QI_ENTRY(ISetProperties)
182  #endif
183   Z7_COM_QI_END
184   Z7_COM_ADDREF_RELEASE
185 
186   Z7_IFACE_COM7_IMP(IInFolderArchive)
187   Z7_IFACE_COM7_IMP(IFolderArcProps)
188 
189  #ifndef Z7_EXTRACT_ONLY
190   Z7_IFACE_COM7_IMP(ISetProperties)
191 
192 public:
193   Z7_IFACE_COM7_IMP(IOutFolderArchive)
194   HRESULT CommonUpdate(ISequentialOutStream *outArchiveStream,
195       unsigned numUpdateItems, IArchiveUpdateCallback *updateCallback);
196 
197   HRESULT CreateFolder(ISequentialOutStream *outArchiveStream,
198       const wchar_t *folderName, IFolderArchiveUpdateCallback *updateCallback100);
199 
200   HRESULT RenameItem(ISequentialOutStream *outArchiveStream,
201       const UInt32 *indices, UInt32 numItems, const wchar_t *newItemName,
202       IFolderArchiveUpdateCallback *updateCallback100);
203 
204   HRESULT CommentItem(ISequentialOutStream *outArchiveStream,
205       const UInt32 *indices, UInt32 numItems, const wchar_t *newItemName,
206       IFolderArchiveUpdateCallback *updateCallback100);
207 
208   HRESULT UpdateOneFile(ISequentialOutStream *outArchiveStream,
209       const UInt32 *indices, UInt32 numItems, const wchar_t *diskFilePath,
210       IFolderArchiveUpdateCallback *updateCallback100);
211  #endif
212 
213 private:
214   HRESULT ReadItems();
215 
216 public:
217   CProxyArc *_proxy;
218   CProxyArc2 *_proxy2;
219   CArchiveLink _archiveLink;
220 
221   UString ArchiveType;
222 
223   FStringVector _names;
224   FString _folderPrefix; // for new files from disk
225 
226   UString _updatePathPrefix;
227   CAgentFolder *_agentFolder;
228 
229   UString _archiveFilePath; // it can be path of non-existing file if file is virtual
230 
231   DWORD _attrib;
232   bool _updatePathPrefix_is_AltFolder;
233   bool ThereIsPathProp;
234   bool _isDeviceFile;
235   bool _isHashHandler;
236 
237   FString _hashBaseFolderPrefix;
238 
239  #ifndef Z7_EXTRACT_ONLY
240   CObjectVector<UString> m_PropNames;
241   CObjectVector<NWindows::NCOM::CPropVariant> m_PropValues;
242  #endif
243 
244   CAgent();
245   ~CAgent();
246 
GetArc()247   const CArc &GetArc() const { return _archiveLink.Arcs.Back(); }
GetArchive()248   IInArchive *GetArchive() const { if ( _archiveLink.Arcs.IsEmpty()) return NULL; return GetArc().Archive; }
249   bool CanUpdate() const;
250 
Is_Attrib_ReadOnly()251   bool Is_Attrib_ReadOnly() const
252   {
253     return _attrib != INVALID_FILE_ATTRIBUTES && (_attrib & FILE_ATTRIBUTE_READONLY);
254   }
255 
IsThere_ReadOnlyArc()256   bool IsThere_ReadOnlyArc() const
257   {
258     FOR_VECTOR (i, _archiveLink.Arcs)
259     {
260       const CArc &arc = _archiveLink.Arcs[i];
261       if (arc.FormatIndex < 0
262           || arc.IsReadOnly
263           || !g_CodecsObj->Formats[arc.FormatIndex].UpdateEnabled)
264         return true;
265     }
266     return false;
267   }
268 
GetTypeOfArc(const CArc & arc)269   UString GetTypeOfArc(const CArc &arc) const
270   {
271     if (arc.FormatIndex < 0)
272       return UString("Parser");
273     return g_CodecsObj->GetFormatNamePtr(arc.FormatIndex);
274   }
275 
GetErrorMessage()276   UString GetErrorMessage() const
277   {
278     UString s;
279     for (int i = (int)_archiveLink.Arcs.Size() - 1; i >= 0; i--)
280     {
281       const CArc &arc = _archiveLink.Arcs[i];
282 
283       UString s2;
284       if (arc.ErrorInfo.ErrorFormatIndex >= 0)
285       {
286         if (arc.ErrorInfo.ErrorFormatIndex == arc.FormatIndex)
287           s2 += "Warning: The archive is open with offset";
288         else
289         {
290           s2 += "Cannot open the file as [";
291           s2 += g_CodecsObj->GetFormatNamePtr(arc.ErrorInfo.ErrorFormatIndex);
292           s2 += "] archive";
293         }
294       }
295 
296       if (!arc.ErrorInfo.ErrorMessage.IsEmpty())
297       {
298         if (!s2.IsEmpty())
299           s2.Add_LF();
300         s2 += "\n[";
301         s2 += GetTypeOfArc(arc);
302         s2 += "]: ";
303         s2 += arc.ErrorInfo.ErrorMessage;
304       }
305 
306       if (!s2.IsEmpty())
307       {
308         if (!s.IsEmpty())
309           s += "--------------------\n";
310         s += arc.Path;
311         s.Add_LF();
312         s += s2;
313         s.Add_LF();
314       }
315     }
316     return s;
317   }
318 
KeepModeForNextOpen()319   void KeepModeForNextOpen() { _archiveLink.KeepModeForNextOpen(); }
320 };
321 
322 
323 // #ifdef NEW_FOLDER_INTERFACE
324 
325 struct CCodecIcons
326 {
327   struct CIconPair
328   {
329     UString Ext;
330     int IconIndex;
331   };
332   CObjectVector<CIconPair> IconPairs;
333 
334   // void Clear() { IconPairs.Clear(); }
335   void LoadIcons(HMODULE m);
336   bool FindIconIndex(const UString &ext, int &iconIndex) const;
337 };
338 
339 
340 Z7_CLASS_IMP_COM_1(
341   CArchiveFolderManager
342   , IFolderManager
343 )
344   CObjectVector<CCodecIcons> CodecIconsVector;
345   CCodecIcons InternalIcons;
346   bool WasLoaded;
347 
348   void LoadFormats();
349   // int FindFormat(const UString &type);
350 public:
CArchiveFolderManager()351   CArchiveFolderManager():
352       WasLoaded(false)
353       {}
354 };
355 
356 // #endif
357 
358 #endif
359