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