ReactOS 0.4.16-dev-1020-gf135cab
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 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)
 
- 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 553 of file CFSFolder.cpp.

554{
555 m_pclsid = &CLSID_ShellFSFolder;
559}
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 561 of file CFSFolder.cpp.

562{
563 TRACE("-- destroying IShellFolder(%p)\n", this);
564
567}
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 1846 of file CFSFolder.cpp.

1847{
1849
1850 sprintfW(buf, L"ShellEx\\{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
1851 riid.Data1, riid.Data2, riid.Data3,
1852 riid.Data4[0], riid.Data4[1], riid.Data4[2], riid.Data4[3],
1853 riid.Data4[4], riid.Data4[5], riid.Data4[6], riid.Data4[7]);
1854
1855 CLSID clsid;
1856 HRESULT hr;
1857
1858 hr = GetCLSIDForFileType(pidl, buf, &clsid);
1859 if (hr != S_OK)
1860 return hr;
1861
1862 hr = _CreateShellExtInstance(&clsid, pidl, riid, ppvOut);
1864 return hr;
1865
1866 return S_OK;
1867}
HRESULT _CreateShellExtInstance(const CLSID *pclsid, LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
Definition: CFSFolder.cpp:1913
#define MAX_PATH
Definition: compat.h:34
#define FAILED_UNEXPECTEDLY(hr)
Definition: debug.h:83
HRESULT GetCLSIDForFileType(PCUIDLIST_RELATIVE pidl, LPCWSTR KeyName, CLSID *pclsid)
Definition: CFSFolder.cpp:164
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:64
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 814 of file CFSFolder.cpp.

815{
816 *ppidl = NULL;
817
818 if (PathIsDosDevice(pszName))
820
821 WIN32_FIND_DATAW FindData = { 0 };
822
823 HRESULT hr = S_OK;
824 if (attrs == ULONG_MAX) // Invalid attributes
825 {
826 if (!_GetFindDataFromName(pszName, &FindData))
828 }
829 else // Pretend as an item of attrs
830 {
831 StringCchCopyW(FindData.cFileName, _countof(FindData.cFileName), pszName);
832 FindData.dwFileAttributes = attrs;
833 }
834
835 if (FAILED(hr))
836 return hr;
837
838 *ppidl = _ILCreateFromFindDataW(&FindData);
839 if (!*ppidl)
840 return E_OUTOFMEMORY;
841
842 return S_OK;
843}
BOOL _GetFindDataFromName(_In_ LPCWSTR pszName, _Out_ WIN32_FIND_DATAW *pFind)
Definition: CFSFolder.cpp:800
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
BOOL PathIsDosDevice(_In_ LPCWSTR pszName)
Definition: utils.cpp:172
#define ULONG_MAX
Definition: intsafe.h:155
#define FAILED(hr)
Definition: intsafe.h:51
LPITEMIDLIST _ILCreateFromFindDataW(const WIN32_FIND_DATAW *wfd)
Definition: pidl.c:1898
#define _countof(array)
Definition: sndvol32.h:70
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 1913 of file CFSFolder.cpp.

1914{
1915 HRESULT hr;
1916 WCHAR wszPath[MAX_PATH], szNameBuf[MAX_PATH];
1917
1918 LPCWSTR pszName = GetItemFileName(pidl, szNameBuf, _countof(szNameBuf));
1919 if (!pszName)
1920 {
1921 ERR("Got garbage pidl\n");
1922 pdump_always(pidl);
1923 return E_INVALIDARG;
1924 }
1925 PathCombineW(wszPath, m_sPathTarget, pszName);
1926
1927 CComPtr<IPersistFile> pp;
1930 return hr;
1931
1932 pp->Load(wszPath, 0);
1933
1934 hr = pp->QueryInterface(riid, ppvOut);
1935 if (hr != S_OK)
1936 {
1937 ERR("Failed to query for interface IID_IShellExtInit hr %x pclsid %s\n", hr, wine_dbgstr_guid(pclsid));
1938 return hr;
1939 }
1940 return hr;
1941}
#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 refiid, LPVOID *ppv)
Definition: shellole.c:105
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define PathCombineW
Definition: pathcch.h:317
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
#define IID_PPV_ARG(Itype, ppType)
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

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

◆ _GetDropTarget()

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

Definition at line 1869 of file CFSFolder.cpp.

1870{
1871 HRESULT hr;
1872
1873 TRACE("CFSFolder::_GetDropTarget entered\n");
1874
1875 if (_ILIsFolder (pidl))
1876 {
1877 CComPtr<IShellFolder> psfChild;
1878 hr = this->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, &psfChild));
1880 return hr;
1881
1882 return psfChild->CreateViewObject(NULL, IID_IDropTarget, ppvOut);
1883 }
1884
1885 CLSID clsid;
1886 hr = GetCLSIDForFileType(pidl, L"shellex\\DropHandler", &clsid);
1887 if (hr != S_OK)
1888 return hr;
1889
1890 hr = _CreateShellExtInstance(&clsid, pidl, IID_IDropTarget, ppvOut);
1892 return S_FALSE;
1893
1894 return S_OK;
1895}
STDMETHOD() BindToObject(PCUIDLIST_RELATIVE pidl, LPBC pbcReserved, REFIID riid, LPVOID *ppvOut) override
Definition: CFSFolder.cpp:990
BOOL _ILIsFolder(LPCITEMIDLIST pidl)
Definition: pidl.c:2102
#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 800 of file CFSFolder.cpp.

801{
804 PathAppendW(szPath, pszName);
805
806 HANDLE hFind = ::FindFirstFileW(szPath, pFind);
807 if (hFind == INVALID_HANDLE_VALUE)
808 return FALSE;
809
810 ::FindClose(hFind);
811 return TRUE;
812}
#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 1897 of file CFSFolder.cpp.

1898{
1899 CLSID clsid;
1900 HRESULT hr;
1901
1902 hr = GetCLSIDForFileType(pidl, L"shellex\\IconHandler", &clsid);
1903 if (hr != S_OK)
1904 return hr;
1905
1906 hr = _CreateShellExtInstance(&clsid, pidl, riid, ppvOut);
1908 return S_FALSE;
1909
1910 return S_OK;
1911}

Referenced by GetUIObjectOf().

◆ _ParseSimple()

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

Definition at line 759 of file CFSFolder.cpp.

