1 // Agent/ArchiveFolderOpen.cpp
2 
3 #include "StdAfx.h"
4 
5 #include "../../../Windows/DLL.h"
6 
7 #include "Agent.h"
8 
LoadFormats()9 void CArchiveFolderManager::LoadFormats()
10 {
11   LoadGlobalCodecs();
12 }
13 
FindFormat(const UString & type)14 int CArchiveFolderManager::FindFormat(const UString &type)
15 {
16   FOR_VECTOR (i, g_CodecsObj->Formats)
17     if (type.IsEqualTo_NoCase(g_CodecsObj->Formats[i].Name))
18       return i;
19   return -1;
20 }
21 
OpenFolderFile(IInStream * inStream,const wchar_t * filePath,const wchar_t * arcFormat,IFolderFolder ** resultFolder,IProgress * progress)22 STDMETHODIMP CArchiveFolderManager::OpenFolderFile(IInStream *inStream,
23     const wchar_t *filePath, const wchar_t *arcFormat,
24     IFolderFolder **resultFolder, IProgress *progress)
25 {
26   CMyComPtr<IArchiveOpenCallback> openArchiveCallback;
27   if (progress)
28   {
29     CMyComPtr<IProgress> progressWrapper = progress;
30     progressWrapper.QueryInterface(IID_IArchiveOpenCallback, &openArchiveCallback);
31   }
32   CAgent *agent = new CAgent();
33   CMyComPtr<IInFolderArchive> archive = agent;
34   RINOK(agent->Open(inStream, filePath, arcFormat, NULL, openArchiveCallback));
35   return agent->BindToRootFolder(resultFolder);
36 }
37 
38 /*
39 HRESULT CAgent::FolderReOpen(
40     IArchiveOpenCallback *openArchiveCallback)
41 {
42   return ReOpenArchive(_archive, _archiveFilePath);
43 }
44 */
45 
46 
47 /*
48 STDMETHODIMP CArchiveFolderManager::GetExtensions(const wchar_t *type, BSTR *extensions)
49 {
50   *extensions = 0;
51   int formatIndex = FindFormat(type);
52   if (formatIndex <  0)
53     return E_INVALIDARG;
54   // Exts[0].Ext;
55   return StringToBstr(g_CodecsObj.Formats[formatIndex].GetAllExtensions(), extensions);
56 }
57 */
58 
AddIconExt(const CCodecIcons & lib,UString & dest)59 static void AddIconExt(const CCodecIcons &lib, UString &dest)
60 {
61   FOR_VECTOR (i, lib.IconPairs)
62   {
63     dest.Add_Space_if_NotEmpty();
64     dest += lib.IconPairs[i].Ext;
65   }
66 }
67 
GetExtensions(BSTR * extensions)68 STDMETHODIMP CArchiveFolderManager::GetExtensions(BSTR *extensions)
69 {
70   LoadFormats();
71   *extensions = 0;
72   UString res;
73 
74   #ifdef EXTERNAL_CODECS
75 
76   FOR_VECTOR (i, g_CodecsObj->Libs)
77     AddIconExt(g_CodecsObj->Libs[i], res);
78 
79   #endif
80 
81   AddIconExt(g_CodecsObj->InternalIcons, res);
82   return StringToBstr(res, extensions);
83 }
84 
GetIconPath(const wchar_t * ext,BSTR * iconPath,Int32 * iconIndex)85 STDMETHODIMP CArchiveFolderManager::GetIconPath(const wchar_t *ext, BSTR *iconPath, Int32 *iconIndex)
86 {
87   *iconPath = 0;
88   *iconIndex = 0;
89 
90   LoadFormats();
91 
92   #ifdef EXTERNAL_CODECS
93 
94   FOR_VECTOR (i, g_CodecsObj->Libs)
95   {
96     const CCodecLib &lib = g_CodecsObj->Libs[i];
97     int ii;
98     if (lib.FindIconIndex(ext, ii))
99     {
100       *iconIndex = ii;
101       return StringToBstr(fs2us(lib.Path), iconPath);
102     }
103   }
104 
105   #endif
106 
107   int ii;
108   if (g_CodecsObj->InternalIcons.FindIconIndex(ext, ii))
109   {
110     FString path;
111     if (NWindows::NDLL::MyGetModuleFileName(path))
112     {
113       *iconIndex = ii;
114       return StringToBstr(fs2us(path), iconPath);
115     }
116   }
117   return S_OK;
118 }
119 
120 /*
121 STDMETHODIMP CArchiveFolderManager::GetTypes(BSTR *types)
122 {
123   LoadFormats();
124   UString typesStrings;
125   FOR_VECTOR(i, g_CodecsObj.Formats)
126   {
127     const CArcInfoEx &ai = g_CodecsObj.Formats[i];
128     if (ai.AssociateExts.Size() == 0)
129       continue;
130     if (i != 0)
131       typesStrings.Add_Space();
132     typesStrings += ai.Name;
133   }
134   return StringToBstr(typesStrings, types);
135 }
136 STDMETHODIMP CArchiveFolderManager::CreateFolderFile(const wchar_t * type,
137     const wchar_t * filePath, IProgress progress)
138 {
139   return E_NOTIMPL;
140 }
141 */
142