ReactOS 0.4.17-dev-573-g8315b8c
CFolder Class Reference

#include <CFolder.h>

Inheritance diagram for CFolder:
Collaboration diagram for CFolder:

Public Types

enum  { INFOTIPCOLUMN = -1 }
 

Public Member Functions

 CFolder ()
 
 ~CFolder ()
 
HRESULT Initialize (LPCITEMIDLIST idlist, IDispatch *pDispatch)
 
LPCITEMIDLIST GetAbsoluteIDList ()
 
HWND GetHwnd ()
 
IUnknownGetSite ()
 
STDMETHOD() get_Title (BSTR *pbs) override
 
STDMETHOD() get_Application (IDispatch **ppid) override
 
STDMETHOD() get_Parent (IDispatch **ppid) override
 
STDMETHOD() get_ParentFolder (Folder **ppsf) override
 
STDMETHOD() Items (FolderItems **ppid) override
 
STDMETHOD() ParseName (BSTR bName, FolderItem **ppid) override
 
STDMETHOD() NewFolder (BSTR bName, VARIANT vOptions) override
 
STDMETHOD() MoveHere (VARIANT vItem, VARIANT vOptions) override
 
STDMETHOD() CopyHere (VARIANT vItem, VARIANT vOptions) override
 
STDMETHOD() GetDetailsOf (VARIANT vItem, int iColumn, BSTR *pbs) override
 
STDMETHOD() get_Self (FolderItem **ppfi) override
 
STDMETHOD() get_OfflineStatus (LONG *pul) override
 
STDMETHOD() Synchronize () override
 
STDMETHOD() get_HaveToShowWebViewBarricade (VARIANT_BOOL *pbHaveToShowWebViewBarricade) override
 
STDMETHOD() DismissedWebViewBarricade () override
 
- Public Member Functions inherited from ATL::CComObjectRootEx< CComMultiThreadModelNoCS >
 ~CComObjectRootEx ()
 
ULONG InternalAddRef ()
 
ULONG InternalRelease ()
 
void Lock ()
 
void Unlock ()
 
HRESULT _AtlInitialConstruct ()
 
- Public Member Functions inherited from ATL::CComObjectRootBase
 CComObjectRootBase ()
 
 ~CComObjectRootBase ()
 
void SetVoid (void *)
 
HRESULT _AtlFinalConstruct ()
 
HRESULT FinalConstruct ()
 
void InternalFinalConstructAddRef ()
 
void InternalFinalConstructRelease ()
 
void FinalRelease ()
 

Static Public Member Functions

static HRESULT GetUIObjectFromVariant (VARIANT &vItem, REFIID riid, void **ppv)
 
static HRESULT CreateInstance (LPCITEMIDLIST pidl, IDispatch *pDispatch, REFIID riid, void **ppv)
 
static HRESULT CreateInstance (LPCITEMIDLIST pidl, Folder &Instance, REFIID riid, void **ppv)
 
- Static Public Member Functions inherited from ATL::CComObjectRootBase
static void WINAPI ObjectMain (bool)
 
static const struct _ATL_CATMAP_ENTRYGetCategoryMap ()
 
static HRESULT WINAPI InternalQueryInterface (void *pThis, const _ATL_INTMAP_ENTRY *pEntries, REFIID iid, void **ppvObject)
 

Private Member Functions

HRESULT GetShellFolder (CComPtr< IShellFolder > &psfCurrent)
 
HRESULT CopyMoveOperation (VARIANT &vItem, VARIANT vOptions, BOOL bCopy)
 

Private Attributes

CComHeapPtr< ITEMIDLISTm_idlist
 
CComPtr< IDispatchm_Application
 

Additional Inherited Members

- Public Attributes inherited from ATL::CComObjectRootBase
LONG m_dwRef
 

Detailed Description

Definition at line 12 of file CFolder.h.

Member Enumeration Documentation

◆ anonymous enum

anonymous enum
Enumerator
INFOTIPCOLUMN 

Definition at line 28 of file CFolder.h.

28{ INFOTIPCOLUMN = -1 }; // learn.microsoft.com/en-us/windows/win32/shell/folder-getdetailsof
@ INFOTIPCOLUMN
Definition: CFolder.h:28

Constructor & Destructor Documentation

◆ CFolder()

CFolder::CFolder ( )

Definition at line 36 of file CFolder.cpp.

37{
38}

◆ ~CFolder()

CFolder::~CFolder ( )

