ReactOS 0.4.15-dev-8002-gbbb3b00
CFSFolder Class Reference

#include <CFSFolder.h>

Inheritance diagram for CFSFolder:
Collaboration diagram for CFSFolder:

Public Member Functions

 CFSFolder ()
 
 ~CFSFolder ()
 
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() InitializeEx (IBindCtx *pbc, LPCITEMIDLIST pidlRoot, const PERSIST_FOLDER_TARGET_INFO *ppfti) override
 
STDMETHOD() GetFolderTargetInfo (PERSIST_FOLDER_TARGET_INFO *ppfti) override
 
STDMETHOD() CallBack (IShellFolder *psf, HWND hwndOwner, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam) override
 
STDMETHOD() MessageSFVCB (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 ()
 
- Public Member Functions inherited from IPersistFolder3
HRESULT InitializeEx ([in] IBindCtx *pbc, [in] PCIDLIST_ABSOLUTE pidlRoot, [in] const PERSIST_FOLDER_TARGET_INFO *ppfti)
 
HRESULT GetFolderTargetInfo ([out] PERSIST_FOLDER_TARGET_INFO *ppfti)
 
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 HRESULT GetFSColumnDetails (UINT iColumn, SHELLDETAILS &sd)
 
static HRESULT GetDefaultFSColumnState (UINT iColumn, SHCOLSTATEF &csFlags)
 
- 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)
 

Protected Member Functions

HRESULT WINAPI GetCustomViewInfo (ULONG unknown, SFVM_CUSTOMVIEWINFO_DATA *data)
 

Private Member Functions

