1 // Zip/ArchiveFolder.cpp
\r
7 #include "Common/StringConvert.h"
\r
9 extern HINSTANCE g_hInstance;
\r
11 static inline UINT GetCurrentFileCodePage()
\r
16 return AreFileApisANSI() ? CP_ACP : CP_OEMCP;
\r
20 void CArchiveFolderManager::LoadFormats()
\r
24 _compressCodecsInfo = _codecs = new CCodecs;
\r
29 int CArchiveFolderManager::FindFormat(const UString &type)
\r
31 for (int i = 0; i < _codecs->Formats.Size(); i++)
\r
32 if (type.CompareNoCase(_codecs->Formats[i].Name) == 0)
\r
37 STDMETHODIMP CArchiveFolderManager::OpenFolderFile(IInStream *inStream,
\r
38 const wchar_t *filePath, const wchar_t *arcFormat,
\r
39 IFolderFolder **resultFolder, IProgress *progress)
\r
41 CMyComPtr<IArchiveOpenCallback> openArchiveCallback;
\r
44 CMyComPtr<IProgress> progressWrapper = progress;
\r
45 progressWrapper.QueryInterface(IID_IArchiveOpenCallback, &openArchiveCallback);
\r
47 CAgent *agent = new CAgent();
\r
48 CMyComPtr<IInFolderArchive> archive = agent;
\r
49 RINOK(agent->Open(inStream, filePath, arcFormat, NULL, openArchiveCallback));
\r
50 return agent->BindToRootFolder(resultFolder);
\r
54 HRESULT CAgent::FolderReOpen(
\r
55 IArchiveOpenCallback *openArchiveCallback)
\r
57 return ReOpenArchive(_archive, _archiveFilePath);
\r
63 STDMETHODIMP CArchiveFolderManager::GetExtensions(const wchar_t *type, BSTR *extensions)
\r
66 int formatIndex = FindFormat(type);
\r
67 if (formatIndex < 0)
\r
68 return E_INVALIDARG;
\r
70 return StringToBstr(_codecs.Formats[formatIndex].GetAllExtensions(), extensions);
\r
74 static void AddIconExt(const CCodecIcons &lib, UString &dest)
\r
76 for (int j = 0; j < lib.IconPairs.Size(); j++)
\r
78 if (!dest.IsEmpty())
\r
80 dest += lib.IconPairs[j].Ext;
\r
84 STDMETHODIMP CArchiveFolderManager::GetExtensions(BSTR *extensions)
\r
89 for (int i = 0; i < _codecs->Libs.Size(); i++)
\r
90 AddIconExt(_codecs->Libs[i], res);
\r
91 AddIconExt(_codecs->InternalIcons, res);
\r
92 return StringToBstr(res, extensions);
\r
95 STDMETHODIMP CArchiveFolderManager::GetIconPath(const wchar_t *ext, BSTR *iconPath, Int32 *iconIndex)
\r
100 for (int i = 0; i < _codecs->Libs.Size(); i++)
\r
102 const CCodecLib &lib = _codecs->Libs[i];
\r
104 if (lib.FindIconIndex(ext, ii))
\r
107 return StringToBstr(GetUnicodeString(lib.Path, GetCurrentFileCodePage()), iconPath);
\r
111 if (_codecs->InternalIcons.FindIconIndex(ext, ii))
\r
115 NWindows::NDLL::MyGetModuleFileName(g_hInstance, path);
\r
116 return StringToBstr(path, iconPath);
\r
122 STDMETHODIMP CArchiveFolderManager::GetTypes(BSTR *types)
\r
125 UString typesStrings;
\r
126 for(int i = 0; i < _codecs.Formats.Size(); i++)
\r
128 const CArcInfoEx &ai = _codecs.Formats[i];
\r
129 if (ai.AssociateExts.Size() == 0)
\r
132 typesStrings += L' ';
\r
133 typesStrings += ai.Name;
\r
135 return StringToBstr(typesStrings, types);
\r
137 STDMETHODIMP CArchiveFolderManager::CreateFolderFile(const wchar_t * type,
\r
138 const wchar_t * filePath, IProgress progress)
\r