ReactOS 0.4.17-dev-1190-g4c812f4
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)
 
HRESULT GetValidCharacters ([out, string] LPWSTR *ppwszValidChars, [out, string] LPWSTR *ppwszInvalidChars)
 
HRESULT GetMaxLength ([in, string] LPCWSTR pszName, [out] int *piMaxNameLen)
 

Static Public Member Functions

static HRESULT GetFSColumnDetails (UINT iColumn, SHELLDETAILS &sd)
 
static HRESULT GetDefaultFSColumnState (UINT iColumn, SHCOLSTATEF &csFlags)
 
static HRESULT FormatDateTime (const FILETIME &ft, LPWSTR Buf, UINT cchBuf)
 
static HRESULT FormatSize (UINT64 size, LPWSTR Buf, UINT cchBuf)
 
static HRESULT CompareSortFoldersFirst (LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
 
static int CompareUiStrings (LPCWSTR a, LPCWSTR b, LPARAM lParam=0)
 
- Static Public Member Functions inherited from ATL::CComObjectRootBase
static void WINAPI ObjectMain (bool)
 
static const struct _ATL_CATMAP_ENTRY * GetCategoryMap ()
 
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 CLSID * m_pclsid
 
LPWSTR m_sPathTarget
 
LPITEMIDLIST m_pidlRoot
 
DWORD m_bGroupPolicyActive
 

Additional Inherited Members

- Public Types inherited from IShellFolder2
typedef struct IShellFolder2::SHCOLUMNID * LPSHCOLUMNID
 
typedef const SHCOLUMNID * LPCSHCOLUMNID
 
- 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 IShellFolder * LPSHELLFOLDER
 
typedef enum IShellFolder::tagSHGDN SHGNO
 
typedef DWORD SHGDNF
 
typedef DWORD SHCONTF
 
typedef ULONG SFGAOF
 
- Public Types inherited from IUnknown
typedef IUnknown * LPUNKNOWN
 
- Public Types inherited from IPersistFolder2
typedef IPersistFolder2 * LPPERSISTFOLDER2
 
- Public Types inherited from IPersistFolder
typedef IPersistFolder * LPPERSISTFOLDER
 
- Public Types inherited from IPersist
typedef IPersist * LPPERSIST
 
- 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 578 of file CFSFolder.cpp.

579{
580 m_pclsid = &CLSID_ShellFSFolder;
584}
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 586 of file CFSFolder.cpp.

587{
588 TRACE("-- destroying IShellFolder(%p)\n", this);
589
592}
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:370
#define TRACE(s)
Definition: solgame.cpp:4

Member Function Documentation

◆ _CreateExtensionUIObject()

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

Definition at line 1897 of file CFSFolder.cpp.

1898{
1900
1901 sprintfW(buf, L"ShellEx\\{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
1902 riid.Data1, riid.Data2, riid.Data3,
1903 riid.Data4[0], riid.Data4[1], riid.Data4[2], riid.Data4[3],
1904 riid.Data4[4], riid.Data4[5], riid.Data4[6], riid.Data4[7]);
1905
1906 CLSID clsid;
1907 HRESULT hr;
1908
1909 hr = GetCLSIDForFileType(pidl, buf, &clsid);
1910 if (hr != S_OK)
1911 return hr;
1912
1913 hr = _CreateShellExtInstance(&clsid, pidl, riid, ppvOut);
1915 return hr;
1916
1917 return S_OK;
1918}
HRESULT _CreateShellExtInstance(const CLSID *pclsid, LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
Definition: CFSFolder.cpp:1964
HRESULT hr
Definition: delayimp.cpp:582
#define MAX_PATH
Definition: compat.h:34
HRESULT GetCLSIDForFileType(PCUIDLIST_RELATIVE pidl, LPCWSTR KeyName, CLSID *pclsid)
Definition: CFSFolder.cpp:164
#define FAILED_UNEXPECTEDLY
Definition: utils.cpp:33
#define L(x)
Definition: resources.c:13
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
const CLSID * clsid
Definition: msctf.cpp:50
short WCHAR
Definition: pedump.c:58
#define sprintfW
Definition: unicode.h:58

Referenced by GetUIObjectOf().

◆ _CreateIDListFromName()

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

Definition at line 839 of file CFSFolder.cpp.

840{
841 *ppidl = NULL;
842
843 if (PathIsDosDevice(pszName))
845
846 WIN32_FIND_DATAW FindData = { 0 };
847
848 HRESULT hr = S_OK;
849 if (attrs == ULONG_MAX) // Invalid attributes
850 {
851 if (!_GetFindDataFromName(pszName, &FindData))
853 }
854 else // Pretend as an item of attrs
855 {
856 StringCchCopyW(FindData.cFileName, _countof(FindData.cFileName), pszName);
857 FindData.dwFileAttributes = attrs;
858 }
859
860 if (FAILED(hr))
861 return hr;
862
863 *ppidl = _ILCreateFromFindDataW(&FindData);
864 if (!*ppidl)
865 return E_OUTOFMEMORY;
866
867 return S_OK;
868}
BOOL _GetFindDataFromName(_In_ LPCWSTR pszName, _Out_ WIN32_FIND_DATAW *pFind)
Definition: CFSFolder.cpp:825
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define ULONG_MAX
Definition: limits.h:31
BOOL PathIsDosDevice(_In_ LPCWSTR pszName)
Definition: utils.cpp:240
#define FAILED(hr)
Definition: intsafe.h:51
LPITEMIDLIST _ILCreateFromFindDataW(const WIN32_FIND_DATAW *wfd)
Definition: pidl.c:1942
#define _countof(array)
Definition: sndvol32.h:70
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
_Field_z_ WCHAR cFileName[MAX_PATH]
Definition: minwinbase.h:291
DWORD dwFileAttributes
Definition: minwinbase.h:283
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define ERROR_BAD_DEVICE
Definition: winerror.h:1032

Referenced by ParseDisplayName().

◆ _CreateShellExtInstance()

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

Definition at line 1964 of file CFSFolder.cpp.

1965{
1966 HRESULT hr;
1967 WCHAR wszPath[MAX_PATH], szNameBuf[MAX_PATH];
1968
1969 LPCWSTR pszName = GetItemFileName(pidl, szNameBuf, _countof(szNameBuf));
1970 if (!pszName)
1971 {
1972 ERR("Got garbage pidl\n");
1973 pdump_always(pidl);
1974 return E_INVALIDARG;
1975 }
1976 PathCombineW(wszPath, m_sPathTarget, pszName);
1977
1978 CComPtr<IPersistFile> pp;
1981 return hr;
1982
1983 pp->Load(wszPath, 0);
1984
1985 hr = pp->QueryInterface(riid, ppvOut);
1986 if (hr != S_OK)
1987 {
1988 ERR("Failed to query for interface IID_IShellExtInit hr %x pclsid %s\n", hr, wine_dbgstr_guid(pclsid));
1989 return hr;
1990 }
1991 return hr;
1992}
#define IID_PPV_ARG(Itype, ppType)
#define ERR(fmt,...)
Definition: precomp.h:57
#define E_INVALIDARG
Definition: ddrawi.h:101
void pdump_always(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:330
static LPCWSTR GetItemFileName(PCUITEMID_CHILD pidl, LPWSTR Buf, UINT cchMax)
Definition: CFSFolder.cpp:24
HRESULT WINAPI SHCoCreateInstance(LPCWSTR aclsid, const CLSID *clsid, LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppv)
Definition: shellole.c:197
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define PathCombineW
Definition: pathcch.h:318
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:181
const uint16_t * LPCWSTR
Definition: typedefs.h:57

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

◆ _GetDropTarget()

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

Definition at line 1920 of file CFSFolder.cpp.

1921{
1922 HRESULT hr;
1923
1924 TRACE("CFSFolder::_GetDropTarget entered\n");
1925
1926 if (_ILIsFolder (pidl))
1927 {
1928 CComPtr<IShellFolder> psfChild;
1929 hr = this->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, &psfChild));
1931 return hr;
1932
1933 return psfChild->CreateViewObject(NULL, IID_IDropTarget, ppvOut);
1934 }
1935
1936 CLSID clsid;
1937 hr = GetCLSIDForFileType(pidl, L"shellex\\DropHandler", &clsid);
1938 if (hr != S_OK)
1939 return hr;
1940
1941 hr = _CreateShellExtInstance(&clsid, pidl, IID_IDropTarget, ppvOut);
1943 return S_FALSE;
1944
1945 return S_OK;
1946}
STDMETHOD() BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CFSFolder.cpp:1015
BOOL _ILIsFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2146
#define S_FALSE
Definition: winerror.h:3451

Referenced by GetUIObjectOf().

◆ _GetFindDataFromName()

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

Definition at line 825 of file CFSFolder.cpp.

826{
829 PathAppendW(szPath, pszName);
830
831 HANDLE hFind = ::FindFirstFileW(szPath, pFind);
832 if (hFind == INVALID_HANDLE_VALUE)
833 return FALSE;
834
835 ::FindClose(hFind);
836 return TRUE;
837}
#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:310

Referenced by _CreateIDListFromName(), and ParseDisplayName().

◆ _GetIconHandler()

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

Definition at line 1948 of file CFSFolder.cpp.

1949{
1950 CLSID clsid;
1951 HRESULT hr;
1952
1953 hr = GetCLSIDForFileType(pidl, L"shellex\\IconHandler", &clsid);
1954 if (hr != S_OK)
1955 return hr;
1956
1957 hr = _CreateShellExtInstance(&clsid, pidl, riid, ppvOut);
1959 return S_FALSE;
1960
1961 return S_OK;
1962}

Referenced by GetUIObjectOf().

◆ _ParseSimple()

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

Definition at line 784 of file CFSFolder.cpp.

788{
789 HRESULT hr;
790 LPWSTR pchNext = lpszDisplayName;
791
792 *ppidl = NULL;
793
794 const DWORD finalattr = pFind->dwFileAttributes;
795 const DWORD finalsizelo = pFind->nFileSizeLow;
796 LPITEMIDLIST pidl;
797 for (hr = S_OK; SUCCEEDED(hr); hr = SHILAppend(pidl, ppidl))
798 {
799 hr = Shell_NextElement(&pchNext, pFind->cFileName, _countof(pFind->cFileName), FALSE);
800 if (hr != S_OK)
801 break;
802
803 pFind->dwFileAttributes = pchNext ? FILE_ATTRIBUTE_DIRECTORY : finalattr;
804 pFind->nFileSizeLow = pchNext ? 0 : finalsizelo;
805 pidl = _ILCreateFromFindDataW(pFind);
806 if (!pidl)
807 {
809 break;
810 }
811 }
812
813 if (SUCCEEDED(hr))
814 return S_OK;
815
816 if (*ppidl)
817 {
818 ILFree(*ppidl);
819 *ppidl = NULL;
820 }
821
822 return hr;
823}
HRESULT SHILAppend(_Inout_ LPITEMIDLIST pidl, _Inout_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:261
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:1051
HRESULT Shell_NextElement(_Inout_ LPWSTR *ppch, _Out_ LPWSTR pszOut, _In_ INT cchOut, _In_ BOOL bValidate)
Definition: shlfolder.cpp:187
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
uint16_t * LPWSTR
Definition: typedefs.h:56

Referenced by ParseDisplayName().

◆ BindToObject()

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

Definition at line 1015 of file CFSFolder.cpp.

1020{
1021 TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this, pidl, pbc,
1022 shdebugstr_guid(&riid), ppvOut);
1023
1024 CComPtr<IShellFolder> pSF;
1025 HRESULT hr;
1026
1027 if (!m_pidlRoot || !ppvOut || !pidl || !pidl->mkid.cb)
1028 {
1029 ERR("CFSFolder::BindToObject: Invalid parameters\n");
1030 return E_INVALIDARG;
1031 }
1032
1033 /* Get the pidl data */
1035 WCHAR szNameBuf[MAX_PATH];
1036 LPCWSTR pszName = GetItemFileName(pidl, szNameBuf, _countof(szNameBuf));
1037 if (!pszName)
1038 {
1039 ERR("CFSFolder::BindToObject: Invalid pidl!\n");
1040 return E_INVALIDARG;
1041 }
1042
1043 *ppvOut = NULL;
1044
1045 /* Create the target folder info */
1046 PERSIST_FOLDER_TARGET_INFO pfti = {0};
1047 pfti.dwAttributes = -1;
1048 pfti.csidl = -1;
1049 PathCombineW(pfti.szTargetParsingName, m_sPathTarget, pszName);
1050
1051 /* Get the CLSID to bind to */
1052 CLSID clsidFolder;
1053 if (_ILIsFolder(pidl))
1054 {
1055 if ((pData->uFileAttribs & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_READONLY)) != 0)
1056 {
1057 hr = SHELL32_GetCLSIDForDirectory(pfti.szTargetParsingName, L"CLSID", &clsidFolder);
1058
1059 if (SUCCEEDED(hr))
1060 {
1061 /* We got a GUID from a desktop.ini, let's try it */
1062 hr = SHELL32_BindToSF(m_pidlRoot, &pfti, pidl, &clsidFolder, riid, ppvOut);
1063 if (SUCCEEDED(hr))
1064 {
1065 TRACE("-- returning (%p) %08x, (%s)\n", *ppvOut, hr, wine_dbgstr_guid(&clsidFolder));
1066 return hr;
1067 }
1068
1069 /* Something went wrong, re-try it with a normal ShellFSFolder */
1070 ERR("CFSFolder::BindToObject: %s failed to bind, using fallback (0x%08x)\n", wine_dbgstr_guid(&clsidFolder), hr);
1071 }
1072 }
1073 /* No system folder or the custom class failed */
1074 clsidFolder = CLSID_ShellFSFolder;
1075 }
1076 else
1077 {
1078 hr = GetCLSIDForFileType(pidl, L"CLSID", &clsidFolder);
1079 if (hr == S_FALSE)
1081 if (hr != S_OK)
1082 return hr;
1083 }
1084
1085 hr = SHELL32_BindToSF(m_pidlRoot, &pfti, pidl, &clsidFolder, riid, ppvOut);
1087 return hr;
1088
1089 TRACE ("-- returning (%p) %08x\n", *ppvOut, hr);
1090
1091 return S_OK;
1092
1093}
const char * shdebugstr_guid(const struct _GUID *id)
Definition: debughlp.cpp:438
static HRESULT SHELL32_GetCLSIDForDirectory(LPCWSTR pwszDir, LPCWSTR KeyName, CLSID *pclsidFolder)
Definition: CFSFolder.cpp:624
#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:2280
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:325
struct tagFileStruct file
Definition: pidl.h:235
union tagPIDLDATA::@698 u
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 1103 of file CFSFolder.cpp.