HRESULT _CreateShellExtInstance (const CLSID *pclsid, LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
 
HRESULT _CreateExtensionUIObject (LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
 
HRESULT _GetDropTarget (LPCITEMIDLIST pidl, LPVOID *ppvOut)
 
HRESULT _GetIconHandler (LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
 
HRESULT _ParseSimple (_In_ LPOLESTR lpszDisplayName, _Inout_ WIN32_FIND_DATAW *pFind, _Out_ LPITEMIDLIST *ppidl)
 
BOOL _GetFindDataFromName (_In_ LPCWSTR pszName, _Out_ WIN32_FIND_DATAW *pFind)
 
HRESULT _CreateIDListFromName (LPCWSTR pszName, DWORD attrs, IBindCtx *pbc, LPITEMIDLIST *ppidl)
 

Private Attributes

const CLSIDm_pclsid
 
LPWSTR m_sPathTarget
 
LPITEMIDLIST m_pidlRoot
 
DWORD m_bGroupPolicyActive
 

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 14 of file CFSFolder.h.

Constructor & Destructor Documentation

◆ CFSFolder()

CFSFolder::CFSFolder ( )

Definition at line 514 of file CFSFolder.cpp.

515{
516 m_pclsid = &CLSID_ShellFSFolder;
520}
DWORD m_bGroupPolicyActive
Definition: CFSFolder.h:31
LPWSTR m_sPathTarget
Definition: CFSFolder.h:27
const CLSID * m_pclsid
Definition: CFSFolder.h:24
LPITEMIDLIST m_pidlRoot
Definition: CFSFolder.h:29
#define NULL
Definition: types.h:112

◆ ~CFSFolder()

CFSFolder::~CFSFolder ( )

Definition at line 522 of file CFSFolder.cpp.

523{
524 TRACE("-- destroying IShellFolder(%p)\n", this);
525
528}
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
#define TRACE(s)
Definition: solgame.cpp:4

Member Function Documentation

◆ _CreateExtensionUIObject()

HRESULT CFSFolder::_CreateExtensionUIObject ( LPCITEMIDLIST  pidl,
REFIID  riid,
LPVOID ppvOut 
)
private

Definition at line 1790 of file CFSFolder.cpp.

1791{
1793
1794 sprintfW(buf, L"ShellEx\\{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
1795 riid.Data1, riid.Data2, riid.Data3,
1796 riid.Data4[0], riid.Data4[1], riid.Data4[2], riid.Data4[3],
1797 riid.Data4[4], riid.Data4[5], riid.Data4[6], riid.Data4[7]);
1798
1799 CLSID clsid;
1800 HRESULT hr;
1801
1802 hr = GetCLSIDForFileType(pidl, buf, &clsid);
1803 if (hr != S_OK)
1804 return hr;
1805
1806 hr = _CreateShellExtInstance(&clsid, pidl, riid, ppvOut);
1808 return hr;
1809
1810 return S_OK;
1811}
HRESULT _CreateShellExtInstance(const CLSID *pclsid, LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
Definition: CFSFolder.cpp:1857
#define MAX_PATH
Definition: compat.h:34
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
HRESULT GetCLSIDForFileType(PCUIDLIST_RELATIVE pidl, LPCWSTR KeyName, CLSID *pclsid)
Definition: CFSFolder.cpp:127
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
REFCLSID clsid
Definition: msctf.c:82
#define L(x)
Definition: ntvdm.h:50
#define sprintfW
Definition: unicode.h:58
HRESULT hr
Definition: shlfolder.c:183
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by GetUIObjectOf().

◆ _CreateIDListFromName()

HRESULT CFSFolder::_CreateIDListFromName ( LPCWSTR  pszName,
DWORD  attrs,
IBindCtx pbc,
LPITEMIDLIST ppidl 
)
private

Definition at line 741 of file CFSFolder.cpp.

742{
743 *ppidl = NULL;
744
745 if (PathIsDosDevice(pszName))
747
748 WIN32_FIND_DATAW FindData = { 0 };
749
750 HRESULT hr = S_OK;
751 if (attrs == ULONG_MAX) // Invalid attributes
752 {
753 if (!_GetFindDataFromName(pszName, &FindData))
755 }
756 else // Pretend as an item of attrs
757 {
758 StringCchCopyW(FindData.cFileName, _countof(FindData.cFileName), pszName);
759 FindData.dwFileAttributes = attrs;
760 }
761
762 if (FAILED(hr))
763 return hr;
764
765 *ppidl = _ILCreateFromFindDataW(&FindData);
766 if (!*ppidl)
767 return E_OUTOFMEMORY;
768
769 return S_OK;
770}
BOOL _GetFindDataFromName(_In_ LPCWSTR pszName, _Out_ WIN32_FIND_DATAW *pFind)
Definition: CFSFolder.cpp:727
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
BOOL PathIsDosDevice(_In_ LPCWSTR pszName)
Definition: utils.cpp:38
#define ULONG_MAX
Definition: limits.h:44
#define FAILED(hr)
Definition: intsafe.h:51
LPITEMIDLIST _ILCreateFromFindDataW(const WIN32_FIND_DATAW *wfd)
Definition: pidl.c:1785
#define _countof(array)
Definition: sndvol32.h:68
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define ERROR_BAD_DEVICE
Definition: winerror.h:703

Referenced by ParseDisplayName().

◆ _CreateShellExtInstance()

HRESULT CFSFolder::_CreateShellExtInstance ( const CLSID pclsid,
LPCITEMIDLIST  pidl,
REFIID  riid,
LPVOID ppvOut 
)
private

Definition at line 1857 of file CFSFolder.cpp.

1858{
1859 HRESULT hr;
1860 WCHAR wszPath[MAX_PATH];
1861
1862 FileStructW* pDataW = _ILGetFileStructW(pidl);
1863 if (!pDataW)
1864 {
1865 ERR("Got garbage pidl\n");
1866 pdump_always(pidl);
1867 return E_INVALIDARG;
1868 }
1869
1870 PathCombineW(wszPath, m_sPathTarget, pDataW->wszName);
1871
1872 CComPtr<IPersistFile> pp;
1875 return hr;
1876
1877 pp->Load(wszPath, 0);
1878
1879 hr = pp->QueryInterface(riid, ppvOut);
1880 if (hr != S_OK)
1881 {
1882 ERR("Failed to query for interface IID_IShellExtInit hr %x pclsid %s\n", hr, wine_dbgstr_guid(pclsid));
1883 return hr;
1884 }
1885 return hr;
1886}
#define ERR(fmt,...)
Definition: debug.h:110
#define E_INVALIDARG
Definition: ddrawi.h:101
void pdump_always(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:319
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID refiid, LPVOID *ppv)
Definition: shellole.c:105
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define PathCombineW
Definition: pathcch.h:317
FileStructW * _ILGetFileStructW(LPCITEMIDLIST pidl)
Definition: pidl.c:2405
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
WCHAR wszName[1]
Definition: shlfolder.c:1555
#define IID_PPV_ARG(Itype, ppType)

Referenced by _CreateExtensionUIObject(), _GetDropTarget(), and _GetIconHandler().

◆ _GetDropTarget()

HRESULT CFSFolder::_GetDropTarget ( LPCITEMIDLIST  pidl,
LPVOID ppvOut 
)
private

Definition at line 1813 of file CFSFolder.cpp.

1814{
1815 HRESULT hr;
1816
1817 TRACE("CFSFolder::_GetDropTarget entered\n");
1818
1819 if (_ILIsFolder (pidl))
1820 {
1821 CComPtr<IShellFolder> psfChild;
1822 hr = this->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, &psfChild));
1824 return hr;
1825
1826 return psfChild->CreateViewObject(NULL, IID_IDropTarget, ppvOut);
1827 }
1828
1829 CLSID clsid;
1830 hr = GetCLSIDForFileType(pidl, L"shellex\\DropHandler", &clsid);
1831 if (hr != S_OK)
1832 return hr;
1833
1834 hr = _CreateShellExtInstance(&clsid, pidl, IID_IDropTarget, ppvOut);
1836 return S_FALSE;
1837
1838 return S_OK;
1839}
STDMETHOD() BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CFSFolder.cpp:917
BOOL _ILIsFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2020
#define S_FALSE
Definition: winerror.h:2357

Referenced by GetUIObjectOf().

◆ _GetFindDataFromName()

BOOL CFSFolder::_GetFindDataFromName ( _In_ LPCWSTR  pszName,
_Out_ WIN32_FIND_DATAW pFind 
)
private

Definition at line 727 of file CFSFolder.cpp.

728{
731 PathAppendW(szPath, pszName);
732
733 HANDLE hFind = ::FindFirstFileW(szPath, pFind);
734 if (hFind == INVALID_HANDLE_VALUE)
735 return FALSE;
736
737 ::FindClose(hFind);
738 return TRUE;
739}
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define lstrcpynW
Definition: compat.h:738
HANDLE WINAPI FindFirstFileW(IN LPCWSTR lpFileName, OUT LPWIN32_FIND_DATAW lpFindFileData)
Definition: find.c:320
BOOL WINAPI FindClose(HANDLE hFindFile)
Definition: find.c:502
LPCWSTR szPath
Definition: env.c:37
#define PathAppendW
Definition: pathcch.h:309

Referenced by _CreateIDListFromName(), and ParseDisplayName().

◆ _GetIconHandler()

HRESULT CFSFolder::_GetIconHandler ( LPCITEMIDLIST  pidl,
REFIID  riid,
LPVOID ppvOut 
)
private

Definition at line 1841 of file CFSFolder.cpp.

1842{
1843 CLSID clsid;
1844 HRESULT hr;
1845
1846 hr = GetCLSIDForFileType(pidl, L"shellex\\IconHandler", &clsid);
1847 if (hr != S_OK)
1848 return hr;
1849
1850 hr = _CreateShellExtInstance(&clsid, pidl, riid, ppvOut);
1852 return S_FALSE;
1853
1854 return S_OK;
1855}

Referenced by GetUIObjectOf().

◆ _ParseSimple()

HRESULT CFSFolder::_ParseSimple ( _In_ LPOLESTR  lpszDisplayName,
_Inout_ WIN32_FIND_DATAW pFind,
_Out_ LPITEMIDLIST ppidl 
)
private

Definition at line 686 of file CFSFolder.cpp.

690{
691 HRESULT hr;
692 LPWSTR pchNext = lpszDisplayName;
693
694 *ppidl = NULL;
695
696 const DWORD finalattr = pFind->dwFileAttributes;
697 const DWORD finalsizelo = pFind->nFileSizeLow;
698 LPITEMIDLIST pidl;
699 for (hr = S_OK; SUCCEEDED(hr); hr = SHILAppend(pidl, ppidl))
700 {
701 hr = Shell_NextElement(&pchNext, pFind->cFileName, _countof(pFind->cFileName), FALSE);
702 if (hr != S_OK)
703 break;
704
705 pFind->dwFileAttributes = pchNext ? FILE_ATTRIBUTE_DIRECTORY : finalattr;
706 pFind->nFileSizeLow = pchNext ? 0 : finalsizelo;
707 pidl = _ILCreateFromFindDataW(pFind);
708 if (!pidl)
709 {
711 break;
712 }
713 }
714
715 if (SUCCEEDED(hr))
716 return S_OK;
717
718 if (*ppidl)
719 {
720 ILFree(*ppidl);
721 *ppidl = NULL;
722 }
723
724 return hr;
725}
HRESULT SHILAppend(_Inout_ LPITEMIDLIST pidl, _Inout_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:59
unsigned long DWORD
Definition: ntddk_ex.h:95
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FILE_ATTRIBUTE_DIRECTORY
Definition: nt_native.h:705
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:938
HRESULT Shell_NextElement(_Inout_ LPWSTR *ppch, _Out_ LPWSTR pszOut, _In_ INT cchOut, _In_ BOOL bValidate)
Definition: shlfolder.cpp:30
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
WCHAR * LPWSTR
Definition: xmlstorage.h:184

Referenced by ParseDisplayName().

◆ BindToObject()

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

Definition at line 917 of file CFSFolder.cpp.

922{
923 TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this, pidl, pbc,
924 shdebugstr_guid(&riid), ppvOut);
925
926 CComPtr<IShellFolder> pSF;
927 HRESULT hr;
928
929 if (!m_pidlRoot || !ppvOut || !pidl || !pidl->mkid.cb)
930 {
931 ERR("CFSFolder::BindToObject: Invalid parameters\n");
932 return E_INVALIDARG;
933 }
934
935 /* Get the pidl data */
936 FileStruct* pData = &_ILGetDataPointer(pidl)->u.file;
937 FileStructW* pDataW = _ILGetFileStructW(pidl);
938
939 if (!pDataW)
940 {
941 ERR("CFSFolder::BindToObject: Invalid pidl!\n");
942 return E_INVALIDARG;
943 }
944
945 *ppvOut = NULL;
946
947 /* Create the target folder info */
948 PERSIST_FOLDER_TARGET_INFO pfti = {0};
949 pfti.dwAttributes = -1;
950 pfti.csidl = -1;
951 PathCombineW(pfti.szTargetParsingName, m_sPathTarget, pDataW->wszName);
952
953 /* Get the CLSID to bind to */
954 CLSID clsidFolder;
955 if (_ILIsFolder(pidl))
956 {
957 if ((pData->uFileAttribs & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_READONLY)) != 0)
958 {
959 hr = SHELL32_GetCLSIDForDirectory(pfti.szTargetParsingName, L"CLSID", &clsidFolder);
960
961 if (SUCCEEDED(hr))
962 {
963 /* We got a GUID from a desktop.ini, let's try it */
964 hr = SHELL32_BindToSF(m_pidlRoot, &pfti, pidl, &clsidFolder, riid, ppvOut);
965 if (SUCCEEDED(hr))
966 {
967 TRACE("-- returning (%p) %08x, (%s)\n", *ppvOut, hr, wine_dbgstr_guid(&clsidFolder));
968 return hr;
969 }
970
971 /* Something went wrong, re-try it with a normal ShellFSFolder */
972 ERR("CFSFolder::BindToObject: %s failed to bind, using fallback (0x%08x)\n", wine_dbgstr_guid(&clsidFolder), hr);
973 }
974 }
975 /* No system folder or the custom class failed */
976 clsidFolder = CLSID_ShellFSFolder;
977 }
978 else
979 {
980 hr = GetCLSIDForFileType(pidl, L"CLSID", &clsidFolder);
981 if (hr == S_FALSE)
983 if (hr != S_OK)
984 return hr;
985 }
986
987 hr = SHELL32_BindToSF(m_pidlRoot, &pfti, pidl, &clsidFolder, riid, ppvOut);
989 return hr;
990
991 TRACE ("-- returning (%p) %08x\n", *ppvOut, hr);
992
993 return S_OK;
994
995}
const char * shdebugstr_guid(const struct _GUID *id)
Definition: debughlp.cpp:428
static HRESULT SHELL32_GetCLSIDForDirectory(LPCWSTR pwszDir, LPCWSTR KeyName, CLSID *pclsidFolder)
Definition: CFSFolder.cpp:560
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
#define FILE_ATTRIBUTE_READONLY
Definition: nt_native.h:702
#define FILE_ATTRIBUTE_SYSTEM
Definition: nt_native.h:704
LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2231
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:168
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830

Referenced by _GetDropTarget(), and ParseDisplayName().

◆ BindToStorage()

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

Definition at line 1005 of file CFSFolder.cpp.

1010{
1011 FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this, pidl, pbcReserved,
1012 shdebugstr_guid (&riid), ppvOut);
1013
1014 *ppvOut = NULL;
1015 return E_NOTIMPL;
1016}
#define FIXME(fmt,...)
Definition: debug.h:111
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ CallBack()

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