Definition at line 40 of file CFolder.cpp.

41{
42}

Member Function Documentation

◆ CopyHere()

HRESULT STDMETHODCALLTYPE CFolder::CopyHere ( VARIANT  vItem,
VARIANT  vOptions 
)
override

Definition at line 254 of file CFolder.cpp.

255{
256 TRACE("(%p, %s, %s)\n", this, wine_dbgstr_variant(&vItem), wine_dbgstr_variant(&vOptions));
257 return CopyMoveOperation(vItem, vOptions, TRUE);
258}
HRESULT CopyMoveOperation(VARIANT &vItem, VARIANT vOptions, BOOL bCopy)
Definition: CFolder.cpp:215
#define TRUE
Definition: types.h:120
#define TRACE(s)
Definition: solgame.cpp:4

◆ CopyMoveOperation()

HRESULT CFolder::CopyMoveOperation ( VARIANT vItem,
VARIANT  vOptions,
BOOL  bCopy 
)
private

Definition at line 215 of file CFolder.cpp.

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}
HRESULT SH32_SimulateDropWithSite(IDropTarget *pDT, IDataObject *pDO, DWORD grfKeyState, PPOINTL pPtl, LPDWORD pdwEffect, IUnknown *pSite)
UINT g_cf_FileOpFlags
IUnknown * GetSite()
Definition: CFolder.h:33
static HRESULT GetUIObjectFromVariant(VARIANT &vItem, REFIID riid, void **ppv)
Definition: CFolder.cpp:179
HRESULT GetShellFolder(CComPtr< IShellFolder > &psfCurrent)
Definition: CFolder.cpp:50
HWND GetHwnd()
Definition: CFolder.h:32
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
@ VT_I4
Definition: compat.h:2298
HRESULT DataObj_SetDWORD(IDataObject *pdtobj, UINT cf, DWORD dwValue)
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
#define L(x)
Definition: resources.c:13
GLbitfield flags
Definition: glext.h:7161
unsigned int UINT
Definition: sysinfo.c:13
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define V_I4(A)
Definition: oleauto.h:247
#define FOF_MULTIDESTFILES
Definition: shellapi.h:141
#define FOF_WANTMAPPINGHANDLE
Definition: shellapi.h:146
HRESULT WINAPI DECLSPEC_HOTPATCH VariantChangeType(VARIANTARG *pvargDest, const VARIANTARG *pvargSrc, USHORT wFlags, VARTYPE vt)
Definition: variant.c:939
#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 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)

Referenced by CopyHere(), and MoveHere().

◆ CreateInstance() [1/2]

static HRESULT CFolder::CreateInstance ( LPCITEMIDLIST  pidl,
Folder &  Instance,
REFIID  riid,
void **  ppv 
)
inlinestatic

Definition at line 59 of file CFolder.h.

60 {
61 CComPtr<IDispatch> pDisp;
62 HRESULT hr = Instance.get_Application(&pDisp);
63 return SUCCEEDED(hr) ? CreateInstance(pidl, pDisp, riid, ppv) : hr;
64 }
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
static CInternetFolder * CreateInstance(void)
Definition: inetfolder.c:330
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_WMI_INSTANCE_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_opt_ WDFWMIINSTANCE * Instance
Definition: wdfwmi.h:481

◆ CreateInstance() [2/2]

static HRESULT CFolder::CreateInstance ( LPCITEMIDLIST  pidl,
IDispatch pDispatch,
REFIID  riid,
void **  ppv 
)
inlinestatic

Definition at line 55 of file CFolder.h.

56 {
57 return ShellObjectCreatorInit<CFolder>(pidl, pDispatch, riid, ppv);
58 }

Referenced by CShellDispatch::BrowseForFolder(), CFolderItem::get_GetFolder(), get_ParentFolder(), CShellDispatch::NameSpace(), and ParseName().

◆ DismissedWebViewBarricade()

HRESULT STDMETHODCALLTYPE CFolder::DismissedWebViewBarricade ( )
override

Definition at line 321 of file CFolder.cpp.

322{
323 TRACE("(%p)\n", this);
324 return E_NOTIMPL;
325}
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ get_Application()

HRESULT STDMETHODCALLTYPE CFolder::get_Application ( IDispatch **  ppid)
override

Definition at line 69 of file CFolder.cpp.

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}
CComPtr< IDispatch > m_Application
Definition: CFolder.h:22
#define E_INVALIDARG
Definition: ddrawi.h:101