763{
764 HRESULT hr;
765 LPWSTR pchNext = lpszDisplayName;
766
767 *ppidl = NULL;
768
769 const DWORD finalattr = pFind->dwFileAttributes;
770 const DWORD finalsizelo = pFind->nFileSizeLow;
771 LPITEMIDLIST pidl;
772 for (hr = S_OK; SUCCEEDED(hr); hr = SHILAppend(pidl, ppidl))
773 {
774 hr = Shell_NextElement(&pchNext, pFind->cFileName, _countof(pFind->cFileName), FALSE);
775 if (hr != S_OK)
776 break;
777
778 pFind->dwFileAttributes = pchNext ? FILE_ATTRIBUTE_DIRECTORY : finalattr;
779 pFind->nFileSizeLow = pchNext ? 0 : finalsizelo;
780 pidl = _ILCreateFromFindDataW(pFind);
781 if (!pidl)
782 {
784 break;
785 }
786 }
787
788 if (SUCCEEDED(hr))
789 return S_OK;
790
791 if (*ppidl)
792 {
793 ILFree(*ppidl);
794 *ppidl = NULL;
795 }
796
797 return hr;
798}
HRESULT SHILAppend(_Inout_ LPITEMIDLIST pidl, _Inout_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:193
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:1044
HRESULT Shell_NextElement(_Inout_ LPWSTR *ppch, _Out_ LPWSTR pszOut, _In_ INT cchOut, _In_ BOOL bValidate)
Definition: shlfolder.cpp:70
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 990 of file CFSFolder.cpp.

995{
996 TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", this, pidl, pbc,
997 shdebugstr_guid(&riid), ppvOut);
998
999 CComPtr<IShellFolder> pSF;
1000 HRESULT hr;
1001
1002 if (!m_pidlRoot || !ppvOut || !pidl || !pidl->mkid.cb)
1003 {
1004 ERR("CFSFolder::BindToObject: Invalid parameters\n");
1005 return E_INVALIDARG;
1006 }
1007
1008 /* Get the pidl data */
1010 WCHAR szNameBuf[MAX_PATH];
1011 LPCWSTR pszName = GetItemFileName(pidl, szNameBuf, _countof(szNameBuf));
1012 if (!pszName)
1013 {
1014 ERR("CFSFolder::BindToObject: Invalid pidl!\n");
1015 return E_INVALIDARG;
1016 }
1017
1018 *ppvOut = NULL;
1019
1020 /* Create the target folder info */
1021 PERSIST_FOLDER_TARGET_INFO pfti = {0};
1022 pfti.dwAttributes = -1;
1023 pfti.csidl = -1;
1024 PathCombineW(pfti.szTargetParsingName, m_sPathTarget, pszName);
1025
1026 /* Get the CLSID to bind to */
1027 CLSID clsidFolder;
1028 if (_ILIsFolder(pidl))
1029 {
1030 if ((pData->uFileAttribs & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_READONLY)) != 0)
1031 {
1032 hr = SHELL32_GetCLSIDForDirectory(pfti.szTargetParsingName, L"CLSID", &clsidFolder);
1033
1034 if (SUCCEEDED(hr))
1035 {
1036 /* We got a GUID from a desktop.ini, let's try it */
1037 hr = SHELL32_BindToSF(m_pidlRoot, &pfti, pidl, &clsidFolder, riid, ppvOut);
1038 if (SUCCEEDED(hr))
1039 {
1040 TRACE("-- returning (%p) %08x, (%s)\n", *ppvOut, hr, wine_dbgstr_guid(&clsidFolder));
1041 return hr;
1042 }
1043
1044 /* Something went wrong, re-try it with a normal ShellFSFolder */
1045 ERR("CFSFolder::BindToObject: %s failed to bind, using fallback (0x%08x)\n", wine_dbgstr_guid(&clsidFolder), hr);
1046 }
1047 }
1048 /* No system folder or the custom class failed */
1049 clsidFolder = CLSID_ShellFSFolder;
1050 }
1051 else
1052 {
1053 hr = GetCLSIDForFileType(pidl, L"CLSID", &clsidFolder);
1054 if (hr == S_FALSE)
1056 if (hr != S_OK)
1057 return hr;
1058 }
1059
1060 hr = SHELL32_BindToSF(m_pidlRoot, &pfti, pidl, &clsidFolder, riid, ppvOut);
1062 return hr;
1063
1064 TRACE ("-- returning (%p) %08x\n", *ppvOut, hr);
1065
1066 return S_OK;
1067
1068}
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:599
#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:2236
HRESULT SHELL32_BindToSF(LPCITEMIDLIST pidlRoot, PERSIST_FOLDER_TARGET_INFO *ppfti, LPCITEMIDLIST pidl, const GUID *clsid, REFIID riid, LPVOID *ppvOut)
Definition: shlfolder.cpp:208
union tagPIDLDATA::@594 u
struct tagFileStruct file
Definition: pidl.h:215
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 1078 of file CFSFolder.cpp.

1083{
1084 FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", this, pidl, pbcReserved,
1085 shdebugstr_guid (&riid), ppvOut);
1086
1087 *ppvOut = NULL;
1088 return E_NOTIMPL;
1089}
#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 1943 of file CFSFolder.cpp.

1944{
1945 enum { IDC_PROPERTIES };
1946 /* no data object means no selection */
1947 if (!pdtobj)
1948 {
1949 if (uMsg == DFM_INVOKECOMMAND && wParam == IDC_PROPERTIES)
1950 {
1952 }
1953 else if (uMsg == DFM_MERGECONTEXTMENU)
1954 {
1955 QCMINFO *pqcminfo = (QCMINFO *)lParam;
1956 HMENU hpopup = CreatePopupMenu();
1958 pqcminfo->idCmdFirst = Shell_MergeMenus(pqcminfo->hmenu, hpopup, pqcminfo->indexMenu, pqcminfo->idCmdFirst, pqcminfo->idCmdLast, MM_ADDSEPARATOR);
1959 DestroyMenu(hpopup);
1960 return S_OK;
1961 }
1962 }
1963 return SHELL32_DefaultContextMenuCallBack(psf, pdtobj, uMsg);
1964}
#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:32
#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:528
HRESULT SHELL_ShowItemIDListProperties(LPCITEMIDLIST pidl)
Definition: item_prop.cpp:205
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
void WINAPI _InsertMenuItemW(HMENU hmenu, UINT indexMenu, BOOL fByPosition, UINT wID, UINT fType, LPCWSTR dwTypeData, UINT fState)
UINT WINAPI Shell_MergeMenus(HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAdjust, UINT uIDAdjustMax, ULONG uFlags)
Definition: shlmenu.c:856
#define MM_ADDSEPARATOR
Definition: shlobj.h:2536
HMENU hmenu
Definition: shlobj.h:1398
UINT idCmdLast
Definition: shlobj.h:1401
UINT idCmdFirst
Definition: shlobj.h:1400
UINT indexMenu
Definition: shlobj.h:1399
HMENU WINAPI CreatePopupMenu(void)
Definition: menu.c:838
#define MFS_ENABLED
Definition: winuser.h:761
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define MFT_STRING
Definition: winuser.h:757
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582

