ReactOS 0.4.17-dev-470-gf9e3448
cabview.h
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS CabView Shell Extension
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: Main header file
5 * COPYRIGHT: Copyright 2024 Whindmar Saksit <whindsaks@proton.me>
6 */
7
8#pragma once
9#include "precomp.h"
10#include "resource.h"
11
12#define FLATFOLDER TRUE
13
15
18{
22};
25
27 public CComObjectRootEx<CComMultiThreadModelNoCS>,
28 public IEnumIDList
29{
30protected:
33
34public:
35 static int CALLBACK DPADestroyCallback(void *pidl, void *pData)
36 {
37 SHFree(pidl);
38 return TRUE;
39 }
40
42 {
44 }
45
46 virtual ~CEnumIDList()
47 {
49 }
50
51 int FindNamedItem(PCUITEMID_CHILD pidl) const;
53
55
57 {
58 return DPA_AppendPtr(m_Items, (void*)pidl) != DPA_ERR ? S_OK : E_OUTOFMEMORY;
59 }
60
61 UINT GetCount() const { return m_Items ? DPA_GetPtrCount(m_Items) : 0; }
62
63 // IEnumIDList
64 IFACEMETHODIMP Next(ULONG celt, PITEMID_CHILD *rgelt, ULONG *pceltFetched)
65 {
66 if (!rgelt)
67 return E_INVALIDARG;
69 UINT count = GetCount(), fetched = 0;
70 if (m_Pos < count && fetched < celt)
71 {
72 if (SUCCEEDED(hr = SHILClone(DPA_FastGetPtr(m_Items, m_Pos), &rgelt[fetched])))
73 fetched++;
74 }
75 if (pceltFetched)
76 *pceltFetched = fetched;
77 m_Pos += fetched;
78 return FAILED(hr) ? hr : (celt == fetched && fetched) ? S_OK : S_FALSE;
79 }
80
82 {
83 m_Pos = 0;
84 return S_OK;
85 }
86
88 {
89 UINT count = GetCount(), newpos = m_Pos + celt;
90 if (celt > count || newpos >= count)
91 return E_INVALIDARG;
92 m_Pos = newpos;
93 return S_OK;
94 }
95
97 {
99 *ppenum = NULL;
100 return E_NOTIMPL;
101 }
102
104 {
106 return SUCCEEDED(ShellObjectCreator(obj)) ? obj.Detach() : NULL;
107 }
108
111
113 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
115};
116
118 public CComCoClass<CCabFolder, &CLSID_CabFolder>,
119 public CComObjectRootEx<CComMultiThreadModelNoCS>,
120 public IShellFolder2,
121 public IPersistFolder2,
122 public IShellFolderViewCB,
123 public IShellIcon
124{
125protected:
126 CComHeapPtr<ITEMIDLIST> m_CurDir;
127 HWND m_ShellViewWindow = NULL;
128
129public:
130 HRESULT ExtractFilesUI(HWND hWnd, IDataObject *pDO);
131 HRESULT GetItemDetails(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd, VARIANT *pv);
132 int MapSCIDToColumn(const SHCOLUMNID &scid);
133 HRESULT CompareID(LPARAM lParam, PCUITEMID_CHILD pidl1, PCUITEMID_CHILD pidl2);
134
136 {
138 *List = pEIDL;
139 return pEIDL ? pEIDL->Fill(m_CurDir) : E_OUTOFMEMORY;
140 }
141
142 // IShellFolder2
144 {
145 return E_NOTIMPL;
146 }
147
149 {
150 return E_NOTIMPL;
151 }
152
153 IFACEMETHODIMP GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override;
154
155 IFACEMETHODIMP GetDefaultColumnState(UINT iColumn, SHCOLSTATEF *pcsFlags) override;
156
157 IFACEMETHODIMP GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override;
158
159 IFACEMETHODIMP GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override;
160
161 IFACEMETHODIMP MapColumnToSCID(UINT column, SHCOLUMNID *pscid) override;
162
163 IFACEMETHODIMP ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) override;
164
165 IFACEMETHODIMP EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override;
166
167 IFACEMETHODIMP BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override;
168
170 {
172 return E_NOTIMPL;
173 }
174
176
177 IFACEMETHODIMP CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override;
178
179 IFACEMETHODIMP GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, SFGAOF *rgfInOut) override;
180
181 IFACEMETHODIMP GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override;
182
184
185 IFACEMETHODIMP SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
186 {
187 return E_NOTIMPL;
188 }
189
190 // IPersistFolder2
192 {
193 LPITEMIDLIST curdir = (LPITEMIDLIST)m_CurDir;
194 return curdir ? SHILClone(curdir, pidl) : E_UNEXPECTED;
195 }
196
198 {
200 if (SHGetPathFromIDListW(pidl, path))
201 {
202 PIDLIST_ABSOLUTE curdir = ILClone(pidl);
203 if (curdir)
204 {
205 m_CurDir.Attach(curdir);
206 return S_OK;
207 }
208 return E_OUTOFMEMORY;
209 }
210 return E_INVALIDARG;
211 }
212
213 IFACEMETHODIMP GetClassID(CLSID *lpClassId) override
214 {
215 *lpClassId = CLSID_CabFolder;
216 return S_OK;
217 }
218
219 // IShellFolderViewCB
220 IFACEMETHODIMP MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam) override;
221
222 // IShellIcon
223 IFACEMETHODIMP GetIconOf(PCUITEMID_CHILD pidl, UINT flags, int *pIconIndex) override;
224
227
229 COM_INTERFACE_ENTRY_IID(IID_IShellFolder, IShellFolder)
230 COM_INTERFACE_ENTRY_IID(IID_IShellFolder2, IShellFolder2)
232 COM_INTERFACE_ENTRY_IID(IID_IPersistFolder, IPersistFolder)
233 COM_INTERFACE_ENTRY_IID(IID_IPersistFolder2, IPersistFolder2)
234 COM_INTERFACE_ENTRY_IID(IID_IShellFolderViewCB, IShellFolderViewCB)
235 COM_INTERFACE_ENTRY_IID(IID_IShellIcon, IShellIcon)
237};
static HRESULT BindToObject(PCIDLIST_ABSOLUTE pidl, REFIID riid, void **ppv)
Definition: CSearchBar.cpp:77
#define msg(x)
Definition: auth_time.c:54
HWND hWnd
Definition: settings.c:17
const WCHAR * class
Definition: main.c:68
BOOL(CALLBACK * EXTRACTCALLBACK)(const EXTRACTCALLBACKINFO &Info, void *Cookie)
Definition: misc.h:78
#define EXTERN_C
Definition: basetyps.h:12
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
HRESULT ExtractCabinet(LPCWSTR cab, LPCWSTR destination, EXTRACTCALLBACK callback, LPVOID cookie)
Definition: extract.cpp:189
HRESULT(CALLBACK * EXTRACTCALLBACK)(EXTRACTCALLBACKMSG msg, const EXTRACTCALLBACKDATA &data, LPVOID cookie)
Definition: cabview.h:23
EXTERN_C const GUID CLSID_CabFolder
Definition: cabview.h:14
EXTRACTCALLBACKMSG
Definition: cabview.h:16
@ ECM_ERROR
Definition: cabview.h:16
@ ECM_BEGIN
Definition: cabview.h:16
@ ECM_FILE
Definition: cabview.h:16
@ ECM_PREPAREPATH
Definition: cabview.h:16
IFACEMETHODIMP SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
Definition: cabview.h:185
IFACEMETHODIMP GetDefaultSearchGUID(GUID *pguid) override
Definition: cabview.h:143
CComHeapPtr< ITEMIDLIST > m_CurDir
Definition: cabview.h:126
IFACEMETHODIMP EnumSearches(IEnumExtraSearch **ppenum) override
Definition: cabview.h:148
HRESULT CreateEnum(CEnumIDList **List)
Definition: cabview.h:135
IFACEMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidl) override
Definition: cabview.h:197
IFACEMETHODIMP GetCurFolder(PIDLIST_ABSOLUTE *pidl) override
Definition: cabview.h:191
IFACEMETHODIMP GetClassID(CLSID *lpClassId) override
Definition: cabview.h:213
IFACEMETHODIMP BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: cabview.h:169
IFACEMETHODIMP Reset()
Definition: cabview.h:81
CEnumIDList()
Definition: cabview.h:41
IFACEMETHODIMP Next(ULONG celt, PITEMID_CHILD *rgelt, ULONG *pceltFetched)
Definition: cabview.h:64
static HRESULT Enumerate(PCIDLIST_ABSOLUTE pidl, HWND hwnd, EXTRACTCALLBACK Callback, LPVOID cookie)
Definition: folder.cpp:215
IFACEMETHODIMP Skip(ULONG celt)
Definition: cabview.h:87
static CEnumIDList * CreateInstance()
Definition: cabview.h:103
static int CALLBACK DPADestroyCallback(void *pidl, void *pData)
Definition: cabview.h:35
HRESULT Fill(PCIDLIST_ABSOLUTE pidl, HWND hwnd=NULL, SHCONTF contf=0)
Definition: folder.cpp:223
UINT GetCount() const
Definition: cabview.h:61
IFACEMETHODIMP Clone(IEnumIDList **ppenum)
Definition: cabview.h:96
ULONG m_Pos
Definition: cabview.h:32
HRESULT Append(LPCITEMIDLIST pidl)
Definition: cabview.h:56
HDPA m_Items
Definition: cabview.h:31
int FindNamedItem(PCUITEMID_CHILD pidl) const
Definition: folder.cpp:171
virtual ~CEnumIDList()
Definition: cabview.h:46
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
HRESULT GetDetailsOf(IShellFolder2 &Folder, PCUITEMID_CHILD pidl, UINT Column, PWSTR &String)
Definition: util.h:88
void WINAPI DPA_DestroyCallback(HDPA hdpa, PFNDPAENUMCALLBACK enumProc, LPVOID lParam)
Definition: dpa.c:1003
HDPA WINAPI DPA_Create(INT nGrow)
Definition: dpa.c:950
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:215
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:370
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLbitfield flags
Definition: glext.h:7161
unsigned int UINT
Definition: sysinfo.c:13
REFIID riid
Definition: atlbase.h:39
static HRESULT WINAPI CompareIDs(IShellFolder *This, LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2)
Definition: inetfolder.c:198
static HRESULT WINAPI CreateViewObject(IShellFolder *This, HWND hwndOwner, REFIID riid, void **ppv)
Definition: inetfolder.c:211
static HRESULT WINAPI GetAttributesOf(IShellFolder *This, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, SFGAOF *rgfInOut)
Definition: inetfolder.c:217
static HRESULT WINAPI GetDisplayNameOf(IShellFolder *This, PCUITEMID_CHILD pidl, SHGDNF uFlags, STRRET *pSR)
Definition: inetfolder.c:261
static HRESULT WINAPI GetUIObjectOf(IShellFolder *This, HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *rgfReserved, void **ppv)
Definition: inetfolder.c:237
IEnumIDList * LPENUMIDLIST
Definition: shobjidl.idl:101
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define BEGIN_COM_MAP(x)
Definition: atlcom.h:581
#define COM_INTERFACE_ENTRY_IID(iid, x)
Definition: atlcom.h:601
#define DECLARE_NOT_AGGREGATABLE(x)
Definition: atlcom.h:651
#define END_COM_MAP()
Definition: atlcom.h:592
#define DECLARE_NO_REGISTRY()
Definition: atlcom.h:639
LONG_PTR LPARAM
Definition: minwindef.h:175
UINT_PTR WPARAM
Definition: minwindef.h:174
static LPSTR pName
Definition: security.c:86
static IPrintDialogCallback callback
Definition: printdlg.c:326
static IParseDisplayName ParseDisplayName
Definition: moniker.c:1141
static SHCONTF
Definition: ordinal.c:61
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define IFACEMETHODIMP
Definition: ntbasedef.h:157
interface IBindCtx * LPBC
Definition: objfwd.h:18
short WCHAR
Definition: pedump.c:58
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1496
const GUID IID_IPersist
Definition: proxy.cpp:14
#define DPA_FastGetPtr(hdpa, i)
Definition: commctrl.h:4977
#define DPA_ERR
Definition: commctrl.h:4790
#define DPA_AppendPtr(hdpa, pitem)
Definition: commctrl.h:4975
#define DPA_GetPtrCount(hdpa)
Definition: commctrl.h:4972
#define REFIID
Definition: guiddef.h:118
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
Definition: shtypes.idl:57
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
DWORD SHCOLSTATEF
Definition: shtypes.idl:142
const FDINOTIFICATION * pfdin
Definition: cabview.h:20
Definition: dpa.c:49
Definition: cookie.c:34
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint32_t ULONG
Definition: typedefs.h:59
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
Definition: wdfinterrupt.h:458
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
_In_ LPCSTR lpName
Definition: winbase.h:2519
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define HRESULT
Definition: msvc.h:7
#define S_FALSE
Definition: winerror.h:3451
#define E_UNEXPECTED
Definition: winerror.h:3528
int WINAPI EnumObjects(_In_ HDC, _In_ int, _In_ GOBJENUMPROC, _In_ LPARAM)