Implements IContextMenuCB.

Definition at line 1888 of file CFSFolder.cpp.

1889{
1890 if (uMsg != DFM_MERGECONTEXTMENU && uMsg != DFM_INVOKECOMMAND)
1891 return S_OK;
1892
1893 /* no data object means no selection */
1894 if (!pdtobj)
1895 {
1896 if (uMsg == DFM_INVOKECOMMAND && wParam == 0)
1897 {
1898 // Create an data object
1899 CComHeapPtr<ITEMID_CHILD> pidlChild(ILClone(ILFindLastID(m_pidlRoot)));
1900 CComHeapPtr<ITEMIDLIST> pidlParent(ILClone(m_pidlRoot));
1901 ILRemoveLastID(pidlParent);
1902
1903 CComPtr<IDataObject> pDataObj;
1904 HRESULT hr = SHCreateDataObject(pidlParent, 1, &pidlChild, NULL, IID_PPV_ARG(IDataObject, &pDataObj));
1905 if (!FAILED_UNEXPECTEDLY(hr))
1906 {
1907 // Ask for a title to display
1908 CComHeapPtr<WCHAR> wszName;
1909 if (!FAILED_UNEXPECTEDLY(SHGetNameFromIDList(m_pidlRoot, SIGDN_PARENTRELATIVEPARSING, &wszName)))
1910 {
1911 BOOL bSuccess = SH_ShowPropertiesDialog(wszName, pDataObj);
1912 if (!bSuccess)
1913 ERR("SH_ShowPropertiesDialog failed\n");
1914 }
1915 }
1916 }
1917 else if (uMsg == DFM_MERGECONTEXTMENU)
1918 {
1919 QCMINFO *pqcminfo = (QCMINFO *)lParam;
1920 HMENU hpopup = CreatePopupMenu();
1922 Shell_MergeMenus(pqcminfo->hmenu, hpopup, pqcminfo->indexMenu++, pqcminfo->idCmdFirst, pqcminfo->idCmdLast, MM_ADDSEPARATOR);
1923 DestroyMenu(hpopup);
1924 }
1925
1926 return S_OK;
1927 }
1928
1930 return S_OK;
1931
1932 return Shell_DefaultContextMenuCallBack(this, pdtobj);
1933}
HRESULT WINAPI SHCreateDataObject(PCIDLIST_ABSOLUTE pidlFolder, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IDataObject *pdtInner, REFIID riid, void **ppv)
#define IDS_PROPERTIES
Definition: resource.h:102
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
HRESULT WINAPI Shell_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdtobj)
Definition: shlfolder.cpp:497
static BOOLEAN bSuccess
Definition: drive.cpp:433
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOL SH_ShowPropertiesDialog(LPCWSTR pwszPath, IDataObject *pDataObj)
Definition: fprop.cpp:83
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:198
HRESULT WINAPI SHGetNameFromIDList(PCIDLIST_ABSOLUTE pidl, SIGDN sigdnName, PWSTR *ppszName)
Definition: pidl.c:1467
BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl)
Definition: pidl.c:221
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:2513
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2597
HMENU hmenu
Definition: shlobj.h:1381
UINT idCmdLast
Definition: shlobj.h:1384
UINT idCmdFirst
Definition: shlobj.h:1383
UINT indexMenu
Definition: shlobj.h:1382
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define MFS_ENABLED
Definition: winuser.h:750
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define MFT_STRING
Definition: winuser.h:746
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582

◆ CompareIDs()

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

Implements IShellFolder.

Definition at line 1022 of file CFSFolder.cpp.

1025{
1026 LPPIDLDATA pData1 = _ILGetDataPointer(pidl1);
1027 LPPIDLDATA pData2 = _ILGetDataPointer(pidl2);
1028 FileStructW* pDataW1 = _ILGetFileStructW(pidl1);
1029 FileStructW* pDataW2 = _ILGetFileStructW(pidl2);
1030 BOOL bIsFolder1 = _ILIsFolder(pidl1);
1031 BOOL bIsFolder2 = _ILIsFolder(pidl2);
1032 LPWSTR pExtension1, pExtension2;
1033
1034 if (!pDataW1 || !pDataW2 || LOWORD(lParam) >= GENERICSHELLVIEWCOLUMNS)
1035 return E_INVALIDARG;
1036
1037 /* When sorting between a File and a Folder, the Folder gets sorted first */
1038 if (bIsFolder1 != bIsFolder2)
1039 {
1040 return MAKE_COMPARE_HRESULT(bIsFolder1 ? -1 : 1);
1041 }
1042
1043 int result = 0;
1044 switch (LOWORD(lParam))
1045 {
1046 case SHFSF_COL_NAME:
1047 result = wcsicmp(pDataW1->wszName, pDataW2->wszName);
1048 break;
1049 case SHFSF_COL_SIZE:
1050 if (pData1->u.file.dwFileSize > pData2->u.file.dwFileSize)
1051 result = 1;
1052 else if (pData1->u.file.dwFileSize < pData2->u.file.dwFileSize)
1053 result = -1;
1054 else
1055 result = 0;
1056 break;
1057 case SHFSF_COL_TYPE:
1058 pExtension1 = PathFindExtensionW(pDataW1->wszName);
1059 pExtension2 = PathFindExtensionW(pDataW2->wszName);
1060 result = wcsicmp(pExtension1, pExtension2);
1061 break;
1062 case SHFSF_COL_MDATE:
1063 result = pData1->u.file.uFileDate - pData2->u.file.uFileDate;
1064 if (result == 0)
1065 result = pData1->u.file.uFileTime - pData2->u.file.uFileTime;
1066 break;
1067 case SHFSF_COL_FATTS:
1068 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
1069 case SHFSF_COL_COMMENT:
1070 result = 0;
1071 break;
1072 default:
1073 if (_ILIsPidlSimple(pidl1) || _ILIsPidlSimple(pidl2))
1074 ERR("Unknown column %u, can't compare\n", LOWORD(lParam));
1075 else
1076 TRACE("Unknown column %u, deferring to the subfolder\n", LOWORD(lParam));
1077 }
1078
1079 if (result == 0)
1080 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
1081
1083}
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
#define wcsicmp
Definition: compat.h:15
#define GENERICSHELLVIEWCOLUMNS
Definition: CFSFolder.cpp:539
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
Definition: path.c:447
GLuint64EXT * result
Definition: glext.h:11304
#define LOWORD(l)
Definition: pedump.c:82
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:577
#define SHFSF_COL_COMMENT
Definition: shfldr.h:48
#define SHFSF_COL_SIZE
Definition: shfldr.h:44
#define SHFSF_COL_NAME
Definition: shfldr.h:43
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:224
#define SHFSF_COL_TYPE
Definition: shfldr.h:45
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:247
#define SHFSF_COL_FATTS
Definition: shfldr.h:47
#define SHFSF_COL_MDATE
Definition: shfldr.h:46