◆ CompareIDs()

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

Implements IShellFolder.

Definition at line 1109 of file CFSFolder.cpp.

1112{
1113 WCHAR szNameBuf1[MAX_PATH], szNameBuf2[_countof(szNameBuf1)];
1114 LPCWSTR pszName1 = GetItemFileName(pidl1, szNameBuf1, _countof(szNameBuf1));
1115 LPCWSTR pszName2 = GetItemFileName(pidl2, szNameBuf2, _countof(szNameBuf2));
1116 if (!pszName1 || !pszName2 || LOWORD(lParam) >= GENERICSHELLVIEWCOLUMNS)
1117 return E_INVALIDARG;
1118
1119 LPPIDLDATA pData1 = _ILGetDataPointer(pidl1);
1120 LPPIDLDATA pData2 = _ILGetDataPointer(pidl2);
1121 LPWSTR pExtension1, pExtension2;
1122
1123 HRESULT hr = CompareSortFoldersFirst(pidl1, pidl2);
1124 if (SUCCEEDED(hr))
1125 return hr;
1126 int result = 0;
1127 switch (LOWORD(lParam))
1128 {
1129 case SHFSF_COL_NAME:
1130 result = _wcsicmp(pszName1, pszName2);
1131 break;
1132 case SHFSF_COL_SIZE:
1133 if (pData1->u.file.dwFileSize > pData2->u.file.dwFileSize)
1134 result = 1;
1135 else if (pData1->u.file.dwFileSize < pData2->u.file.dwFileSize)
1136 result = -1;
1137 else
1138 result = 0;
1139 break;
1140 case SHFSF_COL_TYPE:
1141 // FIXME: Compare the type strings from SHGetFileInfo
1142 pExtension1 = PathFindExtensionW(pszName1);
1143 pExtension2 = PathFindExtensionW(pszName2);
1144 result = _wcsicmp(pExtension1, pExtension2);
1145 break;
1146 case SHFSF_COL_MDATE:
1147 result = pData1->u.file.uFileDate - pData2->u.file.uFileDate;
1148 if (result == 0)
1149 result = pData1->u.file.uFileTime - pData2->u.file.uFileTime;
1150 break;
1151 case SHFSF_COL_FATTS:
1152 return SHELL32_CompareDetails(this, lParam, pidl1, pidl2);
1153 case SHFSF_COL_COMMENT:
1154 result = 0;
1155 break;
1156 default:
1157 if (_ILIsPidlSimple(pidl1) || _ILIsPidlSimple(pidl2))
1158 ERR("Unknown column %u, can't compare\n", LOWORD(lParam));
1159 else
1160 TRACE("Unknown column %u, deferring to the subfolder\n", LOWORD(lParam));
1161 }
1162
1163 if (result == 0)
1164 return SHELL32_CompareChildren(this, lParam, pidl1, pidl2);
1165
1167}
static HRESULT CompareSortFoldersFirst(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: CFSFolder.cpp:1091
BOOL WINAPI _ILIsPidlSimple(LPCITEMIDLIST pidl)
#define GENERICSHELLVIEWCOLUMNS
Definition: CFSFolder.cpp:578
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
Definition: path.c:447
GLuint64EXT * result
Definition: glext.h:11304
#define LOWORD(l)
Definition: pedump.c:82
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define MAKE_COMPARE_HRESULT(x)
Definition: shellutils.h:623
#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:264
#define SHFSF_COL_TYPE
Definition: shfldr.h:45
HRESULT SHELL32_CompareDetails(IShellFolder2 *isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: shlfolder.cpp:287
#define SHFSF_COL_FATTS
Definition: shfldr.h:47
#define SHFSF_COL_MDATE
Definition: shfldr.h:46

◆ CompareSortFoldersFirst()

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

Definition at line 1091 of file CFSFolder.cpp.

1092{
1093 BOOL bIsFolder1 = _ILIsFolder(pidl1), bIsFolder2 = _ILIsFolder(pidl2);
1094 // When sorting between a File and a Folder, the Folder gets sorted first
1095 if (bIsFolder1 != bIsFolder2)
1096 {
1097 // ...but only if neither of them were generated by SHSimpleIDListFromPath
1098 // because in that case we cannot tell if it's a file or a folder.
1099 if (pidl1 && IsRealItem(*pidl1) && pidl2 && IsRealItem(*pidl2))
1100 return MAKE_COMPARE_HRESULT(bIsFolder1 ? -1 : 1);
1101 }
1103}
static BOOL IsRealItem(const ITEMIDLIST &idl)
Definition: CFSFolder.cpp:37
unsigned int BOOL
Definition: ntddk_ex.h:94
#define S_EQUAL
Definition: shellutils.h:621
#define FACILITY_SHELL
Definition: winerror.h:56
#define SEVERITY_ERROR
Definition: winerror.h:65
#define MAKE_SCODE(sev, fac, code)
Definition: winerror.h:70

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

◆ CompareUiStrings()

static int CFSFolder::CompareUiStrings ( LPCWSTR  a,
LPCWSTR  b 
)
inlinestatic

Definition at line 136 of file CFSFolder.h.

137 {
138 return StrCmpLogicalW(a, b);
139 }
INT WINAPI StrCmpLogicalW(LPCWSTR lpszStr, LPCWSTR lpszComp)
Definition: string.c:2310
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204

Referenced by CRecycleBin::CompareIDs().

◆ CreateViewObject()

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

Definition at line 1172 of file CFSFolder.cpp.

1174{
1175 CComPtr<IShellView> pShellView;
1177
1178 TRACE ("(%p)->(hwnd=%p,%s,%p)\n", this, hwndOwner, shdebugstr_guid (&riid),
1179 ppvOut);
1180
1181 if (ppvOut)
1182 {
1183 *ppvOut = NULL;
1184
1185 BOOL bIsDropTarget = IsEqualIID (riid, IID_IDropTarget);
1186 BOOL bIsShellView = !bIsDropTarget && IsEqualIID (riid, IID_IShellView);
1187
1188 if (bIsDropTarget || bIsShellView)
1189 {
1190 DWORD dwDirAttributes = _ILGetFileAttributes(ILFindLastID(m_pidlRoot), NULL, 0);
1191
1192 if ((dwDirAttributes & (FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_READONLY)) != 0)
1193 {
1194 CLSID clsidFolder;
1195 hr = SHELL32_GetCLSIDForDirectory(m_sPathTarget, L"UICLSID", &clsidFolder);
1196 if (SUCCEEDED(hr))
1197 {
1198 CComPtr<IPersistFolder> spFolder;
1199 hr = SHCoCreateInstance(NULL, &clsidFolder, NULL, IID_PPV_ARG(IPersistFolder, &spFolder));
1200 if (!FAILED_UNEXPECTEDLY(hr))
1201 {
1202 hr = spFolder->Initialize(m_pidlRoot);
1203
1204 if (!FAILED_UNEXPECTEDLY(hr))
1205 {
1206 hr = spFolder->QueryInterface(riid, ppvOut);
1207 }
1208 }
1209 }
1210 else
1211 {
1212 // No desktop.ini, or no UICLSID present, continue as if nothing happened
1213 hr = E_INVALIDARG;
1214 }
1215 }
1216 }
1217
1218 if (!SUCCEEDED(hr))
1219 {
1220 // No UICLSID handler found, continue to the default handlers
1221 if (bIsDropTarget)
1222 {
1224 }
1225 else if (IsEqualIID (riid, IID_IContextMenu))
1226 {
1227 HKEY hKeys[16];
1228 UINT cKeys = 0;
1229 AddClassKeyToArray(L"Directory\\Background", hKeys, &cKeys);
1230
1231 DEFCONTEXTMENU dcm;
1232 dcm.hwnd = hwndOwner;
1233 dcm.pcmcb = this;
1234 dcm.pidlFolder = m_pidlRoot;
1235 dcm.psf = this;
1236 dcm.cidl = 0;
1237 dcm.apidl = NULL;
1238 dcm.cKeys = cKeys;
1239 dcm.aKeys = hKeys;
1241 hr = SHCreateDefaultContextMenu (&dcm, riid, ppvOut);
1242 }
1243 else if (bIsShellView)
1244 {
1245 SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this, NULL, this};
1246 hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
1247 }
1248 else
1249 {
1250 hr = E_INVALIDARG;
1251 }
1252 }
1253 }
1254 TRACE("-- (%p)->(interface=%p)\n", this, ppvOut);
1255 return hr;
1256}
HRESULT WINAPI SHCreateShellFolderView(const SFV_CREATE *pcsfv, IShellView **ppsv)
Definition: CDefView.cpp:4794
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, LPWSTR pOut, UINT uOutSize)
Definition: pidl.c:2543
LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl)
Definition: pidl.c:198
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:323
struct _SFV_CREATE SFV_CREATE
IContextMenuCB * pcmcb
Definition: shlobj.h:2558
IShellFolder * psf
Definition: shlobj.h:2560
IUnknown * punkAssociationInfo
Definition: shlobj.h:2563
PCUITEMID_CHILD_ARRAY apidl
Definition: shlobj.h:2562
const HKEY * aKeys
Definition: shlobj.h:2565
PCIDLIST_ABSOLUTE pidlFolder
Definition: shlobj.h:2559