1108{
1109 FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this, pidl, pbcReserved,
1110 shdebugstr_guid (&riid), ppvOut);
1111
1112 *ppvOut = NULL;
1113 return E_NOTIMPL;
1114}
#define FIXME(fmt,...)
Definition: precomp.h:53
#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 1994 of file CFSFolder.cpp.

1995{
1996 enum { IDC_PROPERTIES };
1997 /* no data object means no selection */
1998 if (!pdtobj)
1999 {
2000 if (uMsg == DFM_INVOKECOMMAND && wParam == IDC_PROPERTIES)
2001 {
2003 }
2004 else if (uMsg == DFM_MERGECONTEXTMENU)
2005 {
2006 QCMINFO *pqcminfo = (QCMINFO *)lParam;
2007 HMENU hpopup = CreatePopupMenu();
2009 pqcminfo->idCmdFirst = Shell_MergeMenus(pqcminfo->hmenu, hpopup, pqcminfo->indexMenu, pqcminfo->idCmdFirst, pqcminfo->idCmdLast, MM_ADDSEPARATOR);
2010 DestroyMenu(hpopup);
2011 return S_OK;
2012 }
2013 }
2014 return SHELL32_DefaultContextMenuCallBack(psf, pdtobj, uMsg);
2015}
#define IDS_PROPERTIES
Definition: resource.h:108
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define IDC_PROPERTIES
Definition: resource.h:35
#define DFM_MERGECONTEXTMENU
Definition: precomp.h:44
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
HRESULT SHELL32_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdo, UINT msg)
Definition: shlfolder.cpp:656
HRESULT SHELL_ShowItemIDListProperties(LPCITEMIDLIST pidl)
Definition: item_prop.cpp:199
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
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
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:2575
HMENU hmenu
Definition: shlobj.h:1435
UINT idCmdLast
Definition: shlobj.h:1438
UINT idCmdFirst
Definition: shlobj.h:1437
UINT indexMenu
Definition: shlobj.h:1436

