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