xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Agent/ArchiveFolderOpen.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Agent/ArchiveFolderOpen.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker // #ifdef NEW_FOLDER_INTERFACE
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringToInt.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/DLL.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/ResourceString.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #include "Agent.h"
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker extern HINSTANCE g_hInstance;
14*f6dc9357SAndroid Build Coastguard Worker static const UINT kIconTypesResId = 100;
15*f6dc9357SAndroid Build Coastguard Worker 
LoadIcons(HMODULE m)16*f6dc9357SAndroid Build Coastguard Worker void CCodecIcons::LoadIcons(HMODULE m)
17*f6dc9357SAndroid Build Coastguard Worker {
18*f6dc9357SAndroid Build Coastguard Worker   IconPairs.Clear();
19*f6dc9357SAndroid Build Coastguard Worker   UString iconTypes;
20*f6dc9357SAndroid Build Coastguard Worker   NWindows::MyLoadString(m, kIconTypesResId, iconTypes);
21*f6dc9357SAndroid Build Coastguard Worker   UStringVector pairs;
22*f6dc9357SAndroid Build Coastguard Worker   SplitString(iconTypes, pairs);
23*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, pairs)
24*f6dc9357SAndroid Build Coastguard Worker   {
25*f6dc9357SAndroid Build Coastguard Worker     const UString &s = pairs[i];
26*f6dc9357SAndroid Build Coastguard Worker     int pos = s.Find(L':');
27*f6dc9357SAndroid Build Coastguard Worker     CIconPair iconPair;
28*f6dc9357SAndroid Build Coastguard Worker     iconPair.IconIndex = -1;
29*f6dc9357SAndroid Build Coastguard Worker     if (pos < 0)
30*f6dc9357SAndroid Build Coastguard Worker       pos = (int)s.Len();
31*f6dc9357SAndroid Build Coastguard Worker     else
32*f6dc9357SAndroid Build Coastguard Worker     {
33*f6dc9357SAndroid Build Coastguard Worker       const UString num = s.Ptr((unsigned)pos + 1);
34*f6dc9357SAndroid Build Coastguard Worker       if (!num.IsEmpty())
35*f6dc9357SAndroid Build Coastguard Worker       {
36*f6dc9357SAndroid Build Coastguard Worker         const wchar_t *end;
37*f6dc9357SAndroid Build Coastguard Worker         iconPair.IconIndex = (int)ConvertStringToUInt32(num, &end);
38*f6dc9357SAndroid Build Coastguard Worker         if (*end != 0)
39*f6dc9357SAndroid Build Coastguard Worker           continue;
40*f6dc9357SAndroid Build Coastguard Worker       }
41*f6dc9357SAndroid Build Coastguard Worker     }
42*f6dc9357SAndroid Build Coastguard Worker     iconPair.Ext = s.Left((unsigned)pos);
43*f6dc9357SAndroid Build Coastguard Worker     IconPairs.Add(iconPair);
44*f6dc9357SAndroid Build Coastguard Worker   }
45*f6dc9357SAndroid Build Coastguard Worker }
46*f6dc9357SAndroid Build Coastguard Worker 
FindIconIndex(const UString & ext,int & iconIndex) const47*f6dc9357SAndroid Build Coastguard Worker bool CCodecIcons::FindIconIndex(const UString &ext, int &iconIndex) const
48*f6dc9357SAndroid Build Coastguard Worker {
49*f6dc9357SAndroid Build Coastguard Worker   iconIndex = -1;
50*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, IconPairs)
51*f6dc9357SAndroid Build Coastguard Worker   {
52*f6dc9357SAndroid Build Coastguard Worker     const CIconPair &pair = IconPairs[i];
53*f6dc9357SAndroid Build Coastguard Worker     if (ext.IsEqualTo_NoCase(pair.Ext))
54*f6dc9357SAndroid Build Coastguard Worker     {
55*f6dc9357SAndroid Build Coastguard Worker       iconIndex = pair.IconIndex;
56*f6dc9357SAndroid Build Coastguard Worker       return true;
57*f6dc9357SAndroid Build Coastguard Worker     }
58*f6dc9357SAndroid Build Coastguard Worker   }
59*f6dc9357SAndroid Build Coastguard Worker   return false;
60*f6dc9357SAndroid Build Coastguard Worker }
61*f6dc9357SAndroid Build Coastguard Worker 
62*f6dc9357SAndroid Build Coastguard Worker 
LoadFormats()63*f6dc9357SAndroid Build Coastguard Worker void CArchiveFolderManager::LoadFormats()
64*f6dc9357SAndroid Build Coastguard Worker {
65*f6dc9357SAndroid Build Coastguard Worker   if (WasLoaded)
66*f6dc9357SAndroid Build Coastguard Worker     return;
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker   LoadGlobalCodecs();
69*f6dc9357SAndroid Build Coastguard Worker 
70*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
71*f6dc9357SAndroid Build Coastguard Worker   CodecIconsVector.Clear();
72*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, g_CodecsObj->Libs)
73*f6dc9357SAndroid Build Coastguard Worker   {
74*f6dc9357SAndroid Build Coastguard Worker     CCodecIcons &ci = CodecIconsVector.AddNew();
75*f6dc9357SAndroid Build Coastguard Worker     ci.LoadIcons(g_CodecsObj->Libs[i].Lib.Get_HMODULE());
76*f6dc9357SAndroid Build Coastguard Worker   }
77*f6dc9357SAndroid Build Coastguard Worker   #endif
78*f6dc9357SAndroid Build Coastguard Worker   InternalIcons.LoadIcons(g_hInstance);
79*f6dc9357SAndroid Build Coastguard Worker   WasLoaded = true;
80*f6dc9357SAndroid Build Coastguard Worker }
81*f6dc9357SAndroid Build Coastguard Worker 
82*f6dc9357SAndroid Build Coastguard Worker /*
83*f6dc9357SAndroid Build Coastguard Worker int CArchiveFolderManager::FindFormat(const UString &type)
84*f6dc9357SAndroid Build Coastguard Worker {
85*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, g_CodecsObj->Formats)
86*f6dc9357SAndroid Build Coastguard Worker     if (type.IsEqualTo_NoCase(g_CodecsObj->Formats[i].Name))
87*f6dc9357SAndroid Build Coastguard Worker       return (int)i;
88*f6dc9357SAndroid Build Coastguard Worker   return -1;
89*f6dc9357SAndroid Build Coastguard Worker }
90*f6dc9357SAndroid Build Coastguard Worker */
91*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CArchiveFolderManager::OpenFolderFile (IInStream * inStream,const wchar_t * filePath,const wchar_t * arcFormat,IFolderFolder ** resultFolder,IProgress * progress))92*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CArchiveFolderManager::OpenFolderFile(IInStream *inStream,
93*f6dc9357SAndroid Build Coastguard Worker     const wchar_t *filePath, const wchar_t *arcFormat,
94*f6dc9357SAndroid Build Coastguard Worker     IFolderFolder **resultFolder, IProgress *progress))
95*f6dc9357SAndroid Build Coastguard Worker {
96*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IArchiveOpenCallback> openArchiveCallback;
97*f6dc9357SAndroid Build Coastguard Worker   if (progress)
98*f6dc9357SAndroid Build Coastguard Worker   {
99*f6dc9357SAndroid Build Coastguard Worker     CMyComPtr<IProgress> progressWrapper = progress;
100*f6dc9357SAndroid Build Coastguard Worker     progressWrapper.QueryInterface(IID_IArchiveOpenCallback, &openArchiveCallback);
101*f6dc9357SAndroid Build Coastguard Worker   }
102*f6dc9357SAndroid Build Coastguard Worker   CAgent *agent = new CAgent();
103*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IInFolderArchive> archive = agent;
104*f6dc9357SAndroid Build Coastguard Worker 
105*f6dc9357SAndroid Build Coastguard Worker   const HRESULT res = archive->Open(inStream, filePath, arcFormat, NULL, openArchiveCallback);
106*f6dc9357SAndroid Build Coastguard Worker 
107*f6dc9357SAndroid Build Coastguard Worker   if (res != S_OK)
108*f6dc9357SAndroid Build Coastguard Worker   {
109*f6dc9357SAndroid Build Coastguard Worker     if (res != S_FALSE)
110*f6dc9357SAndroid Build Coastguard Worker       return res;
111*f6dc9357SAndroid Build Coastguard Worker     /* 20.01: we create folder even for Non-Open cases, if there is NonOpen_ErrorInfo information.
112*f6dc9357SAndroid Build Coastguard Worker          So we can get error information from that IFolderFolder later. */
113*f6dc9357SAndroid Build Coastguard Worker     if (!agent->_archiveLink.NonOpen_ErrorInfo.IsThereErrorOrWarning())
114*f6dc9357SAndroid Build Coastguard Worker       return res;
115*f6dc9357SAndroid Build Coastguard Worker   }
116*f6dc9357SAndroid Build Coastguard Worker 
117*f6dc9357SAndroid Build Coastguard Worker   RINOK(archive->BindToRootFolder(resultFolder))
118*f6dc9357SAndroid Build Coastguard Worker   return res;
119*f6dc9357SAndroid Build Coastguard Worker }
120*f6dc9357SAndroid Build Coastguard Worker 
121*f6dc9357SAndroid Build Coastguard Worker /*
122*f6dc9357SAndroid Build Coastguard Worker HRESULT CAgent::FolderReOpen(
123*f6dc9357SAndroid Build Coastguard Worker     IArchiveOpenCallback *openArchiveCallback)
124*f6dc9357SAndroid Build Coastguard Worker {
125*f6dc9357SAndroid Build Coastguard Worker   return ReOpenArchive(_archive, _archiveFilePath);
126*f6dc9357SAndroid Build Coastguard Worker }
127*f6dc9357SAndroid Build Coastguard Worker */
128*f6dc9357SAndroid Build Coastguard Worker 
129*f6dc9357SAndroid Build Coastguard Worker 
130*f6dc9357SAndroid Build Coastguard Worker /*
131*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CArchiveFolderManager::GetExtensions(const wchar_t *type, BSTR *extensions))
132*f6dc9357SAndroid Build Coastguard Worker {
133*f6dc9357SAndroid Build Coastguard Worker   *extensions = 0;
134*f6dc9357SAndroid Build Coastguard Worker   int formatIndex = FindFormat(type);
135*f6dc9357SAndroid Build Coastguard Worker   if (formatIndex <  0)
136*f6dc9357SAndroid Build Coastguard Worker     return E_INVALIDARG;
137*f6dc9357SAndroid Build Coastguard Worker   // Exts[0].Ext;
138*f6dc9357SAndroid Build Coastguard Worker   return StringToBstr(g_CodecsObj.Formats[formatIndex].GetAllExtensions(), extensions);
139*f6dc9357SAndroid Build Coastguard Worker }
140*f6dc9357SAndroid Build Coastguard Worker */
141*f6dc9357SAndroid Build Coastguard Worker 
AddIconExt(const CCodecIcons & lib,UString & dest)142*f6dc9357SAndroid Build Coastguard Worker static void AddIconExt(const CCodecIcons &lib, UString &dest)
143*f6dc9357SAndroid Build Coastguard Worker {
144*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, lib.IconPairs)
145*f6dc9357SAndroid Build Coastguard Worker   {
146*f6dc9357SAndroid Build Coastguard Worker     dest.Add_Space_if_NotEmpty();
147*f6dc9357SAndroid Build Coastguard Worker     dest += lib.IconPairs[i].Ext;
148*f6dc9357SAndroid Build Coastguard Worker   }
149*f6dc9357SAndroid Build Coastguard Worker }
150*f6dc9357SAndroid Build Coastguard Worker 
151*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CArchiveFolderManager::GetExtensions (BSTR * extensions))152*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CArchiveFolderManager::GetExtensions(BSTR *extensions))
153*f6dc9357SAndroid Build Coastguard Worker {
154*f6dc9357SAndroid Build Coastguard Worker   *extensions = NULL;
155*f6dc9357SAndroid Build Coastguard Worker   LoadFormats();
156*f6dc9357SAndroid Build Coastguard Worker   UString res;
157*f6dc9357SAndroid Build Coastguard Worker 
158*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
159*f6dc9357SAndroid Build Coastguard Worker   /*
160*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, g_CodecsObj->Libs)
161*f6dc9357SAndroid Build Coastguard Worker     AddIconExt(g_CodecsObj->Libs[i].CodecIcons, res);
162*f6dc9357SAndroid Build Coastguard Worker   */
163*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, CodecIconsVector)
164*f6dc9357SAndroid Build Coastguard Worker     AddIconExt(CodecIconsVector[i], res);
165*f6dc9357SAndroid Build Coastguard Worker   #endif
166*f6dc9357SAndroid Build Coastguard Worker 
167*f6dc9357SAndroid Build Coastguard Worker   AddIconExt(
168*f6dc9357SAndroid Build Coastguard Worker       // g_CodecsObj->
169*f6dc9357SAndroid Build Coastguard Worker       InternalIcons, res);
170*f6dc9357SAndroid Build Coastguard Worker 
171*f6dc9357SAndroid Build Coastguard Worker   return StringToBstr(res, extensions);
172*f6dc9357SAndroid Build Coastguard Worker }
173*f6dc9357SAndroid Build Coastguard Worker 
174*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CArchiveFolderManager::GetIconPath (const wchar_t * ext,BSTR * iconPath,Int32 * iconIndex))175*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CArchiveFolderManager::GetIconPath(const wchar_t *ext, BSTR *iconPath, Int32 *iconIndex))
176*f6dc9357SAndroid Build Coastguard Worker {
177*f6dc9357SAndroid Build Coastguard Worker   *iconPath = NULL;
178*f6dc9357SAndroid Build Coastguard Worker   *iconIndex = 0;
179*f6dc9357SAndroid Build Coastguard Worker   LoadFormats();
180*f6dc9357SAndroid Build Coastguard Worker 
181*f6dc9357SAndroid Build Coastguard Worker   #ifdef Z7_EXTERNAL_CODECS
182*f6dc9357SAndroid Build Coastguard Worker   // FOR_VECTOR (i, g_CodecsObj->Libs)
183*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, CodecIconsVector)
184*f6dc9357SAndroid Build Coastguard Worker   {
185*f6dc9357SAndroid Build Coastguard Worker     int ii;
186*f6dc9357SAndroid Build Coastguard Worker     if (CodecIconsVector[i].FindIconIndex(ext, ii))
187*f6dc9357SAndroid Build Coastguard Worker     {
188*f6dc9357SAndroid Build Coastguard Worker       const CCodecLib &lib = g_CodecsObj->Libs[i];
189*f6dc9357SAndroid Build Coastguard Worker       *iconIndex = ii;
190*f6dc9357SAndroid Build Coastguard Worker       return StringToBstr(fs2us(lib.Path), iconPath);
191*f6dc9357SAndroid Build Coastguard Worker     }
192*f6dc9357SAndroid Build Coastguard Worker   }
193*f6dc9357SAndroid Build Coastguard Worker   #endif
194*f6dc9357SAndroid Build Coastguard Worker 
195*f6dc9357SAndroid Build Coastguard Worker   int ii;
196*f6dc9357SAndroid Build Coastguard Worker   if (InternalIcons.FindIconIndex(ext, ii))
197*f6dc9357SAndroid Build Coastguard Worker   {
198*f6dc9357SAndroid Build Coastguard Worker     FString path;
199*f6dc9357SAndroid Build Coastguard Worker     if (NWindows::NDLL::MyGetModuleFileName(path))
200*f6dc9357SAndroid Build Coastguard Worker     {
201*f6dc9357SAndroid Build Coastguard Worker       *iconIndex = ii;
202*f6dc9357SAndroid Build Coastguard Worker       return StringToBstr(fs2us(path), iconPath);
203*f6dc9357SAndroid Build Coastguard Worker     }
204*f6dc9357SAndroid Build Coastguard Worker   }
205*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
206*f6dc9357SAndroid Build Coastguard Worker }
207*f6dc9357SAndroid Build Coastguard Worker 
208*f6dc9357SAndroid Build Coastguard Worker /*
209*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CArchiveFolderManager::GetTypes(BSTR *types))
210*f6dc9357SAndroid Build Coastguard Worker {
211*f6dc9357SAndroid Build Coastguard Worker   LoadFormats();
212*f6dc9357SAndroid Build Coastguard Worker   UString typesStrings;
213*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR(i, g_CodecsObj.Formats)
214*f6dc9357SAndroid Build Coastguard Worker   {
215*f6dc9357SAndroid Build Coastguard Worker     const CArcInfoEx &ai = g_CodecsObj.Formats[i];
216*f6dc9357SAndroid Build Coastguard Worker     if (ai.AssociateExts.Size() == 0)
217*f6dc9357SAndroid Build Coastguard Worker       continue;
218*f6dc9357SAndroid Build Coastguard Worker     if (i != 0)
219*f6dc9357SAndroid Build Coastguard Worker       typesStrings.Add_Space();
220*f6dc9357SAndroid Build Coastguard Worker     typesStrings += ai.Name;
221*f6dc9357SAndroid Build Coastguard Worker   }
222*f6dc9357SAndroid Build Coastguard Worker   return StringToBstr(typesStrings, types);
223*f6dc9357SAndroid Build Coastguard Worker }
224*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CArchiveFolderManager::CreateFolderFile(const wchar_t * type,
225*f6dc9357SAndroid Build Coastguard Worker     const wchar_t * filePath, IProgress progress))
226*f6dc9357SAndroid Build Coastguard Worker {
227*f6dc9357SAndroid Build Coastguard Worker   return E_NOTIMPL;
228*f6dc9357SAndroid Build Coastguard Worker }
229*f6dc9357SAndroid Build Coastguard Worker */
230*f6dc9357SAndroid Build Coastguard Worker 
231*f6dc9357SAndroid Build Coastguard Worker // #endif
232