◆ get_HaveToShowWebViewBarricade()

HRESULT STDMETHODCALLTYPE CFolder::get_HaveToShowWebViewBarricade ( VARIANT_BOOL pbHaveToShowWebViewBarricade)
override

Definition at line 315 of file CFolder.cpp.

316{
317 TRACE("(%p, %p)\n", this, pbHaveToShowWebViewBarricade);
318 return E_NOTIMPL;
319}

◆ get_OfflineStatus()

HRESULT STDMETHODCALLTYPE CFolder::get_OfflineStatus ( LONG pul)
override

Definition at line 303 of file CFolder.cpp.

304{
305 TRACE("(%p, %p)\n", this, pul);
306 return E_NOTIMPL;
307}

◆ get_Parent()

HRESULT STDMETHODCALLTYPE CFolder::get_Parent ( IDispatch **  ppid)
override

Definition at line 82 of file CFolder.cpp.

83{
84 TRACE("(%p %p)\n", this, ppid);
85
86 if (ppid)
87 *ppid = NULL;
88
89 return E_NOTIMPL;
90}

◆ get_ParentFolder()

HRESULT STDMETHODCALLTYPE CFolder::get_ParentFolder ( Folder **  ppsf)
override

Definition at line 92 of file CFolder.cpp.

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}
LPCITEMIDLIST GetAbsoluteIDList()
Definition: CFolder.h:31
static HRESULT CreateInstance(LPCITEMIDLIST pidl, IDispatch *pDispatch, REFIID riid, void **ppv)
Definition: CFolder.h:55
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
static BOOL ILIsEmpty(_In_opt_ PCUIDLIST_RELATIVE pidl)
Definition: shlobj.h:2537
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42

◆ get_Self()

HRESULT STDMETHODCALLTYPE CFolder::get_Self ( FolderItem **  ppfi)
override

Definition at line 294 of file CFolder.cpp.

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}
#define E_POINTER
Definition: winerror.h:3480

◆ get_Title()

HRESULT STDMETHODCALLTYPE CFolder::get_Title ( BSTR pbs)
override

Definition at line 58 of file CFolder.cpp.

59{
60 if (!pbs)
61 return E_POINTER;
62
65 *pbs = SysAllocString(SUCCEEDED(hr) ? path : L"");
66 return S_OK;
67}
CComHeapPtr< ITEMIDLIST > m_idlist
Definition: CFolder.h:21
#define E_FAIL
Definition: ddrawi.h:102
#define MAX_PATH
Definition: compat.h:34
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:240
short WCHAR
Definition: pedump.c:58
BOOL ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWORD type)
Definition: pidl.c:101
#define ILGDN_INFOLDER
Definition: undocshell.h:86

◆ GetAbsoluteIDList()

LPCITEMIDLIST CFolder::GetAbsoluteIDList ( )
inline

Definition at line 31 of file CFolder.h.

31{ return m_idlist; }

Referenced by get_ParentFolder(), get_Self(), GetShellFolder(), Items(), NewFolder(), and ParseName().

◆ GetDetailsOf()

HRESULT STDMETHODCALLTYPE CFolder::GetDetailsOf ( VARIANT  vItem,
int  iColumn,
BSTR pbs 
)
override

Definition at line 260 of file CFolder.cpp.

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}
static PITEMID_CHILD CloneLeafPidl(const VARIANT *pV)
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:370
const GLdouble * v
Definition: gl.h:2040
#define V_BSTR(A)
Definition: oleauto.h:226
static HRESULT SHELL_SysAllocString(PCWSTR in, BSTR *out)
Definition: shell32_main.h:262
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
uint16_t * PWSTR
Definition: typedefs.h:56

◆ GetHwnd()

HWND CFolder::GetHwnd ( )
inline

Definition at line 32 of file CFolder.h.

32{ return NULL; }

Referenced by CopyMoveOperation().

◆ GetShellFolder()

HRESULT CFolder::GetShellFolder ( CComPtr< IShellFolder > &  psfCurrent)
private

Definition at line 50 of file CFolder.cpp.

51{
54 return hr;
55}
SHSTDAPI SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_opt_ IBindCtx *pBindCtx, _In_ REFIID riid, _Out_ void **ppvObj)

Referenced by CopyMoveOperation(), GetDetailsOf(), and ParseName().

◆ GetSite()

IUnknown * CFolder::GetSite ( )
inline

