ReactOS  0.4.15-dev-3698-gce6da82
CFontExt.cpp
Go to the documentation of this file.
1 /*
2  * PROJECT: ReactOS Font Shell Extension
3  * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4  * PURPOSE: CFontExt implementation
5  * COPYRIGHT: Copyright 2019-2021 Mark Jansen <mark.jansen@reactos.org>
6  * Copyright 2019 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
7  */
8 
9 #include "precomp.h"
10 #include "undocgdi.h" // for GetFontResourceInfoW
11 
13 
14 #ifndef SHCIDS_ALLFIELDS
15 #define SHCIDS_ALLFIELDS 0x80000000L
16 #endif
17 
19 {
20  int iResource;
22  int cxChar;
23  int fmt;
24 };
25 
27 {
33 };
34 
36 {
42 };
43 
44 
45 // Helper functions to translate a guid to a readable name
46 bool GetInterfaceName(const WCHAR* InterfaceString, WCHAR* buf, size_t size)
47 {
48  WCHAR LocalBuf[100];
49  DWORD dwType = 0, dwDataSize = size * sizeof(WCHAR);
50 
51  if (!SUCCEEDED(StringCchPrintfW(LocalBuf, _countof(LocalBuf), L"Interface\\%s", InterfaceString)))
52  return false;
53 
54  return RegGetValueW(HKEY_CLASSES_ROOT, LocalBuf, NULL, RRF_RT_REG_SZ, &dwType, buf, &dwDataSize) == ERROR_SUCCESS;
55 }
56 
58 {
59  static WCHAR buf[2][300];
60  static int idx = 0;
61 
62  idx ^= 1;
63 
64  LPOLESTR tmp;
65  HRESULT hr = ProgIDFromCLSID(iid, &tmp);
66  if (SUCCEEDED(hr))
67  {
68  wcscpy(buf[idx], tmp);
69  CoTaskMemFree(tmp);
70  return buf[idx];
71  }
74  {
75  return buf[idx];
76  }
78 
79  return buf[idx];
80 }
81 
82 
84 {
86 }
87 
89 {
91 }
92 
93 // *** IShellFolder2 methods ***
95 {
96  ERR("%s() UNIMPLEMENTED\n", __FUNCTION__);
97  return E_NOTIMPL;
98 }
99 
101 {
102  ERR("%s() UNIMPLEMENTED\n", __FUNCTION__);
103  return E_NOTIMPL;
104 }
105 
107 {
108  ERR("%s() UNIMPLEMENTED\n", __FUNCTION__);
109  return E_NOTIMPL;
110 }
111 
113 {
114  if (!pcsFlags || iColumn >= _countof(g_ColumnDefs))
115  return E_INVALIDARG;
116 
117  *pcsFlags = g_ColumnDefs[iColumn].dwDefaultState;
118  return S_OK;
119 }
120 
122 {
123  ERR("%s() UNIMPLEMENTED\n", __FUNCTION__);
124  return E_NOTIMPL;
125 }
126 
128 {
129  if (iColumn >= _countof(g_ColumnDefs))
130  return E_FAIL;
131 
132  psd->cxChar = g_ColumnDefs[iColumn].cxChar;
133  psd->fmt = g_ColumnDefs[iColumn].fmt;
134 
135  // No item requested, so return the column name
136  if (pidl == NULL)
137  {
138  return SHSetStrRet(&psd->str, _AtlBaseModule.GetResourceInstance(), g_ColumnDefs[iColumn].iResource);
139  }
140 
141  // Validate that this pidl is the last one
142  PCUIDLIST_RELATIVE curpidl = ILGetNext(pidl);
143  if (curpidl->mkid.cb != 0)
144  {
145  ERR("ERROR, unhandled PIDL!\n");
146  return E_FAIL;
147  }
148 
149  // Name, ReactOS specific?
150  if (iColumn == FONTEXT_COL_NAME)
151  return GetDisplayNameOf(pidl, 0, &psd->str);
152 
153  const FontPidlEntry* fontEntry = _FontFromIL(pidl);
154  if (!fontEntry)
155  {
156  ERR("ERROR, not a font PIDL!\n");
157  return E_FAIL;
158  }
159 
160  // If we got here, we are in details view!
161  auto info = g_FontCache->Find(fontEntry);
162  if (info == nullptr)
163  {
164  ERR("Unable to query info about %S\n", fontEntry->Name);
166  }
167 
168  int ret;
169  CStringA AttrLetters;
172  switch (iColumn)
173  {
175  return SHSetStrRet(&psd->str, PathFindFileNameW(info->File()));
176  case FONTEXT_COL_SIZE:
177  psd->str.uType = STRRET_CSTR;
178  StrFormatKBSizeA(info->FileSize().QuadPart, psd->str.cStr, MAX_PATH);
179  return S_OK;
181  psd->str.uType = STRRET_CSTR;
182  FileTimeToSystemTime(&info->FileWriteTime(), &time);
184  if (ret < 1)
185  {
186  ERR("GetDateFormatA failed\n");
187  return E_FAIL;
188  }
189  psd->str.cStr[ret-1] = ' ';
191  return S_OK;
192  case FONTEXT_COL_ATTR:
193  AttrLetters.LoadString(IDS_COL_ATTR_LETTERS);
194  if (AttrLetters.GetLength() != 5)
195  {
196  ERR("IDS_COL_ATTR_LETTERS does not contain 5 letters!\n");
197  return E_FAIL;
198  }
199  psd->str.uType = STRRET_CSTR;
200  dwAttributes = info->FileAttributes();
201  ret = 0;
203  psd->str.cStr[ret++] = AttrLetters[0];
205  psd->str.cStr[ret++] = AttrLetters[1];
207  psd->str.cStr[ret++] = AttrLetters[2];
209  psd->str.cStr[ret++] = AttrLetters[3];
211  psd->str.cStr[ret++] = AttrLetters[4];
212  psd->str.cStr[ret] = '\0';
213  return S_OK;
214  default:
215  break;
216  }
217 
219  return E_NOTIMPL;
220 }
221 
223 {
224  //ERR("%s() UNIMPLEMENTED\n", __FUNCTION__);
225  return E_NOTIMPL;
226 }
227 
228 // *** IShellFolder2 methods ***
229 STDMETHODIMP CFontExt::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
230 {
231  ERR("%s() UNIMPLEMENTED\n", __FUNCTION__);
232  return E_NOTIMPL;
233 }
234 
235 STDMETHODIMP CFontExt::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
236 {
237  return _CEnumFonts_CreateInstance(this, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
238 }
239 
241 {
242  ERR("%s(riid=%S) UNIMPLEMENTED\n", __FUNCTION__, g2s(riid));
243  return E_NOTIMPL;
244 }
245 
247 {
248  ERR("%s() UNIMPLEMENTED\n", __FUNCTION__);
249  return E_NOTIMPL;
250 }
251 
253 {
254  const FontPidlEntry* fontEntry1 = _FontFromIL(pidl1);
255  const FontPidlEntry* fontEntry2 = _FontFromIL(pidl2);
256 
257  if (!fontEntry1 || !fontEntry2)
258  return E_INVALIDARG;
259 
260  int result;
261  DWORD sortMode = lParam & 0xFFFF0000;
262  DWORD column = lParam & 0x0000FFFF;
263  if (sortMode == SHCIDS_ALLFIELDS)
264  {
266  result = (int)fontEntry1->Index - (int)fontEntry2->Index;
267  }
268  else
269  {
270  auto info1 = g_FontCache->Find(fontEntry1);
271  auto info2 = g_FontCache->Find(fontEntry2);
272 
273  if (!info1 || !info2)
274  {
275  ERR("Unable to find font %S or %S in cache!\n", fontEntry1->Name, fontEntry2->Name);
276  return E_INVALIDARG;
277  }
278 
279  switch (column)
280  {
281  case 0xffff:
282  /* ROS bug? */
283  case FONTEXT_COL_NAME:
284  // These items are already ordered by name
285  result = (int)fontEntry1->Index - (int)fontEntry2->Index;
286  break;
288  result = wcsicmp(PathFindFileNameW(info1->File()), PathFindFileNameW(info2->File()));
289  break;
290  case FONTEXT_COL_SIZE:
291  result = (int)info1->FileSize().HighPart - info2->FileSize().HighPart;
292  if (result == 0)
293  result = (int)info1->FileSize().LowPart - info2->FileSize().LowPart;
294  break;
296  result = CompareFileTime(&info1->FileWriteTime(), &info2->FileWriteTime());
297  break;
298  case FONTEXT_COL_ATTR:
299  // FIXME: how to compare attributes?
300  result = (int)info1->FileAttributes() - info2->FileAttributes();
301  break;
302  default:
303  ERR("Unimplemented column %u\n", column);
304  return E_INVALIDARG;
305  }
306  }
307 
309 }
310 
312 {
314 
315  *ppvOut = NULL;
316 
317  if (IsEqualIID(riid, IID_IDropTarget))
318  {
319  ERR("IDropTarget not implemented\n");
320  *ppvOut = static_cast<IDropTarget *>(this);
321  AddRef();
322  hr = S_OK;
323  }
324  else if (IsEqualIID(riid, IID_IContextMenu))
325  {
326  ERR("IContextMenu not implemented\n");
327  hr = E_NOTIMPL;
328  }
329  else if (IsEqualIID(riid, IID_IShellView))
330  {
331  // Just create a default shell folder view, and register ourself as folder
332  SFV_CREATE sfv = { sizeof(SFV_CREATE) };
333  sfv.pshf = this;
334  hr = SHCreateShellFolderView(&sfv, (IShellView**)ppvOut);
335  }
336 
337  return hr;
338 }
339 
341 {
342  if (!rgfInOut || !cidl || !apidl)
343  return E_INVALIDARG;
344 
345  DWORD rgf = 0;
346  while (cidl > 0 && *apidl)
347  {
348  const FontPidlEntry* fontEntry = _FontFromIL(*apidl);
349  if (fontEntry)
350  {
351  // We don't support delete yet
352  rgf |= (/*SFGAO_CANDELETE |*/ SFGAO_HASPROPSHEET | SFGAO_CANCOPY | SFGAO_FILESYSTEM);
353  }
354  else
355  {
356  rgf = 0;
357  break;
358  }
359 
360  apidl++;
361  cidl--;
362  }
363 
364  *rgfInOut = rgf;
365  return S_OK;
366 }
367 
368 
370 {
371  if (riid == IID_IContextMenu ||
372  riid == IID_IContextMenu2 ||
373  riid == IID_IContextMenu3)
374  {
375  return _CFontMenu_CreateInstance(hwndOwner, cidl, apidl, this, riid, ppvOut);
376  }
377  else if (riid == IID_IExtractIconA || riid == IID_IExtractIconW)
378  {
379  if (cidl == 1)
380  {
381  const FontPidlEntry* fontEntry = _FontFromIL(*apidl);
382  if (fontEntry)
383  {
386  // Just create a default icon extractor based on the filename
387  // We might want to create a preview with the font to get really fancy one day.
389  }
390  }
391  else
392  {
393  ERR("IID_IExtractIcon with cidl != 1 UNIMPLEMENTED\n");
394  }
395  }
396  else if (riid == IID_IDataObject)
397  {
398  if (cidl >= 1)
399  {
400  return _CDataObject_CreateInstance(m_Folder, cidl, apidl, riid, ppvOut);
401  }
402  else
403  {
404  ERR("IID_IDataObject with cidl == 0 UNIMPLEMENTED\n");
405  }
406  }
407 
408  //ERR("%s(riid=%S) UNIMPLEMENTED\n", __FUNCTION__, g2s(riid));
409  return E_NOTIMPL;
410 }
411 
413 {
414  if (!pidl)
415  return E_NOTIMPL;
416 
417  // Validate that this pidl is the last one
418  PCUIDLIST_RELATIVE curpidl = ILGetNext(pidl);
419  if (curpidl->mkid.cb != 0)
420  {
421  ERR("ERROR, unhandled PIDL!\n");
422  return E_FAIL;
423  }
424 
425  const FontPidlEntry* fontEntry = _FontFromIL(pidl);
426  if (!fontEntry)
427  return E_FAIL;
428 
429  if (dwFlags == SHGDN_FORPARSING)
430  {
431  CStringW File = g_FontCache->Filename(g_FontCache->Find(fontEntry), true);
432  if (!File.IsEmpty())
433  {
434  return SHSetStrRet(strRet, File);
435  }
436  }
437 
438  return SHSetStrRet(strRet, fontEntry->Name);
439 }
440 
442 {
443  ERR("%s() UNIMPLEMENTED\n", __FUNCTION__);
444  return E_NOTIMPL;
445 }
446 
447 // *** IPersistFolder2 methods ***
449 {
450  if (ppidl && m_Folder)
451  {
452  *ppidl = ILClone(m_Folder);
453  return S_OK;
454  }
455 
456  return E_POINTER;
457 }
458 
459 
460 // *** IPersistFolder methods ***
462 {
463  WCHAR PidlPath[MAX_PATH + 1] = {0}, FontsDir[MAX_PATH + 1];
464  if (!SHGetPathFromIDListW(pidl, PidlPath))
465  {
466  ERR("Unable to extract path from pidl\n");
467  return E_FAIL;
468  }
469 
470  HRESULT hr = SHGetFolderPathW(NULL, CSIDL_FONTS, NULL, 0, FontsDir);
471  if (FAILED_UNEXPECTEDLY(hr))
472  {
473  ERR("Unable to get fonts path (0x%x)\n", hr);
474  return hr;
475  }
476 
477  if (_wcsicmp(PidlPath, FontsDir))
478  {
479  ERR("CFontExt View initializing on unexpected folder: '%S'\n", PidlPath);
480  return E_FAIL;
481  }
482 
483  m_Folder.Attach(ILClone(pidl));
484  StringCchCatW(FontsDir, _countof(FontsDir), L"\\");
485  g_FontCache->SetFontDir(FontsDir);
486 
487  return S_OK;
488 }
489 
490 
491 // *** IPersist methods ***
493 {
494  *lpClassId = CLSID_CFontExt;
495  return S_OK;
496 }
497 
498 // *** IDropTarget methods ***
499 STDMETHODIMP CFontExt::DragEnter(IDataObject* pDataObj, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect)
500 {
501  *pdwEffect = DROPEFFECT_NONE;
502 
503  CDataObjectHIDA cida(pDataObj);
504  if (FAILED_UNEXPECTEDLY(cida.hr()))
505  return cida.hr();
506 
507  *pdwEffect = DROPEFFECT_COPY;
508  return S_OK;
509 }
510 
512 {
513  return S_OK;
514 }
515 
517 {
518  return S_OK;
519 }
520 
521 STDMETHODIMP CFontExt::Drop(IDataObject* pDataObj, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect)
522 {
523  *pdwEffect = DROPEFFECT_NONE;
524 
525  CDataObjectHIDA cida(pDataObj);
526  if (!cida)
527  return E_UNEXPECTED;
528 
529  PCUIDLIST_ABSOLUTE pidlParent = HIDA_GetPIDLFolder(cida);
530  if (!pidlParent)
531  {
532  ERR("pidlParent is NULL\n");
533  return E_FAIL;
534  }
535 
536  BOOL bOK = TRUE;
537  CAtlArray<CStringW> FontPaths;
538  for (UINT n = 0; n < cida->cidl; ++n)
539  {
540  PCUIDLIST_RELATIVE pidlRelative = HIDA_GetPIDLItem(cida, n);
541  if (!pidlRelative)
542  continue;
543 
544  PIDLIST_ABSOLUTE pidl = ILCombine(pidlParent, pidlRelative);
545  if (!pidl)
546  {
547  ERR("ILCombine failed\n");
548  bOK = FALSE;
549  break;
550  }
551 
554  ILFree(pidl);
555 
556  if (!ret)
557  {
558  ERR("SHGetPathFromIDListW failed\n");
559  bOK = FALSE;
560  break;
561  }
562 
564  {
565  ERR("PathIsDirectory\n");
566  bOK = FALSE;
567  break;
568  }
569 
570  LPCWSTR pchDotExt = PathFindExtensionW(szPath);
571  if (!IsFontDotExt(pchDotExt))
572  {
573  ERR("'%S' is not supported\n", pchDotExt);
574  bOK = FALSE;
575  break;
576  }
577 
578  FontPaths.Add(szPath);
579  }
580 
581  if (!bOK)
582  return E_FAIL;
583 
584  CRegKey keyFonts;
585  if (keyFonts.Open(FONT_HIVE, FONT_KEY, KEY_WRITE) != ERROR_SUCCESS)
586  {
587  ERR("keyFonts.Open failed\n");
588  return E_FAIL;
589  }
590 
591  for (size_t iItem = 0; iItem < FontPaths.GetCount(); ++iItem)
592  {
593  HRESULT hr = DoInstallFontFile(FontPaths[iItem], g_FontCache->FontPath(), keyFonts.m_hKey);
594  if (FAILED_UNEXPECTEDLY(hr))
595  {
596  bOK = FALSE;
597  break;
598  }
599  }
600 
601  // Invalidate our cache
602  g_FontCache->Read();
603 
604  // Notify the system that a font was added
606 
607  // Notify the shell that the folder contents are changed
609 
610  // TODO: Show message
611 
612  return bOK ? S_OK : E_FAIL;
613 }
614 
615 HRESULT CFontExt::DoInstallFontFile(LPCWSTR pszFontPath, LPCWSTR pszFontsDir, HKEY hkeyFonts)
616 {
617  WCHAR szDestFile[MAX_PATH];
618 
619  // Add this font to the font list, so we can query the name
620  if (!AddFontResourceW(pszFontPath))
621  {
622  ERR("AddFontResourceW('%S') failed\n", pszFontPath);
623  DeleteFileW(szDestFile);
624  return E_FAIL;
625  }
626 
627  CStringW strFontName;
628  HRESULT hr = DoGetFontTitle(pszFontPath, strFontName);
629 
630  // We got the name, remove it again
631  RemoveFontResourceW(pszFontPath);
632 
633  if (!SUCCEEDED(hr))
634  {
635  ERR("DoGetFontTitle failed (err=0x%x)!\n", hr);
636  return hr;
637  }
638 
639  StringCchCopyW(szDestFile, sizeof(szDestFile), pszFontsDir);
640 
641  LPCWSTR pszFileTitle = PathFindFileName(pszFontPath);
642  PathAppendW(szDestFile, pszFileTitle);
643  if (!CopyFileW(pszFontPath, szDestFile, FALSE))
644  {
645  ERR("CopyFileW('%S', '%S') failed\n", pszFontPath, szDestFile);
646  return E_FAIL;
647  }
648 
649  DWORD cbData = (wcslen(pszFileTitle) + 1) * sizeof(WCHAR);
650  LONG nError = RegSetValueExW(hkeyFonts, strFontName, 0, REG_SZ,
651  (const BYTE *)pszFileTitle, cbData);
652  if (nError)
653  {
654  ERR("RegSetValueExW failed with %ld\n", nError);
655  DeleteFileW(szDestFile);
656  return E_FAIL;
657  }
658 
659  AddFontResourceW(szDestFile);
660 
661  return S_OK;
662 }
663 
664 HRESULT
665 CFontExt::DoGetFontTitle(IN LPCWSTR pszFontPath, OUT CStringW& strFontName)
666 {
667  DWORD cbInfo = 0;
668  BOOL ret = GetFontResourceInfoW(pszFontPath, &cbInfo, NULL, 1);
669  if (!ret || !cbInfo)
670  {
671  ERR("GetFontResourceInfoW failed (err: %u)\n", GetLastError());
672  return E_FAIL;
673  }
674 
675  LPWSTR pszBuffer = strFontName.GetBuffer(cbInfo / sizeof(WCHAR));
676  ret = GetFontResourceInfoW(pszFontPath, &cbInfo, pszBuffer, 1);
677  DWORD dwErr = GetLastError();;
678  strFontName.ReleaseBuffer();
679  if (ret)
680  {
681  TRACE("pszFontName: %S\n", (LPCWSTR)strFontName);
682  return S_OK;
683  }
684 
685  ERR("GetFontResourceInfoW failed (err: %u)\n", dwErr);
686  return E_FAIL;
687 }
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
Definition: reg.c:1965
#define SHCIDS_ALLFIELDS
Definition: CFontExt.cpp:15
int GetLength() const
Definition: atlsimpstr.h:356
BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
Definition: path.c:1722
DWORD dwDefaultState
Definition: CFontExt.cpp:21
#define IN
Definition: typedefs.h:39
virtual STDMETHODIMP DragLeave()
Definition: CFontExt.cpp:516
virtual STDMETHODIMP GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd)
Definition: CFontExt.cpp:127
#define REFIID
Definition: guiddef.h:118
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:925
#define E_NOINTERFACE
Definition: winerror.h:2364
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
#define ERROR_SUCCESS
Definition: deptool.c:10
HRESULT hr
Definition: shlfolder.c:183
GLuint64EXT * result
Definition: glext.h:11304
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
interface IBindCtx * LPBC
Definition: objfwd.h:18
#define TRUE
Definition: types.h:120
INT WINAPI GetDateFormatA(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCSTR lpFormat, LPSTR lpDateStr, INT cchOut)
Definition: lcformat.c:922
#define pt(x, y)
Definition: drawing.c:79
#define FILE_ATTRIBUTE_SYSTEM
Definition: nt_native.h:704
REFIID riid
Definition: precomp.h:44
virtual STDMETHODIMP GetClassID(CLSID *lpClassId)
Definition: CFontExt.cpp:492
LONG g_ModuleRefCnt
Definition: ACPPage.cpp:13
#define REFCLSID
Definition: guiddef.h:117
#define LOCALE_USER_DEFAULT
#define DATE_SHORTDATE
Definition: winnls.h:196
virtual STDMETHODIMP Initialize(LPCITEMIDLIST pidl)
Definition: CFontExt.cpp:461
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:699
#define LVCFMT_RIGHT
Definition: commctrl.h:2599
HRESULT _CEnumFonts_CreateInstance(CFontExt *zip, DWORD flags, REFIID riid, LPVOID *ppvOut)
Definition: CEnumFonts.cpp:87
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1294
static PCUIDLIST_RELATIVE HIDA_GetPIDLItem(CIDA const *pida, SIZE_T i)
Definition: shellutils.h:554
_In_ LPCSTR lpName
Definition: winbase.h:2770
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:851
GLdouble n
Definition: glext.h:7729
#define IDS_COL_NAME
Definition: resource.h:6
WINE_DEFAULT_DEBUG_CHANNEL(fontext)
#define LVCFMT_LEFT
Definition: commctrl.h:2598
const FontPidlEntry * _FontFromIL(LPCITEMIDLIST pidl)
Definition: fontpidl.cpp:32
virtual STDMETHODIMP DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
Definition: CFontExt.cpp:499
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
#define RRF_RT_REG_SZ
Definition: driver.c:575
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1040
~CFontExt()
Definition: CFontExt.cpp:88
LPSTR WINAPI StrFormatKBSizeA(LONGLONG llBytes, LPSTR lpszDest, UINT cchMax)
Definition: string.c:1727
const GUID IID_IDataObject
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:546
__u16 time
Definition: mkdosfs.c:366
bool GetInterfaceName(const WCHAR *InterfaceString, WCHAR *buf, size_t size)
Definition: CFontExt.cpp:46
static LPOLESTR
Definition: stg_prop.c:27
font_columns
Definition: CFontExt.cpp:26
#define CSIDL_FONTS
Definition: shlobj.h:2031
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:3791
#define IID_PPV_ARG(Itype, ppType)
#define E_FAIL
Definition: ddrawi.h:102
STRRET str
Definition: shtypes.idl:108
virtual STDMETHODIMP CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2)
Definition: CFontExt.cpp:252
HKEY m_hKey
Definition: atlbase.h:1013
HRESULT DoInstallFontFile(LPCWSTR pszFontPath, LPCWSTR pszFontsDir, HKEY hkeyFonts)
Definition: CFontExt.cpp:615
DWORD dwAttributes
Definition: vdmdbg.h:34
virtual STDMETHODIMP EnumSearches(IEnumExtraSearch **ppenum)
Definition: CFontExt.cpp:100
const DWORD DROPEFFECT_COPY
Definition: oleidl.idl:930
BOOL WINAPI PathAppendW(LPWSTR lpszPath, LPCWSTR lpszAppend)
Definition: path.c:126
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
int WINAPI AddFontResourceW(_In_ LPCWSTR pszFilename)
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
INT WINAPI GetTimeFormatA(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCSTR lpFormat, LPSTR lpTimeStr, INT cchOut)
Definition: lcformat.c:1030
const DWORD DROPEFFECT_NONE
Definition: oleidl.idl:929
char cStr[MAX_PATH]
Definition: shtypes.idl:98
size_t GetCount() const
Definition: atlcoll.h:373
#define L(x)
Definition: ntvdm.h:50
HRESULT WINAPI DECLSPEC_HOTPATCH ProgIDFromCLSID(REFCLSID clsid, LPOLESTR *ppszProgID)
Definition: compobj.c:2530
#define FALSE
Definition: types.h:117
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
virtual STDMETHODIMP BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut)
Definition: CFontExt.cpp:240
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:90
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
BOOL IsFontDotExt(LPCWSTR pchDotExt)
Definition: precomp.h:39
if SUCCEEDED(hr)
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
virtual STDMETHODIMP GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: CFontExt.cpp:412
#define STDMETHODIMP
Definition: basetyps.h:43
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
#define FONT_KEY
Definition: precomp.h:31
unsigned int idx
Definition: utils.c:41
#define IDS_COL_MODIFIED
Definition: resource.h:9
#define E_INVALIDARG
Definition: ddrawi.h:101
static FolderViewColumns g_ColumnDefs[]
Definition: CFontExt.cpp:35
virtual STDMETHODIMP GetDefaultColumnState(UINT iColumn, SHCOLSTATEF *pcsFlags)
Definition: CFontExt.cpp:112
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
Definition: path.c:394
LONG_PTR LPARAM
Definition: windef.h:208
HRESULT _CFontMenu_CreateInstance(HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, REFIID riid, LPVOID *ppvOut)
Definition: CFontMenu.cpp:114
HRESULT DoGetFontTitle(IN LPCWSTR pszFontPath, OUT CStringW &strFontName)
Definition: CFontExt.cpp:665
#define IDS_COL_SIZE
Definition: resource.h:8
virtual STDMETHODIMP ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
Definition: CFontExt.cpp:229
struct _SFV_CREATE SFV_CREATE
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
Definition: path.c:447
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
void SetFontDir(const LPCWSTR Path)
Definition: CFontCache.cpp:120
DWORD dwErr
Definition: service.c:36
WCHAR * g2s(REFCLSID iid)
Definition: CFontExt.cpp:57
virtual STDMETHODIMP BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut)
Definition: CFontExt.cpp:246
#define KEY_WRITE
Definition: nt_native.h:1031
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4899
CFontExt()
Definition: CFontExt.cpp:83
size_t Add(INARGTYPE element)
Definition: atlcoll.h:295
virtual STDMETHODIMP GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut)
Definition: CFontExt.cpp:369
#define FONT_HIVE
Definition: precomp.h:30
#define TRACE(s)
Definition: solgame.cpp:4
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:188
GLsizeiptr size
Definition: glext.h:5919
LONG WINAPI CompareFileTime(IN CONST FILETIME *lpFileTime1, IN CONST FILETIME *lpFileTime2)
Definition: time.c:106
EXTERN_C HRESULT WINAPI SHCreateFileExtractIconW(_In_ LPCWSTR pszFile, _In_ DWORD dwFileAttributes, _In_ REFIID riid, _Outptr_ void **ppv)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:79
BOOL WINAPI CopyFileW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN BOOL bFailIfExists)
Definition: copy.c:439
#define _countof(array)
Definition: sndvol32.h:68
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:82
#define MAX_PATH
Definition: compat.h:34
#define IDS_COL_ATTR
Definition: resource.h:10
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2434
PCXSTR GetString() const
Definition: atlsimpstr.h:361
LONG Open(HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired=KEY_READ|KEY_WRITE)
Definition: atlbase.h:1071
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
#define PathFindFileName
Definition: shlwapi.h:911
unsigned long DWORD
Definition: ntddk_ex.h:95
BOOL WINAPI RemoveFontResourceW(_In_ LPCWSTR)
virtual STDMETHODIMP Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
Definition: CFontExt.cpp:521
#define FILE_ATTRIBUTE_COMPRESSED
Definition: nt_native.h:711
ULONG AddRef()
#define FILE_ATTRIBUTE_ARCHIVE
Definition: nt_native.h:706
#define WM_FONTCHANGE
Definition: winuser.h:1620
#define wcsicmp
Definition: compat.h:15
int ret
virtual STDMETHODIMP DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect)
Definition: CFontExt.cpp:511
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
DWORD SHCOLSTATEF
Definition: shtypes.idl:142
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
virtual STDMETHODIMP GetDefaultSearchGUID(GUID *lpguid)
Definition: CFontExt.cpp:94
#define InterlockedDecrement
Definition: armddk.h:52
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
virtual STDMETHODIMP GetCurFolder(LPITEMIDLIST *ppidl)
Definition: CFontExt.cpp:448
CFontCache * g_FontCache
Definition: CFontCache.cpp:12
WCHAR Name[1]
Definition: fontpidl.hpp:17
static PCUIDLIST_ABSOLUTE HIDA_GetPIDLFolder(CIDA const *pida)
Definition: shellutils.h:549
#define IDS_COL_FILENAME
Definition: resource.h:7
const CStringW & FontPath() const
Definition: CFontCache.hpp:53
void Read()
Definition: CFontCache.cpp:200
unsigned char BYTE
Definition: xxhash.c:193
CComHeapPtr< ITEMIDLIST > m_Folder
Definition: CFontExt.hpp:18
#define SHCNF_PATHW
Definition: shlobj.h:1764
#define ERR(fmt,...)
Definition: debug.h:110
IShellFolder * pshf
Definition: shlobj.h:1283
virtual STDMETHODIMP EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
Definition: CFontExt.cpp:235
#define S_OK
Definition: intsafe.h:52
const ITEMIDLIST_ABSOLUTE UNALIGNED * PCUIDLIST_ABSOLUTE
Definition: shtypes.idl:63
#define InterlockedIncrement
Definition: armddk.h:53
LPCWSTR szPath
Definition: env.c:37
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:228
#define IDS_COL_ATTR_LETTERS
Definition: resource.h:11
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
#define E_NOTIMPL
Definition: ddrawi.h:99
#define SHCNE_UPDATEDIR
Definition: shlobj.h:1741
#define FILE_ATTRIBUTE_HIDDEN
Definition: nt_native.h:703
unsigned int UINT
Definition: ndis.h:50
#define NULL
Definition: types.h:112
virtual STDMETHODIMP CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut)
Definition: CFontExt.cpp:311
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
virtual STDMETHODIMP GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv)
Definition: CFontExt.cpp:121
#define E_UNEXPECTED
Definition: winerror.h:2456
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
Definition: shtypes.idl:57
virtual STDMETHODIMP GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut)
Definition: CFontExt.cpp:340
HRESULT WINAPI SHGetFolderPathW(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath)
Definition: shellpath.c:2348
#define OUT
Definition: typedefs.h:40
CFontInfo * Find(const FontPidlEntry *fontEntry)
Definition: CFontCache.cpp:145
unsigned int ULONG
Definition: retypes.h:1
BOOL LoadString(_In_ UINT nID)
Definition: cstringt.h:591
const GUID CLSID_CFontExt
Definition: fontext.cpp:12
#define UNIMPLEMENTED
Definition: debug.h:115
virtual STDMETHODIMP MapColumnToSCID(UINT iColumn, SHCOLUMNID *pscid)
Definition: CFontExt.cpp:222
HRESULT _CDataObject_CreateInstance(PCIDLIST_ABSOLUTE folder, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, LPVOID *ppvOut)
Definition: CDataObject.cpp:38
CStringW Filename(CFontInfo *info, bool alwaysFullPath=false)
Definition: CFontCache.cpp:164
#define TIME_NOSECONDS
Definition: winnls.h:278
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
BOOL WINAPI GetFontResourceInfoW(LPCWSTR lpFileName, DWORD *pdwBufSize, void *lpBuffer, DWORD dwType)
Definition: File.h:15
virtual STDMETHODIMP SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut)
Definition: CFontExt.cpp:441
virtual STDMETHODIMP GetDefaultColumn(DWORD dwReserved, ULONG *pSort, ULONG *pDisplay)
Definition: CFontExt.cpp:106
WCHAR * LPWSTR
Definition: xmlstorage.h:184
UINT uType
Definition: shtypes.idl:93
#define E_POINTER
Definition: winerror.h:2365
#define __FUNCTION__
Definition: types.h:112
#define HWND_BROADCAST
Definition: winuser.h:1194
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
LPARAM lParam
Definition: combotst.c:139
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
#define REG_SZ
Definition: layer.c:22