◆ CompareIDs()

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

Implements IShellFolder.

Definition at line 1134 of file CFSFolder.cpp.

1137{
1138 WCHAR szNameBuf1[MAX_PATH], szNameBuf2[_countof(szNameBuf1)];
1139 LPCWSTR pszName1 = GetItemFileName(pidl1, szNameBuf1, _countof(szNameBuf1));
1140 LPCWSTR pszName2 = GetItemFileName(pidl2, szNameBuf2, _countof(szNameBuf2));
1141 if (!pszName1 || !pszName2 || LOWORD(lParam) >= GENERICSHELLVIEWCOLUMNS)
1142 return E_INVALIDARG;
1143
1144 LPPIDLDATA pData1 = _ILGetDataPointer(pidl1);
1145 LPPIDLDATA pData2 = _ILGetDataPointer(pidl2);
1146 HRESULT hr = CompareSortFoldersFirst(pidl1, pidl2);
1147 if (SUCCEEDED(hr))
1148 return hr;
1149 int result = 0;
1150 switch (LOWORD(lParam))
1151 {
1152 case SHFSF_COL_NAME:
1153 result = CompareUiStrings(pszName1, pszName2, lParam);
1154 break;
1155 case SHFSF_COL_SIZE:
1156 if (pData1->u.file.dwFileSize > pData2->u.file.dwFileSize)
1157 result = 1;
1158 else if (pData1->u.file.dwFileSize < pData2->u.file.dwFileSize)
1159 result = -1;
1160 else
1161 result = 0;
1162 break;
1163 case SHFSF_COL_TYPE:
1164 {
1165 SHFILEINFOW info1, info2;
1166 enum { flags = SHGFI_PIDL | SHGFI_TYPENAME };
1167 if (SHGetFileInfoW((LPCWSTR)pidl1, 0, &info1, sizeof(info1), flags) &&
1168 SHGetFileInfoW((LPCWSTR)pidl2, 0, &info2, sizeof(info2), flags))
1169 {
1171 }
1172 break;
1173 }
1174 case SHFSF_COL_MDATE:
1175 result = pData1->u.file.uFileDate - pData2->u.file.uFileDate;
1176 if (result == 0)
1177 result = pData1->u.file.uFileTime - pData2->u.file.uFileTime;
1178 break;
1179 case SHFSF_COL_FATTS:
1180 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
1181 case SHFSF_COL_COMMENT:
1182 result = 0;
1183 break;
1184 default:
1185 if (_ILIsPidlSimple(pidl1) || _ILIsPidlSimple(pidl2))
1186 ERR("Unknown column %u, can't compare\n", LOWORD(lParam));
1187 else
1188 TRACE("Unknown column %u, deferring to the subfolder\n", LOWORD(lParam));
1189 }
1190
1191 if (result == 0)
1192 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
1193
1195}
static HRESULT CompareSortFoldersFirst(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: CFSFolder.cpp:1116
static int CompareUiStrings(LPCWSTR a, LPCWSTR b, LPARAM lParam=0)
Definition: CFSFolder.h:132
#define GENERICSHELLVIEWCOLUMNS
Definition: CFSFolder.cpp:603
GLbitfield flags
Definition: glext.h:7161
GLuint64EXT * result
Definition: glext.h:11304
#define LOWORD(l)
Definition: pedump.c:82
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
Definition: shell32_main.c:431
#define SHGFI_TYPENAME
Definition: shellapi.h:168
#define SHGFI_PIDL
Definition: shellapi.h:181
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:740
#define SHFSF_COL_COMMENT
Definition: shfldr.h:49
#define SHFSF_COL_SIZE
Definition: shfldr.h:45
#define SHFSF_COL_NAME
Definition: shfldr.h:44
HRESULT SHELL32_CompareChildren(IShellFolder2 *psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:381
#define SHFSF_COL_TYPE
Definition: shfldr.h:46
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:404
#define SHFSF_COL_FATTS
Definition: shfldr.h:48
#define SHFSF_COL_MDATE
Definition: shfldr.h:47
WCHAR szTypeName[80]
Definition: shellapi.h:389

◆ CompareSortFoldersFirst()

HRESULT CFSFolder::CompareSortFoldersFirst ( LPCITEMIDLIST  pidl1,
LPCITEMIDLIST  pidl2 
)
static

Definition at line 1116 of file CFSFolder.cpp.

1117{
1118 BOOL bIsFolder1 = _ILIsFolder(pidl1), bIsFolder2 = _ILIsFolder(pidl2);
1119 // When sorting between a File and a Folder, the Folder gets sorted first
1120 if (bIsFolder1 != bIsFolder2)
1121 {
1122 // ...but only if neither of them were generated by SHSimpleIDListFromPath
1123 // because in that case we cannot tell if it's a file or a folder.
1124 if (pidl1 && IsRealItem(*pidl1) && pidl2 && IsRealItem(*pidl2))
1125 return MAKE_COMPARE_HRESULT(bIsFolder1 ? -1 : 1);
1126 }
1128}
static BOOL IsRealItem(const ITEMIDLIST &idl)
Definition: CFSFolder.cpp:37
unsigned int BOOL
Definition: ntddk_ex.h:94
#define S_EQUAL
Definition: shellutils.h:738
#define FACILITY_SHELL
Definition: winerror.h:60
#define SEVERITY_ERROR
Definition: winerror.h:178
#define MAKE_SCODE(sev, fac, code)
Definition: winerror.h:182

Referenced by CompareIDs(), and CRecycleBin::CompareIDs().

◆ CompareUiStrings()

static int CFSFolder::CompareUiStrings ( LPCWSTR  a,
LPCWSTR  b,
LPARAM  lParam = 0 
)
inlinestatic

Definition at line 132 of file CFSFolder.h.

133 {
135 return _wcsicmp(a, b);
136 return SHELL_StrCmpLogical(a, b);
137 }
#define SHCIDS_CANONICALONLY
Definition: shobjidl.idl:226
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:164
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204

Referenced by CompareIDs(), CRecycleBin::CompareIDs(), and SHELL32_CompareDetails().

◆ CreateViewObject()

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

Definition at line 1200 of file CFSFolder.cpp.

1202{
1203 CComPtr<IShellView> pShellView;
1205
1206 TRACE ("(%p)->(hwnd=%p,%s,%p)\n", this, hwndOwner, shdebugstr_guid (&riid),
1207 ppvOut);
1208
1209 if (ppvOut)
1210 {
1211 *ppvOut = NULL;
1212
1213 BOOL bIsDropTarget = IsEqualIID (riid, IID_IDropTarget);
1214 BOOL bIsShellView = !bIsDropTarget && IsEqualIID (riid, IID_IShellView);
1215
1216 if (bIsDropTarget || bIsShellView)
1217 {
1218 DWORD dwDirAttributes = _ILGetFileAttributes(ILFindLastID(m_pidlRoot), NULL, 0);
1219
1220 if ((dwDirAttributes & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_READONLY)) != 0)
1221 {
1222 CLSID clsidFolder;
1223 hr = SHELL32_GetCLSIDForDirectory(m_sPathTarget, L"UICLSID", &clsidFolder);
1224 if (SUCCEEDED(hr))
1225 {
1226 CComPtr<IPersistFolder> spFolder;
1227 hr = SHCoCreateInstance(NULL, &clsidFolder, NULL, IID_PPV_ARG(IPersistFolder, &spFolder));
1228 if (!FAILED_UNEXPECTEDLY(hr))
1229 {
1230 hr = spFolder->Initialize(m_pidlRoot);
1231
1232 if (!FAILED_UNEXPECTEDLY(hr))
1233 {
1234 hr = spFolder->QueryInterface(riid, ppvOut);
1235 }
1236 }
1237 }
1238 else
1239 {
1240 // No desktop.ini, or no UICLSID present, continue as if nothing happened
1241 hr = E_INVALIDARG;
1242 }
1243 }
1244 }
1245
1246 if (!SUCCEEDED(hr))
1247 {
1248 // No UICLSID handler found, continue to the default handlers
1249 if (bIsDropTarget)
1250 {
1252 }
1253 else if (bIsShellView)
1254 {
1255 SFV_CREATE sfvparams = { sizeof(SFV_CREATE), this, NULL, this };
1256 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
1257 }
1258 else if (IsEqualIID(riid, IID_IContextMenu))
1259 {
1261 AddClassKeyToArray(L"Directory\\Background", keys, keys);
1262 DEFCONTEXTMENU dcm = { hwndOwner, this, m_pidlRoot, this, 0, NULL, NULL, keys, keys };
1263 hr = SHCreateDefaultContextMenu(&dcm, riid, ppvOut);
1264 }
1265 else
1266 {
1267 hr = E_INVALIDARG;
1268 }
1269 }
1270 }
1271 TRACE("-- (%p)->(interface=%p)\n", this, ppvOut);
1272 return hr;
1273}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:4806
HRESULT WINAPI SHCreateDefaultContextMenu(const DEFCONTEXTMENU *pdcm, REFIID riid, void **ppv)
HRESULT CFSDropTarget_CreateInstance(LPWSTR sPathTarget, REFIID riid, LPVOID *ppvOut)
const UINT * keys
Definition: locale.c:418
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: fontext.cpp:109
DWORD _ILGetFileAttributes(LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize)
Definition: pidl.c:2587
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:199
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
struct _SFV_CREATE SFV_CREATE

◆ EnumObjects()

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

Definition at line 999 of file CFSFolder.cpp.

1003{
1004 return ShellObjectCreatorInit<CFileSysEnum>(m_sPathTarget, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
1005}
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141

◆ EnumSearches()

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

Implements IShellFolder2.

Definition at line 1622 of file CFSFolder.cpp.

1623{
1624 *ppenum = NULL;
1625 return E_NOTIMPL;
1626}

◆ FormatDateTime()

HRESULT CFSFolder::FormatDateTime ( const FILETIME &  ft,
LPWSTR  Buf,
UINT  cchBuf 
)
static

Definition at line 2148 of file CFSFolder.cpp.

2149{
2150 FILETIME lft;
2152 FileTimeToLocalFileTime(&ft, &lft);
2153 FileTimeToSystemTime(&lft, &time);
2155 if (ret > 0 && ret < cchBuf)
2156 {
2157 /* Append space + time without seconds */
2158 Buf[ret-1] = ' ';
2160 }
2161 return ret ? S_OK : E_FAIL;
2162}
#define E_FAIL
Definition: ddrawi.h:102
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:183
BOOL WINAPI FileTimeToLocalFileTime(IN CONST FILETIME *lpFileTime, OUT LPFILETIME lpLocalFileTime)
Definition: time.c:216
return ret
Definition: mutex.c:147
unsigned int UINT
Definition: sysinfo.c:13
INT WINAPI GetTimeFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpTimeStr, INT cchOut)
Definition: lcformat.c:1101
INT WINAPI GetDateFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpDateStr, INT cchOut)
Definition: lcformat.c:1001
__u16 time
Definition: mkdosfs.c:8
#define LOCALE_USER_DEFAULT
_In_ UINT cchBuf
Definition: shlwapi.h:378
#define TIME_NOSECONDS
Definition: winnls.h:306
#define DATE_SHORTDATE
Definition: winnls.h:216

