/* * 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 */ #include "precomp.h" WINE_DEFAULT_DEBUG_CHANNEL(fontext); class CEnumFonts : public CComObjectRootEx, 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(zip, flags, riid, ppvOut); }