1 /* 2 * This library is free software; you can redistribute it and/or 3 * modify it under the terms of the GNU Lesser General Public 4 * License as published by the Free Software Foundation; either 5 * version 2.1 of the License, or (at your option) any later version. 6 * 7 * This library is distributed in the hope that it will be useful, 8 * but WITHOUT ANY WARRANTY; without even the implied warranty of 9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 10 * Lesser General Public License for more details. 11 * 12 * You should have received a copy of the GNU Lesser General Public 13 * License along with this library; if not, write to the Free Software 14 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 15 */ 16 17 #ifndef __ENUMIDLIST_H__ 18 #define __ENUMIDLIST_H__ 19 20 struct ENUMLIST 21 { 22 ENUMLIST *pNext; 23 LPITEMIDLIST pidl; 24 }; 25 26 class CEnumIDListBase : 27 public CComObjectRootEx<CComMultiThreadModelNoCS>, 28 public IEnumIDList 29 { 30 protected: 31 ENUMLIST *mpFirst; 32 ENUMLIST *mpLast; 33 ENUMLIST *mpCurrent; 34 public: 35 CEnumIDListBase(); 36 virtual ~CEnumIDListBase(); 37 BOOL AddToEnumList(LPITEMIDLIST pidl); 38 BOOL DeleteList(); 39 BOOL HasItemWithCLSID(LPITEMIDLIST pidl); 40 HRESULT AppendItemsFromEnumerator(IEnumIDList* pEnum); 41 42 template <class T> BOOL HasItemWithCLSIDImpl(LPCITEMIDLIST pidl) 43 { 44 const CLSID * const pClsid = static_cast<T*>(this)->GetPidlClsid((PCUITEMID_CHILD)pidl); 45 for (ENUMLIST *pCur = mpFirst; pClsid && pCur; pCur = pCur->pNext) 46 { 47 const CLSID * const pEnumClsid = static_cast<T*>(this)->GetPidlClsid((PCUITEMID_CHILD)pCur->pidl); 48 if (pEnumClsid && IsEqualCLSID(*pClsid, *pEnumClsid)) 49 return TRUE; 50 } 51 return FALSE; 52 } 53 54 // *** IEnumIDList methods *** 55 STDMETHOD(Next)(ULONG celt, LPITEMIDLIST *rgelt, ULONG *pceltFetched) override; 56 STDMETHOD(Skip)(ULONG celt) override; 57 STDMETHOD(Reset)() override; 58 STDMETHOD(Clone)(IEnumIDList **ppenum) override; 59 60 BEGIN_COM_MAP(CEnumIDListBase) 61 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList) 62 END_COM_MAP() 63 }; 64 65 #endif /* __ENUMIDLIST_H__ */ 66