Files
reactos/dll/shellext/fontext/CEnumFonts.cpp
Katayama Hirofumi MZ 6af07a31b0 [FONTEXT][SHELL32][SDK] Support delete operation (#8639)
Improve usability of Fonts folder.
JIRA issue: CORE-17311
- Modify PIDL design to contain
  name and filename.
- Implement CFontExt::
  ParseDisplayName to parsing
  name as PIDL.
- Modify CDefaultContextMenu::
  GetCommandString and
  CDefaultContextMenu::
  DoCopyOrCut for DFM_GETVERBA,
  DFM_GETVERBW, DFM_CMD_COPY,
  and DFM_CMD_MOVE.
- Add IDS_CONFIRM_DELETE_FONT,
  IDS_CANTDELETEFONT, and
  IDS_PROPERTIES resource strings.
- Add SHMultiFileProperties
  prototype to <shlobj.h>.
2026-02-13 18:37:06 +09:00

114 lines
2.8 KiB
C++

/*
* PROJECT: ReactOS Font Shell Extension
* LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
* PURPOSE: CEnumFonts implementation
* COPYRIGHT: Copyright 2019 Mark Jansen <mark.jansen@reactos.org>
*/
#include "precomp.h"
WINE_DEFAULT_DEBUG_CHANNEL(fontext);
class CEnumFonts :
public CComObjectRootEx<CComMultiThreadModelNoCS>,
public IEnumIDList
{
private:
DWORD m_dwFlags;
ULONG m_Index;
public:
CEnumFonts()
: m_dwFlags(0)
, m_Index(0)
{
}
HRESULT Initialize(CFontExt* folder, DWORD flags)
{
m_dwFlags = flags;
m_Index = 0;
return S_OK;
}
// *** IEnumIDList methods ***
STDMETHODIMP Next(ULONG celt, LPITEMIDLIST *rgelt, ULONG *pceltFetched) override
{
if (!rgelt || (!pceltFetched && celt != 1))
return E_POINTER;
HRESULT hr = S_OK;
ULONG Fetched = 0;
while (celt)
{
if (m_Index >= g_FontCache->Size())
{
hr = S_FALSE;
break;
}
if (!g_FontCache->IsMarkDeleted(m_Index))
{
CStringW Name = g_FontCache->Name(m_Index), FileName = g_FontCache->File(m_Index);
if (Name.IsEmpty() || FileName.IsEmpty())
{
ERR("Why is Name or FileName empty?\n");
}
else
{
// Create a PIDL
PITEMID_CHILD item = _ILCreate(Name, FileName);
if (!item)
{
hr = Fetched ? S_FALSE : E_OUTOFMEMORY;
break;
}
rgelt[Fetched++] = item;
--celt;
}
}
m_Index++;
}
if (pceltFetched)
*pceltFetched = Fetched;
return hr;
}
STDMETHODIMP Skip(ULONG celt) override
{
for (ULONG i = 0; i < celt && m_Index < g_FontCache->Size(); ++i)
{
while (m_Index < g_FontCache->Size() && g_FontCache->IsMarkDeleted(m_Index))
++m_Index;
++m_Index;
}
return S_OK;
}
STDMETHODIMP Reset() override
{
m_Index = 0;
return S_OK;
}
STDMETHODIMP Clone(IEnumIDList **ppenum) override
{
return E_NOTIMPL;
}
public:
DECLARE_NOT_AGGREGATABLE(CEnumFonts)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CEnumFonts)
COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
END_COM_MAP()
};
HRESULT _CEnumFonts_CreateInstance(CFontExt* zip, DWORD flags, REFIID riid, LPVOID * ppvOut)
{
return ShellObjectCreatorInit<CEnumFonts>(zip, flags, riid, ppvOut);
}