ReactOS 0.4.17-dev-523-gf6fcb59
CShellItemArray.cpp
Go to the documentation of this file.
1
2
3#include "precomp.h"
4
6
7/***********************************************************************
8 * CShellItemArray
9 */
10
12{
13}
14
16{
17 delete m_pHIDA;
18}
19
22{
23 m_pHIDA = new CDataObjectHIDA(pdo);
24 if (!m_pHIDA)
25 return E_OUTOFMEMORY;
26
27 HRESULT hr = m_pHIDA->hr();
28 if (FAILED(hr))
29 {
30 delete m_pHIDA;
31 m_pHIDA = NULL;
32 }
33 return hr;
34}
35
36UINT
38{
39 return m_pHIDA ? (*m_pHIDA)->cidl : 0;
40}
41
44{
46 *ppv = NULL;
47 return E_NOTIMPL;
48}
49
52{
54 *ppv = NULL;
55 return E_NOTIMPL;
56}
57
60{
62 *ppv = NULL;
63 return E_NOTIMPL;
64}
65
67CShellItemArray::GetAttributes(_In_ SIATTRIBFLAGS dwAttribFlags, _In_ SFGAOF sfgaoMask, _Out_ SFGAOF *psfgaoAttribs)
68{
70 *psfgaoAttribs = 0;
71 return E_NOTIMPL;
72}
73
76{
77 if (!pCount)
78 return E_INVALIDARG;
79 *pCount = ItemCount();
80 return S_OK;
81}
82
85{
86 if (!ppItem)
87 return E_INVALIDARG;
88 *ppItem = NULL;
89 if (!m_pHIDA)
90 return E_UNEXPECTED;
91 if (nIndex >= ItemCount())
92 return E_FAIL;
94 HIDA_GetPIDLItem(*m_pHIDA, nIndex), ppItem);
95}
96
99{
101 *ppESI = NULL;
102 return E_NOTIMPL;
103}
104
105/***********************************************************************
106 * CSimpleShellItemArray
107 */
108
111{
112 if (!m_items.SetCount(0))
113 return E_OUTOFMEMORY;
114 for (UINT i = 0; i < count; ++i)
115 {
116 CComPtr<IShellItem> ptr = pitems[i];
117 if (!ptr)
118 return E_INVALIDARG;
119 m_items.Add(ptr);
120 }
121 return S_OK;
122}
123
126{
128 *ppv = NULL;
129 return E_NOTIMPL;
130}
131
134{
136 *ppv = NULL;
137 return E_NOTIMPL;
138}
139
142{
144 *ppv = NULL;
145 return E_NOTIMPL;
146}
147
149CSimpleShellItemArray::GetAttributes(_In_ SIATTRIBFLAGS dwAttribFlags, _In_ SFGAOF sfgaoMask, _Out_ SFGAOF *psfgaoAttribs)
150{
151 HRESULT hr = S_OK;
152 SFGAOF attr;
153
154 if (!psfgaoAttribs)
155 return E_POINTER;
156
157 if (dwAttribFlags & ~(SIATTRIBFLAGS_AND | SIATTRIBFLAGS_OR))
158 FIXME("%08x contains unsupported attribution flags\n", dwAttribFlags);
159
160 for (size_t i = 0; i < m_items.GetCount(); ++i)
161 {
162 hr = m_items[i]->GetAttributes(sfgaoMask, &attr);
164 break;
165
166 if (i == 0)
167 {
168 *psfgaoAttribs = attr;
169 continue;
170 }
171
172 if ((dwAttribFlags & SIATTRIBFLAGS_MASK) == SIATTRIBFLAGS_AND)
173 *psfgaoAttribs &= attr;
174 else
175 *psfgaoAttribs |= attr;
176 }
177
178 if (SUCCEEDED(hr))
179 {
180 if (*psfgaoAttribs == sfgaoMask)
181 return S_OK;
182 return S_FALSE;
183 }
184 return hr;
185}
186
189{
190 if (!pdwNumItems)
191 return E_INVALIDARG;
192 *pdwNumItems = static_cast<DWORD>(m_items.GetCount());
193 return S_OK;
194}
195
198{
199 if (!ppsi)
200 return E_INVALIDARG;
201 *ppsi = NULL;
202 if (dwIndex >= m_items.GetCount())
203 return E_FAIL;
204 *ppsi = m_items[dwIndex];
205 (*ppsi)->AddRef();
206 return S_OK;
207}
208
211{
213 *ppenumShellItems = NULL;
214 return E_NOTIMPL;
215}
216
219{
220 return ShellObjectCreatorInit<CSimpleShellItemArray>(items, cidl, riid, ppv);
221}
222
223/***********************************************************************
224 * SHCreateShellItemArray [SHELL32.@]
225 */
228 _In_opt_ PCIDLIST_ABSOLUTE pidlParent,
230 _In_ UINT cidl,
232 _Out_ IShellItemArray **ppsiItemArray)
233{
235 HRESULT hr = E_FAIL;
236
237 TRACE("(%p,%p,%u,%p,%p)\n", pidlParent, psf, cidl, ppidl, ppsiItemArray);
238
239 if (!ppsiItemArray)
240 return E_POINTER;
241 *ppsiItemArray = NULL;
242
243 if (!pidlParent && !psf)
244 return E_POINTER;
245
246 if (!ppidl)
247 return E_INVALIDARG;
248
249 array.Allocate(cidl);
250 if (!array)
251 return E_OUTOFMEMORY;
252
253 for (UINT i = 0; i < cidl; ++i)
254 array[i] = NULL;
255
256 for (UINT i = 0; i < cidl; ++i)
257 {
258 hr = SHCreateShellItem(pidlParent, psf, ppidl[i], &array[i]);
260 break;
261 }
262
263 if (SUCCEEDED(hr))
264 {
265 hr = CreateShellItemArrayFromItems(array, cidl, IID_PPV_ARG(IShellItemArray, ppsiItemArray));
266 }
267
268 for (UINT i = 0; i < cidl; ++i)
269 {
270 if (array[i])
271 array[i]->Release();
272 }
273
274 return hr;
275}
276
277/***********************************************************************
278 * SHCreateShellItemArrayFromIDLists [SHELL32.@]
279 */
282 _In_ UINT cidl,
283 _In_reads_(cidl) PCIDLIST_ABSOLUTE_ARRAY pidlArray,
284 _Out_ IShellItemArray **ppsiItemArray)
285{
287 HRESULT hr;
288
289 TRACE("(%u,%p,%p)\n", cidl, pidlArray, ppsiItemArray);
290
291 if (!ppsiItemArray)
292 return E_POINTER;
293 *ppsiItemArray = NULL;
294
295 if (cidl == 0 || !pidlArray)
296 return E_INVALIDARG;
297
298 array.Allocate(cidl);
299 if (!array)
300 return E_OUTOFMEMORY;
301
302 for (UINT i = 0; i < cidl; ++i)
303 array[i] = NULL;
304
305 for (UINT i = 0; i < cidl; ++i)
306 {
307 hr = SHCreateShellItem(NULL, NULL, pidlArray[i], &array[i]);
309 break;
310 }
311
312 if (SUCCEEDED(hr))
313 {
314 hr = CreateShellItemArrayFromItems(array, cidl, IID_PPV_ARG(IShellItemArray, ppsiItemArray));
315 }
316
317 for (UINT i = 0; i < cidl; ++i)
318 {
319 if (array[i])
320 array[i]->Release();
321 }
322
323 return hr;
324}
325
326/***********************************************************************
327 * SHCreateShellItemArrayFromShellItem [SHELL32.@]
328 */
331{
332 IShellItem *items[1] = { psi };
333
334 TRACE("(%p,%s,%p)\n", psi, debugstr_guid(&riid), ppv);
335
336 if (!ppv)
337 return E_POINTER;
338 *ppv = NULL;
339
340 if (!psi)
341 return E_INVALIDARG;
342
344}
345
346/***********************************************************************
347 * SHCreateShellItemArrayFromDataObject [SHELL32.@]
348 */
351{
352 return ShellObjectCreatorInit<CShellItemArray>(pdo, riid, ppv);
353}
EXTERN_C HRESULT WINAPI SHCreateShellItemArrayFromIDLists(_In_ UINT cidl, _In_reads_(cidl) PCIDLIST_ABSOLUTE_ARRAY pidlArray, _Out_ IShellItemArray **ppsiItemArray)
EXTERN_C HRESULT WINAPI SHCreateShellItemArrayFromDataObject(_In_ IDataObject *pdo, _In_ REFIID riid, _Out_ void **ppv)
EXTERN_C HRESULT WINAPI SHCreateShellItemArrayFromShellItem(_In_ IShellItem *psi, _In_ REFIID riid, _Out_ void **ppv)
HRESULT CreateShellItemArrayFromItems(_In_reads_(cidl) IShellItem **items, _In_ UINT cidl, _In_ REFIID riid, _Out_ void **ppv)
EXTERN_C HRESULT WINAPI SHCreateShellItemArray(_In_opt_ PCIDLIST_ABSOLUTE pidlParent, _In_opt_ IShellFolder *psf, _In_ UINT cidl, _In_reads_opt_(cidl) PCUITEMID_CHILD_ARRAY ppidl, _Out_ IShellItemArray **ppsiItemArray)
HRESULT WINAPI SHCreateShellItem(PCIDLIST_ABSOLUTE pidlParent, IShellFolder *psfParent, PCUITEMID_CHILD pidl, IShellItem **ppsi)
Definition: CShellItem.cpp:261
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define FIXME(fmt,...)
Definition: precomp.h:53
#define EXTERN_C
Definition: basetyps.h:12
#define STDMETHODIMP
Definition: basetyps.h:43
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
CDataObjectHIDA * m_pHIDA
virtual ~CShellItemArray()
UINT ItemCount() const
STDMETHODIMP GetItemAt(_In_ DWORD nIndex, _Out_ IShellItem **ppItem) override
STDMETHODIMP GetPropertyDescriptionList(_In_ REFPROPERTYKEY keyType, _In_ REFIID riid, _Out_ void **ppv) override
STDMETHODIMP GetAttributes(_In_ SIATTRIBFLAGS dwAttribFlags, _In_ SFGAOF sfgaoMask, _Out_ SFGAOF *psfgaoAttribs) override
STDMETHODIMP GetCount(_Out_ DWORD *pCount) override
STDMETHODIMP EnumItems(_Out_ IEnumShellItems **ppESI) override
STDMETHODIMP BindToHandler(_In_opt_ IBindCtx *pbc, _In_ REFGUID rbhid, _In_ REFIID riid, _Out_ void **ppv) override
STDMETHODIMP GetPropertyStore(_In_ GETPROPERTYSTOREFLAGS flags, _In_ REFIID riid, _Out_ void **ppv) override
HRESULT Initialize(_In_ IDataObject *pdo)
STDMETHODIMP BindToHandler(_In_opt_ IBindCtx *pbc, _In_ REFGUID rbhid, _In_ REFIID riid, _Out_ void **ppv) override
CAtlArray< CComPtr< IShellItem > > m_items
HRESULT Initialize(_In_reads_(count) IShellItem **pitems, _In_ UINT count)
STDMETHODIMP GetAttributes(_In_ SIATTRIBFLAGS dwAttribFlags, _In_ SFGAOF sfgaoMask, _Out_ SFGAOF *psfgaoAttribs) override
STDMETHODIMP GetPropertyStore(_In_ GETPROPERTYSTOREFLAGS flags, _In_ REFIID riid, _Out_ void **ppv) override
STDMETHODIMP EnumItems(_Out_ IEnumShellItems **ppenumShellItems) override
STDMETHODIMP GetPropertyDescriptionList(_In_ REFPROPERTYKEY keyType, _In_ REFIID riid, _Out_ void **ppv) override
STDMETHODIMP GetItemAt(_In_ DWORD dwIndex, _Out_ IShellItem **ppsi) override
STDMETHODIMP GetCount(_Out_ DWORD *pdwNumItems) override
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
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
GLbitfield flags
Definition: glext.h:7161
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int UINT
Definition: sysinfo.c:13
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
static PVOID ptr
Definition: dispmode.c:27
#define _In_reads_(s)
Definition: no_sal2.h:168
#define _Out_
Definition: no_sal2.h:160
#define _In_reads_opt_(s)
Definition: no_sal2.h:222
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
static TCHAR * items[]
Definition: page1.c:45
PROPERTYKEY * REFPROPERTYKEY
Definition: propsys.idl:40
#define REFIID
Definition: guiddef.h:118
static PCUIDLIST_RELATIVE HIDA_GetPIDLItem(CIDA const *pida, SIZE_T i)
Definition: shellutils.h:721
static PCUIDLIST_ABSOLUTE HIDA_GetPIDLFolder(CIDA const *pida)
Definition: shellutils.h:716
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
#define TRACE(s)
Definition: solgame.cpp:4
Definition: scsiwmi.h:51
Definition: undname.c:54
Definition: cookie.c:202
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
#define E_UNEXPECTED
Definition: winerror.h:3528
#define E_POINTER
Definition: winerror.h:3480
#define IID_PPV_ARG(Itype, ppType)