ReactOS 0.4.17-dev-470-gf9e3448
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
17{
18}
19
21{
22}
23
25{
26 m_idlist.Attach(ILClone(idlist));
27 if (!m_idlist)
28 return E_OUTOFMEMORY;
30}
31
33{
36 return hr;
37}
38
39// *** Folder methods ***
41{
42 if (!pbs)
43 return E_POINTER;
44
47 *pbs = SysAllocString(SUCCEEDED(hr) ? path : L"");
48 return S_OK;
49}
50
52{
53 TRACE("(%p, %p)\n", this, ppid);
54
55 if (!ppid)
56 return E_INVALIDARG;
57
58 *ppid = m_Application;
59 (*ppid)->AddRef();
60
61 return S_OK;
62}
63
65{
66 TRACE("(%p %p)\n", this, ppid);
67
68 if (ppid)
69 *ppid = NULL;
70
71 return E_NOTIMPL;
72}
73
75{
76 TRACE("(%p, %p)\n", this, ppsf);
77
78 *ppsf = NULL;
79 LPCITEMIDLIST pidlAbsSelf = GetAbsoluteIDList();
80 if (ILIsEmpty(pidlAbsSelf))
81 return S_FALSE;
82
83 CComHeapPtr<ITEMIDLIST> pidlParent;
84 if (FAILED(SHILCloneParent(pidlAbsSelf, &pidlParent)))
85 return E_OUTOFMEMORY;
86 return ShellObjectCreatorInit<CFolder>(static_cast<LPITEMIDLIST>(pidlParent), IID_PPV_ARG(Folder, ppsf));
87}
88
90{
91 /* FolderItems_Constructor */
92 return ShellObjectCreatorInit<CFolderItems>(GetAbsoluteIDList(), this, IID_PPV_ARG(FolderItems, ppid));
93}
94
96{
97 TRACE("(%p, %s, %p)\n", this, wine_dbgstr_w(bName), ppid);
98 if (!ppid)
99 return E_POINTER;
100 *ppid = NULL;
101
102 CComPtr<IShellFolder> psfCurrent;
103 HRESULT hr = GetShellFolder(psfCurrent);
104 if (FAILED(hr))
105 return hr;
106
108 hr = psfCurrent->ParseDisplayName(NULL, NULL, bName, NULL, &relativePidl, NULL);
109 if (!SUCCEEDED(hr))
110 return S_FALSE;
112 combined.Attach(ILCombine(GetAbsoluteIDList(), relativePidl));
113 if (!combined)
114 return E_OUTOFMEMORY;
115
116 CComHeapPtr<ITEMIDLIST> parentPidl;
117 if (FAILED(hr = SHILCloneParent((LPCITEMIDLIST)combined, &parentPidl)))
118 return hr;
119 CComPtr<Folder> pParent; // The parent Folder of the thing we just parsed
120 hr = ShellObjectCreatorInit<CFolder>(parentPidl, IID_PPV_ARG(Folder, &pParent));
121 if (FAILED(hr))
122 return hr;
123
124 return ShellObjectCreatorInit<CFolderItem>(pParent, static_cast<LPITEMIDLIST>(combined), IID_PPV_ARG(FolderItem, ppid));
125}
126
128{
129 TRACE("(%p, %s, %s)\n", this, wine_dbgstr_w(bName), wine_dbgstr_variant(&vOptions));
130
131 // Note: MSDN says vOptions "is not currently used"
132 CComPtr<IStorage> pStg, pStgNew;
134 if (FAILED(hr))
135 goto tryfs;//return hr;
136 hr = pStg->CreateStorage(bName, STGM_FAILIFTHERE, 0, 0, &pStgNew);
137 return (hr == STG_E_FILEALREADYEXISTS) ? S_OK : hr;
138
139tryfs: // HACKFIX: Our CFSFolder does not yet support IStorage, try it directly
140 LPCITEMIDLIST pidlAbsSelf = GetAbsoluteIDList();
141 if (SHGetAttributes(NULL, pidlAbsSelf, SFGAO_FILESYSTEM) == SFGAO_FILESYSTEM)
142 {
143 CComHeapPtr<WCHAR> pszDirPath;
144 if (SUCCEEDED(SHELL_DisplayNameOf(NULL, pidlAbsSelf, SHGDN_FORPARSING, &pszDirPath)))
145 {
146 DWORD cch = wcslen(pszDirPath) + 1 + wcslen(bName) + 1, attr;
147 if (PWSTR pszPath = (PWSTR)SHAlloc(cch * sizeof(WCHAR)))
148 {
149 StringCchPrintfW(pszPath, cch, L"%s\\%s", &pszDirPath[0], bName);
150 if (PathFileExistsAndAttributesW(pszPath, &attr))
152 else
153 hr = Win32CreateDirectoryW(pszPath, NULL) ? S_OK : E_FAIL;
154 SHFree(pszPath);
155 }
156 }
157 }
158 return hr;
159}
160
162{
163 CComHeapPtr<ITEMIDLIST> pidlOneItem;
164 if (SUCCEEDED(VariantToIdlist(&vItem, &pidlOneItem)))
165 return SHELL_GetUIObjectOfAbsoluteItem(NULL, pidlOneItem, riid, ppv);
166
167 // TODO: CFolderItems array
168 return E_NOTIMPL;
169}
170
172{
173 CComPtr<IShellFolder> psfCurrent;
174 HRESULT hr = GetShellFolder(psfCurrent);
175 if (FAILED(hr))
176 return hr;
177
179 if (FAILED_UNEXPECTEDLY(hr = psfCurrent->CreateViewObject(GetHwnd(), IID_PPV_ARG(IDropTarget, &pDT))))
180 return hr;
181
184 return hr;
185
186 if (SUCCEEDED(VariantChangeType(&vOptions, &vOptions, 0, VT_I4)))
187 {
189 if (flags)
190 {
191 extern UINT g_cf_FileOpFlags;
192 if (!g_cf_FileOpFlags)
195 }
196 }
198 return SUCCEEDED(hr) ? S_OK : S_FALSE;
199}
200
202{
203 TRACE("(%p, %s, %s)\n", this, wine_dbgstr_variant(&vItem), wine_dbgstr_variant(&vOptions));
204 return CopyMoveOperation(vItem, vOptions, FALSE);
205}
206
208{
209 TRACE("(%p, %s, %s)\n", this, wine_dbgstr_variant(&vItem), wine_dbgstr_variant(&vOptions));
210 return CopyMoveOperation(vItem, vOptions, TRUE);
211}
212
214{
215 TRACE("(%p, %s, %i, %p)\n", this, wine_dbgstr_variant(&vItem), iColumn, pbs);
216
219 if (FAILED(hr))
220 return hr;
221
223 if (pidlItem && iColumn == -1)
224 {
225 PWSTR pszTip = NULL;
226 if (SUCCEEDED(hr = SHELL_QueryInfoTipAlloc(psf, QITIPF_DEFAULT, pidlItem, &pszTip)))
227 {
228 hr = SHELL_SysAllocString(pszTip, pbs);
229 SHFree(pszTip);
230 return hr;
231 }
232 }
233 else
234 {
235 VARIANT v;
236 if (pbs && SUCCEEDED(SHELL_GetDetailsOfAsStringVariant(psf, pidlItem, iColumn, &v)))
237 {
238 *pbs = V_BSTR(&v);
239 return S_OK;
240 }
241 }
242 return SHELL_SysAllocString(L"", pbs);
243}
244
245
246// *** Folder2 methods ***
248{
249 TRACE("(%p, %p)\n", this, ppfi);
250 if (!ppfi)
251 return E_POINTER;
252
253 return ShellObjectCreatorInit<CFolderItem>(this, GetAbsoluteIDList(), IID_PPV_ARG(FolderItem, ppfi));
254}
255
257{
258 TRACE("(%p, %p)\n", this, pul);
259 return E_NOTIMPL;
260}
261
263{
264 TRACE("(%p)\n", this);
265 return E_NOTIMPL;
266}
267
269{
270 TRACE("(%p, %p)\n", this, pbHaveToShowWebViewBarricade);
271 return E_NOTIMPL;
272}
273
275{
276 TRACE("(%p)\n", this);
277 return E_NOTIMPL;
278}
279
280
HRESULT SH32_SimulateDropWithSite(IDropTarget *pDT, IDataObject *pDO, DWORD grfKeyState, PPOINTL pPtl, LPDWORD pdwEffect, IUnknown *pSite)
UINT g_cf_FileOpFlags
static HRESULT GetUIObjectFromVariant(VARIANT &vItem, REFIID riid, void **ppv)
Definition: CFolder.cpp:161
EXTERN_C BOOL WINAPI Win32CreateDirectoryW(LPCWSTR path, LPSECURITY_ATTRIBUTES sec)
Definition: shlfileop.cpp:504
#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 PCUITEMID_CHILD GetLeafPidlRef(const VARIANT *pV)
~CFolder()
Definition: CFolder.cpp:20
CComHeapPtr< ITEMIDLIST > m_idlist
Definition: CFolder.h:21
IUnknown * GetSite()
Definition: CFolder.h:31
STDMETHOD() MoveHere(VARIANT vItem, VARIANT vOptions) override
Definition: CFolder.cpp:201
STDMETHOD() Items(FolderItems **ppid) override
Definition: CFolder.cpp:89
STDMETHOD() CopyHere(VARIANT vItem, VARIANT vOptions) override
Definition: CFolder.cpp:207
STDMETHOD() ParseName(BSTR bName, FolderItem **ppid) override
Definition: CFolder.cpp:95
STDMETHOD() get_ParentFolder(Folder **ppsf) override
Definition: CFolder.cpp:74
STDMETHOD() NewFolder(BSTR bName, VARIANT vOptions) override
Definition: CFolder.cpp:127
CFolder()
Definition: CFolder.cpp:16
STDMETHOD() get_HaveToShowWebViewBarricade(VARIANT_BOOL *pbHaveToShowWebViewBarricade) override
Definition: CFolder.cpp:268
STDMETHOD() GetDetailsOf(VARIANT vItem, int iColumn, BSTR *pbs) override
Definition: CFolder.cpp:213
HRESULT CopyMoveOperation(VARIANT &vItem, VARIANT vOptions, BOOL bCopy)
Definition: CFolder.cpp:171
LPCITEMIDLIST GetAbsoluteIDList()
Definition: CFolder.h:29
HRESULT GetShellFolder(CComPtr< IShellFolder > &psfCurrent)
Definition: CFolder.cpp:32
STDMETHOD() get_Parent(IDispatch **ppid) override
Definition: CFolder.cpp:64
STDMETHOD() get_Application(IDispatch **ppid) override
Definition: CFolder.cpp:51
CComPtr< IShellDispatch > m_Application
Definition: CFolder.h:22
HRESULT Initialize(LPCITEMIDLIST idlist)
Definition: CFolder.cpp:24
STDMETHOD() get_OfflineStatus(LONG *pul) override
Definition: CFolder.cpp:256
STDMETHOD() Synchronize() override
Definition: CFolder.cpp:262
HWND GetHwnd()
Definition: CFolder.h:30
STDMETHOD() DismissedWebViewBarricade() override
Definition: CFolder.cpp:274
STDMETHOD() get_Self(FolderItem **ppfi) override
Definition: CFolder.cpp:247
STDMETHOD() get_Title(BSTR *pbs) override
Definition: CFolder.cpp:40
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 WINAPI CShellDispatch_Constructor(REFIID riid, LPVOID *ppvOut)
HRESULT SHELL_DisplayNameOf(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_opt_ UINT Flags, _Out_ PWSTR *ppStr)
Definition: utils.cpp:468
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:510
EXTERN_C HRESULT SHELL_GetUIObjectOfAbsoluteItem(_In_opt_ HWND hWnd, _In_ PCIDLIST_ABSOLUTE pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:442
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
GLbitfield flags
Definition: glext.h:7161
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
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define STGM_FAILIFTHERE
Definition: objbase.h:947
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:238
#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 ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:817
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
#define REFIID
Definition: guiddef.h:118
static HRESULT SHELL_SysAllocString(PCWSTR in, BSTR *out)
Definition: shell32_main.h:259
_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:2536
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
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, VARIANTARG *pvargSrc, USHORT wFlags, VARTYPE vt)
Definition: variant.c:962
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
#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)