ReactOS 0.4.17-dev-573-g8315b8c
CFolder.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: Folder 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
16static inline HRESULT GetFolderItem(FolderItems *pItems, UINT Index, FolderItem **ppItem)
17{
18 VARIANT v;
19 V_VT(&v) = VT_I4;
20 V_I4(&v) = Index;
21 return pItems->Item(v, ppItem);
22}
23
24static HRESULT GetFolderItem(FolderItems *pItems, UINT Index, IShellFolder **ppsf, PITEMID_CHILD *ppidlChild)
25{
28 if (FAILED(hr))
29 return hr;
31 if (SUCCEEDED(hr = pFI->QueryInterface(IID_PPV_ARG(IParentAndItem, &pPAI))))
32 return pPAI->GetParentAndItem(NULL, ppsf, ppidlChild);
33 return hr;
34}
35
37{
38}
39
41{
42}
43
45{
46 m_Application = pDispatch;
47 return SHILClone(idlist, &m_idlist);
48}
49
51{
54 return hr;
55}
56
57// *** Folder methods ***
59{
60 if (!pbs)
61 return E_POINTER;
62
65 *pbs = SysAllocString(SUCCEEDED(hr) ? path : L"");
66 return S_OK;
67}
68
70{
71 TRACE("(%p, %p)\n", this, ppid);
72
73 if (!ppid)
74 return E_INVALIDARG;
75
76 *ppid = m_Application;
77 (*ppid)->AddRef();
78
79 return S_OK;
80}
81
83{
84 TRACE("(%p %p)\n", this, ppid);
85
86 if (ppid)
87 *ppid = NULL;
88
89 return E_NOTIMPL;
90}
91
93{
94 TRACE("(%p, %p)\n", this, ppsf);
95
96 *ppsf = NULL;
97 LPCITEMIDLIST pidlAbsSelf = GetAbsoluteIDList();
98 if (ILIsEmpty(pidlAbsSelf))
99 return S_FALSE;
100
101 CComHeapPtr<ITEMIDLIST> pidlParent;
102 if (FAILED(SHILCloneParent(pidlAbsSelf, &pidlParent)))
103 return E_OUTOFMEMORY;
104 return CFolder::CreateInstance(pidlParent, m_Application, IID_PPV_ARG(Folder, ppsf));
105}
106
108{
109 /* FolderItems_Constructor */
110 return ShellObjectCreatorInit<CFolderItems>(GetAbsoluteIDList(), this, IID_PPV_ARG(FolderItems, ppid));
111}
112
114{
115 TRACE("(%p, %s, %p)\n", this, wine_dbgstr_w(bName), ppid);
116 if (!ppid)
117 return E_POINTER;
118 *ppid = NULL;
119
120 CComPtr<IShellFolder> psfCurrent;
121 HRESULT hr = GetShellFolder(psfCurrent);
122 if (FAILED(hr))
123 return hr;
124
126 hr = psfCurrent->ParseDisplayName(NULL, NULL, bName, NULL, &relativePidl, NULL);
127 if (!SUCCEEDED(hr))
128 return S_FALSE;
130 combined.Attach(ILCombine(GetAbsoluteIDList(), relativePidl));
131 if (!combined)
132 return E_OUTOFMEMORY;
133
134 CComHeapPtr<ITEMIDLIST> parentPidl;
135 if (FAILED(hr = SHILCloneParent((LPCITEMIDLIST)combined, &parentPidl)))
136 return hr;
137 CComPtr<Folder> pParent; // The parent Folder of the thing we just parsed
139 if (FAILED(hr))
140 return hr;
141
142 return ShellObjectCreatorInit<CFolderItem>(pParent, static_cast<LPITEMIDLIST>(combined), IID_PPV_ARG(FolderItem, ppid));
143}
144
146{
147 TRACE("(%p, %s, %s)\n", this, wine_dbgstr_w(bName), wine_dbgstr_variant(&vOptions));
148
149 // Note: MSDN says vOptions "is not currently used"
150 CComPtr<IStorage> pStg, pStgNew;
152 if (FAILED(hr))
153 goto tryfs;//return hr;
154 hr = pStg->CreateStorage(bName, STGM_FAILIFTHERE, 0, 0, &pStgNew);
155 return (hr == STG_E_FILEALREADYEXISTS) ? S_OK : hr;
156
157tryfs: // HACKFIX: Our CFSFolder does not yet support IStorage, try it directly
158 LPCITEMIDLIST pidlAbsSelf = GetAbsoluteIDList();
159 if (SHGetAttributes(NULL, pidlAbsSelf, SFGAO_FILESYSTEM) == SFGAO_FILESYSTEM)
160 {
161 CComHeapPtr<WCHAR> pszDirPath;
162 if (SUCCEEDED(SHELL_DisplayNameOf(NULL, pidlAbsSelf, SHGDN_FORPARSING, &pszDirPath)))
163 {
164 DWORD cch = wcslen(pszDirPath) + 1 + wcslen(bName) + 1, attr;
165 if (PWSTR pszPath = (PWSTR)SHAlloc(cch * sizeof(WCHAR)))
166 {
167 StringCchPrintfW(pszPath, cch, L"%s\\%s", &pszDirPath[0], bName);
168 if (PathFileExistsAndAttributesW(pszPath, &attr))
170 else
171 hr = Win32CreateDirectoryW(pszPath, NULL) ? S_OK : E_FAIL;
172 SHFree(pszPath);
173 }
174 }
175 }
176 return hr;
177}
178
180{
181 HWND hWnd = NULL;
182 CComHeapPtr<ITEMIDLIST> pidlOneItem;
183 if (SUCCEEDED(VariantToIdlist(&vItem, &pidlOneItem)))
184 return SHELL_GetUIObjectOfAbsoluteItem(hWnd, pidlOneItem, riid, ppv);
185
188 if (SUCCEEDED(VariantQueryInterface(&vItem, IID_PPV_ARG(FolderItems, &pItems))))
189 {
190 long count;
191 if (FAILED(hr = pItems->get_Count(&count)))
192 return hr;
193 if (count <= 0)
195
196 LPITEMIDLIST *ppidls = (LPITEMIDLIST*)SHAlloc(sizeof(*ppidls) * count);
197 if (!ppidls)
198 return E_OUTOFMEMORY;
199 CComPtr<IShellFolder> pFolder;
200 for (UINT i = 0; i < (UINT)count; ++i)
201 {
202 if (SUCCEEDED(hr = GetFolderItem(pItems, i, i == 0 ? &pFolder : NULL, &ppidls[i])))
203 continue;
204 ppidls[i] = NULL;
205 count = i; // Don't free undefined items. Stop the loop.
206 }
207
208 if (SUCCEEDED(hr))
209 hr = pFolder->GetUIObjectOf(hWnd, count, const_cast<LPCITEMIDLIST*>(ppidls), riid, NULL, ppv);
210 _ILFreeaPidl(ppidls, count);
211 }
212 return hr;
213}
214
216{
217 CComPtr<IShellFolder> psfCurrent;
218 HRESULT hr = GetShellFolder(psfCurrent);
219 if (FAILED(hr))
220 return hr;
221
223 if (FAILED_UNEXPECTEDLY(hr = psfCurrent->CreateViewObject(GetHwnd(), IID_PPV_ARG(IDropTarget, &pDT))))
224 return hr;
225
229 return S_FALSE;
231 return hr;
232
233 if (SUCCEEDED(VariantChangeType(&vOptions, &vOptions, 0, VT_I4)))
234 {
236 if (flags)
237 {
238 extern UINT g_cf_FileOpFlags;
239 if (!g_cf_FileOpFlags)
242 }
243 }
245 return SUCCEEDED(hr) ? S_OK : S_FALSE;
246}
247
249{
250 TRACE("(%p, %s, %s)\n", this, wine_dbgstr_variant(&vItem), wine_dbgstr_variant(&vOptions));
251 return CopyMoveOperation(vItem, vOptions, FALSE);
252}
253
255{
256 TRACE("(%p, %s, %s)\n", this, wine_dbgstr_variant(&vItem), wine_dbgstr_variant(&vOptions));
257 return CopyMoveOperation(vItem, vOptions, TRUE);
258}
259
261{
262 TRACE("(%p, %s, %i, %p)\n", this, wine_dbgstr_variant(&vItem), iColumn, pbs);
263
266 if (FAILED(hr))
267 return hr;
268
270 if (pidlItem && iColumn == INFOTIPCOLUMN)
271 {
272 PWSTR pszTip = NULL;
273 if (SUCCEEDED(hr = SHELL_QueryInfoTipAlloc(psf, QITIPF_DEFAULT, pidlItem, &pszTip)))
274 {
275 hr = SHELL_SysAllocString(pszTip, pbs);
276 SHFree(pszTip);
277 return hr;
278 }
279 }
280 else
281 {
282 VARIANT v;
283 if (pbs && SUCCEEDED(SHELL_GetDetailsOfAsStringVariant(psf, pidlItem, iColumn, &v)))
284 {
285 *pbs = V_BSTR(&v);
286 return S_OK;
287 }
288 }
289 return SHELL_SysAllocString(L"", pbs);
290}
291
292
293// *** Folder2 methods ***
295{
296 TRACE("(%p, %p)\n", this, ppfi);
297 if (!ppfi)
298 return E_POINTER;
299
300 return ShellObjectCreatorInit<CFolderItem>(this, GetAbsoluteIDList(), IID_PPV_ARG(FolderItem, ppfi));
301}
302
304{
305 TRACE("(%p, %p)\n", this, pul);
306 return E_NOTIMPL;
307}
308
310{
311 TRACE("(%p)\n", this);
312 return E_NOTIMPL;
313}
314
316{
317 TRACE("(%p, %p)\n", this, pbHaveToShowWebViewBarricade);
318 return E_NOTIMPL;
319}
320
322{
323 TRACE("(%p)\n", this);
324 return E_NOTIMPL;
325}
326
327
HRESULT SH32_SimulateDropWithSite(IDropTarget *pDT, IDataObject *pDO, DWORD grfKeyState, PPOINTL pPtl, LPDWORD pdwEffect, IUnknown *pSite)
UINT g_cf_FileOpFlags
static HRESULT GetFolderItem(FolderItems *pItems, UINT Index, FolderItem **ppItem)
Definition: CFolder.cpp:16
EXTERN_C BOOL WINAPI Win32CreateDirectoryW(LPCWSTR path, LPSECURITY_ATTRIBUTES sec)
Definition: shlfileop.cpp:504
HWND hWnd
Definition: settings.c:17
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define EXTERN_C
Definition: basetyps.h:12
#define STDMETHODCALLTYPE
Definition: bdasup.h:9
static PITEMID_CHILD CloneLeafPidl(const VARIANT *pV)
@ INFOTIPCOLUMN
Definition: CFolder.h:28
~CFolder()
Definition: CFolder.cpp:40
CComHeapPtr< ITEMIDLIST > m_idlist
Definition: CFolder.h:21
IUnknown * GetSite()
Definition: CFolder.h:33
STDMETHOD() MoveHere(VARIANT vItem, VARIANT vOptions) override
Definition: CFolder.cpp:248
STDMETHOD() Items(FolderItems **ppid) override
Definition: CFolder.cpp:107
HRESULT Initialize(LPCITEMIDLIST idlist, IDispatch *pDispatch)
Definition: CFolder.cpp:44
STDMETHOD() CopyHere(VARIANT vItem, VARIANT vOptions) override
Definition: CFolder.cpp:254
STDMETHOD() ParseName(BSTR bName, FolderItem **ppid) override
Definition: CFolder.cpp:113
STDMETHOD() get_ParentFolder(Folder **ppsf) override
Definition: CFolder.cpp:92
static HRESULT GetUIObjectFromVariant(VARIANT &vItem, REFIID riid, void **ppv)
Definition: CFolder.cpp:179
STDMETHOD() NewFolder(BSTR bName, VARIANT vOptions) override
Definition: CFolder.cpp:145
CFolder()
Definition: CFolder.cpp:36
STDMETHOD() get_HaveToShowWebViewBarricade(VARIANT_BOOL *pbHaveToShowWebViewBarricade) override
Definition: CFolder.cpp:315
STDMETHOD() GetDetailsOf(VARIANT vItem, int iColumn, BSTR *pbs) override
Definition: CFolder.cpp:260
HRESULT CopyMoveOperation(VARIANT &vItem, VARIANT vOptions, BOOL bCopy)
Definition: CFolder.cpp:215
CComPtr< IDispatch > m_Application
Definition: CFolder.h:22
LPCITEMIDLIST GetAbsoluteIDList()
Definition: CFolder.h:31
HRESULT GetShellFolder(CComPtr< IShellFolder > &psfCurrent)
Definition: CFolder.cpp:50
STDMETHOD() get_Parent(IDispatch **ppid) override
Definition: CFolder.cpp:82
static HRESULT CreateInstance(LPCITEMIDLIST pidl, IDispatch *pDispatch, REFIID riid, void **ppv)
Definition: CFolder.h:55
STDMETHOD() get_Application(IDispatch **ppid) override
Definition: CFolder.cpp:69
STDMETHOD() get_OfflineStatus(LONG *pul) override
Definition: CFolder.cpp:303
STDMETHOD() Synchronize() override
Definition: CFolder.cpp:309
HWND GetHwnd()
Definition: CFolder.h:32
STDMETHOD() DismissedWebViewBarricade() override
Definition: CFolder.cpp:321
STDMETHOD() get_Self(FolderItem **ppfi) override
Definition: CFolder.cpp:294
STDMETHOD() get_Title(BSTR *pbs) override
Definition: CFolder.cpp:58
void Attach(T *lp)
Definition: atlalloc.h:162
#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 TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
OLECHAR * BSTR
Definition: compat.h:2293
#define MAX_PATH
Definition: compat.h:34
short VARIANT_BOOL
Definition: compat.h:2290
@ VT_I4
Definition: compat.h:2298
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
HRESULT SHELL_DisplayNameOf(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_opt_ UINT Flags, _Out_ PWSTR *ppStr)
Definition: utils.cpp:454
SHSTDAPI SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_opt_ IBindCtx *pBindCtx, _In_ REFIID riid, _Out_ void **ppvObj)
HRESULT DataObj_SetDWORD(IDataObject *pdtobj, UINT cf, DWORD dwValue)
DWORD SHGetAttributes(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwAttributes)
Definition: utils.cpp:496
EXTERN_C HRESULT SHELL_GetUIObjectOfAbsoluteItem(_In_opt_ HWND hWnd, _In_ PCIDLIST_ABSOLUTE pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:428
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:370
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:348
BOOL WINAPI PathFileExistsAndAttributesW(LPCWSTR lpszPath, DWORD *dwAttr)
Definition: path.c:747
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxObject * pParent
Definition: fxdpcapi.cpp:86
const GLdouble * v
Definition: gl.h:2040
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 wine_dbgstr_w
Definition: kernel32.h:34
static int int const SCRIPT_CONTROL const SCRIPT_STATE SCRIPT_ITEM * pItems
Definition: usp10.c:62
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define STGM_FAILIFTHERE
Definition: objbase.h:947
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:240
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_I4(A)
Definition: oleauto.h:247
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:817
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
Definition: pidl.c:2616
BOOL ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWORD type)
Definition: pidl.c:101
HRESULT VariantToIdlist(_In_ VARIANT *pV, _Out_ LPITEMIDLIST *ppidl)
Definition: prop.cpp:68
HRESULT VariantQueryInterface(_In_ VARIANT *pV, _In_ REFIID riid, _Out_ void **ppv)
Definition: prop.cpp:83
#define REFIID
Definition: guiddef.h:118
static HRESULT SHELL_SysAllocString(PCWSTR in, BSTR *out)
Definition: shell32_main.h:262
_In_ UINT _In_ UINT cch
Definition: shellapi.h:432
#define FOF_MULTIDESTFILES
Definition: shellapi.h:141
#define FOF_WANTMAPPINGHANDLE
Definition: shellapi.h:146
HRESULT SHELL_GetDetailsOfAsStringVariant(IShellFolder *pSF, PCUITEMID_CHILD pidl, UINT Column, VARIANT *pVar)
Definition: shlfolder.cpp:116
HRESULT SHELL_QueryInfoTipAlloc(_In_ IShellFolder *pSF, _In_ DWORD dwFlags, _In_ LPCITEMIDLIST pidl, _Out_ PWSTR *ppTip)
Definition: shlfolder.cpp:162
#define QITIPF_DEFAULT
Definition: shlobj.h:699
static BOOL ILIsEmpty(_In_opt_ PCUIDLIST_RELATIVE pidl)
Definition: shlobj.h:2537
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
Definition: cookie.c:202
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * LPCWSTR
Definition: typedefs.h:57
#define ILGDN_INFOLDER
Definition: undocshell.h:86
HRESULT WINAPI DECLSPEC_HOTPATCH VariantChangeType(VARIANTARG *pvargDest, const VARIANTARG *pvargSrc, USHORT wFlags, VARTYPE vt)
Definition: variant.c:939
_In_ WDFCOLLECTION _In_ ULONG Index
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
#define ERROR_NO_DATA
Definition: winerror.h:406
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define STG_E_FILEALREADYEXISTS
Definition: winerror.h:3674
#define E_POINTER
Definition: winerror.h:3480
#define MK_SHIFT
Definition: winuser.h:2405
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)
#define MK_CONTROL
Definition: winuser.h:2406
#define MK_LBUTTON
Definition: winuser.h:2403
#define IID_PPV_ARG(Itype, ppType)