1 // Agent/Agent.h
2 
3 #ifndef __AGENT_AGENT_H
4 #define __AGENT_AGENT_H
5 
6 #include "Common/MyCom.h"
7 
8 #include "Windows/PropVariant.h"
9 
10 #include "../Common/OpenArchive.h"
11 #include "../Common/UpdateAction.h"
12 
13 #ifdef NEW_FOLDER_INTERFACE
14 #include "../FileManager/IFolder.h"
15 #include "../Common/LoadCodecs.h"
16 #endif
17 
18 #include "AgentProxy.h"
19 #include "IFolderArchive.h"
20 
21 class CAgentFolder;
22 
23 DECL_INTERFACE(IArchiveFolderInternal, 0x01, 0xC)
24 {
25   STDMETHOD(GetAgentFolder)(CAgentFolder **agentFolder) PURE;
26 };
27 
28 struct CProxyItem
29 {
30   CProxyFolder *Folder;
31   UInt32 Index;
32 };
33 
34 class CAgent;
35 
36 class CAgentFolder:
37   public IFolderFolder,
38   public IFolderProperties,
39   public IGetFolderArchiveProperties,
40   public IArchiveFolder,
41   public IArchiveFolderInternal,
42   public IInArchiveGetStream,
43 #ifdef NEW_FOLDER_INTERFACE
44   public IFolderOperations,
45   public IFolderSetFlatMode,
46 #endif
47   public CMyUnknownImp
48 {
49 public:
50 
51   MY_QUERYINTERFACE_BEGIN
52     MY_QUERYINTERFACE_ENTRY(IFolderFolder)
53     MY_QUERYINTERFACE_ENTRY(IFolderProperties)
54     MY_QUERYINTERFACE_ENTRY(IGetFolderArchiveProperties)
55     MY_QUERYINTERFACE_ENTRY(IArchiveFolder)
56     MY_QUERYINTERFACE_ENTRY(IArchiveFolderInternal)
57     MY_QUERYINTERFACE_ENTRY(IInArchiveGetStream)
58   #ifdef NEW_FOLDER_INTERFACE
59     MY_QUERYINTERFACE_ENTRY(IFolderOperations)
60     MY_QUERYINTERFACE_ENTRY(IFolderSetFlatMode)
61   #endif
62   MY_QUERYINTERFACE_END
63   MY_ADDREF_RELEASE
64 
65   void LoadFolder(CProxyFolder *folder);
66   HRESULT BindToFolder(CProxyFolder *folder, IFolderFolder **resultFolder);
67   void GetRealIndices(const UINT32 *indices, UINT32 numItems, CUIntVector &realIndices) const;
68 
69   INTERFACE_FolderFolder(;)
70   INTERFACE_FolderProperties(;)
71 
72   STDMETHOD(GetFolderArchiveProperties)(IFolderArchiveProperties **object);
73 
74   // IArchiveFolder
75   STDMETHOD(Extract)(const UINT32 *indices, UINT32 numItems,
76       NExtract::NPathMode::EEnum pathMode,
77       NExtract::NOverwriteMode::EEnum overwriteMode,
78       const wchar_t *path,
79       Int32 testMode,
80       IFolderArchiveExtractCallback *extractCallback);
81 
82   STDMETHOD(GetAgentFolder)(CAgentFolder **agentFolder);
83 
84   STDMETHOD(GetStream)(UInt32 index, ISequentialInStream **stream);
85 
86   #ifdef NEW_FOLDER_INTERFACE
87   INTERFACE_FolderOperations(;)
88 
89   STDMETHOD(SetFlatMode)(Int32 flatMode);
90   #endif
91 
CAgentFolder()92   CAgentFolder(): _proxyFolderItem(NULL), _flatMode(0) {}
93 
Init(CProxyArchive * proxyHandler,CProxyFolder * proxyFolderItem,IFolderFolder * parentFolder,CAgent * agent)94   void Init(CProxyArchive *proxyHandler,
95       CProxyFolder *proxyFolderItem,
96       IFolderFolder *parentFolder,
97       CAgent *agent)
98   {
99     _proxyArchive = proxyHandler;
100     _proxyFolderItem = proxyFolderItem;
101     _parentFolder = parentFolder;
102     _agent = (IInFolderArchive *)agent;
103     _agentSpec = agent;
104   }
105 
106   void GetPathParts(UStringVector &pathParts);
107   HRESULT CommonUpdateOperation(
108       bool deleteOperation,
109       bool createFolderOperation,
110       bool renameOperation,
111       const wchar_t *newItemName,
112       const NUpdateArchive::CActionSet *actionSet,
113       const UINT32 *indices, UINT32 numItems,
114       IFolderArchiveUpdateCallback *updateCallback100);
115 
116 
117   UString GetPrefix(UInt32 index) const;
118   UString GetName(UInt32 index) const;
119   UString GetFullPathPrefixPlusPrefix(UInt32 index) const;
120   void GetPrefixIfAny(UInt32 index, NWindows::NCOM::CPropVariant &propVariant) const;
121 
122 public:
123   CProxyArchive *_proxyArchive;
124   CProxyFolder *_proxyFolderItem;
125   CMyComPtr<IFolderFolder> _parentFolder;
126   CMyComPtr<IInFolderArchive> _agent;
127   CAgent *_agentSpec;
128 
129   CRecordVector<CProxyItem> _items;
130   bool _flatMode;
131 private:
132 };
133 
134 class CAgent:
135   public IInFolderArchive,
136   public IFolderArchiveProperties,
137   #ifndef EXTRACT_ONLY
138   public IOutFolderArchive,
139   public ISetProperties,
140   #endif
141   public CMyUnknownImp
142 {
143 public:
144 
145   MY_QUERYINTERFACE_BEGIN
146     MY_QUERYINTERFACE_ENTRY(IInFolderArchive)
147     MY_QUERYINTERFACE_ENTRY(IFolderArchiveProperties)
148   #ifndef EXTRACT_ONLY
149     MY_QUERYINTERFACE_ENTRY(IOutFolderArchive)
150     MY_QUERYINTERFACE_ENTRY(ISetProperties)
151   #endif
152   MY_QUERYINTERFACE_END
153   MY_ADDREF_RELEASE
154 
155   INTERFACE_IInFolderArchive(;)
156   INTERFACE_IFolderArchiveProperties(;)
157 
158   #ifndef EXTRACT_ONLY
159   INTERFACE_IOutFolderArchive(;)
160 
161   HRESULT CommonUpdate(
162       const wchar_t *newArchiveName,
163       int numUpdateItems,
164       IArchiveUpdateCallback *updateCallback);
165 
166   HRESULT CreateFolder(
167     const wchar_t *newArchiveName,
168     const wchar_t *folderName,
169     IFolderArchiveUpdateCallback *updateCallback100);
170 
171   HRESULT RenameItem(
172     const wchar_t *newArchiveName,
173     const UINT32 *indices, UINT32 numItems,
174     const wchar_t *newItemName,
175     IFolderArchiveUpdateCallback *updateCallback100);
176 
177   // ISetProperties
178   STDMETHOD(SetProperties)(const wchar_t **names, const PROPVARIANT *values, Int32 numProperties);
179   #endif
180 
181   CCodecs *_codecs;
182   CMyComPtr<ICompressCodecsInfo> _compressCodecsInfo;
183 
184   CAgent();
185   ~CAgent();
186 private:
187   HRESULT ReadItems();
188 public:
189   CProxyArchive *_proxyArchive;
190   CArchiveLink _archiveLink;
191 
192 
193   UString ArchiveType;
194 
195   UStringVector _names;
196   UString _folderPrefix;
197 
198   UString _archiveNamePrefix;
199   CAgentFolder *_agentFolder;
200 
201   UString _archiveFilePath;
202 
203   #ifndef EXTRACT_ONLY
204   CObjectVector<UString> m_PropNames;
205   CObjectVector<NWindows::NCOM::CPropVariant> m_PropValues;
206   #endif
207 
GetArc()208   const CArc &GetArc() { return _archiveLink.Arcs.Back(); }
GetArchive()209   IInArchive *GetArchive() { return GetArc().Archive; }
CanUpdate()210   bool CanUpdate() const { return _archiveLink.Arcs.Size() == 1; }
211 };
212 
213 #ifdef NEW_FOLDER_INTERFACE
214 class CArchiveFolderManager:
215   public IFolderManager,
216   public CMyUnknownImp
217 {
218 public:
MY_UNKNOWN_IMP1(IFolderManager)219   MY_UNKNOWN_IMP1(IFolderManager)
220 
221   INTERFACE_IFolderManager(;)
222 
223   CArchiveFolderManager(): _codecs(0) {}
224 private:
225   void LoadFormats();
226   int FindFormat(const UString &type);
227   CCodecs *_codecs;
228   CMyComPtr<ICompressCodecsInfo> _compressCodecsInfo;
229 };
230 #endif
231 
232 #endif
233