ReactOS 0.4.16-dev-550-g2186ce3
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;
54
56 {
57 return DPA_AppendPtr(m_Items, (void*)pidl) != DPA_ERR ? S_OK : E_OUTOFMEMORY;
58 }
59
60 UINT GetCount() const { return m_Items ? DPA_GetPtrCount(m_Items) : 0; }
61
62 // IEnumIDList
63 IFACEMETHODIMP Next(ULONG celt, PITEMID_CHILD *rgelt, ULONG *pceltFetched)
64 {
65 if (!rgelt)
66 return E_INVALIDARG;
68 UINT count = GetCount(), fetched = 0;
69 if (m_Pos < count && fetched < celt)
70 {
71 if (SUCCEEDED(hr = SHILClone(DPA_FastGetPtr(m_Items, m_Pos), &rgelt[fetched])))
72 fetched++;
73 }
74 if (pceltFetched)
75 *pceltFetched = fetched;
76 m_Pos += fetched;
77 return FAILED(hr) ? hr : (celt == fetched && fetched) ? S_OK : S_FALSE;
78 }
79
81 {
82 m_Pos = 0;
83 return S_OK;
84 }
85
87 {
88 UINT count = GetCount(), newpos = m_Pos + celt;
89 if (celt > count || newpos >= count)
90 return E_INVALIDARG;
91 m_Pos = newpos;
92 return S_OK;
93 }
94
96 {
98 *ppenum = NULL;
99 return E_NOTIMPL;
100 }
101
103 {
105 return SUCCEEDED(ShellObjectCreator(obj)) ? obj.Detach() : NULL;
106 }
107
110
112 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
114};
115
117 public CComCoClass<CCabFolder, &CLSID_CabFolder>,
118 public CComObjectRootEx<CComMultiThreadModelNoCS>,
119 public IShellFolder2,
120 public IPersistFolder2,
121 public IShellFolderViewCB,
122 public IShellIcon
123{
124protected:
125 CComHeapPtr<ITEMIDLIST> m_CurDir;
126 HWND m_ShellViewWindow = NULL;
127
128public:
129 HRESULT ExtractFilesUI(HWND hWnd, IDataObject *pDO);
130 HRESULT GetItemDetails(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd, VARIANT *pv);
131 int MapSCIDToColumn(const SHCOLUMNID &scid);
132 HRESULT CompareID(LPARAM lParam, PCUITEMID_CHILD pidl1, PCUITEMID_CHILD pidl2);
133
135 {
137 *List = pEIDL;
138 return pEIDL ? pEIDL->Fill(m_CurDir) : E_OUTOFMEMORY;
139 }
140
141 // IShellFolder2
143 {
144 return E_NOTIMPL;
145 }
146
148 {
149 return E_NOTIMPL;
150 }
151
152 IFACEMETHODIMP GetDefaultColumn(DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override;
153
154 IFACEMETHODIMP GetDefaultColumnState(UINT iColumn, SHCOLSTATEF *pcsFlags) override;
155
156 IFACEMETHODIMP GetDetailsEx(PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override;
157
158 IFACEMETHODIMP GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override;
159
160 IFACEMETHODIMP MapColumnToSCID(UINT column, SHCOLUMNID *pscid) override;
161
162 IFACEMETHODIMP ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) override
163 {
165 return E_NOTIMPL;
166 }
167
168 IFACEMETHODIMP EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override;
169
170 IFACEMETHODIMP BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override;
171
173 {
175 return E_NOTIMPL;
176 }
177
178 IFACEMETHODIMP CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override;
179
180 IFACEMETHODIMP CreateViewObject(HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override;
181
182 IFACEMETHODIMP GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, SFGAOF *rgfInOut) override;
183
184 IFACEMETHODIMP GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override;
185
186 IFACEMETHODIMP GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET pName) override;
187
188 IFACEMETHODIMP SetNameOf(HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
189 {
190 return E_NOTIMPL;
191 }
192
193 // IPersistFolder2
195 {
196 LPITEMIDLIST curdir = (LPITEMIDLIST)m_CurDir;
197 return curdir ? SHILClone(curdir, pidl) : E_UNEXPECTED;
198 }
199
201 {
203 if (SHGetPathFromIDListW(pidl, path))
204 {
205 PIDLIST_ABSOLUTE curdir = ILClone(pidl);
206 if (curdir)
207 {
208 m_CurDir.Attach(curdir);
209 return S_OK;
210 }
211 return E_OUTOFMEMORY;
212 }
213 return E_INVALIDARG;
214 }
215
216 IFACEMETHODIMP GetClassID(CLSID *lpClassId) override
217 {
218 *lpClassId = CLSID_CabFolder;
219 return S_OK;
220 }
221
222 // IShellFolderViewCB
223 IFACEMETHODIMP MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam) override;
224
225 // IShellIcon
226 IFACEMETHODIMP GetIconOf(PCUITEMID_CHILD pidl, UINT flags, int *pIconIndex) override;
227
230
232 COM_INTERFACE_ENTRY_IID(IID_IShellFolder, IShellFolder)
233 COM_INTERFACE_ENTRY_IID(IID_IShellFolder2, IShellFolder2)
235 COM_INTERFACE_ENTRY_IID(IID_IPersistFolder, IPersistFolder)
236 COM_INTERFACE_ENTRY_IID(IID_IPersistFolder2, IPersistFolder2)
237 COM_INTERFACE_ENTRY_IID(IID_IShellFolderViewCB, IShellFolderViewCB)
238 COM_INTERFACE_ENTRY_IID(IID_IShellIcon, IShellIcon)
240};
#define msg(x)
Definition: auth_time.c:54
HWND hWnd
Definition: settings.c:17
const WCHAR * class
Definition: main.c:68
#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:188
IFACEMETHODIMP GetDefaultSearchGUID(GUID *pguid) override
Definition: cabview.h:142
CComHeapPtr< ITEMIDLIST > m_CurDir
Definition: cabview.h:125
IFACEMETHODIMP ParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, ULONG *pchEaten, PIDLIST_RELATIVE *ppidl, ULONG *pdwAttributes) override
Definition: cabview.h:162
IFACEMETHODIMP EnumSearches(IEnumExtraSearch **ppenum) override
Definition: cabview.h:147
HRESULT CreateEnum(CEnumIDList **List)
Definition: cabview.h:134
IFACEMETHODIMP Initialize(PCIDLIST_ABSOLUTE pidl) override
Definition: cabview.h:200
IFACEMETHODIMP GetCurFolder(PIDLIST_ABSOLUTE *pidl) override
Definition: cabview.h:194
IFACEMETHODIMP GetClassID(CLSID *lpClassId) override
Definition: cabview.h:216
IFACEMETHODIMP BindToStorage(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: cabview.h:172
IFACEMETHODIMP Reset()
Definition: cabview.h:80
CEnumIDList()
Definition: cabview.h:41
HRESULT Fill(LPCWSTR path, HWND hwnd=NULL, SHCONTF contf=0)
Definition: folder.cpp:215
IFACEMETHODIMP Next(ULONG celt, PITEMID_CHILD *rgelt, ULONG *pceltFetched)
Definition: cabview.h:63
IFACEMETHODIMP Skip(ULONG celt)
Definition: cabview.h:86
static CEnumIDList * CreateInstance()
Definition: cabview.h:102
static int CALLBACK DPADestroyCallback(void *pidl, void *pData)
Definition: cabview.h:35
UINT GetCount() const
Definition: cabview.h:60
IFACEMETHODIMP Clone(IEnumIDList **ppenum)
Definition: cabview.h:95
ULONG m_Pos
Definition: cabview.h:32
HRESULT Append(LPCITEMIDLIST pidl)
Definition: cabview.h:55
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
#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:132
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
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
REFIID riid
Definition: atlbase.h:39
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
static LPSTR pName
Definition: security.c:75
static IPrintDialogCallback callback
Definition: printdlg.c:326
static LPOLESTR
Definition: stg_prop.c:27
static SHCONTF
Definition: ordinal.c:64
unsigned int UINT
Definition: ndis.h:50
#define IFACEMETHODIMP
Definition: ntbasedef.h:157
interface IBindCtx * LPBC
Definition: objfwd.h:18
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1454
const GUID IID_IPersist
Definition: proxy.cpp:14
#define DPA_FastGetPtr(hdpa, i)
Definition: commctrl.h:4965
#define DPA_ERR
Definition: commctrl.h:4790
#define DPA_AppendPtr(hdpa, pitem)
Definition: commctrl.h:4963
#define DPA_GetPtrCount(hdpa)
Definition: commctrl.h:4960
#define REFIID
Definition: guiddef.h:118
HRESULT hr
Definition: shlfolder.c:183
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
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
_In_ LPCSTR lpName
Definition: winbase.h:2814
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
#define HRESULT
Definition: msvc.h:7
#define S_FALSE
Definition: winerror.h:2357
#define E_UNEXPECTED
Definition: winerror.h:2456
int WINAPI EnumObjects(_In_ HDC, _In_ int, _In_ GOBJENUMPROC, _In_ LPARAM)
__wchar_t WCHAR
Definition: xmlstorage.h:180
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185