Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114/* * 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);}