ReactOS 0.4.16-dev-1025-gd3456f5
CDesktopFolder Class Reference

#include <CDesktopFolder.h>

Inheritance diagram for CDesktopFolder:
Collaboration diagram for CDesktopFolder:

Public Member Functions

 CDesktopFolder ()
 
 ~CDesktopFolder ()
 
HRESULT WINAPI FinalConstruct ()
 
STDMETHOD() ParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes) override
 
STDMETHOD() EnumObjects (HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList) override
 
STDMETHOD() BindToObject (PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
 
STDMETHOD() BindToStorage (PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
 
STDMETHOD() CompareIDs (LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) override
 
STDMETHOD() CreateViewObject (HWND hwndOwner, REFIID riid, LPVOID *ppvOut) override
 
STDMETHOD() GetAttributesOf (UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
 
STDMETHOD() GetUIObjectOf (HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) override
 
STDMETHOD() GetDisplayNameOf (PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
 
STDMETHOD() SetNameOf (HWND hwndOwner, PCUITEMID_CHILD pidl, LPCOLESTR lpName, DWORD dwFlags, PITEMID_CHILD *pPidlOut) override
 
STDMETHOD() GetDefaultSearchGUID (GUID *pguid) override
 
STDMETHOD() EnumSearches (IEnumExtraSearch **ppenum) override
 
STDMETHOD() GetDefaultColumn (DWORD dwRes, ULONG *pSort, ULONG *pDisplay) override
 
STDMETHOD() GetDefaultColumnState (UINT iColumn, DWORD *pcsFlags) override
 
STDMETHOD() GetDetailsEx (PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pv) override
 
STDMETHOD() GetDetailsOf (PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) override
 
STDMETHOD() MapColumnToSCID (UINT column, SHCOLUMNID *pscid) override
 
STDMETHOD() GetClassID (CLSID *lpClassId) override
 
STDMETHOD() Initialize (PCIDLIST_ABSOLUTE pidl) override
 
STDMETHOD() GetCurFolder (PIDLIST_ABSOLUTE *pidl) override
 
STDMETHOD() CallBack (IShellFolder *psf, HWND hwndOwner, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam) override
 
STDMETHODIMP GetMaxLength (LPCWSTR pszName, int *piMaxNameLen) override
 
STDMETHODIMP GetValidCharacters (LPWSTR *ppwszValidChars, LPWSTR *ppwszInvalidChars) 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 ()
 
HRESULT GetDefaultSearchGUID ([out] GUID *lpguid)
 
HRESULT EnumSearches ([out] IEnumExtraSearch **ppenum)
 
HRESULT GetDefaultColumn ([in] DWORD dwReserved, [out] ULONG *pSort, [out] ULONG *pDisplay)
 
HRESULT GetDefaultColumnState ([in] UINT iColumn, [out] SHCOLSTATEF *pcsFlags)
 
HRESULT GetDetailsEx ([in] PCUITEMID_CHILD pidl, [in] const SHCOLUMNID *pscid, [out] VARIANT *pv)
 
HRESULT GetDetailsOf ([in] PCUITEMID_CHILD pidl, [in] UINT iColumn, [out] SHELLDETAILS *psd)
 
HRESULT MapColumnToSCID ([in] UINT iColumn, [in] SHCOLUMNID *pscid)
 
- Public Member Functions inherited from IShellFolder
HRESULT ParseDisplayName ([in] HWND hwndOwner, [in] LPBC pbcReserved, [in, string] LPOLESTR lpszDisplayName, [out] ULONG *pchEaten, [out] PIDLIST_RELATIVE *ppidl, [in, out, unique] ULONG *pdwAttributes)
 
HRESULT EnumObjects ([in] HWND hwndOwner, [in] SHCONTF grfFlags, [out] IEnumIDList **ppenumIDList)
 
HRESULT BindToObject ([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
 
HRESULT BindToStorage ([in] PCUIDLIST_RELATIVE pidl, [in] LPBC pbcReserved, [in] REFIID riid, [out, iid_is(riid)] void **ppvObj)
 
HRESULT CompareIDs ([in] LPARAM lParam, [in] PCUIDLIST_RELATIVE pidl1, [in] PCUIDLIST_RELATIVE pidl2)
 
HRESULT CreateViewObject ([in] HWND hwndOwner, [in] REFIID riid, [out, iid_is(riid)] void **ppvOut)
 
HRESULT GetAttributesOf ([in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut)
 
HRESULT GetUIObjectOf ([in] HWND hwndOwner, [in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in] REFIID riid, [in, out, unique] UINT *prgfInOut, [out, iid_is(riid)] void **ppvOut)
 
HRESULT GetDisplayNameOf ([in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName)
 
HRESULT SetNameOf ([in] HWND hwnd, [in] PCUITEMID_CHILD pidl, [in, string] LPCOLESTR lpszName, [in] SHGDNF uFlags, [out] PITEMID_CHILD *ppidlOut)
 
- Public Member Functions inherited from IUnknown
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 
HRESULT GetCurFolder ([out] PIDLIST_ABSOLUTE *ppidl)
 
HRESULT Initialize ([in] PCIDLIST_ABSOLUTE pidl)
 
HRESULT GetClassID ([out] CLSID *pClassID)
 
HRESULT CallBack ([in] IShellFolder *psf, [in] HWND hwndOwner, [in] IDataObject *pdtobj, [in] UINT uMsg, [in] WPARAM wParam, [in] LPARAM lParam)
 

Static Public Member Functions

static BOOL IsCommonItem (LPCITEMIDLIST pidl)
 
- 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 _GetSFFromPidl (LPCITEMIDLIST pidl, IShellFolder2 **psf)
 
HRESULT _ParseDisplayNameByParent (HWND hwndOwner, LPBC pbc, LPOLESTR pszPath, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
 
STDMETHODIMP ShellUrlParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
 
STDMETHODIMP HttpUrlParseDisplayName (HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
 

Static Private Member Functions

static HRESULT GetColumnDetails (UINT iColumn, SHELLDETAILS &sd)
 

Private Attributes

CComPtr< IShellFolder2m_DesktopFSFolder
 
CComPtr< IShellFolder2m_SharedDesktopFSFolder
 
CComPtr< IShellFolder2m_regFolder
 
LPWSTR sPathTarget
 
LPITEMIDLIST pidlRoot
 

Additional Inherited Members

- Public Types inherited from IShellFolder2
typedef struct IShellFolder2::SHCOLUMNIDLPSHCOLUMNID
 
typedef const SHCOLUMNIDLPCSHCOLUMNID
 
- Public Types inherited from IShellFolder
enum  tagSHGDN {
  SHGDN_NORMAL = 0 , SHGDN_INFOLDER = 1 , SHGDN_FOREDITING = 0x1000 , SHGDN_INCLUDE_NONFILESYS = 0x2000 ,
  SHGDN_FORADDRESSBAR = 0x4000 , SHGDN_FORPARSING = 0x8000
}
 
enum  tagSHCONTF {
  SHCONTF_FOLDERS = 32 , SHCONTF_NONFOLDERS = 64 , SHCONTF_INCLUDEHIDDEN = 128 , SHCONTF_INIT_ON_FIRST_NEXT = 256 ,
  SHCONTF_NETPRINTERSRCH = 512 , SHCONTF_SHAREABLE = 1024 , SHCONTF_STORAGE = 2048 , SHCONTF_NAVIGATION_ENUM = 0x01000 ,
  SHCONTF_FASTITEMS = 0x02000 , SHCONTF_FLATLIST = 0x04000 , SHCONTF_ENABLE_ASYNC = 0x08000 , SHCONTF_INCLUDESUPERHIDDEN = 0x10000
}
 
typedef IShellFolderLPSHELLFOLDER
 
typedef enum IShellFolder::tagSHGDN SHGNO
 
typedef DWORD SHGDNF
 
typedef DWORD SHCONTF
 
typedef ULONG SFGAOF
 
- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 
- Public Types inherited from IPersistFolder2
typedef IPersistFolder2LPPERSISTFOLDER2
 
- Public Types inherited from IPersistFolder
typedef IPersistFolderLPPERSISTFOLDER
 
- Public Types inherited from IPersist
typedef IPersistLPPERSIST
 
- Public Attributes inherited from ATL::CComObjectRootBase
LONG m_dwRef
 

Detailed Description

Definition at line 26 of file CDesktopFolder.h.

Constructor & Destructor Documentation

◆ CDesktopFolder()

CDesktopFolder::CDesktopFolder ( )

Definition at line 249 of file CDesktopFolder.cpp.

249 :
252{
253}
LPITEMIDLIST pidlRoot
#define NULL
Definition: types.h:112

◆ ~CDesktopFolder()

CDesktopFolder::~CDesktopFolder ( )

Definition at line 255 of file CDesktopFolder.cpp.

256{
257}

Member Function Documentation

◆ _GetSFFromPidl()

HRESULT CDesktopFolder::_GetSFFromPidl ( LPCITEMIDLIST  pidl,
IShellFolder2 **  psf 
)
private

Definition at line 305 of file CDesktopFolder.cpp.

306{
307 if (IsRegItem(pidl))
308 return m_regFolder->QueryInterface(IID_PPV_ARG(IShellFolder2, psf));
309#if DBG
310 if (_ILIsDesktop(pidl))
311 {
312 FIXME("Desktop is unexpected here!\n");
313 }
314 else if (_ILIsSpecialFolder(pidl))
315 {
316 FIXME("Unexpected PIDL type %#x\n", pidl->mkid.abID[0]);
317 }
318#endif
320 return pSF->QueryInterface(IID_PPV_ARG(IShellFolder2, psf));
321}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
static const CLSID * IsRegItem(LPCITEMIDLIST pidl)
#define FIXME(fmt,...)
Definition: precomp.h:53
CComPtr< IShellFolder2 > m_SharedDesktopFSFolder
static BOOL IsCommonItem(LPCITEMIDLIST pidl)
CComPtr< IShellFolder2 > m_DesktopFSFolder
CComPtr< IShellFolder2 > m_regFolder
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
BOOL _ILIsSpecialFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2119
#define IID_PPV_ARG(Itype, ppType)

Referenced by BindToObject(), GetAttributesOf(), GetDetailsEx(), GetDetailsOf(), GetDisplayNameOf(), GetUIObjectOf(), and SetNameOf().

◆ _ParseDisplayNameByParent()

HRESULT CDesktopFolder::_ParseDisplayNameByParent ( HWND  hwndOwner,
LPBC  pbc,
LPOLESTR  pszPath,
DWORD pchEaten,
PIDLIST_RELATIVE ppidl,
DWORD pdwAttributes 
)
private

Definition at line 323 of file CDesktopFolder.cpp.

330{
331 if (pchEaten)
332 *pchEaten = 0;
333
334 CComHeapPtr<ITEMIDLIST> pidlParent;
335 BOOL bPath = FALSE;
336 WCHAR wch = *lpszDisplayName;
337 if (((L'A' <= wch && wch <= L'Z') || (L'a' <= wch && wch <= L'z')) &&
338 (lpszDisplayName[1] == L':'))
339 {
340 // "C:..."
341 bPath = TRUE;
342 pidlParent.Attach(_ILCreateMyComputer());
343 }
344 else if (PathIsUNCW(lpszDisplayName)) // "\\\\..."
345 {
346 bPath = TRUE;
347 pidlParent.Attach(_ILCreateNetwork());
348 }
349
350 if (bPath)
351 {
352 if (!pidlParent)
353 return E_OUTOFMEMORY;
354
355 CComPtr<IShellFolder> pParentFolder;
356 SHBindToObject(NULL, pidlParent, IID_PPV_ARG(IShellFolder, &pParentFolder));
357
358 CComHeapPtr<ITEMIDLIST> pidlChild;
359 HRESULT hr = pParentFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName,
360 pchEaten, &pidlChild, pdwAttributes);
361 if (FAILED(hr))
362 return hr;
363
364 *ppidl = ILCombine(pidlParent, pidlChild);
365 return (*ppidl ? S_OK : E_OUTOFMEMORY);
366 }
367
368 if (!UrlIsW(lpszDisplayName, URLIS_URL) || SHSkipJunctionBinding(pbc, NULL))
369 return E_INVALIDARG;
370
371 // Now lpszDisplayName is a URL
372 PARSEDURLW ParsedURL = { sizeof(ParsedURL) };
373 ::ParseURLW(lpszDisplayName, &ParsedURL);
374
375 switch (ParsedURL.nScheme)
376 {
377 case URL_SCHEME_FILE: // "file:..."
378 {
379 // Convert "file://..." to a normal path
381 DWORD cchPath = _countof(szPath);
382 HRESULT hr = PathCreateFromUrlW(lpszDisplayName, szPath, &cchPath, 0);
384 return hr;
385
386 CComPtr<IShellFolder> psfDesktop;
387 hr = SHGetDesktopFolder(&psfDesktop);
389 return hr;
390
391 // Parse by desktop folder
392 return psfDesktop->ParseDisplayName(hwndOwner, pbc, szPath, pchEaten, ppidl,
393 pdwAttributes);
394 }
395 case URL_SCHEME_HTTP: // "http:..."
396 case URL_SCHEME_HTTPS: // "https:..."
397 {
398 if (!BindCtx_ContainsObject(pbc, STR_PARSE_PREFER_FOLDER_BROWSING))
399 return E_INVALIDARG;
400
401 return HttpUrlParseDisplayName(hwndOwner,
402 pbc,
403 lpszDisplayName,
404 pchEaten,
405 ppidl,
406 pdwAttributes);
407 }
408 case URL_SCHEME_SHELL: // "shell:..."
409 {
410 return ShellUrlParseDisplayName(hwndOwner,
411 pbc,
412 lpszDisplayName,
413 pchEaten,
414 ppidl,
415 pdwAttributes);
416 }
419 {
420 WARN("We don't support 'ms-shell-rooted:' and 'ms-shell-idlist:' schemes\n");
421 break;
422 }
423 default:
424 {
425 TRACE("Scheme: %u\n", ParsedURL.nScheme);
426 break;
427 }
428 }
429
430 return E_INVALIDARG;
431}
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
#define WARN(fmt,...)
Definition: precomp.h:61
STDMETHODIMP HttpUrlParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
STDMETHODIMP ShellUrlParseDisplayName(HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define MAX_PATH
Definition: compat.h:34
#define FAILED_UNEXPECTEDLY(hr)
Definition: debug.h:83
BOOL BindCtx_ContainsObject(_In_ IBindCtx *pBindCtx, _In_ LPCWSTR pszName)
Definition: utils.cpp:270
EXTERN_C HRESULT SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:370
BOOL SHSkipJunctionBinding(_In_ IBindCtx *pbc, _In_ CLSID *pclsid)
Definition: utils.cpp:291
HRESULT WINAPI PathCreateFromUrlW(LPCWSTR pszUrl, LPWSTR pszPath, LPDWORD pcchPath, DWORD dwReserved)
Definition: path.c:3361
BOOL WINAPI PathIsUNCW(LPCWSTR lpszPath)
Definition: path.c:2272
HRESULT WINAPI ParseURLW(LPCWSTR x, PARSEDURLW *y)
Definition: url.c:197
BOOL WINAPI UrlIsW(LPCWSTR pszUrl, URLIS Urlis)
Definition: url.c:1933
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
LPCWSTR szPath
Definition: env.c:37
#define L(x)
Definition: ntvdm.h:50
LPITEMIDLIST _ILCreateMyComputer(void)
Definition: pidl.c:1798
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:816
LPITEMIDLIST _ILCreateNetwork(void)
Definition: pidl.c:1861
HRESULT hr
Definition: shlfolder.c:183
@ URL_SCHEME_MSSHELLROOTED
Definition: shlwapi.h:1200
@ URL_SCHEME_HTTPS
Definition: shlwapi.h:1192
@ URL_SCHEME_MSSHELLIDLIST
Definition: shlwapi.h:1201
@ URL_SCHEME_HTTP
Definition: shlwapi.h:1183
@ URL_SCHEME_FILE
Definition: shlwapi.h:1190
@ URL_SCHEME_SHELL
Definition: shlwapi.h:1193
@ URLIS_URL
Definition: shlwapi.h:1226
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
UINT nScheme
Definition: shlwapi.h:1472
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by ParseDisplayName().

◆ BindToObject()

HRESULT WINAPI CDesktopFolder::BindToObject ( PCUIDLIST_RELATIVE  pidl,
LPBC  pbcReserved,
REFIID  riid,
LPVOID ppvOut 
)
override

Definition at line 576 of file CDesktopFolder.cpp.

581{
582 if (!pidl)
583 return E_INVALIDARG;
584
585 CComPtr<IShellFolder2> psf;
586 HRESULT hr = _GetSFFromPidl(pidl, &psf);
588 return hr;
589
590 return psf->BindToObject(pidl, pbcReserved, riid, ppvOut);
591}
HRESULT _GetSFFromPidl(LPCITEMIDLIST pidl, IShellFolder2 **psf)
REFIID riid
Definition: atlbase.h:39

Referenced by GetUIObjectOf().

◆ BindToStorage()

HRESULT WINAPI CDesktopFolder::BindToStorage ( PCUIDLIST_RELATIVE  pidl,
LPBC  pbcReserved,
REFIID  riid,
LPVOID ppvOut 
)
override

Definition at line 596 of file CDesktopFolder.cpp.

601{
602 FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n",
603 this, pidl, pbcReserved, shdebugstr_guid (&riid), ppvOut);
604
605 *ppvOut = NULL;
606 return E_NOTIMPL;
607}
#define E_NOTIMPL
Definition: ddrawi.h:99
const char * shdebugstr_guid(const struct _GUID *id)
Definition: debughlp.cpp:438

◆ CallBack()

HRESULT WINAPI CDesktopFolder::CallBack ( IShellFolder psf,
HWND  hwndOwner,
IDataObject pdtobj,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)
override

Implements IContextMenuCB.

Definition at line 1047 of file CDesktopFolder.cpp.

1048{
1049 enum { IDC_PROPERTIES };
1050 if (uMsg == DFM_INVOKECOMMAND && wParam == (pdtobj ? DFM_CMD_PROPERTIES : IDC_PROPERTIES))
1051 {
1052 return SHELL_ExecuteControlPanelCPL(hwndOwner, L"desk.cpl") ? S_OK : E_FAIL;
1053 }
1054 else if (uMsg == DFM_MERGECONTEXTMENU && !pdtobj) // Add Properties item when called for directory background
1055 {
1056 QCMINFO *pqcminfo = (QCMINFO *)lParam;
1057 HMENU hpopup = CreatePopupMenu();
1059 pqcminfo->idCmdFirst = Shell_MergeMenus(pqcminfo->hmenu, hpopup, pqcminfo->indexMenu, pqcminfo->idCmdFirst, pqcminfo->idCmdLast, MM_ADDSEPARATOR);
1060 DestroyMenu(hpopup);
1061 return S_OK;
1062 }
1063 return SHELL32_DefaultContextMenuCallBack(psf, pdtobj, uMsg);
1064}
#define IDS_PROPERTIES
Definition: resource.h:108
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define E_FAIL
Definition: ddrawi.h:102
#define IDC_PROPERTIES
Definition: resource.h:32
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
#define SHELL_ExecuteControlPanelCPL(hwnd, cpl)
Definition: precomp.h:188
HRESULT SHELL32_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdo, UINT msg)
Definition: shlfolder.cpp:613
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
void WINAPI _InsertMenuItemW(HMENU hmenu, UINT indexMenu, BOOL fByPosition, UINT wID, UINT fType, LPCWSTR dwTypeData, UINT fState)
UINT WINAPI Shell_MergeMenus(HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags)
Definition: shlmenu.c:856
#define MM_ADDSEPARATOR
Definition: shlobj.h:2536
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2620
HMENU hmenu
Definition: shlobj.h:1398
UINT idCmdLast
Definition: shlobj.h:1401
UINT idCmdFirst
Definition: shlobj.h:1400
UINT indexMenu
Definition: shlobj.h:1399
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define MFS_ENABLED
Definition: winuser.h:761
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define MFT_STRING
Definition: winuser.h:757
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582

◆ CompareIDs()

HRESULT WINAPI CDesktopFolder::CompareIDs ( LPARAM  lParam,
PCUIDLIST_RELATIVE  pidl1,
PCUIDLIST_RELATIVE  pidl2 
)
override

Implements IShellFolder.

Definition at line 612 of file CDesktopFolder.cpp.

613{
614 bool bIsDesktopFolder1, bIsDesktopFolder2;
615
616 if (!pidl1 || !pidl2)
617 {
618 ERR("Got null pidl pointer (%Ix %p %p)!\n", lParam, pidl1, pidl2);
619 return E_INVALIDARG;
620 }
621
622 bIsDesktopFolder1 = _ILIsDesktop(pidl1);
623 bIsDesktopFolder2 = _ILIsDesktop(pidl2);
624 if (bIsDesktopFolder1 || bIsDesktopFolder2)
625 return MAKE_COMPARE_HRESULT(bIsDesktopFolder1 - bIsDesktopFolder2);
626
627 if (_ILIsSpecialFolder(pidl1) || _ILIsSpecialFolder(pidl2))
628 return m_regFolder->CompareIDs(lParam, pidl1, pidl2);
629
630 HRESULT ret = m_DesktopFSFolder->CompareIDs(lParam, pidl1, pidl2);
631 if (ret == 0 && ((lParam & SHCIDS_COLUMNMASK) == SHFSF_COL_NAME || (lParam & (SHCIDS_ALLFIELDS | SHCIDS_CANONICALONLY))))
633 return ret;
634}
#define SHCIDS_ALLFIELDS
Definition: CFontExt.cpp:14
#define ERR(fmt,...)
Definition: precomp.h:57
#define SHCIDS_CANONICALONLY
Definition: shobjidl.idl:226
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:630
#define SHFSF_COL_NAME
Definition: shfldr.h:44
int ret

◆ CreateViewObject()

HRESULT WINAPI CDesktopFolder::CreateViewObject ( HWND  hwndOwner,
REFIID  riid,
LPVOID ppvOut 
)
override

Definition at line 639 of file CDesktopFolder.cpp.

643{
645
646 TRACE ("(%p)->(hwnd=%p,%s,%p)\n",
647 this, hwndOwner, shdebugstr_guid (&riid), ppvOut);
648
649 if (!ppvOut)
650 return hr;
651
652 *ppvOut = NULL;
653
654 if (IsEqualIID (riid, IID_IDropTarget))
655 {
656 hr = m_DesktopFSFolder->CreateViewObject(hwndOwner, riid, ppvOut);
657 }
658 else if (IsEqualIID (riid, IID_IContextMenu))
659 {
660 HKEY hKeys[16];
661 UINT cKeys = 0;
662 AddClassKeyToArray(L"Directory\\Background", hKeys, &cKeys);
663
664 DEFCONTEXTMENU dcm;
665 dcm.hwnd = hwndOwner;
666 dcm.pcmcb = this;
667 dcm.pidlFolder = pidlRoot;
668 dcm.psf = this;
669 dcm.cidl = 0;
670 dcm.apidl = NULL;
671 dcm.cKeys = cKeys;
672 dcm.aKeys = hKeys;
674 hr = SHCreateDefaultContextMenu (&dcm, riid, ppvOut);
675 }
676 else if (IsEqualIID (riid, IID_IShellView))
677 {
678 CComPtr<CDesktopFolderViewCB> sfviewcb;
679 if (SUCCEEDED(hr = ShellObjectCreator(sfviewcb)))
680 {
681 SFV_CREATE create = { sizeof(create), this, NULL, sfviewcb };
683 if (SUCCEEDED(hr))
684 sfviewcb->Initialize((IShellView*)*ppvOut);
685 }
686 }
687 TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut);
688 return hr;
689}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:4793
HRESULT WINAPI SHCreateDefaultContextMenu(const DEFCONTEXTMENU *pdcm, REFIID riid, void **ppv)
#define SUCCEEDED(hr)
Definition: intsafe.h:50
static const struct access_res create[16]
Definition: package.c:7505
unsigned int UINT
Definition: ndis.h:50
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:408
IContextMenuCB * pcmcb
Definition: shlobj.h:2558
IShellFolder * psf
Definition: shlobj.h:2560
IUnknown * punkAssociationInfo
Definition: shlobj.h:2563
PCUITEMID_CHILD_ARRAY apidl
Definition: shlobj.h:2562
const HKEY * aKeys
Definition: shlobj.h:2565
PCIDLIST_ABSOLUTE pidlFolder
Definition: shlobj.h:2559

◆ EnumObjects()

HRESULT WINAPI CDesktopFolder::EnumObjects ( HWND  hwndOwner,
DWORD  dwFlags,
LPENUMIDLIST *  ppEnumIDList 
)
override

Definition at line 550 of file CDesktopFolder.cpp.

551{
552 CComPtr<IEnumIDList> pRegEnumerator;
553 CComPtr<IEnumIDList> pDesktopEnumerator;
554 CComPtr<IEnumIDList> pCommonDesktopEnumerator;
555 HRESULT hr;
556
557 hr = m_regFolder->EnumObjects(hwndOwner, dwFlags, &pRegEnumerator);
558 if (FAILED(hr))
559 ERR("EnumObjects for reg folder failed\n");
560
561 hr = m_DesktopFSFolder->EnumObjects(hwndOwner, dwFlags, &pDesktopEnumerator);
562 if (FAILED(hr))
563 ERR("EnumObjects for desktop fs folder failed\n");
564
565 hr = m_SharedDesktopFSFolder->EnumObjects(hwndOwner, dwFlags, &pCommonDesktopEnumerator);
566 if (FAILED(hr))
567 ERR("EnumObjects for shared desktop fs folder failed\n");
568
569 return ShellObjectCreatorInit<CDesktopFolderEnum>(m_regFolder, dwFlags, pRegEnumerator, pDesktopEnumerator,
570 pCommonDesktopEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
571}
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176

◆ EnumSearches()

HRESULT WINAPI CDesktopFolder::EnumSearches ( IEnumExtraSearch **  ppenum)
override

Implements IShellFolder2.

Definition at line 919 of file CDesktopFolder.cpp.

920{
921 FIXME ("(%p)\n", this);
922 return E_NOTIMPL;
923}

◆ FinalConstruct()

HRESULT WINAPI CDesktopFolder::FinalConstruct ( )

Definition at line 259 of file CDesktopFolder.cpp.

260{
261 WCHAR szMyPath[MAX_PATH];
262 HRESULT hr;
263
264 /* Create the root pidl */
266 if (!pidlRoot)
267 return E_OUTOFMEMORY;
268
269 /* Create the inner fs folder */
271 &CLSID_ShellFSFolder,
275 return hr;
276
277 /* Create the inner shared fs folder. Dont fail on failure. */
279 &CLSID_ShellFSFolder,
283 return hr;
284
285 /* Create the inner reg folder */
286 REGFOLDERINITDATA RegInit = { static_cast<IShellFolder*>(this), &g_RegFolderInfo };
287 hr = CRegFolder_CreateInstance(&RegInit,
288 pidlRoot,
291 return hr;
292
293 /* Cache the path to the user desktop directory */
295 return E_UNEXPECTED;
296
297 sPathTarget = (LPWSTR)SHAlloc((wcslen(szMyPath) + 1) * sizeof(WCHAR));
298 if (!sPathTarget)
299 return E_OUTOFMEMORY;
300
301 wcscpy(sPathTarget, szMyPath);
302 return S_OK;
303}
static const REGFOLDERINFO g_RegFolderInfo
static HRESULT SHELL32_CoCreateInitSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidlChild, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: CFindFolder.cpp:13
HRESULT CRegFolder_CreateInstance(PREGFOLDERINITDATA pInit, LPCITEMIDLIST pidlRoot, REFIID riid, void **ppv)
Definition: CRegFolder.cpp:970
wcscpy
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:304
BOOL WINAPI SHGetSpecialFolderPathW(HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:3243
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
LPITEMIDLIST _ILCreateDesktop(void)
Definition: pidl.c:1787
#define CSIDL_COMMON_DESKTOPDIRECTORY
Definition: shlobj.h:2205
#define CSIDL_DESKTOPDIRECTORY
Definition: shlobj.h:2196
#define E_UNEXPECTED
Definition: winerror.h:2456
WCHAR * LPWSTR
Definition: xmlstorage.h:184

◆ GetAttributesOf()

HRESULT WINAPI CDesktopFolder::GetAttributesOf ( UINT  cidl,
PCUITEMID_CHILD_ARRAY  apidl,
DWORD rgfInOut 
)
override

Definition at line 694 of file CDesktopFolder.cpp.

698{
699 HRESULT hr = S_OK;
700
701 TRACE("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n",
702 this, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0);
703
704 if (cidl && !apidl)
705 return E_INVALIDARG;
706
707 if (*rgfInOut == 0)
708 *rgfInOut = ~0;
709
710 if(cidl == 0)
711 *rgfInOut &= dwDesktopAttributes;
712 else
713 {
714 /* TODO: always add SFGAO_CANLINK */
715 for (UINT i = 0; i < cidl; ++i)
716 {
717 pdump(apidl[i]);
718 if (_ILIsDesktop(apidl[i]))
719 *rgfInOut &= dwDesktopAttributes;
720 else if (_ILIsMyComputer(apidl[i]))
721 *rgfInOut &= dwMyComputerAttributes;
722 else if (IsRegItem(apidl[i], CLSID_NetworkPlaces))
723 *rgfInOut &= dwMyNetPlacesAttributes;
724 else if (_ILIsFolderOrFile(apidl[i]) || _ILIsSpecialFolder(apidl[i]))
725 {
726 CComPtr<IShellFolder2> psf;
727 HRESULT hr = _GetSFFromPidl(apidl[i], &psf);
729 continue;
730
731 psf->GetAttributesOf(1, &apidl[i], rgfInOut);
732 }
733 else
734 ERR("Got an unknown pidl type!!!\n");
735 }
736 }
737 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
738 *rgfInOut &= ~SFGAO_VALIDATE;
739
740 TRACE("-- result=0x%08x\n", *rgfInOut);
741
742 return hr;
743}
static const DWORD dwMyComputerAttributes
static const DWORD dwDesktopAttributes
static DWORD dwMyNetPlacesAttributes
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:322
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
BOOL _ILIsMyComputer(LPCITEMIDLIST pidl)
Definition: pidl.c:2097

◆ GetClassID()

HRESULT WINAPI CDesktopFolder::GetClassID ( CLSID lpClassId)
override

Implements IPersist.

Definition at line 1015 of file CDesktopFolder.cpp.

1016{
1017 TRACE ("(%p)\n", this);
1018
1019 if (!lpClassId)
1020 return E_POINTER;
1021
1022 *lpClassId = CLSID_ShellDesktop;
1023
1024 return S_OK;
1025}
#define E_POINTER
Definition: winerror.h:2365

◆ GetColumnDetails()

HRESULT CDesktopFolder::GetColumnDetails ( UINT  iColumn,
SHELLDETAILS sd 
)
staticprivate

Definition at line 972 of file CDesktopFolder.cpp.

973{
974 /* CDesktopFolder may override the flags and/or name if desired */
975 return CFSFolder::GetFSColumnDetails(iColumn, sd);
976}
static HRESULT GetFSColumnDetails(UINT iColumn, SHELLDETAILS &sd)
Definition: CFSFolder.cpp:595
static const WCHAR sd[]
Definition: suminfo.c:286

Referenced by GetDetailsOf().

◆ GetCurFolder()

HRESULT WINAPI CDesktopFolder::GetCurFolder ( PIDLIST_ABSOLUTE pidl)
override

Implements IPersistFolder2.

Definition at line 1037 of file CDesktopFolder.cpp.

1038{
1039 TRACE ("(%p)->(%p)\n", this, pidl);
1040
1041 if (!pidl)
1042 return E_INVALIDARG; /* xp doesn't have this check and crashes on NULL */
1043 *pidl = ILClone (pidlRoot);
1044 return S_OK;
1045}
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237

◆ GetDefaultColumn()

HRESULT WINAPI CDesktopFolder::GetDefaultColumn ( DWORD  dwRes,
ULONG pSort,
ULONG pDisplay 
)
override

Implements IShellFolder2.

Definition at line 925 of file CDesktopFolder.cpp.

926{
927 TRACE ("(%p)\n", this);
928
929 if (pSort)
930 *pSort = 0;
931 if (pDisplay)
932 *pDisplay = 0;
933
934 return S_OK;
935}

◆ GetDefaultColumnState()

HRESULT WINAPI CDesktopFolder::GetDefaultColumnState ( UINT  iColumn,
DWORD pcsFlags 
)
override

Implements IShellFolder2.

Definition at line 937 of file CDesktopFolder.cpp.

938{
939 HRESULT hr;
940 TRACE ("(%p)\n", this);
941
942 if (!pcsFlags)
943 return E_INVALIDARG;
944
945 hr = CFSFolder::GetDefaultFSColumnState(iColumn, *pcsFlags);
946 /*
947 // CDesktopFolder may override the flags if desired (future)
948 switch(iColumn)
949 {
950 case SHFSF_COL_FATTS:
951 *pcsFlags &= ~SHCOLSTATE_ONBYDEFAULT;
952 break;
953 }
954 */
955 return hr;
956}
static HRESULT GetDefaultFSColumnState(UINT iColumn, SHCOLSTATEF &csFlags)
Definition: CFSFolder.cpp:605

◆ GetDefaultSearchGUID()

HRESULT WINAPI CDesktopFolder::GetDefaultSearchGUID ( GUID pguid)
override

Implements IShellFolder2.

Definition at line 913 of file CDesktopFolder.cpp.

914{
915 FIXME ("(%p)\n", this);
916 return E_NOTIMPL;
917}

◆ GetDetailsEx()

HRESULT WINAPI CDesktopFolder::GetDetailsEx ( PCUITEMID_CHILD  pidl,
const SHCOLUMNID pscid,
VARIANT pv 
)
override

Implements IShellFolder2.

Definition at line 958 of file CDesktopFolder.cpp.

960{
961 HRESULT hr;
962 CComPtr<IShellFolder2> psf;
963 if (FAILED_UNEXPECTEDLY(hr = _GetSFFromPidl(pidl, &psf)))
964 return hr;
965 return psf->GetDetailsEx(pidl, pscid, pv);
966}

◆ GetDetailsOf()

HRESULT WINAPI CDesktopFolder::GetDetailsOf ( PCUITEMID_CHILD  pidl,
UINT  iColumn,
SHELLDETAILS psd 
)
override

Implements IShellFolder2.

Definition at line 978 of file CDesktopFolder.cpp.

982{
983 if (!psd)
984 return E_INVALIDARG;
985
986 if (!pidl)
987 {
988 return GetColumnDetails(iColumn, *psd);
989 }
990
991 CComPtr<IShellFolder2> psf;
992 HRESULT hr = _GetSFFromPidl(pidl, &psf);
994 return hr;
995
996 hr = psf->GetDetailsOf(pidl, iColumn, psd);
998 return hr;
999
1000 return hr;
1001}
static HRESULT GetColumnDetails(UINT iColumn, SHELLDETAILS &sd)

◆ GetDisplayNameOf()

HRESULT WINAPI CDesktopFolder::GetDisplayNameOf ( PCUITEMID_CHILD  pidl,
DWORD  dwFlags,
LPSTRRET  strRet 
)
override

Definition at line 857 of file CDesktopFolder.cpp.

858{
859 TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet);
860 pdump (pidl);
861
862 if (!strRet)
863 return E_INVALIDARG;
864
865 if (!_ILIsPidlSimple (pidl))
866 {
867 return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
868 }
869 else if (_ILIsDesktop(pidl))
870 {
872 return SHSetStrRet(strRet, sPathTarget);
873 else
874 return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet);
875 }
876
877 /* file system folder or file rooted at the desktop */
878 CComPtr<IShellFolder2> psf;
879 HRESULT hr = _GetSFFromPidl(pidl, &psf);
881 return hr;
882
883 return psf->GetDisplayNameOf(pidl, dwFlags, strRet);
884}
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
#define IS_SHGDN_DESKTOPABSOLUTEPARSING(flags)
Definition: shfldr.h:79
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:331

◆ GetMaxLength()

STDMETHODIMP CDesktopFolder::GetMaxLength ( LPCWSTR  pszName,
int piMaxNameLen 
)
inlineoverride

Definition at line 116 of file CDesktopFolder.h.

117 {
118 return E_NOTIMPL;
119 }

◆ GetUIObjectOf()

HRESULT WINAPI CDesktopFolder::GetUIObjectOf ( HWND  hwndOwner,
UINT  cidl,
PCUITEMID_CHILD_ARRAY  apidl,
REFIID  riid,
UINT prgfInOut,
LPVOID ppvOut 
)
override

Definition at line 757 of file CDesktopFolder.cpp.

764{
765 LPVOID pObj = NULL;
767
768 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
769 this, hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
770
771 if (!ppvOut)
772 return hr;
773 *ppvOut = NULL;
774
775 BOOL self = IsSelf(cidl, apidl);
776 if (cidl == 1 && !_ILIsSpecialFolder(apidl[0]) && !self)
777 {
778 CComPtr<IShellFolder2> psf;
779 HRESULT hr = _GetSFFromPidl(apidl[0], &psf);
781 return hr;
782
783 return psf->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, ppvOut);
784 }
785
786 if (IsEqualIID (riid, IID_IContextMenu))
787 {
788 // FIXME: m_regFolder vs AddFSClassKeysToArray is incorrect when the selection includes both regitems and FS items
789 if (!self && cidl > 0 && _ILIsSpecialFolder(apidl[0]))
790 {
791 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
792 }
793 else
794 {
795 /* Do not use the context menu of the CFSFolder here. */
796 /* We need to pass a pointer of the CDesktopFolder so as the data object that the context menu gets is rooted to the desktop */
797 /* Otherwise operations like that involve items from both user and shared desktop will not work */
798 HKEY hKeys[16];
799 UINT cKeys = 0;
800 if (self)
801 {
802 AddClsidKeyToArray(CLSID_ShellDesktop, hKeys, &cKeys);
803 AddClassKeyToArray(L"Folder", hKeys, &cKeys);
804 }
805 else if (cidl > 0)
806 {
807 AddFSClassKeysToArray(cidl, apidl, hKeys, &cKeys);
808 }
809
810 DEFCONTEXTMENU dcm;
811 dcm.hwnd = hwndOwner;
812 dcm.pcmcb = this;
813 dcm.pidlFolder = pidlRoot;
814 dcm.psf = this;
815 dcm.cidl = cidl;
816 dcm.apidl = apidl;
817 dcm.cKeys = cKeys;
818 dcm.aKeys = hKeys;
820 hr = SHCreateDefaultContextMenu (&dcm, riid, &pObj);
821 }
822 }
823 else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
824 {
825 hr = IDataObject_Constructor( hwndOwner, pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
826 }
827 else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
828 {
829 hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
830 }
831 else if (IsEqualIID (riid, IID_IDropTarget) && (cidl == 1))
832 {
833 CComPtr<IShellFolder> psfChild;
834 hr = this->BindToObject(apidl[0], NULL, IID_PPV_ARG(IShellFolder, &psfChild));
836 return hr;
837
838 return psfChild->CreateViewObject(NULL, riid, ppvOut);
839 }
840 else
842
843 if (SUCCEEDED(hr) && !pObj)
845
846 *ppvOut = pObj;
847 TRACE ("(%p)->hr=0x%08x\n", this, hr);
848 return hr;
849}
static BOOL IsSelf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl)
HRESULT IDataObject_Constructor(HWND hwndOwner, PCIDLIST_ABSOLUTE pMyPidl, PCUIDLIST_RELATIVE_ARRAY apidl, UINT cidl, BOOL bExtendedObject, IDataObject **dataObject)
STDMETHOD() BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
const GUID IID_IDataObject
void AddFSClassKeysToArray(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:430
LSTATUS AddClsidKeyToArray(REFCLSID clsid, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:423
#define E_NOINTERFACE
Definition: winerror.h:2364

◆ GetValidCharacters()

STDMETHODIMP CDesktopFolder::GetValidCharacters ( LPWSTR ppwszValidChars,
LPWSTR ppwszInvalidChars 
)
inlineoverride

Definition at line 122 of file CDesktopFolder.h.

123 {
124 if (ppwszValidChars)
125 {
126 *ppwszValidChars = NULL;
127 }
128 if (ppwszInvalidChars)
129 {
130 return SHStrDupW(INVALID_FILETITLE_CHARACTERSW, ppwszInvalidChars);
131 }
132 return S_OK;
133 }
HRESULT WINAPI SHStrDupW(LPCWSTR src, LPWSTR *dest)
Definition: string.c:2018
#define INVALID_FILETITLE_CHARACTERSW
Definition: undocshell.h:1002

◆ HttpUrlParseDisplayName()

STDMETHODIMP CDesktopFolder::HttpUrlParseDisplayName ( HWND  hwndOwner,
LPBC  pbc,
LPOLESTR  lpszDisplayName,
DWORD pchEaten,
PIDLIST_RELATIVE ppidl,
DWORD pdwAttributes 
)
private

Definition at line 169 of file CDesktopFolder.cpp.

176{
177 FIXME("\n");
178 return E_NOTIMPL; // FIXME
179}

Referenced by _ParseDisplayNameByParent().

◆ Initialize()

HRESULT WINAPI CDesktopFolder::Initialize ( PCIDLIST_ABSOLUTE  pidl)
override

Implements IPersistFolder.

Definition at line 1027 of file CDesktopFolder.cpp.

1028{
1029 TRACE ("(%p)->(%p)\n", this, pidl);
1030
1031 if (!pidl)
1032 return S_OK;
1033
1034 return E_INVALIDARG;
1035}

◆ IsCommonItem()

static BOOL CDesktopFolder::IsCommonItem ( LPCITEMIDLIST  pidl)
inlinestatic

Definition at line 78 of file CDesktopFolder.h.

78{ return _ILGetFSType(pidl) & PT_FS_COMMON_FLAG; }
static BYTE _ILGetFSType(LPCITEMIDLIST pidl)
Definition: pidl.h:129

Referenced by _GetSFFromPidl(), and CompareIDs().

◆ MapColumnToSCID()

HRESULT WINAPI CDesktopFolder::MapColumnToSCID ( UINT  column,
SHCOLUMNID pscid 
)
override

Implements IShellFolder2.

Definition at line 1003 of file CDesktopFolder.cpp.

1004{
1005 // Note: All these folders use the same SHFSF_COL mapping (m_regFolder only handles a subset).
1007 return m_DesktopFSFolder->MapColumnToSCID(column, pscid);
1009 return m_SharedDesktopFSFolder->MapColumnToSCID(column, pscid);
1010 if (m_regFolder)
1011 return m_regFolder->MapColumnToSCID(column, pscid);
1012 return E_FAIL;
1013}

◆ ParseDisplayName()

HRESULT WINAPI CDesktopFolder::ParseDisplayName ( HWND  hwndOwner,
LPBC  pbc,
LPOLESTR  lpszDisplayName,
DWORD pchEaten,
PIDLIST_RELATIVE ppidl,
DWORD pdwAttributes 
)
override

Definition at line 440 of file CDesktopFolder.cpp.

447{
448 TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
449 this, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName),
450 pchEaten, ppidl, pdwAttributes);
451
452 if (!ppidl)
453 return E_INVALIDARG;
454
455 *ppidl = NULL;
456
457 if (!lpszDisplayName)
458 return E_INVALIDARG;
459
460 if (!*lpszDisplayName)
461 {
462 *ppidl = _ILCreateMyComputer();
463 return (*ppidl ? S_OK : E_OUTOFMEMORY);
464 }
465
466 if (lpszDisplayName[0] == ':' && lpszDisplayName[1] == ':')
467 {
468 return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl,
469 pdwAttributes);
470 }
471
472 HRESULT hr = _ParseDisplayNameByParent(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl,
473 pdwAttributes);
474 if (SUCCEEDED(hr))
475 {
476 if (BindCtx_ContainsObject(pbc, STR_PARSE_TRANSLATE_ALIASES))
477 {
478 CComHeapPtr<ITEMIDLIST> pidlAlias;
479 if (SUCCEEDED(Shell_TranslateIDListAlias(*ppidl, NULL, &pidlAlias, 0xFFFF)))
480 {
481 ILFree(*ppidl);
482 *ppidl = pidlAlias.Detach();
483 }
484 }
485
486 TRACE ("(%p)->(-- ret=0x%08x)\n", this, hr);
487 return hr;
488 }
489
491 return hr;
492
493 if (BindCtx_ContainsObject(pbc, STR_DONT_PARSE_RELATIVE))
494 return E_INVALIDARG;
495
496 if (SHIsFileSysBindCtx(pbc, NULL) == S_OK)
497 return hr;
498
499 BIND_OPTS BindOps = { sizeof(BindOps) };
501 if (pbc && SUCCEEDED(pbc->GetBindOptions(&BindOps)) && (BindOps.grfMode & STGM_CREATE))
502 {
503 BindOps.grfMode &= ~STGM_CREATE;
504 bCreate = TRUE;
505 pbc->SetBindOptions(&BindOps);
506 }
507
509 {
510 hr = m_DesktopFSFolder->ParseDisplayName(hwndOwner,
511 pbc,
512 lpszDisplayName,
513 pchEaten,
514 ppidl,
515 pdwAttributes);
516 }
517
519 {
520 hr = m_SharedDesktopFSFolder->ParseDisplayName(hwndOwner,
521 pbc,
522 lpszDisplayName,
523 pchEaten,
524 ppidl,
525 pdwAttributes);
526 if (SUCCEEDED(hr))
527 MarkAsCommonItem(*ppidl);
528 }
529
531 {
532 BindOps.grfMode |= STGM_CREATE;
533 pbc->SetBindOptions(&BindOps);
534 hr = m_DesktopFSFolder->ParseDisplayName(hwndOwner,
535 pbc,
536 lpszDisplayName,
537 pchEaten,
538 ppidl,
539 pdwAttributes);
540 }
541
542 TRACE ("(%p)->(-- ret=0x%08x)\n", this, hr);
543
544 return hr;
545}
static void MarkAsCommonItem(LPITEMIDLIST pidl)
HRESULT _ParseDisplayNameByParent(HWND hwndOwner, LPBC pbc, LPOLESTR pszPath, DWORD *pchEaten, PIDLIST_RELATIVE *ppidl, DWORD *pdwAttributes)
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:303
BOOL Shell_FailForceReturn(_In_ HRESULT hr)
Definition: utils.cpp:320
HRESULT Shell_TranslateIDListAlias(_In_ LPCITEMIDLIST pidl, _In_ HANDLE hToken, _Out_ LPITEMIDLIST *ppidlAlias, _In_ DWORD dwFlags)
Definition: utils.cpp:261
#define debugstr_w
Definition: kernel32.h:32
#define STGM_CREATE
Definition: objbase.h:926
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1044
_In_ int _In_ BOOL bCreate
Definition: shlobj.h:1528

◆ SetNameOf()

HRESULT WINAPI CDesktopFolder::SetNameOf ( HWND  hwndOwner,
PCUITEMID_CHILD  pidl,
LPCOLESTR  lpName,
DWORD  dwFlags,
PITEMID_CHILD pPidlOut 
)
override

Implements IShellFolder.

Definition at line 898 of file CDesktopFolder.cpp.

904{
905 CComPtr<IShellFolder2> psf;
906 HRESULT hr = _GetSFFromPidl(pidl, &psf);
908 return hr;
909
910 return psf->SetNameOf(hwndOwner, pidl, lpName, dwFlags, pPidlOut);
911}
_In_ LPCSTR lpName
Definition: winbase.h:2820

◆ ShellUrlParseDisplayName()

STDMETHODIMP CDesktopFolder::ShellUrlParseDisplayName ( HWND  hwndOwner,
LPBC  pbc,
LPOLESTR  lpszDisplayName,
DWORD pchEaten,
PIDLIST_RELATIVE ppidl,
DWORD pdwAttributes 
)
private

Definition at line 70 of file CDesktopFolder.cpp.

77{
78 LPWSTR pch;
79 INT cch, csidl;
81 PARSEDURLW ParsedURL = { sizeof(ParsedURL) };
82
83 ::ParseURLW(lpszDisplayName, &ParsedURL);
84
85 DWORD attrs = (pdwAttributes ? *pdwAttributes : 0) | SFGAO_STREAM;
86 if (ParsedURL.pszSuffix[0] == L':' && ParsedURL.pszSuffix[1] == L':') // It begins from "::"
87 {
88 CComPtr<IShellFolder> psfDesktop;
89 hr = SHGetDesktopFolder(&psfDesktop);
90 if (SUCCEEDED(hr))
91 {
92 CComPtr<IBindCtx> pBindCtx;
93 hr = ::CreateBindCtx(0, &pBindCtx);
94 if (SUCCEEDED(hr))
95 {
96 BIND_OPTS BindOps = { sizeof(BindOps) };
97 BindOps.grfMode = STGM_CREATE;
98 pBindCtx->SetBindOptions(&BindOps);
99 hr = psfDesktop->ParseDisplayName(hwndOwner, pBindCtx,
100 (LPWSTR)ParsedURL.pszSuffix,
101 pchEaten, ppidl, &attrs);
102 }
103 }
104 }
105 else
106 {
107 csidl = Shell_ParseSpecialFolder(ParsedURL.pszSuffix, &pch, &cch);
108 if (csidl == -1)
109 {
110 ERR("\n");
111 return hr;
112 }
113
114 CComHeapPtr<ITEMIDLIST> pidlLocation;
115 hr = SHGetFolderLocation(hwndOwner, (csidl | CSIDL_FLAG_CREATE), NULL, 0, &pidlLocation);
117 return hr;
118
119 if (pch && *pch)
120 {
121 CComPtr<IShellFolder> psfFolder;
122 hr = SHBindToObject(NULL, pidlLocation, IID_PPV_ARG(IShellFolder, &psfFolder));
123 if (SUCCEEDED(hr))
124 {
125 CComHeapPtr<ITEMIDLIST> pidlNew;
126 hr = psfFolder->ParseDisplayName(hwndOwner, pbc, pch, pchEaten, &pidlNew, &attrs);
127 if (SUCCEEDED(hr))
128 {
129 hr = SHILCombine(pidlLocation, pidlNew, ppidl);
130 if (pchEaten)
131 *pchEaten += cch;
132 }
133 }
134 }
135 else
136 {
137 if (attrs)
138 hr = SHGetNameAndFlagsW(pidlLocation, 0, NULL, 0, &attrs);
139
140 if (SUCCEEDED(hr))
141 {
142 if (pchEaten)
143 *pchEaten = cch;
144 *ppidl = pidlLocation.Detach();
145 }
146 }
147 }
148
149 // FIXME: SHWindowsPolicy
150 if (SUCCEEDED(hr) && (attrs & SFGAO_STREAM) &&
151 !BindCtx_ContainsObject(pbc, STR_PARSE_SHELL_PROTOCOL_TO_FILE_OBJECTS))
152 {
153 ILFree(*ppidl);
154 *ppidl = NULL;
156 }
157
158 if (pdwAttributes)
159 *pdwAttributes = attrs;
160
161 // FIXME: SHWindowsPolicy
164
165 return hr;
166}
EXTERN_C INT Shell_ParseSpecialFolder(_In_ LPCWSTR pszStart, _Out_ LPWSTR *ppch, _Out_ INT *pcch)
Definition: shellpath.c:2010
HRESULT SHGetNameAndFlagsW(_In_ LPCITEMIDLIST pidl, _In_ DWORD dwFlags, _Out_opt_ LPWSTR pszText, _In_ UINT cchBuf, _Inout_opt_ DWORD *pdwAttributes)
Definition: utils.cpp:480
HRESULT WINAPI SHGetFolderLocation(HWND hwndOwner, int nFolder, HANDLE hToken, DWORD dwReserved, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3301
#define pch(ap)
Definition: match.c:418
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static DWORD DWORD void LPSTR DWORD cch
Definition: str.c:202
HRESULT WINAPI CreateBindCtx(DWORD reserved, LPBC *ppbc)
Definition: bindctx.c:556
#define CSIDL_FLAG_CREATE
LPCWSTR pszSuffix
Definition: shlwapi.h:1470
int32_t INT
Definition: typedefs.h:58
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:106
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92

Referenced by _ParseDisplayNameByParent().

Member Data Documentation

◆ m_DesktopFSFolder

CComPtr<IShellFolder2> CDesktopFolder::m_DesktopFSFolder
private

◆ m_regFolder

CComPtr<IShellFolder2> CDesktopFolder::m_regFolder
private

◆ m_SharedDesktopFSFolder

CComPtr<IShellFolder2> CDesktopFolder::m_SharedDesktopFSFolder
private

◆ pidlRoot

LPITEMIDLIST CDesktopFolder::pidlRoot
private

Definition at line 41 of file CDesktopFolder.h.

Referenced by CreateViewObject(), FinalConstruct(), GetCurFolder(), and GetUIObjectOf().

◆ sPathTarget

LPWSTR CDesktopFolder::sPathTarget
private

Definition at line 40 of file CDesktopFolder.h.

Referenced by FinalConstruct(), and GetDisplayNameOf().


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