Referenced by GetDetailsOf(), and CRecycleBin::GetDetailsOf().

◆ FormatSize()

HRESULT CFSFolder::FormatSize ( UINT64  size,
LPWSTR  Buf,
UINT  cchBuf 
)
static

Definition at line 2164 of file CFSFolder.cpp.

2165{
2166 if (StrFormatKBSizeW(size, Buf, cchBuf))
2167 return S_OK;
2168 if (cchBuf)
2169 *Buf = UNICODE_NULL;
2170 return E_FAIL;
2171}
LPWSTR WINAPI StrFormatKBSizeW(LONGLONG llBytes, LPWSTR lpszDest, UINT cchMax)
Definition: string.c:475
GLsizeiptr size
Definition: glext.h:5919
#define UNICODE_NULL

Referenced by CRecycleBin::GetDetailsOf().

◆ GetAttributesOf()

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

Definition at line 1284 of file CFSFolder.cpp.

1286{
1287 HRESULT hr = S_OK;
1288
1289 if (!rgfInOut)
1290 return E_INVALIDARG;
1291 if (cidl && !apidl)
1292 return E_INVALIDARG;
1293
1294 if (*rgfInOut == 0)
1295 *rgfInOut = ~0;
1296
1297 if(cidl == 0)
1298 {
1300
1301 if (_ILIsFolderOrFile(rpidl))
1302 {
1303 SHELL32_GetFSItemAttributes(this, rpidl, rgfInOut);
1304 }
1305 else if (_ILIsDrive(rpidl))
1306 {
1307 IShellFolder *psfParent = NULL;
1309 if(SUCCEEDED(hr))
1310 {
1311 hr = psfParent->GetAttributesOf(1, &rpidl, (SFGAOF*)rgfInOut);
1312 psfParent->Release();
1313 }
1314 }
1315 else
1316 {
1317 ERR("Got and unknown pidl!\n");
1318 }
1319 }
1320 else
1321 {
1322 while (cidl > 0 && *apidl)
1323 {
1324 pdump(*apidl);
1325 if (_ILIsFolderOrFile(*apidl))
1326 SHELL32_GetFSItemAttributes(this, *apidl, rgfInOut);
1327 else
1328 ERR("Got an unknown type of pidl!!!\n");
1329 apidl++;
1330 cidl--;
1331 }
1332 }
1333 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
1334 *rgfInOut &= ~SFGAO_VALIDATE;
1335
1336 TRACE("-- result=0x%08x\n", *rgfInOut);
1337
1338 return hr;
1339}
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:322
HRESULT SHELL32_GetFSItemAttributes(IShellFolder *psf, LPCITEMIDLIST pidl, LPDWORD pdwAttributes)
Definition: CFSFolder.cpp:644
ULONG SFGAOF
Definition: shobjidl.idl:222
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:1504
BOOL _ILIsDrive(LPCITEMIDLIST pidl)
Definition: pidl.c:2139
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42

Referenced by ParseDisplayName().

◆ GetClassID()

HRESULT WINAPI CFSFolder::GetClassID ( CLSID *  lpClassId)
override

Implements IPersist.

Definition at line 1778 of file CFSFolder.cpp.

1779{
1780 TRACE ("(%p)\n", this);
1781
1782 if (!lpClassId)
1783 return E_POINTER;
1784
1785 *lpClassId = *m_pclsid;
1786
1787 return S_OK;
1788}
#define E_POINTER
Definition: winerror.h:3480

◆ GetCurFolder()

HRESULT WINAPI CFSFolder::GetCurFolder ( PIDLIST_ABSOLUTE *  pidl)
override

Implements IPersistFolder2.

Definition at line 1820 of file CFSFolder.cpp.

1821{
1822 TRACE ("(%p)->(%p)\n", this, pidl);
1823
1824 if (!pidl)
1825 return E_POINTER;
1826
1827 *pidl = ILClone(m_pidlRoot);
1828 return S_OK;
1829}
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:238

◆ GetCustomViewInfo()

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

Definition at line 2044 of file CFSFolder.cpp.

