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