ReactOS 0.4.15-dev-8434-g155a7c7
CRegFolder.cpp File Reference
#include <precomp.h>
Include dependency graph for CRegFolder.cpp:

Go to the source code of this file.

Classes

class  CRegFolderEnum
 
class  CRegFolder
 

Enumerations

enum  REGFOLDERCOLUMNINDEX { COL_NAME = SHFSF_COL_NAME , COL_TYPE = SHFSF_COL_TYPE , COL_INFOTIP = SHFSF_COL_COMMENT , REGFOLDERCOLUMNCOUNT = max(COL_INFOTIP, COL_TYPE) + 1 }
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (shell)
 
HRESULT CALLBACK RegFolderContextMenuCallback (IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
 
HRESULT CGuidItemContextMenu_CreateInstance (PCIDLIST_ABSOLUTE pidlFolder, HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, IContextMenu **ppcm)
 
HRESULT FormatGUIDKey (LPWSTR KeyName, SIZE_T KeySize, LPCWSTR RegPath, const GUID *riid)
 
HRESULT CGuidItemExtractIcon_CreateInstance (LPCITEMIDLIST pidl, REFIID iid, LPVOID *ppvOut)
 
HRESULT CRegFolder_CreateInstance (const GUID *pGuid, LPCITEMIDLIST pidlRoot, LPCWSTR lpszPath, LPCWSTR lpszEnumKeyName, REFIID riid, void **ppv)
 

Enumeration Type Documentation

◆ REGFOLDERCOLUMNINDEX

Enumerator
COL_NAME 
COL_TYPE 
COL_INFOTIP 
REGFOLDERCOLUMNCOUNT 

Definition at line 294 of file CRegFolder.cpp.

295{
300};
@ REGFOLDERCOLUMNCOUNT
Definition: CRegFolder.cpp:299
@ COL_INFOTIP
Definition: CRegFolder.cpp:298
@ COL_NAME
Definition: CRegFolder.cpp:296
@ COL_TYPE
Definition: CRegFolder.cpp:297
#define SHFSF_COL_COMMENT
Definition: shfldr.h:48
#define SHFSF_COL_NAME
Definition: shfldr.h:43
#define SHFSF_COL_TYPE
Definition: shfldr.h:45
#define max(a, b)
Definition: svc.c:63

Function Documentation

◆ CGuidItemContextMenu_CreateInstance()

HRESULT CGuidItemContextMenu_CreateInstance ( PCIDLIST_ABSOLUTE  pidlFolder,
HWND  hwnd,
UINT  cidl,
PCUITEMID_CHILD_ARRAY  apidl,
IShellFolder psf,
IContextMenu **  ppcm 
)

Definition at line 87 of file CRegFolder.cpp.

93{
94 HKEY hKeys[10];
95 UINT cKeys = 0;
96
97 GUID *pGuid = _ILGetGUIDPointer(apidl[0]);
98 if (pGuid)
99 {
100 WCHAR key[60];
101 wcscpy(key, L"CLSID\\");
102 StringFromGUID2(*pGuid, &key[6], 39);
103 AddClassKeyToArray(key, hKeys, &cKeys);
104 }
105
106 // FIXME: CRegFolder should be aggregated by its outer folder and should
107 // provide the attributes for all required non-registry folders.
108 // It currently does not so we have to ask the outer folder ourself so
109 // that we get the correct attributes for My Computer etc.
110 CComPtr<IShellFolder> pOuterSF;
111 SHBindToObject(NULL, pidlFolder, IID_PPV_ARG(IShellFolder, &pOuterSF));
112
113 SFGAOF att = (psf && cidl) ? SHGetAttributes(pOuterSF ? pOuterSF.p : psf, apidl[0], SFGAO_FOLDER) : 0;
114 if (att & SFGAO_FOLDER)
115 AddClassKeyToArray(L"Folder", hKeys, &cKeys);
116
117 return CDefFolderMenu_Create2(pidlFolder, hwnd, cidl, apidl, psf, RegFolderContextMenuCallback, cKeys, hKeys, ppcm);
118}
HRESULT WINAPI CDefFolderMenu_Create2(PCIDLIST_ABSOLUTE pidlFolder, HWND hwnd, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, IShellFolder *psf, LPFNDFMCALLBACK lpfn, UINT nKeys, const HKEY *ahkeyClsKeys, IContextMenu **ppcm)
HRESULT CALLBACK RegFolderContextMenuCallback(IShellFolder *psf, HWND hwnd, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: CRegFolder.cpp:25
#define NULL
Definition: types.h:112
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2434
DWORD SHGetAttributes(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwAttributes)
Definition: utils.cpp:246
EXTERN_C HRESULT SHBindToObject(_In_opt_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ REFIID riid, _Out_ void **ppvObj)
Definition: utils.cpp:220
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
Definition: ebrowser.c:83
unsigned int UINT
Definition: ndis.h:50
#define L(x)
Definition: ntvdm.h:50
IID * _ILGetGUIDPointer(LPCITEMIDLIST pidl)
Definition: pidl.c:2292
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:277
Definition: copy.c:22
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define IID_PPV_ARG(Itype, ppType)
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by CRegFolder::GetUIObjectOf().

◆ CGuidItemExtractIcon_CreateInstance()

HRESULT CGuidItemExtractIcon_CreateInstance ( LPCITEMIDLIST  pidl,
REFIID  iid,
LPVOID ppvOut 
)

Definition at line 130 of file CRegFolder.cpp.

131{
132 CComPtr<IDefaultExtractIconInit> initIcon;
133 HRESULT hr;
134 GUID const * riid;
135 int icon_idx;
136 WCHAR wTemp[MAX_PATH];
137
139 if (FAILED(hr))
140 return hr;
141
142 if (_ILIsDesktop(pidl))
143 {
144 initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_DESKTOP);
145 return initIcon->QueryInterface(iid, ppvOut);
146 }
147
148 riid = _ILGetGUIDPointer(pidl);
149 if (!riid)
150 return E_FAIL;
151
152 /* Choose a correct icon for Recycle Bin (full or empty) */
153 const WCHAR* iconname = NULL;
154 if (_ILIsBitBucket(pidl))
155 {
156 CComPtr<IEnumIDList> EnumIDList;
158
159 CComPtr<IShellFolder2> psfRecycleBin;
160 CComPtr<IShellFolder> psfDesktop;
161 hr = SHGetDesktopFolder(&psfDesktop);
162
163 if (SUCCEEDED(hr))
164 hr = psfDesktop->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder2, &psfRecycleBin));
165 if (SUCCEEDED(hr))
166 hr = psfRecycleBin->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &EnumIDList);
167
168 ULONG itemcount;
169 LPITEMIDLIST pidl = NULL;
170 if (SUCCEEDED(hr) && (hr = EnumIDList->Next(1, &pidl, &itemcount)) == S_OK)
171 {
172 CoTaskMemFree(pidl);
173 iconname = L"Full";
174 } else {
175 iconname = L"Empty";
176 }
177 }
178
179 /* Prepare registry path for loading icons of My Computer and other shell extensions */
181
183 L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\%s",
184 riid);
186 return hr;
187
188 /* Load icon for the current user */
189 BOOL ret = HCU_GetIconW(KeyName, wTemp, iconname, _countof(wTemp), &icon_idx);
190 if (!ret)
191 {
192 /* Failed, load default system-wide icon */
193 hr = FormatGUIDKey(KeyName, _countof(KeyName), L"CLSID\\%s", riid);
195 return hr;
196
197 ret = HCR_GetIconW(KeyName, wTemp, iconname, _countof(wTemp), &icon_idx);
198 }
199
200 if (ret)
201 {
202 /* Success, set loaded icon */
203 initIcon->SetNormalIcon(wTemp, icon_idx);
204 }
205 else
206 {
207 /* Everything has failed, set blank paper icon */
208 WARN("Failed to load an icon for the item, setting blank icon\n");
209 initIcon->SetNormalIcon(swShell32Name, IDI_SHELL_DOCUMENT - 1);
210 }
211
212 return initIcon->QueryInterface(iid, ppvOut);
213}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
HRESULT WINAPI SHCreateDefaultExtractIcon(REFIID riid, void **ppv)
HRESULT FormatGUIDKey(LPWSTR KeyName, SIZE_T KeySize, LPCWSTR RegPath, const GUID *riid)
Definition: CRegFolder.cpp:120
#define WARN(fmt,...)
Definition: precomp.h:61
#define E_FAIL
Definition: ddrawi.h:102
#define MAX_PATH
Definition: compat.h:34
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
unsigned int BOOL
Definition: ntddk_ex.h:94
WCHAR swShell32Name[MAX_PATH]
Definition: folders.cpp:22
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
REFIID riid
Definition: atlbase.h:39
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
BOOL _ILIsBitBucket(LPCITEMIDLIST pidl)
Definition: pidl.c:1981
BOOL HCR_GetIconW(LPCWSTR szClass, LPWSTR szDest, LPCWSTR szName, DWORD len, int *picon_idx)
Definition: classes.c:297
HRESULT hr
Definition: shlfolder.c:183
#define IDI_SHELL_DESKTOP
Definition: shresdef.h:590
#define IDI_SHELL_DOCUMENT
Definition: shresdef.h:556
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
#define _countof(array)
Definition: sndvol32.h:70
uint32_t ULONG
Definition: typedefs.h:59
int ret
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
Definition: wdfdevice.h:2699

