ReactOS 0.4.17-dev-470-gf9e3448
CFolderItems.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: shell32
3 * LICENSE: LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+)
4 * PURPOSE: FolderItem(s) implementation
5 * COPYRIGHT: Copyright 2015-2018 Mark Jansen (mark.jansen@reactos.org)
6 */
7
8#include "precomp.h"
9#include "prop.h"
10
12
13
15{
16}
17
19{
20}
21
23{
24 m_idlist.Attach(ILClone(idlist));
25 if (!m_idlist)
26 return E_OUTOFMEMORY;
28 return S_OK;
29}
30
32{
33 return SHBindToParent(GetAbsoluteIDList(), riid, ppv, &pidlLast);
34}
35
37{
38 LPCITEMIDLIST pidl = NULL;
39 FolderItem2 *pFI2;
40 if (pUnk && SUCCEEDED(pUnk->QueryInterface(IID_PPV_ARG(FolderItem2, &pFI2))))
41 {
42 // This assumes we are the only implementer of CFolderItem (probably true)
43 // but when we get IParentAndItem we can do this in a safer way
44 pidl = static_cast<CFolderItem*>(pFI2)->m_idlist;
45 pFI2->Release();
46 }
47 return pidl;
48}
49
51{
52 if (!pV)
53 return NULL;
54
55 if (V_VT(pV) == (VT_VARIANT | VT_BYREF) && V_VARIANTREF(pV))
56 pV = V_VARIANTREF(pV);
57
58 switch (V_VT(pV))
59 {
60 case VT_DISPATCH | VT_BYREF:
62 case VT_DISPATCH:
64 }
65 return NULL;
66}
67
69{
71}
72
74{
76 PCUITEMID_CHILD pidlLeaf;
79 return hr;
80 return SHGetDataFromIDListW(psf, pidlLeaf, SHGDFIL_FINDDATA, &wfd, sizeof(wfd));
81}
82
83// *** FolderItem methods ***
85{
86 TRACE("(%p, %p)\n", this, ppid);
87 return m_Folder->get_Application(ppid);
88}
89
91{
92 TRACE("(%p, %p)\n", this, ppid);
93
94 if (!ppid)
95 return E_INVALIDARG;
96 return m_Folder->QueryInterface(IID_PPV_ARG(IDispatch, ppid));
97}
98
100{
101 TRACE("(%p, %p)\n", this, pbs);
102
103 *pbs = NULL;
104
106 PCUITEMID_CHILD last_part;
109 return hr;
110
111 STRRET strret;
112 hr = Parent->GetDisplayNameOf(last_part, SHGDN_INFOLDER, &strret);
114 hr = StrRetToBSTR(&strret, last_part, pbs);
115
116 return hr;
117}
118
120{
121 TRACE("(%p, %s)\n", this, wine_dbgstr_w(bs));
122
124 PCUITEMID_CHILD pidlLeaf;
127 return hr;
128
129 LPITEMIDLIST pidlNew;
130 if (SUCCEEDED(hr = psf->SetNameOf(GetHwnd(), pidlLeaf, bs, SHGDN_INFOLDER, &pidlNew)) && pidlNew)
131 {
132 LPITEMIDLIST pidlClone = ILClone(m_idlist);
133 ILRemoveLastID(pidlClone);
134 if (pidlClone && SUCCEEDED(SHILAppend(pidlNew, &pidlClone)))
135 {
136 m_idlist.Free();
137 m_idlist.Attach(pidlClone);
138 }
139 }
140 return hr;
141}
142
144{
145 CComPtr<IShellFolder> psfDesktop;
146
147 HRESULT hr = SHGetDesktopFolder(&psfDesktop);
148 if (!SUCCEEDED(hr))
149 return hr;
150
151 STRRET strret;
152 hr = psfDesktop->GetDisplayNameOf(m_idlist, SHGDN_FORPARSING, &strret);
154 return hr;
155
156 return StrRetToBSTR(&strret, NULL, pbs);
157}
158
160{
161 TRACE("(%p, %p)\n", this, ppid);
162 return E_NOTIMPL;
163}
164
166{
167 return ShellObjectCreatorInit<CFolder>(const_cast<LPITEMIDLIST>(GetAbsoluteIDList()), IID_PPV_ARG(IDispatch, ppid));
168}
169
171{
172 *pB = SHGetAttributes(NULL, GetAbsoluteIDList(), sfgaof) ? VARIANT_TRUE : VARIANT_FALSE;
173 return S_OK;
174}
175
177{
178 TRACE("(%p, %p)\n", this, pb);
179 return HasAttribute(SFGAO_LINK, pb);
180}
181
183{
184 TRACE("(%p, %p)\n", this, pb);
185 return HasAttribute(SFGAO_FOLDER, pb);
186}
187
189{
190 TRACE("(%p, %p)\n", this, pb);
191 return HasAttribute(SFGAO_FILESYSTEM, pb);
192}
193
195{
196 TRACE("(%p, %p)\n", this, pb);
197 return HasAttribute(SFGAO_BROWSABLE, pb);
198}
199
201{
202 TRACE("(%p, %p)\n", this, pdt);
203
204 WIN32_FIND_DATA wfd;
206 {
207 FILETIME ft;
208 FileTimeToLocalFileTime(&wfd.ftLastWriteTime, &ft);
209 WORD dd, dt;
210 if (FileTimeToDosDateTime(&ft, &dd, &dt) && DosDateTimeToVariantTime(dd, dt, pdt))
211 return S_OK;
212 }
213 *pdt = 0;
214 return S_FALSE;
215}
216
218{
219 TRACE("(%p, %f)\n", this, dt);
220 return E_NOTIMPL;
221}
222
224{
225 TRACE("(%p, %p)\n", this, pul);
226
227 WIN32_FIND_DATA wfd;
229 {
230 *pul = wfd.nFileSizeLow;
231 return S_OK;
232 }
233 *pul = 0;
234 return S_FALSE;
235}
236
238{
239 TRACE("(%p, %p)\n", this, pbs);
240
241 VARIANT v;
242 V_VT(&v) = VT_EMPTY;
243 if (SUCCEEDED(GetExtendedProperty(PKEY_ItemTypeText, &v)))
244 {
246 {
247 *pbs = V_BSTR(&v);
248 return S_OK;
249 }
250 VariantClear(&v);
251 }
253 return hr == S_OK ? S_FALSE : hr;
254}
255
257{
258 if (!ppfic)
259 return E_POINTER;
260
263 if (SUCCEEDED(hr))
264 hr = pVerbs->Init(GetAbsoluteIDList());
266 return hr;
267
268 *ppfic = pVerbs.Detach();
269 return S_OK;
270}
271
273{
275 V_VT(&empty) = VT_EMPTY;
276 return InvokeVerbEx(vVerb, empty);
277}
278
280{
281 TRACE("(%p, %s)\n", this, wine_dbgstr_variant(&vVerb));
282
284 sei.cbSize = sizeof(sei);
286 sei.hwnd = GetHwnd();
287 sei.lpVerb = V_VT(&vVerb) == VT_BSTR ? V_BSTR(&vVerb) : NULL;
288 sei.lpFile = NULL;
289 sei.lpParameters = V_VT(&vArgs) == VT_BSTR ? V_BSTR(&vArgs) : NULL;
290 sei.lpDirectory = NULL;
291 sei.nShow = SW_SHOW;
292 sei.lpIDList = const_cast<LPITEMIDLIST>(GetAbsoluteIDList());
293 ShellExecuteExW(&sei);
294 return S_OK;
295}
296
298{
300 PCUITEMID_CHILD pidlLeaf;
302 return FAILED(hr) ? hr : psf->GetDetailsEx(pidlLeaf, reinterpret_cast<const SHCOLUMNID*>(&pkey), pv);
303}
304
306{
307 if (!pv)
308 return E_INVALIDARG;
309
310 PROPERTYKEY pkeybuf;
311 const PROPERTYKEY *pPK = SHELL_GetPropertyKeyFromString(bsPropName, &pkeybuf);
312 if (pPK && GetExtendedProperty(*pPK, pv) == S_OK)
313 return S_OK;
314
315 V_VT(pv) = VT_EMPTY;
316 return S_FALSE;
317}
318
319
321 :m_Count(-1)
322{
323}
324
326{
327}
328
330{
331 CComPtr<IShellFolder> psfDesktop, psfTarget;
332
333 m_idlist.Attach(ILClone(idlist));
334 if (!m_idlist)
335 return E_OUTOFMEMORY;
336
337 HRESULT hr = SHGetDesktopFolder(&psfDesktop);
339 return hr;
340
341 hr = psfDesktop->BindToObject(m_idlist, NULL, IID_PPV_ARG(IShellFolder, &psfTarget));
343 return hr;
344
345 hr = psfTarget->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &m_EnumIDList);
346
348 return hr;
349
351 return S_OK;
352}
353
354// *** FolderItems methods ***
356{
357 if (!m_EnumIDList)
358 return E_FAIL;
359
360 if (!plCount)
361 return E_POINTER;
362
363 if (m_Count == -1)
364 {
365 long count = 0;
366
367 HRESULT hr = m_EnumIDList->Reset();
369 return hr;
370
372 while ((hr = m_EnumIDList->Next(1, &Pidl, 0)) != S_FALSE)
373 {
374 count++;
375 Pidl.Free();
376 }
377 m_Count = count;
378 }
379 *plCount = m_Count;
380
381 return S_OK;
382}
383
385{
386 TRACE("(%p, %p)\n", this, ppid);
387 return m_Folder->get_Application(ppid);
388}
389
391{
392 TRACE("(%p, %p)\n", this, ppid);
393
394 if (ppid)
395 *ppid = NULL;
396
397 return E_NOTIMPL;
398}
399
401{
403 HRESULT hr;
404
405 if (!m_EnumIDList)
406 return E_FAIL;
407
409 if (FAILED(hr))
410 return hr;
411
412 if (V_VT(&index) == VT_I2)
414
415 if (V_VT(&index) == VT_I4)
416 {
418
419 hr = m_EnumIDList->Reset();
421 return hr;
422
423 hr = m_EnumIDList->Skip(count);
424
426 return hr;
427
429 hr = m_EnumIDList->Next(1, &spPidl, 0);
431 return hr;
432 hr = ShellObjectCreatorInit<CFolderItem>(m_Folder, static_cast<LPITEMIDLIST>(spPidl), IID_PPV_ARG(FolderItem, ppid));
434 return hr;
435 return hr;
436 }
437 else if (V_VT(&index) == VT_BSTR)
438 {
439 if (!V_BSTR(&index))
440 return S_FALSE;
441
442 hr = m_Folder->ParseName(V_BSTR(&index), ppid);
444 return hr;
445 return hr;
446 }
447
448 FIXME("Index type %d not handled.\n", V_VT(&index));
449 return E_NOTIMPL;
450}
451
453{
454 return ShellObjectCreatorInit<CFolderItems>(static_cast<LPITEMIDLIST>(m_idlist), m_Folder, IID_FolderItems, reinterpret_cast<void**>(ppunk));
455}
456
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:732
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define index(s, c)
Definition: various.h:29
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define FIXME(fmt,...)
Definition: precomp.h:53
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
T * Detach()
Definition: atlcomcli.h:186
static HRESULT CreateInstance(CComPtr< CFolderItemVerbs > &objref)
CComHeapPtr< ITEMIDLIST > m_idlist
Definition: CFolderItems.h:18
static LPCITEMIDLIST GetInternalPidlRef(IUnknown *pUnk)
STDMETHOD() get_Type(BSTR *pbs) override
STDMETHOD() get_Path(BSTR *pbs) override
STDMETHOD() get_IsLink(VARIANT_BOOL *pb) override
STDMETHOD() get_Size(LONG *pul) override
static PCUITEMID_CHILD GetLeafPidlRef(const VARIANT *pV)
HRESULT GetFindDataFromIDList(WIN32_FIND_DATA &wfd)
STDMETHOD() get_IsFileSystem(VARIANT_BOOL *pb) override
STDMETHOD() get_IsBrowsable(VARIANT_BOOL *pb) override
STDMETHOD() get_ModifyDate(DATE *pdt) override
HRESULT GetParentShellFolderAndItem(REFIID riid, void **ppv, PCUITEMID_CHILD &pidlLast)
HRESULT GetExtendedProperty(REFPROPERTYKEY pkey, VARIANT *pv)
HWND GetHwnd()
Definition: CFolderItems.h:32
STDMETHOD() get_Parent(IDispatch **ppid) override
STDMETHOD() get_IsFolder(VARIANT_BOOL *pb) override
STDMETHOD() Verbs(FolderItemVerbs **ppfic) override
STDMETHOD() put_Name(BSTR bs) override
HRESULT Initialize(Folder *folder, LPCITEMIDLIST idlist)
LPCITEMIDLIST GetAbsoluteIDList()
Definition: CFolderItems.h:31
STDMETHOD() get_Name(BSTR *pbs) override
STDMETHOD() ExtendedProperty(BSTR bsPropName, VARIANT *pv) override
STDMETHOD() InvokeVerbEx(VARIANT vVerb, VARIANT vArgs) override
STDMETHOD() put_ModifyDate(DATE dt) override
STDMETHOD() get_GetFolder(IDispatch **ppid) override
STDMETHOD() get_Application(IDispatch **ppid) override
STDMETHOD() InvokeVerb(VARIANT vVerb) override
HRESULT HasAttribute(DWORD sfgaof, VARIANT_BOOL *pB)
CComPtr< Folder > m_Folder
Definition: CFolderItems.h:19
STDMETHOD() get_GetLink(IDispatch **ppid) override
STDMETHOD() Item(VARIANT index, FolderItem **ppid) override
STDMETHOD() get_Application(IDispatch **ppid) override
CComPtr< IEnumIDList > m_EnumIDList
Definition: CFolderItems.h:79
STDMETHOD() get_Count(long *plCount) override
CComHeapPtr< ITEMIDLIST > m_idlist
Definition: CFolderItems.h:78
CComPtr< Folder > m_Folder
Definition: CFolderItems.h:80
HRESULT Initialize(LPCITEMIDLIST idlist, Folder *parent)
STDMETHOD() get_Parent(IDispatch **ppid) override
STDMETHOD() _NewEnum(IUnknown **ppunk) override
void Free()
Definition: atlalloc.h:153
#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
static const WCHAR empty[1]
Definition: string.c:47
double DATE
Definition: compat.h:2253
OLECHAR * BSTR
Definition: compat.h:2293
short VARIANT_BOOL
Definition: compat.h:2290
@ VT_BSTR
Definition: compat.h:2303
@ VT_BYREF
Definition: compat.h:2342
@ VT_VARIANT
Definition: compat.h:2307
@ VT_I4
Definition: compat.h:2298
@ VT_I2
Definition: compat.h:2297
@ VT_EMPTY
Definition: compat.h:2295
@ VT_DISPATCH
Definition: compat.h:2304
BOOL WINAPI FileTimeToLocalFileTime(IN CONST FILETIME *lpFileTime, OUT LPFILETIME lpLocalFileTime)
Definition: time.c:216
BOOL WINAPI FileTimeToDosDateTime(IN CONST FILETIME *lpFileTime, OUT LPWORD lpFatDate, OUT LPWORD lpFatTime)
Definition: time.c:37
DWORD SHGetAttributes(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwAttributes)
Definition: utils.cpp:510
HRESULT SHILAppend(_Inout_ LPITEMIDLIST pidl, _Inout_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:275
HRESULT WINAPI StrRetToBSTR(STRRET *lpStrRet, LPCITEMIDLIST pidl, BSTR *pBstrOut)
Definition: string.c:418
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
static void *static void *static LPDIRECTPLAY IUnknown * pUnk
Definition: dplayx.c:30
#define L(x)
Definition: resources.c:13
r parent
Definition: btrfs.c:3010
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned long DWORD
Definition: ntddk_ex.h:95
const GLdouble * v
Definition: gl.h:2040
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint index
Definition: glext.h:6031
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
nsresult QueryInterface(nsIIDRef riid, void **result)
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define wine_dbgstr_w
Definition: kernel32.h:34
static struct msdos_boot_sector bs
Definition: mkdosfs.c:539
const char * var
Definition: shader.c:5666
#define V_VARIANTREF(A)
Definition: oleauto.h:283
#define V_VT(A)
Definition: oleauto.h:211
#define V_DISPATCHREF(A)
Definition: oleauto.h:240
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_UI4(A)
Definition: oleauto.h:270
#define V_DISPATCH(A)
Definition: oleauto.h:239
long LONG
Definition: pedump.c:60
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:199
BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl)
Definition: pidl.c:222
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
Definition: pidl.c:1504
HRESULT WINAPI SHGetDataFromIDListW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, int nFormat, LPVOID dest, int len)
Definition: pidl.c:1358
const PROPERTYKEY * SHELL_GetPropertyKeyFromString(_In_ PCWSTR pszString, _Out_ PROPERTYKEY *pkey)
Definition: prop.cpp:60
PROPERTYKEY * REFPROPERTYKEY
Definition: propsys.idl:40
#define REFIID
Definition: guiddef.h:118
static HRESULT SHELL_SysAllocString(PCWSTR in, BSTR *out)
Definition: shell32_main.h:259
#define SEE_MASK_INVOKEIDLIST
Definition: shellapi.h:28
#define SEE_MASK_FLAG_NO_UI
Definition: shellapi.h:38
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExW(LPSHELLEXECUTEINFOW sei)
Definition: shlexec.cpp:2723
#define SHGDFIL_FINDDATA
Definition: shlobj.h:1468
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define TRACE(s)
Definition: solgame.cpp:4
LPCWSTR lpDirectory
Definition: shellapi.h:340
LPCWSTR lpParameters
Definition: shellapi.h:339
Definition: fci.c:116
uint32_t ULONG
Definition: typedefs.h:59
INT WINAPI DosDateTimeToVariantTime(USHORT wDosDate, USHORT wDosTime, double *pDateOut)
Definition: variant.c:1211
HRESULT WINAPI DECLSPEC_HOTPATCH VariantChangeType(VARIANTARG *pvargDest, VARIANTARG *pvargSrc, USHORT wFlags, VARTYPE vt)
Definition: variant.c:962
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
HRESULT WINAPI VariantCopyInd(VARIANT *pvargDest, VARIANTARG *pvargSrc)
Definition: variant.c:847
#define S_FALSE
Definition: winerror.h:3451
#define E_POINTER
Definition: winerror.h:3480
#define SW_SHOW
Definition: winuser.h:786
#define IID_PPV_ARG(Itype, ppType)