2045{
2046 if (data == NULL)
2047 {
2048 return E_POINTER;
2049 }
2050 if (data->cbSize != sizeof(*data))
2051 {
2052 // NOTE: You have to set the cbData member before SFVM_GET_CUSTOMVIEWINFO call.
2053 return E_INVALIDARG;
2054 }
2055
2056 data->hbmBack = NULL;
2057 data->clrText = CLR_INVALID;
2058 data->clrTextBack = CLR_INVALID;
2059
2061
2062 // does the folder exists?
2064 {
2065 return E_INVALIDARG;
2066 }
2067
2068 // don't use custom view in network path for security
2070 {
2071 return E_ACCESSDENIED;
2072 }
2073
2074 // build the ini file path
2076 PathAppend(szIniFile, L"desktop.ini");
2077
2078 static LPCWSTR TheGUID = L"{BE098140-A513-11D0-A3A4-00C04FD706EC}";
2079 static LPCWSTR Space = L" \t\n\r\f\v";
2080
2081 // get info from ini file
2082 WCHAR szImage[MAX_PATH], szText[64];
2083
2084 // load the image
2085 szImage[0] = UNICODE_NULL;
2086 GetPrivateProfileStringW(TheGUID, L"IconArea_Image", L"", szImage, _countof(szImage), szIniFile);
2087 if (szImage[0])
2088 {
2089 StrTrimW(szImage, Space);
2090 if (PathIsRelativeW(szImage))
2091 {
2092 PathAppendW(szPath, szImage);
2093 StringCchCopyW(szImage, _countof(szImage), szPath);
2094 }
2095 data->hbmBack = DoLoadPicture(szImage);
2096 }
2097
2098 // load the text color
2099 szText[0] = UNICODE_NULL;
2100 GetPrivateProfileStringW(TheGUID, L"IconArea_Text", L"", szText, _countof(szText), szIniFile);
2101 if (szText[0])
2102 {
2103 StrTrimW(szText, Space);
2104
2105 LPWSTR pchEnd = NULL;
2106 COLORREF cr = (wcstol(szText, &pchEnd, 0) & 0xFFFFFF);
2107
2108 if (pchEnd && !*pchEnd)
2109 data->clrText = cr;
2110 }
2111
2112 // load the text background color
2113 szText[0] = UNICODE_NULL;
2114 GetPrivateProfileStringW(TheGUID, L"IconArea_TextBackground", L"", szText, _countof(szText), szIniFile);
2115 if (szText[0])
2116 {
2117 StrTrimW(szText, Space);
2118
2119 LPWSTR pchEnd = NULL;
2120 COLORREF cr = (wcstol(szText, &pchEnd, 0) & 0xFFFFFF);
2121
2122 if (pchEnd && !*pchEnd)
2123 data->clrTextBack = cr;
2124 }
2125
2126 if (data->hbmBack != NULL || data->clrText != CLR_INVALID || data->clrTextBack != CLR_INVALID)
2127 return S_OK;
2128
2129 return E_FAIL;
2130}
INT WINAPI GetPrivateProfileStringW(LPCWSTR section, LPCWSTR entry, LPCWSTR def_val, LPWSTR buffer, UINT len, LPCWSTR filename)
Definition: profile.c:1142
BOOL WINAPI PathIsRelativeW(const WCHAR *path)
Definition: path.c:1006
BOOL WINAPI StrTrimW(WCHAR *str, const WCHAR *trim)
Definition: string.c:804
_ACRTIMP __msvcrt_long __cdecl wcstol(const wchar_t *, wchar_t **, int)
Definition: wcs.c:2752
static HBITMAP DoLoadPicture(LPCWSTR pszFileName)
Definition: CFSFolder.cpp:2017
BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
Definition: path.c:669
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
#define PathAppend
Definition: pathcch.h:308
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1496
#define PathIsNetworkPath
Definition: shlwapi.h:481
TCHAR szIniFile[]
Definition: scrnsave.c:29
DWORD COLORREF
Definition: windef.h:100
#define E_ACCESSDENIED
Definition: winerror.h:4116
#define CLR_INVALID
Definition: wingdi.h:883

Referenced by MessageSFVCB().

◆ GetDefaultColumn()

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

Implements IShellFolder2.

Definition at line 1628 of file CFSFolder.cpp.

1630{
1631 TRACE ("(%p)\n", this);
1632 return E_NOTIMPL; // Not required when column 0 is our default.
1633}

◆ GetDefaultColumnState()

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

Implements IShellFolder2.

Definition at line 1635 of file CFSFolder.cpp.

1637{
1638 TRACE ("(%p)\n", this);
1639
1640 if (!pcsFlags)
1641 return E_INVALIDARG;
1642 else
1643 return GetDefaultFSColumnState(iColumn, *pcsFlags);
1644}
static HRESULT GetDefaultFSColumnState(UINT iColumn, SHCOLSTATEF &csFlags)
Definition: CFSFolder.cpp:615

◆ GetDefaultFSColumnState()

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

Definition at line 615 of file CFSFolder.cpp.

616{
617 if (iColumn >= _countof(GenericSFHeader))
618 return E_INVALIDARG;
619
620 csFlags = GenericSFHeader[iColumn].colstate;
621 return S_OK;
622}
static const shvheader GenericSFHeader[]
Definition: CFSFolder.cpp:594
WORD colstate
Definition: shfldr.h:32

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

◆ GetDefaultSearchGUID()

HRESULT WINAPI CFSFolder::GetDefaultSearchGUID ( GUID *  pguid)
override

Implements IShellFolder2.

Definition at line 1617 of file CFSFolder.cpp.

1618{
1619 return E_NOTIMPL;
1620}

◆ GetDetailsEx()

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

Implements IShellFolder2.

Definition at line 1646 of file CFSFolder.cpp.

1647{
1648 if (!_ILGetFSType(pidl))
1649 return E_INVALIDARG;
1650 HRESULT hr;
1651 if (pscid->fmtid == FMTID_ShellDetails)
1652 {
1653 switch (pscid->pid)
1654 {
1655 case PID_DESCRIPTIONID:
1656 {
1658 return hr;
1659 SHDESCRIPTIONID *pDID = (SHDESCRIPTIONID*)V_ARRAY(pv)->pvData;
1660 if (ItemIsFolder(pidl))
1662 else if (_ILGetFSType(pidl) & PT_FS_FILE_FLAG)
1664 else
1666 if (FAILED(GetItemCLSID(pidl, &pDID->clsid)))
1667 pDID->clsid = CLSID_NULL;
1668 return S_OK;
1669 }
1670 }
1671 }
1672 // Handle non-string fields here when possible instead of deferring to GetDetailsOf
1673 const FileStruct &fsitem = ((PIDLDATA*)pidl->mkid.abID)->u.file;
1674 if (pscid->fmtid == FMTID_Storage)
1675 {
1676 switch (pscid->pid)
1677 {
1678 case PID_STG_NAME: // Handled directly here for faster performance
1679 return SHELL_GetDetailsOfAsStringVariant(static_cast<IShellFolder2*>(this), pidl, SHFSF_COL_NAME, pv);
1680 case PID_STG_SIZE:
1681 V_VT(pv) = VT_UI4;
1682 V_UI4(pv) = _ILGetFileSize(pidl, NULL, 0);
1683 return S_OK;
1684 case PID_STG_ATTRIBUTES:
1685 V_VT(pv) = VT_UI4;
1686 V_UI4(pv) = fsitem.uFileAttribs;
1687 return S_OK;
1688 case PID_STG_WRITETIME:
1689 V_VT(pv) = VT_DATE;
1690 if (DosDateTimeToVariantTime(fsitem.uFileDate, fsitem.uFileTime, &V_DATE(pv)))
1691 return S_OK;
1692 break;
1693 }
1694 }
1695 return SH32_GetDetailsOfPKeyAsVariant(this, pidl, pscid, pv, TRUE);
1696}
@ VT_DATE
Definition: compat.h:2302
@ VT_UI4
Definition: compat.h:2313
HRESULT GetItemCLSID(PCUIDLIST_RELATIVE pidl, CLSID *pclsid)
Definition: CFSFolder.cpp:174
static BOOL ItemIsFolder(PCUITEMID_CHILD pidl)
Definition: CFSFolder.cpp:17
if(dx< 0)
Definition: linetemp.h:194
#define PID_STG_WRITETIME
Definition: ntquery.h:60
#define PID_STG_SIZE
Definition: ntquery.h:58
#define PID_STG_ATTRIBUTES
Definition: ntquery.h:59
#define PID_STG_NAME
Definition: ntquery.h:56
#define V_ARRAY(A)
Definition: oleauto.h:222
#define V_VT(A)
Definition: oleauto.h:211
#define V_UI4(A)
Definition: oleauto.h:270
#define V_DATE(A)
Definition: oleauto.h:231
DWORD _ILGetFileSize(LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize)
Definition: pidl.c:2521
static BYTE _ILGetFSType(LPCITEMIDLIST pidl)
Definition: pidl.h:149
#define CLSID_NULL
Definition: guiddef.h:99
static HRESULT SHELL_CreateVariantBuffer(VARIANT *pVar, UINT cb)
Definition: shell32_main.h:284
HRESULT SH32_GetDetailsOfPKeyAsVariant(IShellFolder2 *pSF, PCUITEMID_CHILD pidl, const SHCOLUMNID *pscid, VARIANT *pVar, BOOL UseFsColMap)
Definition: shlfolder.cpp:152
HRESULT SHELL_GetDetailsOfAsStringVariant(IShellFolder *pSF, PCUITEMID_CHILD pidl, UINT Column, VARIANT *pVar)
Definition: shlfolder.cpp:116
#define PID_DESCRIPTIONID
Definition: shlguid.h:175
#define SHDID_FS_DIRECTORY
Definition: shlobj.h:1503
#define SHDID_FS_OTHER
Definition: shlobj.h:1504
#define SHDID_FS_FILE
Definition: shlobj.h:1502
DWORD dwDescriptionId
Definition: shlobj.h:1525
WORD uFileDate
Definition: pidl.h:202
WORD uFileAttribs
Definition: pidl.h:204
WORD uFileTime
Definition: pidl.h:203
INT WINAPI DosDateTimeToVariantTime(USHORT wDosDate, USHORT wDosTime, double *pDateOut)
Definition: variant.c:1188