◆ EnumObjects()

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

Definition at line 974 of file CFSFolder.cpp.

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

◆ EnumSearches()

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

Implements IShellFolder2.

Definition at line 1616 of file CFSFolder.cpp.

1617{
1618 FIXME ("(%p)\n", this);
1619 return E_NOTIMPL;
1620}

◆ FormatDateTime()

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

Definition at line 2097 of file CFSFolder.cpp.

2098{
2099 FILETIME lft;
2101 FileTimeToLocalFileTime(&ft, &lft);
2102 FileTimeToSystemTime(&lft, &time);
2104 if (ret > 0 && ret < cchBuf)
2105 {
2106 /* Append space + time without seconds */
2107 Buf[ret-1] = ' ';
2109 }
2110 return ret ? S_OK : E_FAIL;
2111}
#define E_FAIL
Definition: ddrawi.h:102
BOOL WINAPI FileTimeToSystemTime(IN CONST FILETIME *lpFileTime, OUT LPSYSTEMTIME lpSystemTime)
Definition: time.c:188
BOOL WINAPI FileTimeToLocalFileTime(IN CONST FILETIME *lpFileTime, OUT LPFILETIME lpLocalFileTime)
Definition: time.c:221
INT WINAPI GetTimeFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpTimeStr, INT cchOut)
Definition: lcformat.c:1089
INT WINAPI GetDateFormatW(LCID lcid, DWORD dwFlags, const SYSTEMTIME *lpTime, LPCWSTR lpFormat, LPWSTR lpDateStr, INT cchOut)
Definition: lcformat.c:989
__u16 time
Definition: mkdosfs.c:8
#define LOCALE_USER_DEFAULT
int ret
#define TIME_NOSECONDS
Definition: winnls.h:280
#define DATE_SHORTDATE
Definition: winnls.h:198

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

◆ FormatSize()

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

Definition at line 2113 of file CFSFolder.cpp.

2114{
2115 if (StrFormatKBSizeW(size, Buf, cchBuf))
2116 return S_OK;
2117 if (cchBuf)
2118 *Buf = UNICODE_NULL;
2119 return E_FAIL;
2120}
LPWSTR WINAPI StrFormatKBSizeW(LONGLONG llBytes, LPWSTR lpszDest, UINT cchMax)
Definition: string.c:1757
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 1267 of file CFSFolder.cpp.

1269{
1270 HRESULT hr = S_OK;
1271
1272 if (!rgfInOut)
1273 return E_INVALIDARG;
1274 if (cidl && !apidl)
1275 return E_INVALIDARG;
1276
1277 if (*rgfInOut == 0)
1278 *rgfInOut = ~0;
1279
1280 if(cidl == 0)
1281 {
1283
1284 if (_ILIsFolderOrFile(rpidl))
1285 {
1286 SHELL32_GetFSItemAttributes(this, rpidl, rgfInOut);
1287 }
1288 else if (_ILIsDrive(rpidl))
1289 {
1290 IShellFolder *psfParent = NULL;
1292 if(SUCCEEDED(hr))
1293 {
1294 hr = psfParent->GetAttributesOf(1, &rpidl, (SFGAOF*)rgfInOut);
1295 psfParent->Release();
1296 }
1297 }
1298 else
1299 {
1300 ERR("Got and unknown pidl!\n");
1301 }
1302 }
1303 else
1304 {
1305 while (cidl > 0 && *apidl)
1306 {
1307 pdump(*apidl);
1308 if (_ILIsFolderOrFile(*apidl))
1309 SHELL32_GetFSItemAttributes(this, *apidl, rgfInOut);
1310 else
1311 ERR("Got an unknown type of pidl!!!\n");
1312 apidl++;
1313 cidl--;
1314 }
1315 }
1316 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
1317 *rgfInOut &= ~SFGAO_VALIDATE;
1318
1319 TRACE("-- result=0x%08x\n", *rgfInOut);
1320
1321 return hr;
1322}
void pdump(LPCITEMIDLIST pidl)
Definition: debughlp.cpp:322
HRESULT SHELL32_GetFSItemAttributes(IShellFolder *psf, LPCITEMIDLIST pidl, LPDWORD pdwAttributes)
Definition: CFSFolder.cpp:619
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:1462
BOOL _ILIsDrive(LPCITEMIDLIST pidl)
Definition: pidl.c:2095
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42

