ReactOS 0.4.17-dev-470-gf9e3448
CEnumZipContents.cpp
Go to the documentation of this file.
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
11static inline bool IncludeInEnumIDList(SHCONTF contf, SFGAOF att) // Borrowed from cabview
12{
13 const SHCONTF both = SHCONTF_FOLDERS | SHCONTF_NONFOLDERS;
14 const SFGAOF superbits = SFGAO_HIDDEN | SFGAO_READONLY | SFGAO_SYSTEM;
15 const bool isfile = (att & (SFGAO_STREAM | SFGAO_FOLDER)) != SFGAO_FOLDER;
16 if ((contf & both) != both && !(contf & SHCONTF_STORAGE))
17 {
18 if (isfile && (contf & SHCONTF_FOLDERS))
19 return false;
20 if ((att & SFGAO_FOLDER) && (contf & SHCONTF_NONFOLDERS))
21 return false;
22 }
23 if ((att & SFGAO_HIDDEN) && !(contf & (SHCONTF_INCLUDEHIDDEN | SHCONTF_STORAGE)))
24 return false;
25 if ((att & superbits) > SFGAO_HIDDEN && !(contf & (SHCONTF_INCLUDESUPERHIDDEN | SHCONTF_STORAGE)))
26 return false;
27 return true;
28}
29
30static inline bool IncludeInEnumIDList(SHCONTF contf, bool dir, unz_file_info64 &zfi)
31{
32 SFGAOF att = dir ? SFGAO_FOLDER : SFGAO_STREAM;
33 // TODO: SFGAO_HIDDEN,READONLY,SYSTEM from zfi.external_fa? (Use MapFSToSFAttributes)
34 return IncludeInEnumIDList(contf, att);
35}
36
38 public CComObjectRootEx<CComMultiThreadModelNoCS>,
39 public IEnumIDList
40{
41private:
45public:
47 :dwFlags(0)
48 {
49 }
50
52 {
53 dwFlags = flags;
55 if (mEnumerator.Initialize(zip))
56 return S_OK;
57 return E_FAIL;
58 }
59
60 // *** IEnumIDList methods ***
61 STDMETHODIMP Next(ULONG celt, LPITEMIDLIST *rgelt, ULONG *pceltFetched)
62 {
63 if (!rgelt || (!pceltFetched && celt != 1))
64 return E_POINTER;
65
66 HRESULT hr = S_OK;
67 ULONG fetched = 0;
70 bool dir;
72
73 while (fetched < celt)
74 {
76 {
78 continue;
79
81 if (!item)
82 {
83 hr = fetched ? S_FALSE : E_OUTOFMEMORY;
84 break;
85 }
86 rgelt[fetched++] = item;
87 }
88 else
89 {
90 hr = S_FALSE;
91 break;
92 }
93 }
94
95 if (pceltFetched)
96 *pceltFetched = fetched;
97 return hr;
98 }
100 {
102 bool dir;
104 while (celt--)
105 {
107 return E_FAIL;
108 ;
109 }
110 return S_OK;
111 }
113 {
114 if (mEnumerator.Reset())
115 return S_OK;
116 return E_FAIL;
117 }
119 {
120 return E_NOTIMPL;
121 }
122
123
124public:
127
129 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
131};
132
133
135{
136 return ShellObjectCreatorInit<CEnumZipContents>(zip, flags, prefix, riid, ppvOut);
137}
138
HRESULT _CEnumZipContents_CreateInstance(IZip *zip, DWORD flags, PCWSTR prefix, REFIID riid, LPVOID *ppvOut)
static bool IncludeInEnumIDList(SHCONTF contf, SFGAOF att)
unsigned int dir
Definition: maze.c:112
#define STDMETHODIMP
Definition: basetyps.h:43
STDMETHODIMP Next(ULONG celt, LPITEMIDLIST *rgelt, ULONG *pceltFetched)
STDMETHODIMP Skip(ULONG celt)
STDMETHODIMP Reset()
STDMETHODIMP Initialize(IZip *zip, DWORD flags, PCWSTR prefix)
CZipEnumerator mEnumerator
STDMETHODIMP Clone(IEnumIDList **ppenum)
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
HRESULT hr
Definition: delayimp.cpp:582
#define SFGAO_SYSTEM
Definition: shobjidl.idl:198
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
unsigned long DWORD
Definition: ntddk_ex.h:95
GLbitfield flags
Definition: glext.h:7161
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:581
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:601
#define DECLARE_PROTECT_FINAL_CONSTRUCT()
Definition: atlcom.h:679
#define DECLARE_NOT_AGGREGATABLE(x)
Definition: atlcom.h:651
#define END_COM_MAP()
Definition: atlcom.h:592
static SHCONTF
Definition: ordinal.c:61
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define REFIID
Definition: guiddef.h:118
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
BOOL NextUnique(PCWSTR prefix, CStringW &name, bool &folder, unz_file_info64 &info)
BOOL Initialize(IZip *zip)
Definition: IZip.hpp:9
Definition: name.c:39
Character const *const prefix
Definition: tempnam.cpp:195
const uint16_t * PCWSTR
Definition: typedefs.h:57
uint32_t ULONG
Definition: typedefs.h:59
#define S_FALSE
Definition: winerror.h:3451
#define E_POINTER
Definition: winerror.h:3480
LPITEMIDLIST _ILCreateZipItem(ZipPidlType Type, PCWSTR lpString, unz_file_info64 &info)
Definition: zippidl.cpp:11
@ ZIP_PIDL_FILE
Definition: zippidl.hpp:12
@ ZIP_PIDL_DIRECTORY
Definition: zippidl.hpp:11