◆ GetDetailsOf()

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

Implements IShellFolder2.

Definition at line 1698 of file CFSFolder.cpp.

1700{
1701 HRESULT hr = E_FAIL;
1702
1703 TRACE ("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd);
1704
1705 if (!psd || iColumn >= GENERICSHELLVIEWCOLUMNS)
1706 return E_INVALIDARG;
1707
1708 if (!pidl)
1709 {
1710 /* the header titles */
1711 return GetFSColumnDetails(iColumn, *psd);
1712 }
1713 else
1714 {
1715 FILETIME ft;
1716 hr = S_OK;
1717 psd->str.uType = STRRET_WSTR;
1718 if (iColumn != SHFSF_COL_NAME)
1719 {
1720 psd->str.pOleStr = (LPWSTR)CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR));
1721 if (!psd->str.pOleStr)
1722 return E_OUTOFMEMORY;
1723 }
1724 /* the data from the pidl */
1725 switch (iColumn)
1726 {
1727 case SHFSF_COL_NAME:
1729 break;
1730 case SHFSF_COL_SIZE:
1731 _ILGetFileSize(pidl, psd->str.pOleStr, MAX_PATH);
1732 break;
1733 case SHFSF_COL_TYPE:
1735 break;
1736 case SHFSF_COL_MDATE:
1737 if (!_ILGetFileDateTime(pidl, &ft) || FAILED(FormatDateTime(ft, psd->str.pOleStr, MAX_PATH)))
1738 {
1739 *psd->str.pOleStr = UNICODE_NULL;
1740 hr = S_FALSE;
1741 }
1742 break;
1743 case SHFSF_COL_FATTS:
1745 break;
1746 case SHFSF_COL_COMMENT:
1747 psd->str.pOleStr[0] = UNICODE_NULL; // TODO: Extract comment from .lnk files? desktop.ini?
1748 break;
1749#if DBG
1750 default:
1751 ERR("Missing case for column %d\n", iColumn);
1752#else
1754#endif
1755 }
1756 }
1757
1758 return hr;
1759}
STDMETHOD() GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
Definition: CFSFolder.cpp:1502
static HRESULT GetFSColumnDetails(UINT iColumn, SHELLDETAILS &sd)
Definition: CFSFolder.cpp:605
static HRESULT FormatDateTime(const FILETIME &ft, LPWSTR Buf, UINT cchBuf)
Definition: CFSFolder.cpp:2148
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
static void GetItemDescription(PCUITEMID_CHILD pidl, LPWSTR Buf, UINT cchMax)
Definition: CFSFolder.cpp:44
#define DEFAULT_UNREACHABLE
BOOL _ILGetFileDateTime(LPCITEMIDLIST pidl, FILETIME *pFt)
Definition: pidl.c:2494
@ STRRET_WSTR
Definition: shtypes.idl:85
STRRET str
Definition: shtypes.idl:108
UINT uType
Definition: shtypes.idl:93
LPWSTR pOleStr
Definition: shtypes.idl:96

◆ GetDisplayNameOf()

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

Definition at line 1502 of file CFSFolder.cpp.