◆ CreateViewObject()

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

Definition at line 1088 of file CFSFolder.cpp.

1090{
1091 CComPtr<IShellView> pShellView;
1093
1094 TRACE ("(%p)->(hwnd=%p,%s,%p)\n", this, hwndOwner, shdebugstr_guid (&riid),
1095 ppvOut);
1096
1097 if (ppvOut)
1098 {
1099 *ppvOut = NULL;
1100
1101 BOOL bIsDropTarget = IsEqualIID (riid, IID_IDropTarget);
1102 BOOL bIsShellView = !bIsDropTarget && IsEqualIID (riid, IID_IShellView);
1103
1104 if (bIsDropTarget || bIsShellView)
1105 {
1106 DWORD dwDirAttributes = _ILGetFileAttributes(ILFindLastID(m_pidlRoot), NULL, 0);
1107
1108 if ((dwDirAttributes & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_READONLY)) != 0)
1109 {
1110 CLSID clsidFolder;
1111 hr = SHELL32_GetCLSIDForDirectory(m_sPathTarget, L"UICLSID", &clsidFolder);
1112 if (SUCCEEDED(hr))
1113 {
1114 CComPtr<IPersistFolder> spFolder;
1115 hr = SHCoCreateInstance(NULL, &clsidFolder, NULL, IID_PPV_ARG(IPersistFolder, &spFolder));
1116 if (!FAILED_UNEXPECTEDLY(hr))
1117 {
1118 hr = spFolder->Initialize(m_pidlRoot);
1119
1120 if (!FAILED_UNEXPECTEDLY(hr))
1121 {
1122 hr = spFolder->QueryInterface(riid, ppvOut);
1123 }
1124 }
1125 }
1126 else
1127 {
1128 // No desktop.ini, or no UICLSID present, continue as if nothing happened
1129 hr = E_INVALIDARG;
1130 }
1131 }
1132 }
1133
1134 if (!SUCCEEDED(hr))
1135 {
1136 // No UICLSID handler found, continue to the default handlers
1137 if (bIsDropTarget)
1138 {
1140 }
1141 else if (IsEqualIID (riid, IID_IContextMenu))
1142 {
1143 HKEY hKeys[16];
1144 UINT cKeys = 0;
1145 AddClassKeyToArray(L"Directory\\Background", hKeys, &cKeys);
1146
1147 DEFCONTEXTMENU dcm;
1148 dcm.hwnd = hwndOwner;
1149 dcm.pcmcb = this;
1150 dcm.pidlFolder = m_pidlRoot;
1151 dcm.psf = this;
1152 dcm.cidl = 0;
1153 dcm.apidl = NULL;
1154 dcm.cKeys = cKeys;
1155 dcm.aKeys = hKeys;
1157 hr = SHCreateDefaultContextMenu (&dcm, riid, ppvOut);
1158 }
1159 else if (bIsShellView)
1160 {
1161 SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this, NULL, this};
1162 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
1163 }
1164 else
1165 {
1166 hr = E_INVALIDARG;
1167 }
1168 }
1169 }
1170 TRACE("-- (%p)->(interface=%p)\n", this, ppvOut);
1171 return hr;
1172}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:3875
HRESULT WINAPI SHCreateDefaultContextMenu(const DEFCONTEXTMENU *pdcm, REFIID riid, void **ppv)
HRESULT CFSDropTarget_CreateInstance(LPWSTR sPathTarget, REFIID riid, LPVOID *ppvOut)
unsigned int UINT
Definition: ndis.h:50
DWORD _ILGetFileAttributes(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
Definition: pidl.c:2650
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:277
struct _SFV_CREATE SFV_CREATE
IContextMenuCB * pcmcb
Definition: shlobj.h:2535
IShellFolder * psf
Definition: shlobj.h:2537
IUnknown * punkAssociationInfo
Definition: shlobj.h:2540
PCUITEMID_CHILD_ARRAY apidl
Definition: shlobj.h:2539
const HKEY * aKeys
Definition: shlobj.h:2542
PCIDLIST_ABSOLUTE pidlFolder
Definition: shlobj.h:2536

◆ EnumObjects()

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

Definition at line 901 of file CFSFolder.cpp.

905{
906 return ShellObjectCreatorInit<CFileSysEnum>(m_sPathTarget, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
907}
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176

◆ EnumSearches()

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

Implements IShellFolder2.

Definition at line 1550 of file CFSFolder.cpp.

1551{
1552 FIXME ("(%p)\n", this);
1553 return E_NOTIMPL;
1554}

◆ GetAttributesOf()

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

Definition at line 1183 of file CFSFolder.cpp.

1185{
1186 HRESULT hr = S_OK;
1187
1188 if (!rgfInOut)
1189 return E_INVALIDARG;
1190 if (cidl && !apidl)
1191 return E_INVALIDARG;
1192
1193 if (*rgfInOut == 0)
1194 *rgfInOut = ~0;
1195
1196 if(cidl == 0)
1197 {
1199
1200 if (_ILIsFolder(rpidl) || _ILIsValue(rpidl))
1201 {
1202 SHELL32_GetFSItemAttributes(this, rpidl, rgfInOut);
1203 }
1204 else if (_ILIsDrive(rpidl))
1205 {
1206 IShellFolder *psfParent = NULL;
1208 if(SUCCEEDED(hr))
1209 {
1210 hr = psfParent->GetAttributesOf(1, &rpidl, (SFGAOF*)rgfInOut);
1211 psfParent->Release();
1212 }
1213 }
1214 else
1215 {
1216 ERR("Got and unknown pidl!\n");
1217 }
1218 }
1219 else
1220 {
1221 while (cidl > 0 && *apidl)
1222 {
1223 pdump(*apidl);
1224 if(_ILIsFolder(*apidl) || _ILIsValue(*apidl))
1225 SHELL32_GetFSItemAttributes(this, *apidl, rgfInOut);
1226 else
1227 ERR("Got an unknown type of pidl!!!\n");
1228 apidl++;
1229 cidl--;
1230 }
1231 }
1232 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
1233 *rgfInOut &= ~SFGAO_VALIDATE;
1234
1235 TRACE("-- result=0x%08x\n", *rgfInOut);
1236
1237 return hr;
1238}
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:311
HRESULT SHELL32_GetFSItemAttributes(IShellFolder *psf, LPCITEMIDLIST pidl, LPDWORD pdwAttributes)
Definition: CFSFolder.cpp:580
ULONG SFGAOF
Definition: shobjidl.idl:228
HRESULT GetAttributesOf([in] UINT cidl, [in, size_is(cidl)] PCUITEMID_CHILD_ARRAY apidl, [in, out] SFGAOF *rgfInOut)
ULONG Release()
HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCITEMIDLIST *ppidlLast)
Definition: pidl.c:1361
BOOL _ILIsValue(LPCITEMIDLIST pidl)
Definition: pidl.c:2029
BOOL _ILIsDrive(LPCITEMIDLIST pidl)
Definition: pidl.c:2008
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42

Referenced by ParseDisplayName().

◆ GetClassID()

HRESULT WINAPI CFSFolder::GetClassID ( CLSID lpClassId)
override

Implements IPersist.

Definition at line 1650 of file CFSFolder.cpp.

1651{
1652 TRACE ("(%p)\n", this);
1653
1654 if (!lpClassId)
1655 return E_POINTER;
1656
1657 *lpClassId = *m_pclsid;
1658
1659 return S_OK;
1660}
#define E_POINTER
Definition: winerror.h:2365

◆ GetCurFolder()

HRESULT WINAPI CFSFolder::GetCurFolder ( PIDLIST_ABSOLUTE pidl)
override

Implements IPersistFolder2.

Definition at line 1697 of file CFSFolder.cpp.

1698{
1699 TRACE ("(%p)->(%p)\n", this, pidl);
1700
1701 if (!pidl)
1702 return E_POINTER;
1703
1704 *pidl = ILClone(m_pidlRoot);
1705 return S_OK;
1706}

◆ GetCustomViewInfo()

HRESULT WINAPI CFSFolder::GetCustomViewInfo ( ULONG  unknown,
SFVM_CUSTOMVIEWINFO_DATA data 
)
protected

Definition at line 1962 of file CFSFolder.cpp.

1963{
1964 if (data == NULL)
1965 {
1966 return E_POINTER;
1967 }
1968 if (data->cbSize != sizeof(*data))
1969 {
1970 // NOTE: You have to set the cbData member before SFVM_GET_CUSTOMVIEWINFO call.
1971 return E_INVALIDARG;
1972 }
1973
1974 data->hbmBack = NULL;
1975 data->clrText = CLR_INVALID;
1976 data->clrTextBack = CLR_INVALID;
1977
1979
1980 // does the folder exists?
1982 {
1983 return E_INVALIDARG;
1984 }
1985
1986 // don't use custom view in network path for security
1988 {
1989 return E_ACCESSDENIED;
1990 }
1991
1992 // build the ini file path
1994 PathAppend(szIniFile, L"desktop.ini");
1995
1996 static LPCWSTR TheGUID = L"{BE098140-A513-11D0-A3A4-00C04FD706EC}";
1997 static LPCWSTR Space = L" \t\n\r\f\v";
1998
1999 // get info from ini file
2000 WCHAR szImage[MAX_PATH], szText[64];
2001
2002 // load the image
2003 szImage[0] = UNICODE_NULL;
2004 GetPrivateProfileStringW(TheGUID, L"IconArea_Image", L"", szImage, _countof(szImage), szIniFile);
2005 if (szImage[0])
2006 {
2007 StrTrimW(szImage, Space);
2008 if (PathIsRelativeW(szImage))
2009 {
2010 PathAppendW(szPath, szImage);
2011 StringCchCopyW(szImage, _countof(szImage), szPath);
2012 }
2013 data->hbmBack = DoLoadPicture(szImage);
2014 }
2015
2016 // load the text color
2017 szText[0] = UNICODE_NULL;
2018 GetPrivateProfileStringW(TheGUID, L"IconArea_Text", L"", szText, _countof(szText), szIniFile);
2019 if (szText[0])
2020 {
2021 StrTrimW(szText, Space);
2022
2023 LPWSTR pchEnd = NULL;
2024 COLORREF cr = (wcstol(szText, &pchEnd, 0) & 0xFFFFFF);
2025
2026 if (pchEnd && !*pchEnd)
2027 data->clrText = cr;
2028 }
2029
2030 // load the text background color
2031 szText[0] = UNICODE_NULL;
2032 GetPrivateProfileStringW(TheGUID, L"IconArea_TextBackground", L"", szText, _countof(szText), szIniFile);
2033 if (szText[0])
2034 {
2035 StrTrimW(szText, Space);
2036
2037 LPWSTR pchEnd = NULL;
2038 COLORREF cr = (wcstol(szText, &pchEnd, 0) & 0xFFFFFF);
2039
2040 if (pchEnd && !*pchEnd)
2041 data->clrTextBack = cr;
2042 }
2043
2044 if (data->hbmBack != NULL || data->clrText != CLR_INVALID || data->clrTextBack != CLR_INVALID)
2045 return S_OK;
2046
2047 return E_FAIL;
2048}
#define E_FAIL
Definition: ddrawi.h:102
INT WINAPI GetPrivateProfileStringW(LPCWSTR section, LPCWSTR entry, LPCWSTR def_val, LPWSTR buffer, UINT len, LPCWSTR filename)
Definition: profile.c:1142
static HBITMAP DoLoadPicture(LPCWSTR pszFileName)
Definition: CFSFolder.cpp:1935
BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
Definition: path.c:1723
BOOL WINAPI PathIsRelativeW(LPCWSTR lpszPath)
Definition: path.c:1579
BOOL WINAPI StrTrimW(LPWSTR lpszStr, LPCWSTR lpszTrim)
Definition: string.c:1877
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
_Check_return_ long __cdecl wcstol(_In_z_ const wchar_t *_Str, _Out_opt_ _Deref_post_z_ wchar_t **_EndPtr, _In_ int _Radix)
#define UNICODE_NULL
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1353
TCHAR szIniFile[]
Definition: scrnsave.c:29
#define PathIsNetworkPath
Definition: shlwapi.h:1101
#define PathAppend
Definition: shlwapi.h:801
DWORD COLORREF
Definition: windef.h:300
#define E_ACCESSDENIED
Definition: winerror.h:2849
#define CLR_INVALID
Definition: wingdi.h:883
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by MessageSFVCB().

◆ GetDefaultColumn()

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

Implements IShellFolder2.

Definition at line 1556 of file CFSFolder.cpp.

1558{
1559 TRACE ("(%p)\n", this);
1560
1561 if (pSort)
1562 *pSort = 0;
1563 if (pDisplay)
1564 *pDisplay = 0;
1565
1566 return S_OK;
1567}

◆ GetDefaultColumnState()

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

Implements IShellFolder2.

Definition at line 1569 of file CFSFolder.cpp.

1571{
1572 TRACE ("(%p)\n", this);
1573
1574 if (!pcsFlags)
1575 return E_INVALIDARG;
1576 else
1577 return GetDefaultFSColumnState(iColumn, *pcsFlags);
1578}
static HRESULT GetDefaultFSColumnState(UINT iColumn, SHCOLSTATEF &csFlags)
Definition: CFSFolder.cpp:551

◆ GetDefaultFSColumnState()

HRESULT CFSFolder::GetDefaultFSColumnState ( UINT  iColumn,
SHCOLSTATEF csFlags 
)
static

Definition at line 551 of file CFSFolder.cpp.

552{
553 if (iColumn >= _countof(GenericSFHeader))
554 return E_INVALIDARG;
555
556 csFlags = GenericSFHeader[iColumn].colstate;
557 return S_OK;
558}
static const shvheader GenericSFHeader[]
Definition: CFSFolder.cpp:530
WORD colstate
Definition: shfldr.h:31

Referenced by CDesktopFolder::GetDefaultColumnState(), and GetDefaultColumnState().

◆ GetDefaultSearchGUID()

HRESULT WINAPI CFSFolder::GetDefaultSearchGUID ( GUID pguid)
override

Implements IShellFolder2.

Definition at line 1544 of file CFSFolder.cpp.

1545{
1546 FIXME ("(%p)\n", this);
1547 return E_NOTIMPL;
1548}

◆ GetDetailsEx()

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

Implements IShellFolder2.

Definition at line 1580 of file CFSFolder.cpp.

1582{
1583 FIXME ("(%p)\n", this);
1584
1585 return E_NOTIMPL;
1586}

◆ GetDetailsOf()

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

Implements IShellFolder2.

Definition at line 1588 of file CFSFolder.cpp.

1590{
1591 HRESULT hr = E_FAIL;
1592
1593 TRACE ("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd);
1594
1595 if (!psd || iColumn >= GENERICSHELLVIEWCOLUMNS)
1596 return E_INVALIDARG;
1597
1598 if (!pidl)
1599 {
1600 /* the header titles */
1601 return GetFSColumnDetails(iColumn, *psd);
1602 }
1603 else
1604 {
1605 hr = S_OK;
1606 psd->str.uType = STRRET_CSTR;
1607 /* the data from the pidl */
1608 switch (iColumn)
1609 {
1610 case SHFSF_COL_NAME:
1612 break;
1613 case SHFSF_COL_SIZE:
1614 _ILGetFileSize(pidl, psd->str.cStr, MAX_PATH);
1615 break;
1616 case SHFSF_COL_TYPE:
1617 _ILGetFileType(pidl, psd->str.cStr, MAX_PATH);
1618 break;
1619 case SHFSF_COL_MDATE:
1620 _ILGetFileDate(pidl, psd->str.cStr, MAX_PATH);
1621 break;
1622 case SHFSF_COL_FATTS:
1624 break;
1625 case SHFSF_COL_COMMENT:
1626 psd->str.cStr[0] = '\0'; // TODO: Extract comment from .lnk files? desktop.ini?
1627 break;
1628#if DBG
1629 default:
1630 ERR("Missing case for column %d\n", iColumn);
1631#else
1633#endif
1634 }
1635 }
1636
1637 return hr;
1638}
STDMETHOD() GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
Definition: CFSFolder.cpp:1421
static HRESULT GetFSColumnDetails(UINT iColumn, SHELLDETAILS &sd)
Definition: CFSFolder.cpp:541
#define DEFAULT_UNREACHABLE
BOOL _ILGetFileDate(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
Definition: pidl.c:2466
DWORD _ILGetFileSize(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
Definition: pidl.c:2510
void _ILGetFileType(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
Definition: pidl.c:2577
@ STRRET_CSTR
Definition: shtypes.idl:87
STRRET str
Definition: shtypes.idl:108
char cStr[MAX_PATH]
Definition: shtypes.idl:98
UINT uType
Definition: shtypes.idl:93

◆ GetDisplayNameOf()

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

Definition at line 1421 of file CFSFolder.cpp.

1423{
1424 if (!strRet)
1425 return E_INVALIDARG;
1426
1427 /* If it is a complex pidl, let the child handle it */
1428 if (!_ILIsPidlSimple (pidl)) /* complex pidl */
1429 {
1430 return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
1431 }
1432 else if (pidl && !pidl->mkid.cb) /* empty pidl */
1433 {
1434 /* If it is an empty pidl return only the path of the folder */
1438 {
1439 return SHSetStrRet(strRet, m_sPathTarget);
1440 }
1441 return E_INVALIDARG;
1442 }
1443
1444 int len = 0;
1445 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
1446 if (!pszPath)
1447 return E_OUTOFMEMORY;
1448
1452 {
1453 lstrcpynW(pszPath, m_sPathTarget, MAX_PATH);
1454 PathAddBackslashW(pszPath);
1455 len = wcslen(pszPath);
1456 }
1457 _ILSimpleGetTextW(pidl, pszPath + len, MAX_PATH + 1 - len);
1459
1460 strRet->uType = STRRET_WSTR;
1461 strRet->pOleStr = pszPath;
1462
1463 TRACE ("-- (%p)->(%s)\n", this, strRet->uType == STRRET_CSTR ? strRet->cStr : debugstr_w(strRet->pOleStr));
1464 return S_OK;
1465}
#define GET_SHGDN_RELATION(dwFlags)
Definition: precomp.h:53
#define GET_SHGDN_FOR(dwFlags)
Definition: precomp.h:52
void SHELL_FS_ProcessDisplayFilename(LPWSTR szPath, DWORD dwFlags)
Definition: CFSFolder.cpp:1398
GLenum GLsizei len
Definition: glext.h:6722
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define debugstr_w
Definition: kernel32.h:32
#define PathAddBackslashW
Definition: pathcch.h:301
DWORD _ILSimpleGetTextW(LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
Definition: pidl.c:2151
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:206
@ STRRET_WSTR
Definition: shtypes.idl:85
LPWSTR pOleStr
Definition: shtypes.idl:96

Referenced by GetDetailsOf().

◆ GetFolderTargetInfo()

HRESULT WINAPI CFSFolder::GetFolderTargetInfo ( PERSIST_FOLDER_TARGET_INFO ppfti)
override

Implements IPersistFolder3.

Definition at line 1783 of file CFSFolder.cpp.

1784{
1785 FIXME("(%p)->(%p)\n", this, ppfti);
1786 ZeroMemory(ppfti, sizeof (*ppfti));
1787 return E_NOTIMPL;
1788}
#define ZeroMemory
Definition: winbase.h:1712

◆ GetFSColumnDetails()

HRESULT CFSFolder::GetFSColumnDetails ( UINT  iColumn,
SHELLDETAILS sd 
)
static

Definition at line 541 of file CFSFolder.cpp.

542{
543 if (iColumn >= _countof(GenericSFHeader))
544 return E_INVALIDARG;
545
546 sd.fmt = GenericSFHeader[iColumn].fmt;
547 sd.cxChar = GenericSFHeader[iColumn].cxChar;
548 return SHSetStrRet(&sd.str, GenericSFHeader[iColumn].colnameid);
549}
static const WCHAR sd[]
Definition: suminfo.c:286

Referenced by CDesktopFolder::GetColumnDetails(), and GetDetailsOf().

◆ GetMaxLength()

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

Definition at line 91 of file CFSFolder.h.

92 {
93 return E_NOTIMPL;
94 }

◆ GetUIObjectOf()

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

Definition at line 1263 of file CFSFolder.cpp.

1267{
1268 LPVOID pObj = NULL;
1270
1271 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
1272 this, hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
1273
1274 if (ppvOut)
1275 {
1276 *ppvOut = NULL;
1277
1278 if (cidl == 1 && _ILIsValue(apidl[0]))
1279 {
1280 hr = _CreateExtensionUIObject(apidl[0], riid, ppvOut);
1281 if(hr != S_FALSE)
1282 return hr;
1283 }
1284
1285 if (IsEqualIID(riid, IID_IContextMenu) && (cidl >= 1))
1286 {
1287 HKEY hKeys[16];
1288 UINT cKeys = 0;
1289 AddFSClassKeysToArray(cidl, apidl, hKeys, &cKeys);
1290
1291 DEFCONTEXTMENU dcm;
1292 dcm.hwnd = hwndOwner;
1293 dcm.pcmcb = this;
1294 dcm.pidlFolder = m_pidlRoot;
1295 dcm.psf = this;
1296 dcm.cidl = cidl;
1297 dcm.apidl = apidl;
1298 dcm.cKeys = cKeys;
1299 dcm.aKeys = hKeys;
1301 hr = SHCreateDefaultContextMenu (&dcm, riid, &pObj);
1302 }
1303 else if (IsEqualIID (riid, IID_IDataObject))
1304 {
1305 if (cidl >= 1)
1306 {
1307 hr = IDataObject_Constructor (hwndOwner, m_pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
1308 }
1309 else
1310 {
1311 hr = E_INVALIDARG;
1312 }
1313 }
1314 else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
1315 {
1316 if (_ILIsValue(apidl[0]))
1317 hr = _GetIconHandler(apidl[0], riid, (LPVOID*)&pObj);
1318 if (hr != S_OK)
1319 hr = CFSExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
1320 }
1321 else if (IsEqualIID (riid, IID_IDropTarget))
1322 {
1323 /* only interested in attempting to bind to shell folders, not files (except exe), so if we fail, rebind to root */
1324 if (cidl != 1 || FAILED(hr = this->_GetDropTarget(apidl[0], (LPVOID*) &pObj)))
1325 {
1327 }
1328 }
1329 else
1330 hr = E_NOINTERFACE;
1331
1332 if (SUCCEEDED(hr) && !pObj)
1333 hr = E_OUTOFMEMORY;
1334
1335 *ppvOut = pObj;
1336 }
1337 TRACE("(%p)->hr=0x%08x\n", this, hr);
1338 return hr;
1339}
HRESULT IDataObject_Constructor(HWND hwndOwner, PCIDLIST_ABSOLUTE pMyPidl, PCUIDLIST_RELATIVE_ARRAY apidl, UINT cidl, BOOL bExtendedObject, IDataObject **dataObject)
HRESULT _GetIconHandler(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
Definition: CFSFolder.cpp:1841
HRESULT _GetDropTarget(LPCITEMIDLIST pidl, LPVOID *ppvOut)
Definition: CFSFolder.cpp:1813
HRESULT _CreateExtensionUIObject(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
Definition: CFSFolder.cpp:1790
HRESULT CFSExtractIcon_CreateInstance(IShellFolder *psf, LPCITEMIDLIST pidl, REFIID iid, LPVOID *ppvOut)
Definition: CFSFolder.cpp:243
const GUID IID_IDataObject
void AddFSClassKeysToArray(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:292
#define E_NOINTERFACE
Definition: winerror.h:2364

◆ GetValidCharacters()

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

Definition at line 97 of file CFSFolder.h.

98 {
99 if (ppwszValidChars)
100 {
101 *ppwszValidChars = NULL;
102 }
103 if (ppwszInvalidChars)
104 {
105 SHStrDupW(INVALID_FILETITLE_CHARACTERSW, ppwszInvalidChars);
106 }
107 return S_OK;
108 }
HRESULT WINAPI SHStrDupW(LPCWSTR src, LPWSTR *dest)
Definition: string.c:2012
#define INVALID_FILETITLE_CHARACTERSW
Definition: undocshell.h:897

◆ Initialize()

HRESULT WINAPI CFSFolder::Initialize ( PCIDLIST_ABSOLUTE  pidl)
override

Implements IPersistFolder.

Definition at line 1668 of file CFSFolder.cpp.

1669{
1670 WCHAR wszTemp[MAX_PATH];
1671
1672 TRACE ("(%p)->(%p)\n", this, pidl);
1673
1674 SHFree(m_pidlRoot); /* free the old pidl */
1675 m_pidlRoot = ILClone (pidl); /* set my pidl */
1676
1679
1680 /* set my path */
1681 if (SHGetPathFromIDListW (pidl, wszTemp))
1682 {
1683 int len = wcslen(wszTemp);
1684 m_sPathTarget = (WCHAR *)SHAlloc((len + 1) * sizeof(WCHAR));
1685 if (!m_sPathTarget)
1686 return E_OUTOFMEMORY;
1687 memcpy(m_sPathTarget, wszTemp, (len + 1) * sizeof(WCHAR));
1688 }
1689
1690 TRACE ("--(%p)->(%s)\n", this, debugstr_w(m_sPathTarget));
1691 return S_OK;
1692}
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:304
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878

◆ InitializeEx()

HRESULT WINAPI CFSFolder::InitializeEx ( IBindCtx pbc,
LPCITEMIDLIST  pidlRoot,
const PERSIST_FOLDER_TARGET_INFO ppfti 
)
override

Definition at line 1713 of file CFSFolder.cpp.

1715{
1716 WCHAR wszTemp[MAX_PATH];
1717
1718 TRACE("(%p)->(%p,%p,%p)\n", this, pbc, pidlRootx, ppfti);
1719 if (ppfti)
1720 TRACE("--%p %s %s 0x%08x 0x%08x\n",
1721 ppfti->pidlTargetFolder, debugstr_w (ppfti->szTargetParsingName),
1722 debugstr_w (ppfti->szNetworkProvider), ppfti->dwAttributes,
1723 ppfti->csidl);
1724
1725 pdump (pidlRootx);
1726 if (ppfti && ppfti->pidlTargetFolder)
1727 pdump(ppfti->pidlTargetFolder);
1728
1729 if (m_pidlRoot)
1730 __SHFreeAndNil(&m_pidlRoot); /* free the old */
1731 if (m_sPathTarget)
1733
1734 /*
1735 * Root path and pidl
1736 */
1737 m_pidlRoot = ILClone(pidlRootx);
1738
1739 /*
1740 * the target folder is spezified in csidl OR pidlTargetFolder OR
1741 * szTargetParsingName
1742 */
1743 if (ppfti)
1744 {
1745 if (ppfti->csidl != -1)
1746 {
1747 if (SHGetSpecialFolderPathW(0, wszTemp, ppfti->csidl,
1748 ppfti->csidl & CSIDL_FLAG_CREATE)) {
1749 int len = wcslen(wszTemp);
1750 m_sPathTarget = (WCHAR *)SHAlloc((len + 1) * sizeof(WCHAR));
1751 if (!m_sPathTarget)
1752 return E_OUTOFMEMORY;
1753 memcpy(m_sPathTarget, wszTemp, (len + 1) * sizeof(WCHAR));
1754 }
1755 }
1756 else if (ppfti->szTargetParsingName[0])
1757 {
1758 int len = wcslen(ppfti->szTargetParsingName);
1759 m_sPathTarget = (WCHAR *)SHAlloc((len + 1) * sizeof(WCHAR));
1760 if (!m_sPathTarget)
1761 return E_OUTOFMEMORY;
1762 memcpy(m_sPathTarget, ppfti->szTargetParsingName,
1763 (len + 1) * sizeof(WCHAR));
1764 }
1765 else if (ppfti->pidlTargetFolder)
1766 {
1767 if (SHGetPathFromIDListW(ppfti->pidlTargetFolder, wszTemp))
1768 {
1769 int len = wcslen(wszTemp);
1770 m_sPathTarget = (WCHAR *)SHAlloc((len + 1) * sizeof(WCHAR));
1771 if (!m_sPathTarget)
1772 return E_OUTOFMEMORY;
1773 memcpy(m_sPathTarget, wszTemp, (len + 1) * sizeof(WCHAR));
1774 }
1775 }
1776 }
1777
1778 TRACE("--(%p)->(target=%s)\n", this, debugstr_w(m_sPathTarget));
1780 return (m_sPathTarget) ? S_OK : E_FAIL;
1781}
BOOL WINAPI SHGetSpecialFolderPathW(HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:3092
#define __SHFreeAndNil(ptr)
Definition: shell32_main.h:146
#define CSIDL_FLAG_CREATE

◆ MapColumnToSCID()

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

Implements IShellFolder2.

Definition at line 1640 of file CFSFolder.cpp.

1642{
1643 FIXME ("(%p)\n", this);
1644 return E_NOTIMPL;
1645}

◆ MessageSFVCB()

HRESULT WINAPI CFSFolder::MessageSFVCB ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)
override

Definition at line 2050 of file CFSFolder.cpp.

2051{
2053 switch (uMsg)
2054 {
2057 break;
2058 }
2059 return hr;
2060}
#define SFVM_GET_CUSTOMVIEWINFO
HRESULT WINAPI GetCustomViewInfo(ULONG unknown, SFVM_CUSTOMVIEWINFO_DATA *data)
Definition: CFSFolder.cpp:1962
uint32_t ULONG
Definition: typedefs.h:59

◆ ParseDisplayName()

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

Definition at line 797 of file CFSFolder.cpp.

802{
803 TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
804 this, hwndOwner, pbc, lpszDisplayName, debugstr_w (lpszDisplayName),
805 pchEaten, ppidl, pdwAttributes);
806
807 if (!ppidl)
808 return E_INVALIDARG;
809
810 *ppidl = NULL;
811
812 if (!lpszDisplayName)
813 return E_INVALIDARG;
814
815 HRESULT hr;
816 WIN32_FIND_DATAW FindData;
817 if (SHIsFileSysBindCtx(pbc, &FindData) == S_OK)
818 {
819 CComHeapPtr<ITEMIDLIST> pidlTemp;
820 hr = _ParseSimple(lpszDisplayName, &FindData, &pidlTemp);
821 if (SUCCEEDED(hr) && pdwAttributes && *pdwAttributes)
822 {
823 LPCITEMIDLIST pidlLast = ILFindLastID(pidlTemp);
824 GetAttributesOf(1, &pidlLast, pdwAttributes);
825 }
826
827 if (SUCCEEDED(hr))
828 *ppidl = pidlTemp.Detach();
829 }
830 else
831 {
832 INT cchElement = lstrlenW(lpszDisplayName) + 1;
833 LPWSTR pszElement = (LPWSTR)alloca(cchElement * sizeof(WCHAR));
834 LPWSTR pchNext = lpszDisplayName;
835 hr = Shell_NextElement(&pchNext, pszElement, cchElement, TRUE);
836 if (FAILED(hr))
837 return hr;
838
839 hr = _CreateIDListFromName(pszElement, ULONG_MAX, pbc, ppidl);
840 if (FAILED(hr))
841 {
842 if (pchNext) // Is there the next element?
843 {
844 // pszElement seems like a directory
845 if (_GetFindDataFromName(pszElement, &FindData) &&
846 (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
847 {
848 hr = _CreateIDListFromName(pszElement, FILE_ATTRIBUTE_DIRECTORY, pbc, ppidl);
849 }
850 }
851 else
852 {
853 // pszElement seems like a non-directory
856 (BindCtx_GetMode(pbc, 0) & STGM_CREATE))
857 {
858 // Pretend like a normal file
859 hr = _CreateIDListFromName(pszElement, FILE_ATTRIBUTE_NORMAL, pbc, ppidl);
860 }
861 }
862 }
863
864 if (SUCCEEDED(hr))
865 {
866 if (pchNext) // Is there next?
867 {
868 CComPtr<IShellFolder> psfChild;
869 hr = BindToObject(*ppidl, pbc, IID_PPV_ARG(IShellFolder, &psfChild));
870 if (FAILED(hr))
871 return hr;
872
873 DWORD chEaten;
874 CComHeapPtr<ITEMIDLIST> pidlChild;
875 hr = psfChild->ParseDisplayName(hwndOwner, pbc, pchNext, &chEaten, &pidlChild,
876 pdwAttributes);
877
878 // Append pidlChild to ppidl
879 if (SUCCEEDED(hr))
880 hr = SHILAppend(pidlChild.Detach(), ppidl);
881 }
882 else if (pdwAttributes && *pdwAttributes)
883 {
884 GetAttributesOf(1, (LPCITEMIDLIST*)ppidl, pdwAttributes);
885 }
886 }
887 }
888
889 TRACE("(%p)->(-- pidl=%p ret=0x%08x)\n", this, ppidl ? *ppidl : 0, hr);
890
891 return hr;
892}
STDMETHOD() GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
Definition: CFSFolder.cpp:1183
HRESULT _ParseSimple(_In_ LPOLESTR lpszDisplayName, _Inout_ WIN32_FIND_DATAW *pFind, _Out_ LPITEMIDLIST *ppidl)
Definition: CFSFolder.cpp:686
HRESULT _CreateIDListFromName(LPCWSTR pszName, DWORD attrs, IBindCtx *pbc, LPITEMIDLIST *ppidl)
Definition: CFSFolder.cpp:741
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
#define lstrlenW
Definition: compat.h:750
DWORD BindCtx_GetMode(_In_ IBindCtx *pbc, _In_ DWORD dwDefault)
Definition: utils.cpp:114
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:139
#define alloca
Definition: malloc.h:357
#define STGM_CREATE
Definition: objbase.h:926
int32_t INT
Definition: typedefs.h:58
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:106

◆ SetNameOf()

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

Implements IShellFolder.

Definition at line 1479 of file CFSFolder.cpp.

1485{
1486 WCHAR szSrc[MAX_PATH + 1], szDest[MAX_PATH + 1];
1487 BOOL bIsFolder = _ILIsFolder (ILFindLastID (pidl));
1488
1489 TRACE ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this, hwndOwner, pidl,
1490 debugstr_w (lpName), dwFlags, pPidlOut);
1491
1492 FileStructW* pDataW = _ILGetFileStructW(pidl);
1493 if (!pDataW)
1494 {
1495 ERR("Got garbage pidl:\n");
1496 pdump_always(pidl);
1497 return E_INVALIDARG;
1498 }
1499
1500 /* build source path */
1501 PathCombineW(szSrc, m_sPathTarget, pDataW->wszName);
1502
1503 /* build destination path */
1506 else
1507 lstrcpynW(szDest, lpName, MAX_PATH);
1508
1510 WCHAR *ext = PathFindExtensionW(szSrc);
1511 if(*ext != '\0') {
1512 INT len = wcslen(szDest);
1513 lstrcpynW(szDest + len, ext, MAX_PATH - len);
1514 }
1515 }
1516
1517 TRACE ("src=%s dest=%s\n", debugstr_w(szSrc), debugstr_w(szDest));
1518 if (!wcscmp(szSrc, szDest))
1519 {
1520 /* src and destination is the same */
1521 HRESULT hr = S_OK;
1522 if (pPidlOut)
1523 hr = _ILCreateFromPathW(szDest, pPidlOut);
1524
1525 return hr;
1526 }
1527
1528 if (MoveFileW (szSrc, szDest))
1529 {
1530 HRESULT hr = S_OK;
1531
1532 if (pPidlOut)
1533 hr = _ILCreateFromPathW(szDest, pPidlOut);
1534
1536 SHCNF_PATHW, szSrc, szDest);
1537
1538 return hr;
1539 }
1540
1541 return E_FAIL;
1542}
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
static const WCHAR *const ext[]
Definition: module.c:53
BOOL WINAPI MoveFileW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName)
Definition: move.c:1104
BOOL SHELL_FS_HideExtension(LPCWSTR szPath)
Definition: CFSFolder.cpp:1354
HRESULT _ILCreateFromPathW(LPCWSTR szPath, LPITEMIDLIST *ppidl)
Definition: pidl.c:1833
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define SHCNE_RENAMEITEM
Definition: shlobj.h:1875
#define SHCNE_RENAMEFOLDER
Definition: shlobj.h:1892
#define SHCNF_PATHW
Definition: shlobj.h:1910
_In_ LPCSTR lpName
Definition: winbase.h:2789

Member Data Documentation

◆ m_bGroupPolicyActive

DWORD CFSFolder::m_bGroupPolicyActive
private

Definition at line 31 of file CFSFolder.h.

Referenced by CFSFolder().

◆ m_pclsid

const CLSID* CFSFolder::m_pclsid
private

Definition at line 24 of file CFSFolder.h.

Referenced by CFSFolder(), and GetClassID().

◆ m_pidlRoot

◆ m_sPathTarget


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