Referenced by CRegFolder::GetUIObjectOf().

◆ CRegFolder_CreateInstance()

HRESULT CRegFolder_CreateInstance ( const GUID pGuid,
LPCITEMIDLIST  pidlRoot,
LPCWSTR  lpszPath,
LPCWSTR  lpszEnumKeyName,
REFIID  riid,
void **  ppv 
)

Definition at line 865 of file CRegFolder.cpp.

866{
867 return ShellObjectCreatorInit<CRegFolder>(pGuid, pidlRoot, lpszPath, lpszEnumKeyName, riid, ppv);
868}
REFIID LPVOID * ppv
Definition: atlbase.h:39

Referenced by CDesktopFolder::FinalConstruct(), CDrivesFolder::FinalConstruct(), and CControlPanelFolder::Initialize().

◆ FormatGUIDKey()

HRESULT FormatGUIDKey ( LPWSTR  KeyName,
SIZE_T  KeySize,
LPCWSTR  RegPath,
const GUID riid 
)

Definition at line 120 of file CRegFolder.cpp.

121{
122 WCHAR xriid[40];
123
124 if (!StringFromGUID2(*riid, xriid, _countof(xriid) - 1))
125 return E_FAIL;
126
127 return StringCchPrintfW(KeyName, KeySize, RegPath, xriid);
128}
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530

