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*/