1cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// SysIconUtils.cpp 2cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 3cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "StdAfx.h" 4cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 5cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef _UNICODE 6cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../../Common/StringConvert.h" 7cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif 8cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 9cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../../../Windows/FileDir.h" 10cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 11cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "SysIconUtils.h" 12cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 13cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef _UNICODE 14cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyextern bool g_IsNT; 15cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif 16cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 17cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyint GetIconIndexForCSIDL(int csidl) 18cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 19cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky LPITEMIDLIST pidl = 0; 20cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky SHGetSpecialFolderLocation(NULL, csidl, &pidl); 21cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (pidl) 22cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 23cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky SHFILEINFO shellInfo; 24cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky SHGetFileInfo(LPCTSTR(pidl), FILE_ATTRIBUTE_NORMAL, 25cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky &shellInfo, sizeof(shellInfo), 26cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky SHGFI_PIDL | SHGFI_SYSICONINDEX); 27cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky IMalloc *pMalloc; 28cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky SHGetMalloc(&pMalloc); 29cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (pMalloc) 30cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 31cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky pMalloc->Free(pidl); 32cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky pMalloc->Release(); 33cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 34cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return shellInfo.iIcon; 35cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 36cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return 0; 37cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 38cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 39cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef _UNICODE 40cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckytypedef int (WINAPI * SHGetFileInfoWP)(LPCWSTR pszPath, DWORD attrib, SHFILEINFOW *psfi, UINT cbFileInfo, UINT uFlags); 41cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 42cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystruct CSHGetFileInfoInit 43cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 44cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky SHGetFileInfoWP shGetFileInfoW; 45cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CSHGetFileInfoInit() 46cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 47cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky shGetFileInfoW = (SHGetFileInfoWP) 48cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky ::GetProcAddress(::GetModuleHandleW(L"shell32.dll"), "SHGetFileInfoW"); 49cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 50cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} g_SHGetFileInfoInit; 51cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif 52cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 53cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic DWORD_PTR MySHGetFileInfoW(LPCWSTR pszPath, DWORD attrib, SHFILEINFOW *psfi, UINT cbFileInfo, UINT uFlags) 54cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 55cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #ifdef _UNICODE 56cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return SHGetFileInfo 57cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #else 58cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (g_SHGetFileInfoInit.shGetFileInfoW == 0) 59cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return 0; 60cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return g_SHGetFileInfoInit.shGetFileInfoW 61cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #endif 62cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky (pszPath, attrib, psfi, cbFileInfo, uFlags); 63cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 64cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 65cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyDWORD_PTR GetRealIconIndex(CFSTR path, DWORD attrib, int &iconIndex) 66cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 67cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #ifndef _UNICODE 68cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (!g_IsNT) 69cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 70cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky SHFILEINFO shellInfo; 71cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky DWORD_PTR res = ::SHGetFileInfo(fs2fas(path), FILE_ATTRIBUTE_NORMAL | attrib, &shellInfo, 72cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX); 73cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky iconIndex = shellInfo.iIcon; 74cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return res; 75cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 76cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky else 77cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #endif 78cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 79cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky SHFILEINFOW shellInfo; 80cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky DWORD_PTR res = ::MySHGetFileInfoW(fs2us(path), FILE_ATTRIBUTE_NORMAL | attrib, &shellInfo, 81cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX); 82cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky iconIndex = shellInfo.iIcon; 83cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return res; 84cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 85cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 86cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 87cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky/* 88cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyDWORD_PTR GetRealIconIndex(const UString &fileName, DWORD attrib, int &iconIndex, UString *typeName) 89cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 90cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #ifndef _UNICODE 91cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (!g_IsNT) 92cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 93cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky SHFILEINFO shellInfo; 94cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky shellInfo.szTypeName[0] = 0; 95cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky DWORD_PTR res = ::SHGetFileInfoA(GetSystemString(fileName), FILE_ATTRIBUTE_NORMAL | attrib, &shellInfo, 96cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME); 97cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (typeName) 98cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky *typeName = GetUnicodeString(shellInfo.szTypeName); 99cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky iconIndex = shellInfo.iIcon; 100cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return res; 101cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 102cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky else 103cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #endif 104cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 105cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky SHFILEINFOW shellInfo; 106cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky shellInfo.szTypeName[0] = 0; 107cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky DWORD_PTR res = ::MySHGetFileInfoW(fileName, FILE_ATTRIBUTE_NORMAL | attrib, &shellInfo, 108cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky sizeof(shellInfo), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME); 109cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (typeName) 110cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky *typeName = shellInfo.szTypeName; 111cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky iconIndex = shellInfo.iIcon; 112cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return res; 113cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 114cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 115cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky*/ 116cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 117cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic int FindInSorted_Attrib(const CRecordVector<CAttribIconPair> &vect, DWORD attrib, int &insertPos) 118cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 119cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky unsigned left = 0, right = vect.Size(); 120cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky while (left != right) 121cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 122cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky unsigned mid = (left + right) / 2; 123cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky DWORD midAttrib = vect[mid].Attrib; 124cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (attrib == midAttrib) 125cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return mid; 126cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (attrib < midAttrib) 127cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky right = mid; 128cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky else 129cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky left = mid + 1; 130cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 131cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky insertPos = left; 132cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return -1; 133cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 134cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 135cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic int FindInSorted_Ext(const CObjectVector<CExtIconPair> &vect, const wchar_t *ext, int &insertPos) 136cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 137cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky unsigned left = 0, right = vect.Size(); 138cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky while (left != right) 139cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 140cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky unsigned mid = (left + right) / 2; 141cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky int compare = MyStringCompareNoCase(ext, vect[mid].Ext); 142cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (compare == 0) 143cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return mid; 144cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (compare < 0) 145cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky right = mid; 146cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky else 147cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky left = mid + 1; 148cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 149cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky insertPos = left; 150cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return -1; 151cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 152cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 153cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyint CExtToIconMap::GetIconIndex(DWORD attrib, const wchar_t *fileName /*, UString *typeName */) 154cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 155cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky int dotPos = -1; 156cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky unsigned i; 157cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky for (i = 0;; i++) 158cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 159cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wchar_t c = fileName[i]; 160cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (c == 0) 161cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky break; 162cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (c == '.') 163cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky dotPos = i; 164cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 165cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 166cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky /* 167cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (MyStringCompareNoCase(fileName, L"$Recycle.Bin") == 0) 168cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 169cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky char s[256]; 170cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky sprintf(s, "SPEC i = %3d, attr = %7x", _attribMap.Size(), attrib); 171cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky OutputDebugStringA(s); 172cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky OutputDebugStringW(fileName); 173cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 174cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky */ 175cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 176cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if ((attrib & FILE_ATTRIBUTE_DIRECTORY) != 0 || dotPos < 0) 177cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 178cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky int insertPos = 0; 179cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky int index = FindInSorted_Attrib(_attribMap, attrib, insertPos); 180cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (index >= 0) 181cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 182cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // if (typeName) *typeName = _attribMap[index].TypeName; 183cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return _attribMap[index].IconIndex; 184cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 185cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CAttribIconPair pair; 186cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky GetRealIconIndex( 187cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #ifdef UNDER_CE 188cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky FTEXT("\\") 189cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #endif 190cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky FTEXT("__DIR__") 191cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky , attrib, pair.IconIndex 192cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // , pair.TypeName 193cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky ); 194cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 195cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky /* 196cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky char s[256]; 197cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky sprintf(s, "i = %3d, attr = %7x", _attribMap.Size(), attrib); 198cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky OutputDebugStringA(s); 199cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky */ 200cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 201cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky pair.Attrib = attrib; 202cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _attribMap.Insert(insertPos, pair); 203cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // if (typeName) *typeName = pair.TypeName; 204cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return pair.IconIndex; 205cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 206cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 207cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky const wchar_t *ext = fileName + dotPos + 1; 208cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky int insertPos = 0; 209cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky int index = FindInSorted_Ext(_extMap, ext, insertPos); 210cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (index >= 0) 211cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 212cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky const CExtIconPair &pa = _extMap[index]; 213cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // if (typeName) *typeName = pa.TypeName; 214cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return pa.IconIndex; 215cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 216cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 217cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky for (i = 0;; i++) 218cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 219cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky wchar_t c = ext[i]; 220cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (c == 0) 221cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky break; 222cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (c < L'0' || c > L'9') 223cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky break; 224cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 225cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (i != 0 && ext[i] == 0) 226cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 227cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // GetRealIconIndex is too slow for big number of split extensions: .001, .002, .003 228cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky if (!SplitIconIndex_Defined) 229cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky { 230cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky GetRealIconIndex( 231cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #ifdef UNDER_CE 232cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky FTEXT("\\") 233cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky #endif 234cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky FTEXT("__FILE__.001"), 0, SplitIconIndex); 235cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky SplitIconIndex_Defined = true; 236cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 237cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return SplitIconIndex; 238cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky } 239cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 240cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky CExtIconPair pair; 241cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky pair.Ext = ext; 242cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky GetRealIconIndex(us2fs(fileName + dotPos), attrib, pair.IconIndex); 243cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky _extMap.Insert(insertPos, pair); 244cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky // if (typeName) *typeName = pair.TypeName; 245cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return pair.IconIndex; 246cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 247cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky 248cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky/* 249cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyint CExtToIconMap::GetIconIndex(DWORD attrib, const UString &fileName) 250cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{ 251cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky return GetIconIndex(attrib, fileName, NULL); 252cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky} 253cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky*/