Referenced by ParseDisplayName().

◆ GetClassID()

HRESULT WINAPI CFSFolder::GetClassID ( CLSID lpClassId)
override

Implements IPersist.

Definition at line 1727 of file CFSFolder.cpp.

1728{
1729 TRACE ("(%p)\n", this);
1730
1731 if (!lpClassId)
1732 return E_POINTER;
1733
1734 *lpClassId = *m_pclsid;
1735
1736 return S_OK;
1737}
#define E_POINTER
Definition: winerror.h:2365

◆ GetCurFolder()

HRESULT WINAPI CFSFolder::GetCurFolder ( PIDLIST_ABSOLUTE pidl)
override

Implements IPersistFolder2.

Definition at line 1769 of file CFSFolder.cpp.

1770{
1771 TRACE ("(%p)->(%p)\n", this, pidl);
1772
1773 if (!pidl)
1774 return E_POINTER;
1775
1776 *pidl = ILClone(m_pidlRoot);
1777 return S_OK;
1778}
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:237

◆ GetCustomViewInfo()

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

Definition at line 1993 of file CFSFolder.cpp.

1994{
1995 if (data == NULL)
1996 {
1997 return E_POINTER;
1998 }
1999 if (data->cbSize != sizeof(*data))
2000 {
2001 // NOTE: You have to set the cbData member before SFVM_GET_CUSTOMVIEWINFO call.
2002 return E_INVALIDARG;
2003 }
2004
2005 data->hbmBack = NULL;
2006 data->clrText = CLR_INVALID;
2007 data->clrTextBack = CLR_INVALID;
2008
2010
2011 // does the folder exists?
2013 {
2014 return E_INVALIDARG;
2015 }
2016
2017 // don't use custom view in network path for security
2019 {
2020 return E_ACCESSDENIED;
2021 }
2022
2023 // build the ini file path
2025 PathAppend(szIniFile, L"desktop.ini");
2026
2027 static LPCWSTR TheGUID = L"{BE098140-A513-11D0-A3A4-00C04FD706EC}";
2028 static LPCWSTR Space = L" \t\n\r\f\v";
2029
2030 // get info from ini file
2031 WCHAR szImage[MAX_PATH], szText[64];
2032
2033 // load the image
2034 szImage[0] = UNICODE_NULL;
2035 GetPrivateProfileStringW(TheGUID, L"IconArea_Image", L"", szImage, _countof(szImage), szIniFile);
2036 if (szImage[0])
2037 {
2038 StrTrimW(szImage, Space);
2039 if (PathIsRelativeW(szImage))
2040 {
2041 PathAppendW(szPath, szImage);
2042 StringCchCopyW(szImage, _countof(szImage), szPath);
2043 }
2044 data->hbmBack = DoLoadPicture(szImage);
2045 }
2046
2047 // load the text color
2048 szText[0] = UNICODE_NULL;
2049 GetPrivateProfileStringW(TheGUID, L"IconArea_Text", L"", szText, _countof(szText), szIniFile);
2050 if (szText[0])
2051 {
2052 StrTrimW(szText, Space);
2053
2054 LPWSTR pchEnd = NULL;
2055 COLORREF cr = (wcstol(szText, &pchEnd, 0) & 0xFFFFFF);
2056
2057 if (pchEnd && !*pchEnd)
2058 data->clrText = cr;
2059 }
2060
2061 // load the text background color
2062 szText[0] = UNICODE_NULL;
2063 GetPrivateProfileStringW(TheGUID, L"IconArea_TextBackground", L"", szText, _countof(szText), szIniFile);
2064 if (szText[0])
2065 {
2066 StrTrimW(szText, Space);
2067
2068 LPWSTR pchEnd = NULL;
2069 COLORREF cr = (wcstol(szText, &pchEnd, 0) & 0xFFFFFF);
2070
2071 if (pchEnd && !*pchEnd)
2072 data->clrTextBack = cr;
2073 }
2074
2075 if (data->hbmBack != NULL || data->clrText != CLR_INVALID || data->clrTextBack != CLR_INVALID)
2076 return S_OK;
2077
2078 return E_FAIL;
2079}
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:1966
BOOL WINAPI PathIsDirectoryW(LPCWSTR lpszPath)
Definition: path.c:1729
BOOL WINAPI PathIsRelativeW(LPCWSTR lpszPath)
Definition: path.c:1585
BOOL WINAPI StrTrimW(LPWSTR lpszStr, LPCWSTR lpszTrim)
Definition: string.c:1883
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)
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1454
TCHAR szIniFile[]
Definition: scrnsave.c:29
#define PathIsNetworkPath
Definition: shlwapi.h:1136
#define PathAppend
Definition: shlwapi.h:836
DWORD COLORREF
Definition: windef.h:300
#define E_ACCESSDENIED
Definition: winerror.h:2849
#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 1622 of file CFSFolder.cpp.

