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