1504{
1505 if (!strRet)
1506 return E_INVALIDARG;
1507
1508 /* If it is a complex pidl, let the child handle it */
1509 if (!_ILIsPidlSimple (pidl)) /* complex pidl */
1510 {
1511 return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
1512 }
1513 else if (pidl && !pidl->mkid.cb) /* empty pidl */
1514 {
1515 /* If it is an empty pidl return only the path of the folder */
1519 {
1520 return SHSetStrRet(strRet, m_sPathTarget);
1521 }
1522 return E_INVALIDARG;
1523 }
1524
1525 int len = 0;
1526 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
1527 if (!pszPath)
1528 return E_OUTOFMEMORY;
1529
1533 {
1534 lstrcpynW(pszPath, m_sPathTarget, MAX_PATH);
1535 PathAddBackslashW(pszPath);
1536 len = wcslen(pszPath);
1537 }
1538 _ILSimpleGetTextW(pidl, pszPath + len, MAX_PATH + 1 - len);
1540
1541 strRet->uType = STRRET_WSTR;
1542 strRet->pOleStr = pszPath;
1543
1544 TRACE ("-- (%p)->(%s)\n", this, strRet->uType == STRRET_CSTR ? strRet->cStr : debugstr_w(strRet->pOleStr));
1545 return S_OK;
1546}
#define GET_SHGDN_RELATION(dwFlags)
Definition: precomp.h:53
#define GET_SHGDN_FOR(dwFlags)
Definition: precomp.h:52
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
void SHELL_FS_ProcessDisplayFilename(LPWSTR szPath, DWORD dwFlags)
Definition: CFSFolder.cpp:1479
GLenum GLsizei len
Definition: glext.h:6722
#define debugstr_w
Definition: kernel32.h:32
#define PathAddBackslashW
Definition: pathcch.h:302
DWORD _ILSimpleGetTextW(LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
Definition: pidl.c:2200
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:363
@ STRRET_CSTR
Definition: shtypes.idl:87
char cStr[MAX_PATH]
Definition: shtypes.idl:98

Referenced by GetDetailsOf().

◆ GetFolderTargetInfo()

HRESULT WINAPI CFSFolder::GetFolderTargetInfo ( PERSIST_FOLDER_TARGET_INFO *  ppfti)
override

Implements IPersistFolder3.

Definition at line 1890 of file CFSFolder.cpp.

1891{
1892 FIXME("(%p)->(%p)\n", this, ppfti);
1893 ZeroMemory(ppfti, sizeof (*ppfti));
1894 return E_NOTIMPL;
1895}
#define ZeroMemory
Definition: minwinbase.h:31

◆ GetFSColumnDetails()

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

Definition at line 605 of file CFSFolder.cpp.

606{
607 if (iColumn >= _countof(GenericSFHeader))
608 return E_INVALIDARG;
609
610 sd.fmt = GenericSFHeader[iColumn].fmt;
611 sd.cxChar = GenericSFHeader[iColumn].cxChar;
612 return SHSetStrRet(&sd.str, GenericSFHeader[iColumn].colnameid);
613}
static const WCHAR sd[]
Definition: suminfo.c:432

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

◆ GetMaxLength()

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

Implements IItemNameLimits.

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 1364 of file CFSFolder.cpp.

1368{
1369 LPVOID pObj = NULL;
1371
1372 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
1373 this, hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
1374
1375 if (ppvOut)
1376 {
1377 *ppvOut = NULL;
1378
1379 if (cidl == 1 && _ILIsValue(apidl[0]))
1380 {
1381 hr = _CreateExtensionUIObject(apidl[0], riid, ppvOut);
1382 if(hr != S_FALSE)
1383 return hr;
1384 }
1385
1386 if (IsEqualIID(riid, IID_IContextMenu) && (cidl >= 1))
1387 {
1389 AddFSClassKeysToArray(cidl, apidl, keys, keys);
1390 DEFCONTEXTMENU dcm = { hwndOwner, this, m_pidlRoot, this, cidl, apidl, NULL, keys, keys };
1391 hr = SHCreateDefaultContextMenu(&dcm, riid, &pObj);
1392 }
1393 else if (IsEqualIID (riid, IID_IDataObject))
1394 {
1395 if (cidl >= 1)
1396 {
1397 hr = IDataObject_Constructor (hwndOwner, m_pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
1398 }
1399 else
1400 {
1401 hr = E_INVALIDARG;
1402 }
1403 }
1404 else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
1405 {
1406 if (_ILIsValue(apidl[0]))
1407 hr = _GetIconHandler(apidl[0], riid, (LPVOID*)&pObj);
1408 if (hr != S_OK)
1409 hr = CFSExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
1410 }
1411 else if (IsEqualIID (riid, IID_IDropTarget))
1412 {
1413 /* only interested in attempting to bind to shell folders, not files (except exe), so if we fail, rebind to root */
1414 if (cidl != 1 || FAILED(hr = this->_GetDropTarget(apidl[0], (LPVOID*) &pObj)))
1415 {
1417 }
1418 }
1419 else
1420 hr = E_NOINTERFACE;
1421
1422 if (SUCCEEDED(hr) && !pObj)
1423 hr = E_OUTOFMEMORY;
1424
1425 *ppvOut = pObj;
1426 }
1427 TRACE("(%p)->hr=0x%08x\n", this, hr);
1428 return hr;
1429}
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:1948
HRESULT _GetDropTarget(LPCITEMIDLIST pidl, LPVOID *ppvOut)
Definition: CFSFolder.cpp:1920
HRESULT _CreateExtensionUIObject(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
Definition: CFSFolder.cpp:1897
HRESULT CFSExtractIcon_CreateInstance(IShellFolder *psf, LPCITEMIDLIST pidl, REFIID iid, LPVOID *ppvOut)
Definition: CFSFolder.cpp:296
const GUID IID_IDataObject
BOOL _ILIsValue(LPCITEMIDLIST pidl)
Definition: pidl.c:2153
void AddFSClassKeysToArray(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:462
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ GetValidCharacters()

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

Implements IItemNameLimits.

Definition at line 97 of file CFSFolder.h.

98 {
99 if (ppwszValidChars)
100 *ppwszValidChars = NULL;
101 if (ppwszInvalidChars)
102 return SHStrDupW(INVALID_FILETITLE_CHARACTERSW, ppwszInvalidChars);
103 return S_OK;
104 }
HRESULT WINAPI SHStrDupW(const WCHAR *src, WCHAR **dest)
Definition: main.c:1692
#define INVALID_FILETITLE_CHARACTERSW
Definition: undocshell.h:1084

◆ Initialize()

HRESULT WINAPI CFSFolder::Initialize ( PCIDLIST_ABSOLUTE  pidl)
override

Implements IPersistFolder.

Definition at line 1796 of file CFSFolder.cpp.

1797{
1798 WCHAR wszTemp[MAX_PATH];
1799
1800 TRACE ("(%p)->(%p)\n", this, pidl);
1801
1802 SHFree(m_pidlRoot); /* free the old pidl */
1803 m_pidlRoot = ILClone (pidl); /* set my pidl */
1804
1807
1808 /* set my path */
1809 HRESULT hr = E_FAIL;
1810 if (SHGetPathFromIDListW (pidl, wszTemp))
1811 hr = SHStrDupW(wszTemp, &m_sPathTarget);
1812
1813 TRACE ("--(%p)->(%s)\n", this, debugstr_w(m_sPathTarget));
1814 return hr;
1815}

◆ InitializeEx()

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

Definition at line 1836 of file CFSFolder.cpp.

1838{
1839 WCHAR wszTemp[MAX_PATH];
1840
1841 TRACE("(%p)->(%p,%p,%p)\n", this, pbc, pidlRootx, ppfti);
1842 if (ppfti)
1843 TRACE("--%p %s %s 0x%08x 0x%08x\n",
1844 ppfti->pidlTargetFolder, debugstr_w (ppfti->szTargetParsingName),
1845 debugstr_w (ppfti->szNetworkProvider), ppfti->dwAttributes,
1846 ppfti->csidl);
1847
1848 pdump (pidlRootx);
1849 if (ppfti && ppfti->pidlTargetFolder)
1850 pdump(ppfti->pidlTargetFolder);
1851
1852 if (m_pidlRoot)
1853 __SHFreeAndNil(&m_pidlRoot); /* free the old */
1854 if (m_sPathTarget)
1856
1857 /*
1858 * Root path and pidl
1859 */
1860 m_pidlRoot = ILClone(pidlRootx);
1861
1862 /*
1863 * the target folder is spezified in csidl OR pidlTargetFolder OR
1864 * szTargetParsingName
1865 */
1866 HRESULT hr = E_FAIL;
1867 if (ppfti)
1868 {
1869 if (ppfti->csidl != -1)
1870 {
1871 BOOL create = ppfti->csidl & CSIDL_FLAG_CREATE;
1872 if (SHGetSpecialFolderPathW(0, wszTemp, ppfti->csidl, create))
1873 hr = SHStrDupW(wszTemp, &m_sPathTarget);
1874 }
1875 else if (ppfti->szTargetParsingName[0])
1876 {
1877 hr = SHStrDupW(ppfti->szTargetParsingName, &m_sPathTarget);
1878 }
1879 else if (ppfti->pidlTargetFolder)
1880 {
1881 if (SHGetPathFromIDListW(ppfti->pidlTargetFolder, wszTemp))
1882 hr = SHStrDupW(wszTemp, &m_sPathTarget);
1883 }
1884 }
1885 TRACE("--(%p)->(target=%s)\n", this, debugstr_w(m_sPathTarget));
1887 return hr;
1888}
BOOL WINAPI SHGetSpecialFolderPathW(HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:4394
static const struct access_res create[16]
Definition: package.c:7546
#define __SHFreeAndNil(ptr)
Definition: shell32_main.h:203
#define CSIDL_FLAG_CREATE
Definition: shlobj.h:2282

◆ MapColumnToSCID()

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

Implements IShellFolder2.

Definition at line 1761 of file CFSFolder.cpp.

1762{
1763 switch (column)
1764 {
1765 case SHFSF_COL_NAME: return MakeSCID(*pscid, FMTID_Storage, PID_STG_NAME);
1766 case SHFSF_COL_SIZE: return MakeSCID(*pscid, FMTID_Storage, PID_STG_SIZE);
1767 case SHFSF_COL_TYPE: return MakeSCID(*pscid, FMTID_Storage, PID_STG_STORAGETYPE);
1768 case SHFSF_COL_MDATE: return MakeSCID(*pscid, FMTID_Storage, PID_STG_WRITETIME);
1769 case SHFSF_COL_FATTS: return MakeSCID(*pscid, FMTID_Storage, PID_STG_ATTRIBUTES);
1770 case SHFSF_COL_COMMENT: return MakeSCID(*pscid, FMTID_SummaryInformation, PIDSI_COMMENTS);
1771 }
1772 return E_INVALIDARG;
1773}
#define PID_STG_STORAGETYPE
Definition: ntquery.h:50
const FMTID FMTID_SummaryInformation
static HRESULT MakeSCID(SHCOLUMNID &scid, REFCLSID fmtid, UINT pid)
Definition: shfldr.h:99

◆ MessageSFVCB()

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

Definition at line 2132 of file CFSFolder.cpp.

2133{
2135 switch (uMsg)
2136 {
2139 break;
2140 case SFVM_GETCOMMANDDIR:
2141 if (m_sPathTarget)
2143 break;
2144 }
2145 return hr;
2146}
#define SFVM_GETCOMMANDDIR
#define SFVM_GET_CUSTOMVIEWINFO
HRESULT WINAPI GetCustomViewInfo(ULONG unknown, SFVM_CUSTOMVIEWINFO_DATA *data)
Definition: CFSFolder.cpp:2044
uint16_t * PWSTR
Definition: typedefs.h:56
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 895 of file CFSFolder.cpp.

900{
901 TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
902 this, hwndOwner, pbc, lpszDisplayName, debugstr_w (lpszDisplayName),
903 pchEaten, ppidl, pdwAttributes);
904
905 if (!ppidl)
906 return E_INVALIDARG;
907
908 *ppidl = NULL;
909
910 if (!lpszDisplayName)
911 return E_INVALIDARG;
912
913 HRESULT hr;
914 WIN32_FIND_DATAW FindData;
915 if (SHIsFileSysBindCtx(pbc, &FindData) == S_OK)
916 {
917 CComHeapPtr<ITEMIDLIST> pidlTemp;
918 hr = _ParseSimple(lpszDisplayName, &FindData, &pidlTemp);
919 if (SUCCEEDED(hr) && pdwAttributes && *pdwAttributes)
920 {
921 LPCITEMIDLIST pidlLast = ILFindLastID(pidlTemp);
922 GetAttributesOf(1, &pidlLast, pdwAttributes);
923 }
924
925 if (SUCCEEDED(hr))
926 *ppidl = pidlTemp.Detach();
927 }
928 else
929 {
930 INT cchElement = lstrlenW(lpszDisplayName) + 1;
931 LPWSTR pszElement = (LPWSTR)_alloca(cchElement * sizeof(WCHAR));
932 LPWSTR pchNext = lpszDisplayName;
933 hr = Shell_NextElement(&pchNext, pszElement, cchElement, TRUE);
934 if (FAILED(hr))
935 return hr;
936
937 hr = _CreateIDListFromName(pszElement, ULONG_MAX, pbc, ppidl);
938 if (FAILED(hr))
939 {
940 if (pchNext) // Is there the next element?
941 {
942 // pszElement seems like a directory
943 if (_GetFindDataFromName(pszElement, &FindData) &&
945 {
946 hr = _CreateIDListFromName(pszElement, FILE_ATTRIBUTE_DIRECTORY, pbc, ppidl);
947 }
948 }
949 else
950 {
951 // pszElement seems like a non-directory
954 (BindCtx_GetMode(pbc, 0) & STGM_CREATE))
955 {
956 // Pretend like a normal file
957 hr = _CreateIDListFromName(pszElement, FILE_ATTRIBUTE_NORMAL, pbc, ppidl);
958 }
959 }
960 }
961
962 if (SUCCEEDED(hr))
963 {
964 if (pchNext) // Is there next?
965 {
966 CComPtr<IShellFolder> psfChild;
967 hr = BindToObject(*ppidl, pbc, IID_PPV_ARG(IShellFolder, &psfChild));
968 if (FAILED(hr))
969 return hr;
970
971 DWORD chEaten;
972 CComHeapPtr<ITEMIDLIST> pidlChild;
973 hr = psfChild->ParseDisplayName(hwndOwner, pbc, pchNext, &chEaten, &pidlChild,
974 pdwAttributes);
975
976 // Append pidlChild to ppidl
977 if (SUCCEEDED(hr))
978 hr = SHILAppend(pidlChild.Detach(), ppidl);
979 }
980 else if (pdwAttributes && *pdwAttributes)
981 {
982 GetAttributesOf(1, (LPCITEMIDLIST*)ppidl, pdwAttributes);
983 }
984 }
985 }
986
987 TRACE("(%p)->(-- pidl=%p ret=0x%08x)\n", this, ppidl ? *ppidl : 0, hr);
988
989 return hr;
990}
STDMETHOD() GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
Definition: CFSFolder.cpp:1284
HRESULT _ParseSimple(_In_ LPOLESTR lpszDisplayName, _Inout_ WIN32_FIND_DATAW *pFind, _Out_ LPITEMIDLIST *ppidl)
Definition: CFSFolder.cpp:784
HRESULT _CreateIDListFromName(LPCWSTR pszName, DWORD attrs, IBindCtx *pbc, LPITEMIDLIST *ppidl)
Definition: CFSFolder.cpp:839
#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:336
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:361
#define STGM_CREATE
Definition: objbase.h:945
int32_t INT
Definition: typedefs.h:58
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:228

◆ SetNameOf()

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

Implements IShellFolder.

Definition at line 1560 of file CFSFolder.cpp.

1566{
1567 WCHAR szSrc[MAX_PATH + 1], szDest[MAX_PATH + 1], szNameBuf[MAX_PATH];
1568 BOOL bIsFolder = ItemIsFolder(ILFindLastID(pidl));
1569
1570 TRACE ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this, hwndOwner, pidl,
1571 debugstr_w (lpName), dwFlags, pPidlOut);
1572
1573 if (pPidlOut)
1574 *pPidlOut = NULL;
1575
1576 LPCWSTR pszName = GetItemFileName(pidl, szNameBuf, _countof(szNameBuf));
1577 if (!pszName)
1578 {
1579 ERR("Got garbage pidl:\n");
1580 pdump_always(pidl);
1581 return E_INVALIDARG;
1582 }
1583
1584 /* build source path */
1585 PathCombineW(szSrc, m_sPathTarget, pszName);
1586
1587 /* build destination path */
1590 else
1591 lstrcpynW(szDest, lpName, MAX_PATH);
1592
1593 if (!(dwFlags & SHGDN_FORPARSING) && !bIsFolder && SHELL_FS_HideExtension(szSrc))
1594 {
1596 if (*ext)
1597 PathAddExtensionW(szDest, ext);
1598 }
1599
1600 HRESULT hr = S_OK;
1601 TRACE ("src=%s dest=%s\n", debugstr_w(szSrc), debugstr_w(szDest));
1602 if (!wcscmp(szSrc, szDest))
1603 {
1604 /* src and destination is the same */
1605 if (pPidlOut)
1606 hr = SHILClone(pidl, pPidlOut);
1607 }
1608 else
1609 {
1610 hr = SHELL_SingleFileOperation(hwndOwner, FO_RENAME, szSrc, szDest, FOF_SILENT | FOF_ALLOWUNDO, NULL);
1611 if (SUCCEEDED(hr) && pPidlOut)
1612 hr = ParseDisplayName(hwndOwner, NULL, PathFindFileNameW(szDest), NULL, pPidlOut, NULL);
1613 }
1614 return hr;
1615}
static const WCHAR *const ext[]
Definition: module.c:53
WCHAR *WINAPI PathFindFileNameW(const WCHAR *path)
Definition: path.c:1677
LPWSTR WINAPI PathFindExtensionW(const WCHAR *path)
Definition: path.c:1250
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
BOOL SHELL_FS_HideExtension(LPCWSTR szPath)
Definition: CFSFolder.cpp:1444
HRESULT SHELL_SingleFileOperation(HWND hWnd, UINT Op, PCWSTR Src, PCWSTR Dest, UINT Flags, PWSTR *ppNewName)
Definition: shlfileop.cpp:2446
static IParseDisplayName ParseDisplayName
Definition: moniker.c:1141
#define PathAddExtensionW
Definition: pathcch.h:306
#define FO_RENAME
Definition: shellapi.h:139
#define FOF_ALLOWUNDO
Definition: shellapi.h:147
#define FOF_SILENT
Definition: shellapi.h:143
_In_ LPCSTR lpName
Definition: winbase.h:2519

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: