1 /* 2 * PROJECT: ReactOS Zip Shell Extension 3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) 4 * PURPOSE: CEnumZipContents 5 * COPYRIGHT: Copyright 2017 Mark Jansen (mark.jansen@reactos.org) 6 * Copyright 2023 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com) 7 */ 8 9 #include "precomp.h" 10 11 class CEnumZipContents : 12 public CComObjectRootEx<CComMultiThreadModelNoCS>, 13 public IEnumIDList 14 { 15 private: 16 CZipEnumerator mEnumerator; 17 DWORD dwFlags; 18 CStringW m_Prefix; 19 public: 20 CEnumZipContents() 21 :dwFlags(0) 22 { 23 } 24 25 STDMETHODIMP Initialize(IZip* zip, DWORD flags, PCWSTR prefix) 26 { 27 dwFlags = flags; 28 m_Prefix = prefix; 29 if (mEnumerator.initialize(zip)) 30 return S_OK; 31 return E_FAIL; 32 } 33 34 // *** IEnumIDList methods *** 35 STDMETHODIMP Next(ULONG celt, LPITEMIDLIST *rgelt, ULONG *pceltFetched) 36 { 37 if (!pceltFetched || !rgelt) 38 return E_POINTER; 39 40 *pceltFetched = 0; 41 42 if (celt != 1) 43 return E_FAIL; 44 45 CStringW name; 46 bool dir; 47 unz_file_info64 info; 48 if (mEnumerator.next_unique(m_Prefix, name, dir, info)) 49 { 50 *pceltFetched = 1; 51 *rgelt = _ILCreate(dir ? ZIP_PIDL_DIRECTORY : ZIP_PIDL_FILE, name, info); 52 return S_OK; 53 } 54 55 return S_FALSE; 56 } 57 STDMETHODIMP Skip(ULONG celt) 58 { 59 CStringW name; 60 bool dir; 61 unz_file_info64 info; 62 while (celt--) 63 { 64 if (!mEnumerator.next_unique(m_Prefix, name, dir, info)) 65 return E_FAIL; 66 ; 67 } 68 return S_OK; 69 } 70 STDMETHODIMP Reset() 71 { 72 if (mEnumerator.reset()) 73 return S_OK; 74 return E_FAIL; 75 } 76 STDMETHODIMP Clone(IEnumIDList **ppenum) 77 { 78 return E_NOTIMPL; 79 } 80 81 82 public: 83 DECLARE_NOT_AGGREGATABLE(CEnumZipContents) 84 DECLARE_PROTECT_FINAL_CONSTRUCT() 85 86 BEGIN_COM_MAP(CEnumZipContents) 87 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList) 88 END_COM_MAP() 89 }; 90 91 92 HRESULT _CEnumZipContents_CreateInstance(IZip* zip, DWORD flags, PCWSTR prefix, REFIID riid, LPVOID * ppvOut) 93 { 94 return ShellObjectCreatorInit<CEnumZipContents>(zip, flags, prefix, riid, ppvOut); 95 } 96 97