[ZIPFLDR] Allow the shell extension to extract passworded zip files
[reactos.git] / dll / shellext / zipfldr / CEnumZipContents.cpp
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 */
7
8 #include "precomp.h"
9
10 class CEnumZipContents :
11 public CComObjectRootEx<CComMultiThreadModelNoCS>,
12 public IEnumIDList
13 {
14 private:
15 CZipEnumerator mEnumerator;
16 DWORD dwFlags;
17 CStringA m_Prefix;
18 public:
19 CEnumZipContents()
20 :dwFlags(0)
21 {
22 }
23
24 STDMETHODIMP Initialize(IZip* zip, DWORD flags, const char* prefix)
25 {
26 dwFlags = flags;
27 m_Prefix = prefix;
28 if (mEnumerator.initialize(zip))
29 return S_OK;
30 return E_FAIL;
31 }
32
33 // *** IEnumIDList methods ***
34 STDMETHODIMP Next(ULONG celt, LPITEMIDLIST *rgelt, ULONG *pceltFetched)
35 {
36 if (!pceltFetched || !rgelt)
37 return E_POINTER;
38
39 *pceltFetched = 0;
40
41 if (celt != 1)
42 return E_FAIL;
43
44 CStringA name;
45 bool dir;
46 unz_file_info64 info;
47 if (mEnumerator.next_unique(m_Prefix, name, dir, info))
48 {
49 *pceltFetched = 1;
50 *rgelt = _ILCreate(dir ? ZIP_PIDL_DIRECTORY : ZIP_PIDL_FILE, name, info);
51 return S_OK;
52 }
53
54 return S_FALSE;
55 }
56 STDMETHODIMP Skip(ULONG celt)
57 {
58 CStringA name;
59 bool dir;
60 unz_file_info64 info;
61 while (celt--)
62 {
63 if (!mEnumerator.next_unique(m_Prefix, name, dir, info))
64 return E_FAIL;
65 ;
66 }
67 return S_OK;
68 }
69 STDMETHODIMP Reset()
70 {
71 if (mEnumerator.reset())
72 return S_OK;
73 return E_FAIL;
74 }
75 STDMETHODIMP Clone(IEnumIDList **ppenum)
76 {
77 return E_NOTIMPL;
78 }
79
80
81 public:
82 DECLARE_NOT_AGGREGATABLE(CEnumZipContents)
83 DECLARE_PROTECT_FINAL_CONSTRUCT()
84
85 BEGIN_COM_MAP(CEnumZipContents)
86 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
87 END_COM_MAP()
88 };
89
90
91 HRESULT _CEnumZipContents_CreateInstance(IZip* zip, DWORD flags, const char* prefix, REFIID riid, LPVOID * ppvOut)
92 {
93 return ShellObjectCreatorInit<CEnumZipContents>(zip, flags, prefix, riid, ppvOut);
94 }
95