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