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