1624{
1625 TRACE ("(%p)\n", this);
1626
1627 if (pSort)
1628 *pSort = 0;
1629 if (pDisplay)
1630 *pDisplay = 0;
1631
1632 return S_OK;
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:590

◆ GetDefaultFSColumnState()

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

Definition at line 590 of file CFSFolder.cpp.

591{
592 if (iColumn >= _countof(GenericSFHeader))
593 return E_INVALIDARG;
594
595 csFlags = GenericSFHeader[iColumn].colstate;
596 return S_OK;
597}
static const shvheader GenericSFHeader[]
Definition: CFSFolder.cpp:569
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 1610 of file CFSFolder.cpp.

1611{
1612 FIXME ("(%p)\n", this);
1613 return E_NOTIMPL;
1614}

◆ GetDetailsEx()

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

Implements IShellFolder2.

Definition at line 1646 of file CFSFolder.cpp.

1648{
1649 FIXME ("(%p)\n", this);
1650
1651 return E_NOTIMPL;
1652}

◆ GetDetailsOf()

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

Implements IShellFolder2.

Definition at line 1654 of file CFSFolder.cpp.

1656{
1657 HRESULT hr = E_FAIL;
1658
1659 TRACE ("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd);
1660
1661 if (!psd || iColumn >= GENERICSHELLVIEWCOLUMNS)
1662 return E_INVALIDARG;
1663
1664 if (!pidl)
1665 {
1666 /* the header titles */
1667 return GetFSColumnDetails(iColumn, *psd);
1668 }
1669 else
1670 {
1671 FILETIME ft;
1672 hr = S_OK;
1673 psd->str.uType = STRRET_WSTR;
1674 if (iColumn != SHFSF_COL_NAME)
1675 {
1676 psd->str.pOleStr = (LPWSTR)CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR));
1677 if (!psd->str.pOleStr)
1678 return E_OUTOFMEMORY;
1679 }
1680 /* the data from the pidl */
1681 switch (iColumn)
1682 {
1683 case SHFSF_COL_NAME:
1685 break;
1686 case SHFSF_COL_SIZE:
1687 _ILGetFileSize(pidl, psd->str.pOleStr, MAX_PATH);
1688 break;
1689 case SHFSF_COL_TYPE:
1691 break;
1692 case SHFSF_COL_MDATE:
1693 if (!_ILGetFileDateTime(pidl, &ft) || FAILED(FormatDateTime(ft, psd->str.pOleStr, MAX_PATH)))
1694 {
1695 *psd->str.pOleStr = UNICODE_NULL;
1696 hr = S_FALSE;
1697 }
1698 break;
1699 case SHFSF_COL_FATTS:
1701 break;
1702 case SHFSF_COL_COMMENT:
1703 psd->str.pOleStr[0] = UNICODE_NULL; // TODO: Extract comment from .lnk files? desktop.ini?
1704 break;
1705#if DBG
1706 default:
1707 ERR("Missing case for column %d\n", iColumn);
1708#else
1710#endif
1711 }
1712 }
1713
1714 return hr;
1715}
STDMETHOD() GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) override
Definition: CFSFolder.cpp:1495
static HRESULT GetFSColumnDetails(UINT iColumn, SHELLDETAILS &sd)
Definition: CFSFolder.cpp:580
static HRESULT FormatDateTime(const FILETIME &ft, LPWSTR Buf, UINT cchBuf)
Definition: CFSFolder.cpp:2097
static void GetItemDescription(PCUITEMID_CHILD pidl, LPWSTR Buf, UINT cchMax)
Definition: CFSFolder.cpp:44
LPVOID WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: ifs.c:426
#define DEFAULT_UNREACHABLE
BOOL _ILGetFileDateTime(LPCITEMIDLIST pidl, FILETIME *pFt)
Definition: pidl.c:2450
DWORD _ILGetFileSize(LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize)
Definition: pidl.c:2477
@ 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 1495 of file CFSFolder.cpp.

1497{
1498 if (!strRet)
1499 return E_INVALIDARG;
1500
1501 /* If it is a complex pidl, let the child handle it */
1502 if (!_ILIsPidlSimple (pidl)) /* complex pidl */
1503 {
1504 return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
1505 }
1506 else if (pidl && !pidl->mkid.cb) /* empty pidl */
1507 {
1508 /* If it is an empty pidl return only the path of the folder */
1512 {
1513 return SHSetStrRet(strRet, m_sPathTarget);
1514 }
1515 return E_INVALIDARG;
1516 }
1517
1518 int len = 0;
1519 LPWSTR pszPath = (LPWSTR)CoTaskMemAlloc((MAX_PATH + 1) * sizeof(WCHAR));
1520 if (!pszPath)
1521 return E_OUTOFMEMORY;
1522
1526 {
1527 lstrcpynW(pszPath, m_sPathTarget, MAX_PATH);
1528 PathAddBackslashW(pszPath);
1529 len = wcslen(pszPath);
1530 }
1531 _ILSimpleGetTextW(pidl, pszPath + len, MAX_PATH + 1 - len);
1533
1534 strRet->uType = STRRET_WSTR;
1535 strRet->pOleStr = pszPath;
1536
1537 TRACE ("-- (%p)->(%s)\n", this, strRet->uType == STRRET_CSTR ? strRet->cStr : debugstr_w(strRet->pOleStr));
1538 return S_OK;
1539}
#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:1472
GLenum GLsizei len
Definition: glext.h:6722
_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:2156
HRESULT SHELL32_GetDisplayNameOfChild(IShellFolder2 *psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet)
Definition: shlfolder.cpp:246
@ 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 1839 of file CFSFolder.cpp.

1840{
1841 FIXME("(%p)->(%p)\n", this, ppfti);
1842 ZeroMemory(ppfti, sizeof (*ppfti));
1843 return E_NOTIMPL;
1844}
#define ZeroMemory
Definition: winbase.h:1743

◆ GetFSColumnDetails()

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

Definition at line 580 of file CFSFolder.cpp.

581{
582 if (iColumn >= _countof(GenericSFHeader))
583 return E_INVALIDARG;
584
585 sd.fmt = GenericSFHeader[iColumn].fmt;
586 sd.cxChar = GenericSFHeader[iColumn].cxChar;
587 return SHSetStrRet(&sd.str, GenericSFHeader[iColumn].colnameid);
588}
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 1347 of file CFSFolder.cpp.

1351{
1352 LPVOID pObj = NULL;
1354
1355 TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n",
1356 this, hwndOwner, cidl, apidl, shdebugstr_guid (&riid), prgfInOut, ppvOut);
1357
1358 if (ppvOut)
1359 {
1360 *ppvOut = NULL;
1361
1362 if (cidl == 1 && _ILIsValue(apidl[0]))
1363 {
1364 hr = _CreateExtensionUIObject(apidl[0], riid, ppvOut);
1365 if(hr != S_FALSE)
1366 return hr;
1367 }
1368
1369 if (IsEqualIID(riid, IID_IContextMenu) && (cidl >= 1))
1370 {
1371 HKEY hKeys[16];
1372 UINT cKeys = 0;
1373 AddFSClassKeysToArray(cidl, apidl, hKeys, &cKeys);
1374
1375 DEFCONTEXTMENU dcm;
1376 dcm.hwnd = hwndOwner;
1377 dcm.pcmcb = this;
1378 dcm.pidlFolder = m_pidlRoot;
1379 dcm.psf = this;
1380 dcm.cidl = cidl;
1381 dcm.apidl = apidl;
1382 dcm.cKeys = cKeys;
1383 dcm.aKeys = hKeys;
1385 hr = SHCreateDefaultContextMenu (&dcm, riid, &pObj);
1386 }
1387 else if (IsEqualIID (riid, IID_IDataObject))
1388 {
1389 if (cidl >= 1)
1390 {
1391 hr = IDataObject_Constructor (hwndOwner, m_pidlRoot, apidl, cidl, TRUE, (IDataObject **)&pObj);
1392 }
1393 else
1394 {
1395 hr = E_INVALIDARG;
1396 }
1397 }
1398 else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
1399 {
1400 if (_ILIsValue(apidl[0]))
1401 hr = _GetIconHandler(apidl[0], riid, (LPVOID*)&pObj);
1402 if (hr != S_OK)
1403 hr = CFSExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
1404 }
1405 else if (IsEqualIID (riid, IID_IDropTarget))
1406 {
1407 /* only interested in attempting to bind to shell folders, not files (except exe), so if we fail, rebind to root */
1408 if (cidl != 1 || FAILED(hr = this->_GetDropTarget(apidl[0], (LPVOID*) &pObj)))
1409 {
1411 }
1412 }
1413 else
1414 hr = E_NOINTERFACE;
1415
1416 if (SUCCEEDED(hr) && !pObj)
1417 hr = E_OUTOFMEMORY;
1418
1419 *ppvOut = pObj;
1420 }
1421 TRACE("(%p)->hr=0x%08x\n", this, hr);
1422 return hr;
1423}
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:1897
HRESULT _GetDropTarget(LPCITEMIDLIST pidl, LPVOID *ppvOut)
Definition: CFSFolder.cpp:1869
HRESULT _CreateExtensionUIObject(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppvOut)
Definition: CFSFolder.cpp:1846
HRESULT CFSExtractIcon_CreateInstance(IShellFolder *psf, LPCITEMIDLIST pidl, REFIID iid, LPVOID *ppvOut)
Definition: CFSFolder.cpp:281
const GUID IID_IDataObject
BOOL _ILIsValue(LPCITEMIDLIST pidl)
Definition: pidl.c:2109
void AddFSClassKeysToArray(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:345
#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:2018
#define INVALID_FILETITLE_CHARACTERSW
Definition: undocshell.h:1002

◆ Initialize()

HRESULT WINAPI CFSFolder::Initialize ( PCIDLIST_ABSOLUTE  pidl)
override

Implements IPersistFolder.

Definition at line 1745 of file CFSFolder.cpp.

1746{
1747 WCHAR wszTemp[MAX_PATH];
1748
1749 TRACE ("(%p)->(%p)\n", this, pidl);
1750
1751 SHFree(m_pidlRoot); /* free the old pidl */
1752 m_pidlRoot = ILClone (pidl); /* set my pidl */
1753
1756
1757 /* set my path */
1758 HRESULT hr = E_FAIL;
1759 if (SHGetPathFromIDListW (pidl, wszTemp))
1760 hr = SHStrDupW(wszTemp, &m_sPathTarget);
1761
1762 TRACE ("--(%p)->(%s)\n", this, debugstr_w(m_sPathTarget));
1763 return hr;
1764}

◆ InitializeEx()

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

Definition at line 1785 of file CFSFolder.cpp.

1787{
1788 WCHAR wszTemp[MAX_PATH];
1789
1790 TRACE("(%p)->(%p,%p,%p)\n", this, pbc, pidlRootx, ppfti);
1791 if (ppfti)
1792 TRACE("--%p %s %s 0x%08x 0x%08x\n",
1793 ppfti->pidlTargetFolder, debugstr_w (ppfti->szTargetParsingName),
1794 debugstr_w (ppfti->szNetworkProvider), ppfti->dwAttributes,
1795 ppfti->csidl);
1796
1797 pdump (pidlRootx);
1798 if (ppfti && ppfti->pidlTargetFolder)
1799 pdump(ppfti->pidlTargetFolder);
1800
1801 if (m_pidlRoot)
1802 __SHFreeAndNil(&m_pidlRoot); /* free the old */
1803 if (m_sPathTarget)
1805
1806 /*
1807 * Root path and pidl
1808 */
1809 m_pidlRoot = ILClone(pidlRootx);
1810
1811 /*
1812 * the target folder is spezified in csidl OR pidlTargetFolder OR
1813 * szTargetParsingName
1814 */
1815 HRESULT hr = E_FAIL;
1816 if (ppfti)
1817 {
1818 if (ppfti->csidl != -1)
1819 {
1820 BOOL create = ppfti->csidl & CSIDL_FLAG_CREATE;
1821 if (SHGetSpecialFolderPathW(0, wszTemp, ppfti->csidl, create))
1822 hr = SHStrDupW(wszTemp, &m_sPathTarget);
1823 }
1824 else if (ppfti->szTargetParsingName[0])
1825 {
1826 hr = SHStrDupW(ppfti->szTargetParsingName, &m_sPathTarget);
1827 }
1828 else if (ppfti->pidlTargetFolder)
1829 {
1830 if (SHGetPathFromIDListW(ppfti->pidlTargetFolder, wszTemp))
1831 hr = SHStrDupW(wszTemp, &m_sPathTarget);
1832 }
1833 }
1834 TRACE("--(%p)->(target=%s)\n", this, debugstr_w(m_sPathTarget));
1836 return hr;
1837}
BOOL WINAPI SHGetSpecialFolderPathW(HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:3243
static const struct access_res create[16]
Definition: package.c:7505
#define __SHFreeAndNil(ptr)
Definition: shell32_main.h:160
#define CSIDL_FLAG_CREATE

◆ MapColumnToSCID()

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

Implements IShellFolder2.

Definition at line 1717 of file CFSFolder.cpp.

1719{
1720 FIXME ("(%p)\n", this);
1721 return E_NOTIMPL;
1722}

◆ MessageSFVCB()

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

Definition at line 2081 of file CFSFolder.cpp.

2082{
2084 switch (uMsg)
2085 {
2088 break;
2089 case SFVM_GETCOMMANDDIR:
2090 if (m_sPathTarget)
2092 break;
2093 }
2094 return hr;
2095}
#define SFVM_GETCOMMANDDIR
#define SFVM_GET_CUSTOMVIEWINFO
HRESULT WINAPI GetCustomViewInfo(ULONG unknown, SFVM_CUSTOMVIEWINFO_DATA *data)
Definition: CFSFolder.cpp:1993
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 870 of file CFSFolder.cpp.

875{
876 TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n",
877 this, hwndOwner, pbc, lpszDisplayName, debugstr_w (lpszDisplayName),
878 pchEaten, ppidl, pdwAttributes);
879
880 if (!ppidl)
881 return E_INVALIDARG;
882
883 *ppidl = NULL;
884
885 if (!lpszDisplayName)
886 return E_INVALIDARG;
887
888 HRESULT hr;
889 WIN32_FIND_DATAW FindData;
890 if (SHIsFileSysBindCtx(pbc, &FindData) == S_OK)
891 {
892 CComHeapPtr<ITEMIDLIST> pidlTemp;
893 hr = _ParseSimple(lpszDisplayName, &FindData, &pidlTemp);
894 if (SUCCEEDED(hr) && pdwAttributes && *pdwAttributes)
895 {
896 LPCITEMIDLIST pidlLast = ILFindLastID(pidlTemp);
897 GetAttributesOf(1, &pidlLast, pdwAttributes);
898 }
899
900 if (SUCCEEDED(hr))
901 *ppidl = pidlTemp.Detach();
902 }
903 else
904 {
905 INT cchElement = lstrlenW(lpszDisplayName) + 1;
906 LPWSTR pszElement = (LPWSTR)_alloca(cchElement * sizeof(WCHAR));
907 LPWSTR pchNext = lpszDisplayName;
908 hr = Shell_NextElement(&pchNext, pszElement, cchElement, TRUE);
909 if (FAILED(hr))
910 return hr;
911
912 hr = _CreateIDListFromName(pszElement, ULONG_MAX, pbc, ppidl);
913 if (FAILED(hr))
914 {
915 if (pchNext) // Is there the next element?
916 {
917 // pszElement seems like a directory
918 if (_GetFindDataFromName(pszElement, &FindData) &&
919 (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
920 {
921 hr = _CreateIDListFromName(pszElement, FILE_ATTRIBUTE_DIRECTORY, pbc, ppidl);
922 }
923 }
924 else
925 {
926 // pszElement seems like a non-directory
929 (BindCtx_GetMode(pbc, 0) & STGM_CREATE))
930 {
931 // Pretend like a normal file
932 hr = _CreateIDListFromName(pszElement, FILE_ATTRIBUTE_NORMAL, pbc, ppidl);
933 }
934 }
935 }
936
937 if (SUCCEEDED(hr))
938 {
939 if (pchNext) // Is there next?
940 {
941 CComPtr<IShellFolder> psfChild;
942 hr = BindToObject(*ppidl, pbc, IID_PPV_ARG(IShellFolder, &psfChild));
943 if (FAILED(hr))
944 return hr;
945
946 DWORD chEaten;
947 CComHeapPtr<ITEMIDLIST> pidlChild;
948 hr = psfChild->ParseDisplayName(hwndOwner, pbc, pchNext, &chEaten, &pidlChild,
949 pdwAttributes);
950
951 // Append pidlChild to ppidl
952 if (SUCCEEDED(hr))
953 hr = SHILAppend(pidlChild.Detach(), ppidl);
954 }
955 else if (pdwAttributes && *pdwAttributes)
956 {
957 GetAttributesOf(1, (LPCITEMIDLIST*)ppidl, pdwAttributes);
958 }
959 }
960 }
961
962 TRACE("(%p)->(-- pidl=%p ret=0x%08x)\n", this, ppidl ? *ppidl : 0, hr);
963
964 return hr;
965}
STDMETHOD() GetAttributesOf(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, DWORD *rgfInOut) override
Definition: CFSFolder.cpp:1267
HRESULT _ParseSimple(_In_ LPOLESTR lpszDisplayName, _Inout_ WIN32_FIND_DATAW *pFind, _Out_ LPITEMIDLIST *ppidl)
Definition: CFSFolder.cpp:759
HRESULT _CreateIDListFromName(LPCWSTR pszName, DWORD attrs, IBindCtx *pbc, LPITEMIDLIST *ppidl)
Definition: CFSFolder.cpp:814
#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:278
HRESULT SHIsFileSysBindCtx(_In_ IBindCtx *pBindCtx, _Out_opt_ WIN32_FIND_DATAW *pFindData)
Definition: utils.cpp:303
#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 1553 of file CFSFolder.cpp.

1559{
1560 WCHAR szSrc[MAX_PATH + 1], szDest[MAX_PATH + 1], szNameBuf[MAX_PATH];
1561 BOOL bIsFolder = ItemIsFolder(ILFindLastID(pidl));
1562
1563 TRACE ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", this, hwndOwner, pidl,
1564 debugstr_w (lpName), dwFlags, pPidlOut);
1565
1566 if (pPidlOut)
1567 *pPidlOut = NULL;
1568
1569 LPCWSTR pszName = GetItemFileName(pidl, szNameBuf, _countof(szNameBuf));
1570 if (!pszName)
1571 {
1572 ERR("Got garbage pidl:\n");
1573 pdump_always(pidl);
1574 return E_INVALIDARG;
1575 }
1576
1577 /* build source path */
1578 PathCombineW(szSrc, m_sPathTarget, pszName);
1579
1580 /* build destination path */
1583 else
1584 lstrcpynW(szDest, lpName, MAX_PATH);
1585
1586 if (!(dwFlags & SHGDN_FORPARSING) && !bIsFolder && SHELL_FS_HideExtension(szSrc))
1587 {
1589 if (*ext)
1590 PathAddExtensionW(szDest, ext);
1591 }
1592
1593 HRESULT hr = S_OK;
1594 TRACE ("src=%s dest=%s\n", debugstr_w(szSrc), debugstr_w(szDest));
1595 if (!wcscmp(szSrc, szDest))
1596 {
1597 /* src and destination is the same */
1598 if (pPidlOut)
1599 hr = SHILClone(pidl, pPidlOut);
1600 }
1601 else
1602 {
1603 hr = SHELL_SingleFileOperation(hwndOwner, FO_RENAME, szSrc, szDest, FOF_SILENT | FOF_ALLOWUNDO, NULL);
1604 if (SUCCEEDED(hr) && pPidlOut)
1605 hr = ParseDisplayName(hwndOwner, NULL, PathFindFileNameW(szDest), NULL, pPidlOut, NULL);
1606 }
1607 return hr;
1608}
static const WCHAR *const ext[]
Definition: module.c:53
BOOL SHELL_FS_HideExtension(LPCWSTR szPath)
Definition: CFSFolder.cpp:1438
static BOOL ItemIsFolder(PCUITEMID_CHILD pidl)
Definition: CFSFolder.cpp:17
HRESULT SHELL_SingleFileOperation(HWND hWnd, UINT Op, PCWSTR Src, PCWSTR Dest, UINT Flags, PWSTR *ppNewName)
Definition: shlfileop.cpp:2446
HRESULT SHILClone(_In_opt_ LPCITEMIDLIST pidl, _Outptr_ LPITEMIDLIST *ppidl)
Definition: utils.cpp:133
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
Definition: path.c:394
static IParseDisplayName ParseDisplayName
Definition: moniker.c:816
#define PathAddExtensionW
Definition: pathcch.h:305
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define FO_RENAME
Definition: shellapi.h:140
#define FOF_ALLOWUNDO
Definition: shellapi.h:148
#define FOF_SILENT
Definition: shellapi.h:144
_In_ LPCSTR lpName
Definition: winbase.h:2820

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: