ReactOS 0.4.17-dev-1190-g4c812f4
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-2026 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
7 */
8
9#include "precomp.h"
10
12
13#ifndef SHCIDS_ALLFIELDS
14#define SHCIDS_ALLFIELDS 0x80000000L
15#endif
16
18{
21 int cxChar;
22 int fmt;
23};
24
26{
32};
33
35{
41};
42
43// Helper functions to translate a guid to a readable name
44bool GetInterfaceName(const WCHAR* InterfaceString, WCHAR* buf, size_t size)
45{
46 WCHAR LocalBuf[100];
47 DWORD dwType = 0, dwDataSize = size * sizeof(WCHAR);
48
49 if (!SUCCEEDED(StringCchPrintfW(LocalBuf, _countof(LocalBuf), L"Interface\\%s", InterfaceString)))
50 return false;
51
52 return RegGetValueW(HKEY_CLASSES_ROOT, LocalBuf, NULL, RRF_RT_REG_SZ, &dwType, buf, &dwDataSize) == ERROR_SUCCESS;
53}
54
56{
57 static WCHAR buf[2][300];
58 static int idx = 0;
59
60 idx ^= 1;
61
62 LPOLESTR tmp;
63 HRESULT hr = ProgIDFromCLSID(iid, &tmp);
64 if (SUCCEEDED(hr))
65 {
66 wcscpy(buf[idx], tmp);
67 CoTaskMemFree(tmp);
68 return buf[idx];
69 }
72 {
73 return buf[idx];
74 }
76
77 return buf[idx];
78}
79
81{
82 PCWSTR AttrLetters = L"RHSAC"; // Read-only, Hidden, System, Archive, Compressed
83
84 UINT ich = 0;
86 pszOut[ich++] = AttrLetters[0];
88 pszOut[ich++] = AttrLetters[1];
90 pszOut[ich++] = AttrLetters[2];
92 pszOut[ich++] = AttrLetters[3];
94 pszOut[ich++] = AttrLetters[4];
95 if (ich < cchMax)
96 {
97 pszOut[ich] = UNICODE_NULL;
98 return S_OK;
99 }
100 ERR("Buffer too short: %u\n", cchMax);
101 return E_FAIL;
102}
103
105{
107}
108
110{
112}
113
115{
116 m_hwndView = hwndView;
117}
118
120{
123 return S_OK; // Override default action
124}
125
127{
130 return S_OK; // Override default action
131}
132
133// *** IShellFolder2 methods ***
135{
136 return E_NOTIMPL;
137}
138
140{
141 *ppenum = NULL;
142 return E_NOTIMPL;
143}
144
146{
147 return E_NOTIMPL; // Not required when column 0 is our default.
148}
149
151{
152 if (!pcsFlags || iColumn >= _countof(g_ColumnDefs))
153 return E_INVALIDARG;
154
155 *pcsFlags = g_ColumnDefs[iColumn].dwDefaultState;
156 return S_OK;
157}
158
160{
161 ERR("%s() UNIMPLEMENTED\n", __FUNCTION__);
162 return E_NOTIMPL;
163}
164
166{
167 if (iColumn >= _countof(g_ColumnDefs))
168 return E_FAIL;
169
170 psd->cxChar = g_ColumnDefs[iColumn].cxChar;
171 psd->fmt = g_ColumnDefs[iColumn].fmt;
172
173 // No item requested, so return the column name
174 if (pidl == NULL)
175 {
176 return SHSetStrRet(&psd->str, _AtlBaseModule.GetResourceInstance(), g_ColumnDefs[iColumn].iResource);
177 }
178
179 // Validate that this pidl is the last one
180 PCUIDLIST_RELATIVE curpidl = ILGetNext(pidl);
181 if (curpidl->mkid.cb != 0)
182 {
183 ERR("ERROR, unhandled PIDL!\n");
184 return E_FAIL;
185 }
186
187 // Name, ReactOS specific?
188 if (iColumn == FONTEXT_COL_NAME)
189 return GetDisplayNameOf(pidl, 0, &psd->str);
190
191 const FontPidlEntry* fontEntry = _FontFromIL(pidl);
192 if (!fontEntry)
193 {
194 ERR("ERROR, not a font PIDL!\n");
195 return E_FAIL;
196 }
197
198 // If we got here, we are in details view!
199 auto info = g_FontCache->Find(fontEntry);
200 if (info == nullptr)
201 {
202 ERR("Unable to query info about %S\n", fontEntry->Name());
204 }
205
206 int ret;
208 switch (iColumn)
209 {
211 return SHSetStrRet(&psd->str, PathFindFileNameW(info->File()));
212 case FONTEXT_COL_SIZE:
213 psd->str.uType = STRRET_CSTR;
214 StrFormatKBSizeA(info->FileSize().QuadPart, psd->str.cStr, MAX_PATH);
215 return S_OK;
217 psd->str.uType = STRRET_CSTR;
218 FileTimeToSystemTime(&info->FileWriteTime(), &time);
220 if (ret < 1)
221 {
222 ERR("GetDateFormatA failed\n");
223 return E_FAIL;
224 }
225 psd->str.cStr[ret-1] = ' ';
227 return S_OK;
228 case FONTEXT_COL_ATTR:
229 {
230 WCHAR szAttr[8];
231 HRESULT hr = FONTEXT_GetAttributeString(info->FileAttributes(), szAttr, _countof(szAttr));
233 return hr;
234 return SHSetStrRet(&psd->str, szAttr);
235 }
236 default:
237 break;
238 }
239
241 return E_NOTIMPL;
242}
243
245{
246 //ERR("%s() UNIMPLEMENTED\n", __FUNCTION__);
247 return E_NOTIMPL;
248}
249
250// *** IShellFolder2 methods ***
251STDMETHODIMP CFontExt::ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
252{
253 if (!lpszDisplayName || !lpszDisplayName[0] || !ppidl)
254 return E_INVALIDARG;
255
256 *ppidl = NULL;
257 if (pchEaten)
258 *pchEaten = 0;
259
260 if (lpszDisplayName[0] == L':' && lpszDisplayName[1] == L':')
261 return E_INVALIDARG;
262
263 if (PathIsRelativeW(lpszDisplayName)) // Not full path?
264 return E_INVALIDARG;
265
266 // Load font cache
267 if (g_FontCache->Size() == 0)
268 g_FontCache->Read();
269
270 for (SIZE_T iFont = 0; iFont < g_FontCache->Size(); ++iFont)
271 {
272 CStringW fileName = g_FontCache->File(iFont);
273 if (fileName.IsEmpty())
274 continue;
275
276 CStringW filePath = g_FontCache->GetFontFilePath(fileName);
277 if (filePath.CompareNoCase(lpszDisplayName) != 0)
278 continue;
279
281 if (fontName.IsEmpty())
282 continue;
283
284 // Create a PIDL
285 *ppidl = _ILCreate(fontName, fileName);
286 if (!*ppidl)
287 return E_OUTOFMEMORY;
288
289 if (pchEaten)
290 *pchEaten = wcslen(lpszDisplayName);
291
292 if (pdwAttributes)
293 *pdwAttributes &= (SFGAO_CANDELETE | SFGAO_HASPROPSHEET | SFGAO_CANCOPY |
294 SFGAO_FILESYSTEM);
295
296 return S_OK;
297 }
298
299 return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); // Not found
300}
301
302STDMETHODIMP CFontExt::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
303{
304 return _CEnumFonts_CreateInstance(this, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
305}
306
308{
309 ERR("%s(riid=%S) UNIMPLEMENTED\n", __FUNCTION__, g2s(riid));
310 return E_NOTIMPL;
311}
312
314{
315 ERR("%s() UNIMPLEMENTED\n", __FUNCTION__);
316 return E_NOTIMPL;
317}
318
320{
321 const FontPidlEntry* fontEntry1 = _FontFromIL(pidl1);
322 const FontPidlEntry* fontEntry2 = _FontFromIL(pidl2);
323 if (!fontEntry1 || !fontEntry2)
324 return E_INVALIDARG;
325
326 int result;
327 DWORD sortMode = lParam & 0xFFFF0000;
328 DWORD column = lParam & 0x0000FFFF;
329 if (sortMode == SHCIDS_ALLFIELDS)
330 {
331 result = StrCmpIW(fontEntry1->Name(), fontEntry2->Name());
332 }
333 else
334 {
335 auto info1 = g_FontCache->Find(fontEntry1);
336 auto info2 = g_FontCache->Find(fontEntry2);
337
338 if (!info1 || !info2)
339 {
340 ERR("Unable to find font %S or %S in cache!\n", fontEntry1->Name(), fontEntry2->Name());
341 return E_INVALIDARG;
342 }
343
344 switch (column)
345 {
346 case 0xffff:
347 /* ROS bug? */
348 case FONTEXT_COL_NAME:
349 result = StrCmpIW(fontEntry1->Name(), fontEntry2->Name());
350 break;
352 result = StrCmpIW(PathFindFileNameW(info1->File()), PathFindFileNameW(info2->File()));
353 break;
354 case FONTEXT_COL_SIZE:
355 {
356 ULONGLONG size1 = info1->FileSize().QuadPart, size2 = info2->FileSize().QuadPart;
357 result = (size1 < size2) ? -1 : ((size1 > size2) ? 1 : 0);
358 }
359 break;
361 result = CompareFileTime(&info1->FileWriteTime(), &info2->FileWriteTime());
362 break;
363 case FONTEXT_COL_ATTR:
364 {
365 HRESULT hr;
366 WCHAR szAttr1[8], szAttr2[8];
367 hr = FONTEXT_GetAttributeString(info1->FileAttributes(), szAttr1, _countof(szAttr1));
369 return hr;
370 hr = FONTEXT_GetAttributeString(info2->FileAttributes(), szAttr2, _countof(szAttr2));
372 return hr;
373 result = _wcsicmp(szAttr1, szAttr2);
374 }
375 break;
376 default:
377 ERR("Unimplemented column %u\n", column);
378 return E_INVALIDARG;
379 }
380 }
381
383}
384
386{
388
389 *ppvOut = NULL;
390
391 if (IsEqualIID(riid, IID_IDropTarget))
392 {
393 *ppvOut = static_cast<IDropTarget *>(this);
394 AddRef();
395 hr = S_OK;
396 }
397 else if (IsEqualIID(riid, IID_IContextMenu))
398 {
399 TRACE("IContextMenu\n");
400 return CFontBackgroundMenu_Create(this, hwndOwner, this, (IContextMenu**)ppvOut);
401 }
402 else if (IsEqualIID(riid, IID_IShellView))
403 {
405 if (SUCCEEDED(hr = ShellObjectCreator(sfviewcb)))
406 {
407 SFV_CREATE create = { sizeof(create), this, NULL, sfviewcb };
409 if (SUCCEEDED(hr))
410 sfviewcb->Initialize(this, (IShellView*)*ppvOut, m_Folder);
411 }
412 }
413
414 return hr;
415}
416
418{
419 if (!rgfInOut || !cidl || !apidl)
420 return E_INVALIDARG;
421
422 if (cidl <= 0)
423 {
424 *rgfInOut = 0;
425 return S_OK;
426 }
427
428 DWORD rgf = (SFGAO_CANDELETE | SFGAO_HASPROPSHEET | SFGAO_CANCOPY | SFGAO_FILESYSTEM);
429 while (cidl > 0 && *apidl)
430 {
431 const FontPidlEntry* fontEntry = _FontFromIL(*apidl);
432 if (!fontEntry)
433 {
434 rgf = 0;
435 break;
436 }
437
438 apidl++;
439 cidl--;
440 }
441
442 *rgfInOut &= rgf;
443 *rgfInOut &= ~SFGAO_VALIDATE; // Make sure SFGAO_VALIDATE is cleared, some apps depend on that
444
445 return S_OK;
446}
447
449 IShellFolder *psf, HWND hwnd, IDataObject *pdtobj,
451{
452 CFontExt* pThis = static_cast<CFontExt*>(psf);
453 if (!pThis)
454 return E_FAIL;
455
456 switch (uMsg)
457 {
459 {
460 QCMINFO* pqcminfo = (QCMINFO*)lParam;
461 // Insert [Preview] menu item
464 pqcminfo->idCmdFirst++, strPreview); // Command 0
465 // Make it default
466 ::SetMenuDefaultItem(pqcminfo->hmenu, pqcminfo->idCmdFirst - 1, FALSE);
467 return S_OK;
468 }
469 case DFM_GETVERBA:
470 case DFM_GETVERBW:
471 {
472 // Replace default "open" command action
473 UINT idCmd = LOWORD(wParam), cchMax = HIWORD(wParam);
474 if (idCmd == 0)
475 {
476 if (uMsg == DFM_GETVERBA)
477 lstrcpynA((PSTR)lParam, "open", cchMax);
478 else
479 lstrcpynW((PWSTR)lParam, L"open", cchMax);
480 return S_OK;
481 }
482 break;
483 }
485 return E_NOTIMPL;
487 {
488 if (wParam == 0)
489 return pThis->PreviewItems(pdtobj);
490 if (wParam == DFM_CMD_COPY)
491 return S_FALSE;
492 if (wParam == DFM_CMD_DELETE)
493 return pThis->DeleteItems(pdtobj);
494 if (wParam == DFM_CMD_PASTE)
495 return S_FALSE;
497 return S_FALSE;
498 if (wParam == DFM_CMD_MOVE)
499 {
500 ERR("DFM_CMD_MOVE not supported\n");
501 return E_NOTIMPL;
502 }
503 ERR("wParam: %p\n", wParam);
504 return E_FAIL;
505 }
506 case DFM_GETDEFSTATICID: // Required for Windows 7 to pick a default
507 return S_FALSE;
509 {
510 HMENU hMenu = (HMENU)wParam;
511 // Delete default [Open] menu item
513 // Disable [Paste link] menu item
515 break;
516 }
517 }
518 return E_NOTIMPL;
519}
520
522{
523 if (riid == IID_IContextMenu ||
524 riid == IID_IContextMenu2 ||
525 riid == IID_IContextMenu3)
526 {
527 if (cidl <= 0)
528 return E_FAIL;
529
530 return CDefFolderMenu_Create2(NULL, hwndOwner, cidl, apidl, this, MenuCallback,
531 0, NULL, (IContextMenu**)ppvOut);
532 }
533 else if (riid == IID_IExtractIconA || riid == IID_IExtractIconW)
534 {
535 if (cidl == 1)
536 {
537 const FontPidlEntry* fontEntry = _FontFromIL(*apidl);
538 if (fontEntry)
539 {
541 CStringW strFileName = g_FontCache->GetFontFilePath(fontEntry->FileName());
542 return SHCreateFileExtractIconW(strFileName, dwAttributes, riid, ppvOut);
543 }
544 }
545 else
546 {
547 ERR("IID_IExtractIcon with cidl != 1 UNIMPLEMENTED\n");
548 }
549 }
550 else if (riid == IID_IDataObject)
551 {
552 if (cidl >= 1)
553 {
554 return _CDataObject_CreateInstance(m_Folder, cidl, apidl, riid, ppvOut);
555 }
556 else
557 {
558 CComPtr<IDataObject> pDataObj;
559 HRESULT hr = OleGetClipboard(&pDataObj);
561 return E_FAIL;
562 *ppvOut = pDataObj.Detach();
563 return S_OK;
564 }
565 }
566 else if (riid == IID_IDropTarget)
567 {
568 *ppvOut = static_cast<IDropTarget*>(this);
569 AddRef();
570 return S_OK;
571 }
572
573 //ERR("%s(riid=%S) UNIMPLEMENTED\n", __FUNCTION__, g2s(riid));
574 return E_NOTIMPL;
575}
576
578{
579 if (!pidl || !strRet)
580 return E_INVALIDARG;
581
582 // Validate that this pidl is the last one
583 PCUIDLIST_RELATIVE nextPidl = ILGetNext(pidl);
584 if (nextPidl && nextPidl->mkid.cb != 0)
585 {
586 ERR("ERROR, unhandled PIDL!\n");
587 return E_FAIL;
588 }
589
590 const FontPidlEntry* fontEntry = _FontFromIL(pidl);
591 if (!fontEntry)
592 return E_FAIL;
593
595 {
596 CStringW fileName = fontEntry->FileName();
597 if (!(dwFlags & SHGDN_INFOLDER))
598 {
599 CStringW fullPath = g_FontCache->GetFontFilePath(fileName);
600 if (!fullPath.IsEmpty())
601 return SHSetStrRet(strRet, fullPath);
602 }
603 return SHSetStrRet(strRet, fileName);
604 }
605
606 return SHSetStrRet(strRet, fontEntry->Name());
607}
608
610{
611 ERR("%s() UNIMPLEMENTED\n", __FUNCTION__);
612 return E_NOTIMPL;
613}
614
615// *** IPersistFolder2 methods ***
617{
618 if (ppidl && m_Folder)
619 {
620 *ppidl = ILClone(m_Folder);
621 return S_OK;
622 }
623
624 return E_POINTER;
625}
626
627// *** IPersistFolder methods ***
629{
630 WCHAR PidlPath[MAX_PATH + 1] = {0}, FontsDir[MAX_PATH + 1];
631 if (!SHGetPathFromIDListW(pidl, PidlPath))
632 {
633 ERR("Unable to extract path from pidl\n");
634 return E_FAIL;
635 }
636
639 {
640 ERR("Unable to get fonts path (0x%x)\n", hr);
641 return hr;
642 }
643
644 if (StrCmpIW(PidlPath, FontsDir))
645 {
646 ERR("CFontExt View initializing on unexpected folder: '%S'\n", PidlPath);
647 return E_FAIL;
648 }
649
650 m_Folder.Attach(ILCreateFromPathW(FontsDir));
651 StringCchCatW(FontsDir, _countof(FontsDir), L"\\");
652 g_FontCache->SetFontDir(FontsDir);
653
654 return S_OK;
655}
656
657// *** IPersist methods ***
659{
660 *lpClassId = CLSID_CFontExt;
661 return S_OK;
662}
663
664// *** IDropTarget methods ***
665STDMETHODIMP CFontExt::DragEnter(IDataObject* pDataObj, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect)
666{
668 if (!m_bDragAccepted)
669 {
670 *pdwEffect = DROPEFFECT_NONE;
671 return E_FAIL;
672 }
673
674 *pdwEffect &= DROPEFFECT_COPY;
675 return S_OK;
676}
677
679{
680 if (!m_bDragAccepted)
681 {
682 *pdwEffect = DROPEFFECT_NONE;
683 return E_FAIL;
684 }
685 *pdwEffect &= DROPEFFECT_COPY;
686 return S_OK;
687}
688
690{
691 return S_OK;
692}
693
694STDMETHODIMP CFontExt::Drop(IDataObject* pDataObj, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect)
695{
698
700 title.LoadStringW(IDS_REACTOS_FONTS_FOLDER);
702 {
703 // Show error message
704 text.LoadStringW(IDS_INSTALL_FAILED);
706 }
707 else if (hr == S_OK)
708 {
709 // Refresh font cache and notify the system about the font change
710 if (g_FontCache)
711 g_FontCache->Read();
712
715
716 // Show successful message
717 text.LoadStringW(IDS_INSTALL_OK);
719 }
720
721 return hr;
722}
LONG g_ModuleRefCnt
Definition: ACPPage.cpp:13
#define ATLASSERT(x)
Definition: CComVariant.cpp:10
HRESULT _CDataObject_CreateInstance(PCIDLIST_ABSOLUTE folder, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, LPVOID *ppvOut)
Definition: CDataObject.cpp:36
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:4806
HRESULT WINAPI CDefFolderMenu_Create2(PCIDLIST_ABSOLUTE pidlFolder, HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, LPFNDFMCALLBACK lpfn, UINT nKeys, const HKEY *ahkeyClsKeys, IContextMenu **ppcm)
HRESULT _CEnumFonts_CreateInstance(CFontExt *zip, DWORD flags, REFIID riid, LPVOID *ppvOut)
Definition: CEnumFonts.cpp:110
EXTERN_C HRESULT WINAPI SHCreateFileExtractIconW(_In_ LPCWSTR pszFile, _In_ DWORD dwFileAttributes, _In_ REFIID riid, _Outptr_ void **ppv)
HRESULT APIENTRY CFontBackgroundMenu_Create(CFontExt *pFontExt, HWND hwnd, IShellFolder *psf, IContextMenu **ppcm)
CFontCache * g_FontCache
Definition: CFontCache.cpp:12
bool GetInterfaceName(const WCHAR *InterfaceString, WCHAR *buf, size_t size)
Definition: CFontExt.cpp:44
static FolderViewColumns g_ColumnDefs[]
Definition: CFontExt.cpp:34
#define SHCIDS_ALLFIELDS
Definition: CFontExt.cpp:14
font_columns
Definition: CFontExt.cpp:26
@ FONTEXT_COL_NAME
Definition: CFontExt.cpp:27
@ FONTEXT_COL_SIZE
Definition: CFontExt.cpp:29
@ FONTEXT_COL_FILENAME
Definition: CFontExt.cpp:28
@ FONTEXT_COL_MODIFIED
Definition: CFontExt.cpp:30
@ FONTEXT_COL_ATTR
Definition: CFontExt.cpp:31
static HRESULT FONTEXT_GetAttributeString(DWORD dwAttributes, LPWSTR pszOut, UINT cchMax)
Definition: CFontExt.cpp:80
WCHAR * g2s(REFCLSID iid)
Definition: CFontExt.cpp:55
#define IID_PPV_ARG(Itype, ppType)
UINT cchMax
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ERR(fmt,...)
Definition: precomp.h:57
#define STDMETHODIMP
Definition: basetyps.h:43
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
T * Detach()
Definition: atlcomcli.h:186
bool IsEmpty() const noexcept
Definition: atlsimpstr.h:394
int CompareNoCase(_In_z_ PCXSTR psz) const
Definition: cstringt.h:743
CStringW File(size_t Index)
Definition: CFontCache.cpp:146
CStringW GetFontFilePath(const PCWSTR Path) const
Definition: CFontCache.cpp:236
CFontInfo * Find(const FontPidlEntry *fontEntry)
Definition: CFontCache.cpp:157
CStringW Name(size_t Index)
Definition: CFontCache.cpp:135
void Read()
Definition: CFontCache.cpp:243
size_t Size()
Definition: CFontCache.cpp:127
void SetFontDir(const LPCWSTR Path)
Definition: CFontCache.cpp:121
STDMETHODIMP GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override
Definition: CFontExt.cpp:521
STDMETHODIMP GetDefaultColumn(DWORD dwReserved, ULONG *pSort, ULONG *pDisplay) override
Definition: CFontExt.cpp:145
STDMETHODIMP DragEnter(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
Definition: CFontExt.cpp:665
STDMETHODIMP GetDefaultColumnState(UINT iColumn, SHCOLSTATEF *pcsFlags) override
Definition: CFontExt.cpp:150
STDMETHODIMP GetCurFolder(LPITEMIDLIST *ppidl) override
Definition: CFontExt.cpp:616
STDMETHODIMP GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override
Definition: CFontExt.cpp:159
HRESULT DeleteItems(IDataObject *pDataObj)
Definition: CFontExt.cpp:119
STDMETHODIMP GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
Definition: CFontExt.cpp:165
STDMETHODIMP DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
Definition: CFontExt.cpp:678
STDMETHODIMP EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
Definition: CFontExt.cpp:302
STDMETHODIMP GetDefaultSearchGUID(GUID *lpguid) override
Definition: CFontExt.cpp:134
CComHeapPtr< ITEMIDLIST > m_Folder
Definition: CFontExt.hpp:18
STDMETHODIMP MapColumnToSCID(UINT iColumn, SHCOLUMNID *pscid) override
Definition: CFontExt.cpp:244
STDMETHODIMP SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
Definition: CFontExt.cpp:609
BOOL m_bDragAccepted
Definition: CFontExt.hpp:19
STDMETHODIMP CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override
Definition: CFontExt.cpp:385
STDMETHODIMP GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
Definition: CFontExt.cpp:577
static HRESULT CALLBACK MenuCallback(IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CFontExt.cpp:448
STDMETHODIMP BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CFontExt.cpp:307
HWND m_hwndView
Definition: CFontExt.hpp:20
STDMETHODIMP EnumSearches(IEnumExtraSearch **ppenum) override
Definition: CFontExt.cpp:139
HRESULT PreviewItems(IDataObject *pDataObj)
Definition: CFontExt.cpp:126
STDMETHODIMP GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
Definition: CFontExt.cpp:417
STDMETHODIMP ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes) override
Definition: CFontExt.cpp:251
STDMETHODIMP GetClassID(CLSID *lpClassId) override
Definition: CFontExt.cpp:658
STDMETHODIMP Drop(IDataObject *pDataObj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect) override
Definition: CFontExt.cpp:694
STDMETHODIMP Initialize(LPCITEMIDLIST pidl) override
Definition: CFontExt.cpp:628
STDMETHODIMP BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CFontExt.cpp:313
void SetViewWindow(HWND hwndView)
Definition: CFontExt.cpp:114
STDMETHODIMP DragLeave() override
Definition: CFontExt.cpp:689
STDMETHODIMP CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
Definition: CFontExt.cpp:319
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
HRESULT hr
Definition: delayimp.cpp:582
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
unsigned int idx
Definition: utils.c:40
#define IDS_COL_NAME
Definition: resource.h:17
#define IDS_COL_SIZE
Definition: resource.h:18
#define IDS_FONT_PREVIEW
Definition: resource.h:20
#define IDS_INSTALL_FAILED
Definition: resource.h:9
#define IDS_COL_ATTR
Definition: resource.h:18
#define IDS_COL_FILENAME
Definition: resource.h:15
#define IDS_INSTALL_OK
Definition: resource.h:8
#define IDS_REACTOS_FONTS_FOLDER
Definition: resource.h:7
#define IDS_COL_MODIFIED
Definition: resource.h:17
#define DFM_GETDEFSTATICID
Definition: precomp.h:47
#define DFM_INVOKECOMMANDEX
Definition: precomp.h:46
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
LSTATUS WINAPI RegGetValueW(HKEY hKey, LPCWSTR pszSubKey, LPCWSTR pszValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData)
Definition: reg.c:1931
HRESULT WINAPI DECLSPEC_HOTPATCH ProgIDFromCLSID(REFCLSID clsid, LPOLESTR *progid)
Definition: combase.c:1262
INT WINAPI StringFromGUID2(REFGUID guid, LPOLESTR str, INT cmax)
Definition: combase.c:1525
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
#define lstrcpynA
Definition: compat.h:751
#define MAX_PATH
Definition: compat.h:34
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define CALLBACK
Definition: compat.h:35
#define lstrcpynW
Definition: compat.h:738
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:183
LONG WINAPI CompareFileTime(IN CONST FILETIME *lpFileTime1, IN CONST FILETIME *lpFileTime2)
Definition: time.c:106
WCHAR *WINAPI PathFindFileNameW(const WCHAR *path)
Definition: path.c:1677
BOOL WINAPI PathIsRelativeW(const WCHAR *path)
Definition: path.c:1006
int WINAPI StrCmpIW(const WCHAR *str, const WCHAR *comp)
Definition: string.c:464
const WCHAR * text
Definition: package.c:1826
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:164
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
HRESULT WINAPI OleGetClipboard(IDataObject **obj)
Definition: clipboard.c:2246
HRESULT WINAPI SHGetFolderPathW(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwFlags, LPWSTR pszPath)
Definition: shellpath.c:3816
LPSTR WINAPI StrFormatKBSizeA(LONGLONG llBytes, LPSTR lpszDest, UINT cchMax)
Definition: string.c:459
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
#define pt(x, y)
Definition: drawing.c:79
return ret
Definition: mutex.c:147
#define L(x)
Definition: resources.c:13
#define __FUNCTION__
Definition: types.h:116
unsigned long DWORD
Definition: ntddk_ex.h:95
HRESULT DoPreviewFontFiles(HWND hwnd, IDataObject *pDataObj)
Definition: fontext.cpp:439
const GUID CLSID_CFontExt
Definition: fontext.cpp:13
HRESULT InstallFontsFromDataObject(HWND hwndView, IDataObject *pDataObj)
Definition: fontext.cpp:390
BOOL CheckDataObject(IDataObject *pDataObj)
Definition: fontext.cpp:308
HRESULT DoDeleteFontFiles(HWND hwnd, IDataObject *pDataObj)
Definition: fontext.cpp:526
const FontPidlEntry * _FontFromIL(PCITEMID_CHILD pidl)
Definition: fontpidl.cpp:80
PITEMID_CHILD _ILCreate(LPCWSTR lpName, LPCWSTR lpFileName)
Definition: fontpidl.cpp:16
GLsizeiptr size
Definition: glext.h:5919
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint64EXT * result
Definition: glext.h:11304
GLenum const GLvoid * fontName
Definition: glext.h:11715
unsigned int UINT
Definition: sysinfo.c:13
REFIID riid
Definition: atlbase.h:39
const DWORD DROPEFFECT_NONE
Definition: oleidl.idl:929
const DWORD DROPEFFECT_COPY
Definition: oleidl.idl:930
ULONG AddRef()
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
INT WINAPI GetTimeFormatA(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCSTR lpFormat, LPSTR lpTimeStr, INT cchOut)
Definition: lcformat.c:1052
INT WINAPI GetDateFormatA(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCSTR lpFormat, LPSTR lpDateStr, INT cchOut)
Definition: lcformat.c:944
LONG_PTR LPARAM
Definition: minwindef.h:175
UINT_PTR WPARAM
Definition: minwindef.h:174
__u16 time
Definition: mkdosfs.c:8
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static const struct access_res create[16]
Definition: package.c:7546
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
#define FILE_ATTRIBUTE_COMPRESSED
Definition: nt_native.h:711
#define FILE_ATTRIBUTE_HIDDEN
Definition: nt_native.h:703
#define FILE_ATTRIBUTE_SYSTEM
Definition: nt_native.h:704
#define FILE_ATTRIBUTE_ARCHIVE
Definition: nt_native.h:706
#define LOCALE_USER_DEFAULT
#define UNICODE_NULL
interface IBindCtx * LPBC
Definition: objfwd.h:18
const GUID IID_IDataObject
#define LOWORD(l)
Definition: pedump.c:82
short WCHAR
Definition: pedump.c:58
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1496
LPITEMIDLIST WINAPI ILGetNext(LPCITEMIDLIST pidl)
Definition: pidl.c:977
LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR path)
Definition: pidl.c:1108
static char title[]
Definition: ps.c:92
#define LVCFMT_LEFT
Definition: commctrl.h:2603
#define LVCFMT_RIGHT
Definition: commctrl.h:2604
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define REFCLSID
Definition: guiddef.h:117
#define MF_BYCOMMAND
Definition: winuser.h:202
BOOL WINAPI SetMenuDefaultItem(_In_ HMENU, _In_ UINT, _In_ UINT)
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI InsertMenuW(_In_ HMENU, _In_ UINT, _In_ UINT, _In_ UINT_PTR, _In_opt_ LPCWSTR)
#define HWND_BROADCAST
Definition: winuser.h:1215
#define MF_STRING
Definition: winuser.h:138
BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
int WINAPI MessageBoxW(_In_opt_ HWND hWnd, _In_opt_ LPCWSTR lpText, _In_opt_ LPCWSTR lpCaption, _In_ UINT uType)
#define MB_ICONERROR
Definition: winuser.h:798
#define WM_SETTINGCHANGE
Definition: winuser.h:1657
#define MF_BYPOSITION
Definition: winuser.h:203
#define MB_ICONINFORMATION
Definition: winuser.h:813
#define WM_FONTCHANGE
Definition: winuser.h:1661
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
BOOL WINAPI EnableMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT)
#define MF_GRAYED
Definition: winuser.h:129
wcscpy
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:740
#define DFM_GETVERBW
Definition: shlobj.h:2649
#define DFM_CMD_DELETE
Definition: shlobj.h:2655
#define DFM_WM_INITMENUPOPUP
Definition: shlobj.h:2644
#define CSIDL_FONTS
Definition: shlobj.h:2239
#define DFM_CMD_COPY
Definition: shlobj.h:2657
#define DFM_GETVERBA
Definition: shlobj.h:2650
#define DFM_CMD_PASTE
Definition: shlobj.h:2661
#define DFM_CMD_MOVE
Definition: shlobj.h:2656
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2659
#define FCIDM_SHVIEW_OPEN
Definition: shresdef.h:894
#define FCIDM_SHVIEW_INSERTLINK
Definition: shresdef.h:873
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
@ STRRET_CSTR
Definition: shtypes.idl:87
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
@ SHCOLSTATE_TYPE_DATE
Definition: shtypes.idl:123
@ SHCOLSTATE_TYPE_STR
Definition: shtypes.idl:121
@ SHCOLSTATE_ONBYDEFAULT
Definition: shtypes.idl:125
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
Definition: shtypes.idl:57
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
DWORD SHCOLSTATEF
Definition: shtypes.idl:142
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
DWORD dwDefaultState
Definition: CFontExt.cpp:20
LPWSTR Name()
Definition: fontpidl.hpp:18
LPWSTR FileName()
Definition: fontpidl.hpp:19
STRRET str
Definition: shtypes.idl:108
HMENU hmenu
Definition: shlobj.h:1435
UINT idCmdFirst
Definition: shlobj.h:1437
char cStr[MAX_PATH]
Definition: shtypes.idl:98
UINT uType
Definition: shtypes.idl:93
uint16_t * PWSTR
Definition: typedefs.h:56
char * PSTR
Definition: typedefs.h:51
const uint16_t * PCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
ULONG_PTR SIZE_T
Definition: typedefs.h:80
uint64_t ULONGLONG
Definition: typedefs.h:67
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
DWORD dwAttributes
Definition: vdmdbg.h:34
_In_ LPCSTR lpName
Definition: winbase.h:2519
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define S_FALSE
Definition: winerror.h:3451
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define E_NOINTERFACE
Definition: winerror.h:3479
#define E_POINTER
Definition: winerror.h:3480
#define TIME_NOSECONDS
Definition: winnls.h:306
#define DATE_SHORTDATE
Definition: winnls.h:216
#define RRF_RT_REG_SZ
Definition: winreg.h:58
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10