Referenced by CGuidItemExtractIcon_CreateInstance().

◆ RegFolderContextMenuCallback()

HRESULT CALLBACK RegFolderContextMenuCallback ( IShellFolder psf,
HWND  hwnd,
IDataObject pdtobj,
UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 25 of file CRegFolder.cpp.

31{
33 return SHELL32_DefaultContextMenuCallBack(psf, pdtobj, uMsg);
34
35 PIDLIST_ABSOLUTE pidlFolder;
36 PUITEMID_CHILD *apidl;
37 UINT cidl;
38 HRESULT hr = SH_GetApidlFromDataObject(pdtobj, &pidlFolder, &apidl, &cidl);
40 return hr;
41
42 if (_ILIsMyComputer(apidl[0]))
43 {
44 if (!SHELL_ExecuteControlPanelCPL(hwnd, L"sysdm.cpl"))
45 {
46 hr = E_FAIL;
47 }
48 }
49 else if (_ILIsDesktop(apidl[0]))
50 {
51 if (!SHELL_ExecuteControlPanelCPL(hwnd, L"desk.cpl"))
52 {
53 hr = E_FAIL;
54 }
55 }
56 else if (_ILIsNetHood(apidl[0]))
57 {
58 // FIXME path!
59 if (32 >= (UINT_PTR)ShellExecuteW(NULL,
60 L"open",
61 L"explorer.exe",
62 L"::{7007ACC7-3202-11D1-AAD2-00805FC1270E}",
63 NULL,
65 {
66 hr = E_FAIL;
67 }
68 }
69 else if (_ILIsBitBucket(apidl[0]))
70 {
71 /* FIXME: detect the drive path of bitbucket if appropiate */
73 hr = E_FAIL;
74 }
75 else
76 {
77 /* Tell the caller to run the default action */
78 hr = S_FALSE;
79 }
80
81 SHFree(pidlFolder);
82 _ILFreeaPidl(apidl, cidl);
83
84 return hr;
85}
WPARAM wParam
Definition: combotst.c:138
#define DFM_INVOKECOMMAND
Definition: precomp.h:45
#define SHELL_ExecuteControlPanelCPL(hwnd, cpl)
Definition: precomp.h:156
HRESULT SHELL32_DefaultContextMenuCallBack(IShellFolder *psf, IDataObject *pdo, UINT msg)
Definition: shlfolder.cpp:522
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
BOOL _ILIsMyComputer(LPCITEMIDLIST pidl)
Definition: pidl.c:1970
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
Definition: pidl.c:2594
BOOL _ILIsNetHood(LPCITEMIDLIST pidl)
Definition: pidl.c:1948
BOOL SH_ShowRecycleBinProperties(WCHAR sDrive)
HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE *ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
Definition: shlfolder.cpp:368
HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpVerb, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd)
Definition: shlexec.cpp:2513
#define DFM_CMD_PROPERTIES
Definition: shlobj.h:2611
ITEMID_CHILD UNALIGNED * PUITEMID_CHILD
Definition: shtypes.idl:68
#define S_FALSE
Definition: winerror.h:2357
#define SW_SHOWDEFAULT
Definition: winuser.h:780

Referenced by CGuidItemContextMenu_CreateInstance().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( shell  )