Definition at line 33 of file CFolder.h.

33{ return NULL; }

Referenced by CopyMoveOperation().

◆ GetUIObjectFromVariant()

HRESULT CFolder::GetUIObjectFromVariant ( VARIANT vItem,
REFIID  riid,
void **  ppv 
)
static

Definition at line 179 of file CFolder.cpp.

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}
static HRESULT GetFolderItem(FolderItems *pItems, UINT Index, FolderItem **ppItem)
Definition: CFolder.cpp:16
HWND hWnd
Definition: settings.c:17
EXTERN_C HRESULT SHELL_GetUIObjectOfAbsoluteItem(_In_opt_ HWND hWnd, _In_ PCIDLIST_ABSOLUTE pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:428
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:348
GLuint GLuint GLsizei count
Definition: gl.h:1545
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
static int int const SCRIPT_CONTROL const SCRIPT_STATE SCRIPT_ITEM * pItems
Definition: usp10.c:62
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
Definition: pidl.c:2616
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
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41

Referenced by CopyMoveOperation(), and GetUIObjectOfFolderItems().

◆ Initialize()

HRESULT CFolder::Initialize ( LPCITEMIDLIST  idlist,
IDispatch pDispatch 
)

Definition at line 44 of file CFolder.cpp.

45{
46 m_Application = pDispatch;
47 return SHILClone(idlist, &m_idlist);
48}

◆ Items()

HRESULT STDMETHODCALLTYPE CFolder::Items ( FolderItems **  ppid)
override

Definition at line 107 of file CFolder.cpp.

108{
109 /* FolderItems_Constructor */
110 return ShellObjectCreatorInit<CFolderItems>(GetAbsoluteIDList(), this, IID_PPV_ARG(FolderItems, ppid));
111}

◆ MoveHere()

HRESULT STDMETHODCALLTYPE CFolder::MoveHere ( VARIANT  vItem,
VARIANT  vOptions 
)
override

Definition at line 248 of file CFolder.cpp.

249{
250 TRACE("(%p, %s, %s)\n", this, wine_dbgstr_variant(&vItem), wine_dbgstr_variant(&vOptions));
251 return CopyMoveOperation(vItem, vOptions, FALSE);
252}
#define FALSE
Definition: types.h:117

◆ NewFolder()

HRESULT STDMETHODCALLTYPE CFolder::NewFolder ( BSTR  bName,
VARIANT  vOptions 
)
override

Definition at line 145 of file CFolder.cpp.

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}
EXTERN_C BOOL WINAPI Win32CreateDirectoryW(LPCWSTR path, LPSECURITY_ATTRIBUTES sec)
Definition: shlfileop.cpp:504
_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
DWORD SHGetAttributes(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwAttributes)
Definition: utils.cpp:496
BOOL WINAPI PathFileExistsAndAttributesW(LPCWSTR lpszPath, DWORD *dwAttr)
Definition: path.c:747
unsigned long DWORD
Definition: ntddk_ex.h:95
#define wine_dbgstr_w
Definition: kernel32.h:34
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
#define STGM_FAILIFTHERE
Definition: objbase.h:947
_In_ UINT _In_ UINT cch
Definition: shellapi.h:432
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
Definition: cookie.c:202
#define STG_E_FILEALREADYEXISTS
Definition: winerror.h:3674

◆ ParseName()

HRESULT STDMETHODCALLTYPE CFolder::ParseName ( BSTR  bName,
FolderItem **  ppid 
)
override

Definition at line 113 of file CFolder.cpp.

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}
void Attach(T *lp)
Definition: atlalloc.h:162
FxObject * pParent
Definition: fxdpcapi.cpp:86
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:817

◆ Synchronize()

HRESULT STDMETHODCALLTYPE CFolder::Synchronize ( )
override

Definition at line 309 of file CFolder.cpp.

310{
311 TRACE("(%p)\n", this);
312 return E_NOTIMPL;
313}

Member Data Documentation

◆ m_Application

CComPtr<IDispatch> CFolder::m_Application
private

Definition at line 22 of file CFolder.h.

Referenced by get_Application(), get_ParentFolder(), Initialize(), and ParseName().

◆ m_idlist

CComHeapPtr<ITEMIDLIST> CFolder::m_idlist
private

Definition at line 21 of file CFolder.h.

Referenced by get_Title(), GetAbsoluteIDList(), and Initialize().


The documentation for this class was generated from the following files: