ReactOS 0.4.16-dev-1040-g85afe48
item_prop.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: shell32
3 * LICENSE: LGPL-2.1+ (https://spdx.org/licenses/LGPL-2.1+)
4 * PURPOSE: FileSystem PropertySheet implementation
5 * COPYRIGHT: Copyright 2024 Whindmar Saksit <whindsaks@proton.me>
6 */
7
8#include "precomp.h"
9
11
12static HRESULT
14{
17 {
18 hr = SHGetNameAndFlagsW(pidl, SHGDN_INFOLDER, Buf, cchBuf, NULL);
19 ILFree(pidl);
20
21 if (SUCCEEDED(hr) && DataObject_GetHIDACount(pDO) > 1)
22 StringCchCatW(Buf, cchBuf, L", ...");
23 }
24 return hr;
25}
26
28{
29 typedef void (CALLBACK*PFNINITIALIZE)(LPCWSTR InitString, IDataObject *pDO,
30 HKEY *hKeys, UINT *cKeys);
31
32 static HRESULT Show(const CLSID *pClsidDefault, IDataObject *pDO,
33 PFNINITIALIZE InitFunc, LPCWSTR InitString)
34 {
35 HRESULT hr;
36 CRegKeyHandleArray keys;
37 if (InitFunc)
38 InitFunc(InitString, pDO, keys, keys);
39 WCHAR szCaption[MAX_PATH], *pszCaption = NULL;
40 if (SUCCEEDED(SHELL_GetCaptionFromDataObject(pDO, szCaption, _countof(szCaption))))
41 pszCaption = szCaption;
42 hr = SHOpenPropSheetW(pszCaption, keys, keys, pClsidDefault, pDO, NULL, NULL) ? S_OK : E_FAIL;
43 return hr;
44 }
45
46 struct DATA
47 {
54 };
55
56 static void FreeData(DATA *pData)
57 {
58 if (pData->InitString)
59 SHFree(pData->InitString);
61 }
62
63 static HRESULT ShowAsync(const CLSID *pClsidDefault, IDataObject *pDO,
64 PFNINITIALIZE InitFunc, LPCWSTR InitString)
65 {
66 DATA *pData = (DATA*)SHAlloc(sizeof(*pData));
67 if (!pData)
68 return E_OUTOFMEMORY;
69 ZeroMemory(pData, sizeof(*pData));
70 pData->InitFunc = InitFunc;
71 if (InitString && FAILED(SHStrDupW(InitString, &pData->InitString)))
72 {
74 return E_OUTOFMEMORY;
75 }
76 if (pClsidDefault)
77 {
78 pData->ClsidDefault = *pClsidDefault;
79 pData->pClsidDefault = &pData->ClsidDefault;
80 }
82
83 HRESULT hr = S_OK;
84 if (pDO)
86
89 {
90 if (pData->pObjStream)
91 pData->pObjStream->Release();
92 hr = E_FAIL;
93 }
94
95 if (SUCCEEDED(hr))
96 {
97 if (hEvent)
98 {
100 // Pump COM messages until the thread can create its own IDataObject (for CORE-19933).
101 // SHOpenPropSheetW is modal and we cannot wait for it to complete.
104 }
105 }
106 else
107 {
109 }
110 return hr;
111 }
112
114 {
115 DATA *pData = (DATA*)Param;
116 CComPtr<IDataObject> pDO, pLocalDO;
117 if (pData->pObjStream)
119 if (pDO && SUCCEEDED(SHELL_CloneDataObject(pDO, &pLocalDO)))
120 pDO = pLocalDO;
121 if (pData->hEvent)
122 SetEvent(pData->hEvent);
123 Show(pData->pClsidDefault, pDO, pData->InitFunc, pData->InitString);
125 return 0;
126 }
127};
128
129static void CALLBACK
131{
132 UNREFERENCED_PARAMETER(InitString);
133 CDataObjectHIDA cida(pDO);
134 if (SUCCEEDED(cida.hr()) && cida->cidl)
135 {
136#if 0
137 CCidaChildArrayHelper items(cida);
138 if (FAILED(hr = items.hr()))
139 return hr;
140#else
141 // Note: Since we are only passing a single item to AddFSClassKeysToArray,
142 // we don't need the rest of the array to be valid.
143 PCUITEMID_CHILD pidl = HIDA_GetPIDLItem(cida, 0);
144#endif
145 AddFSClassKeysToArray(1, &pidl, hKeys, cKeys); // Add file-type specific pages
146 }
147}
148
149static void CALLBACK
150ClassPropDialogInitCallback(LPCWSTR InitString, IDataObject *pDO, HKEY *hKeys, UINT *cKeys)
151{
153 AddClassKeyToArray(InitString, hKeys, cKeys); // Add pages from HKCR\%ProgId% (with shellex\PropertySheetHandlers appended later)
154}
155
158{
159 CDataObjectHIDA cida(pDO);
160 HRESULT hr = cida.hr();
162 return hr;
163
164 const CLSID *pClsid = NULL;
166 LPCWSTR InitString = NULL;
167
168 if (cida->cidl && _ILIsDrive(HIDA_GetPIDLItem(cida, 0)))
169 {
170 pClsid = &CLSID_ShellDrvDefExt;
172 InitString = L"Drive";
173 }
174 else
175 {
176 pClsid = &CLSID_ShellFileDefExt;
178 }
180 return Dialog.ShowAsync(pClsid, pDO, InitFunc, InitString);
181}
182
185{
186 if (DataObject_GetHIDACount(pDO) == 1)
188
189 ERR("SHMultiFileProperties is not implemented yet\n");
191 SHELL_ErrorBox(hOwner, hr);
192 return hr; // TODO: return SHMultiFileProperties(pDO, 0);
193}
194
197{
198 WCHAR ClassBuf[6 + 38 + 1] = L"CLSID\\";
199 StringFromGUID2(*pClsid, ClassBuf + 6, 38 + 1);
201 return Dialog.ShowAsync(NULL, pDO, ClassPropDialogInitCallback, ClassBuf);
202}
203
206{
207 assert(pidl);
208
209 CComHeapPtr<ITEMIDLIST> alloc;
210 if (IS_INTRESOURCE(pidl))
211 {
212 HRESULT hr = SHGetSpecialFolderLocation(NULL, LOWORD(pidl), const_cast<LPITEMIDLIST*>(&pidl));
213 if (FAILED(hr))
214 return hr;
215 alloc.Attach(const_cast<LPITEMIDLIST>(pidl));
216 }
217 SHELLEXECUTEINFOA sei = {
218 sizeof(sei), SEE_MASK_INVOKEIDLIST | SEE_MASK_ASYNCOK, NULL, "properties",
219 NULL, NULL, NULL, SW_SHOWNORMAL, NULL, const_cast<LPITEMIDLIST>(pidl)
220 };
222}
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define index(s, c)
Definition: various.h:29
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define ERR(fmt,...)
Definition: precomp.h:57
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
#define ERROR_NOT_SUPPORTED
Definition: compat.h:100
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
#define FAILED_UNEXPECTEDLY(hr)
Definition: debug.h:83
HRESULT WINAPI CoWaitForMultipleHandles(DWORD dwFlags, DWORD dwTimeout, ULONG cHandles, LPHANDLE pHandles, LPDWORD lpdwindex)
Definition: compobj.c:4578
INT WINAPI StringFromGUID2(REFGUID id, LPOLESTR str, INT cmax)
Definition: compobj.c:2434
HRESULT WINAPI CoMarshalInterThreadInterfaceInStream(REFIID riid, LPUNKNOWN pUnk, LPSTREAM *ppStm)
Definition: marshal.c:2100
HRESULT WINAPI CoGetInterfaceAndReleaseStream(LPSTREAM pStm, REFIID riid, LPVOID *ppv)
Definition: marshal.c:2144
HRESULT DataObject_GetHIDACount(IDataObject *pdo)
HRESULT SHGetNameAndFlagsW(_In_ LPCITEMIDLIST pidl, _In_ DWORD dwFlags, _Out_opt_ LPWSTR pszText, _In_ UINT cchBuf, _Inout_opt_ DWORD *pdwAttributes)
Definition: utils.cpp:480
HRESULT SHELL_CloneDataObject(_In_ IDataObject *pDO, _Out_ IDataObject **ppDO)
PIDLIST_ABSOLUTE SHELL_DataObject_ILCloneFullItem(_In_ IDataObject *pDO, _In_ UINT Index)
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:326
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:304
HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST *ppidl)
Definition: shellpath.c:3408
HRESULT WINAPI SHStrDupW(LPCWSTR src, LPWSTR *dest)
Definition: string.c:2018
BOOL WINAPI SHCreateThread(LPTHREAD_START_ROUTINE pfnThreadProc, VOID *pData, DWORD dwFlags, LPTHREAD_START_ROUTINE pfnCallback)
Definition: thread.c:356
#define assert(x)
Definition: debug.h:53
#define INFINITE
Definition: serial.h:102
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint index
Definition: glext.h:6031
GLbitfield flags
Definition: glext.h:7161
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
static void CALLBACK FSFolderItemPropDialogInitCallback(LPCWSTR InitString, IDataObject *pDO, HKEY *hKeys, UINT *cKeys)
Definition: item_prop.cpp:130
HRESULT SHELL32_ShowFilesystemItemsPropertiesDialogAsync(HWND hOwner, IDataObject *pDO)
Definition: item_prop.cpp:184
static void CALLBACK ClassPropDialogInitCallback(LPCWSTR InitString, IDataObject *pDO, HKEY *hKeys, UINT *cKeys)
Definition: item_prop.cpp:150
static HRESULT SHELL_GetCaptionFromDataObject(IDataObject *pDO, LPWSTR Buf, UINT cchBuf)
Definition: item_prop.cpp:13
HRESULT SHELL32_ShowFilesystemItemPropertiesDialogAsync(IDataObject *pDO)
Definition: item_prop.cpp:157
HRESULT SHELL_ShowItemIDListProperties(LPCITEMIDLIST pidl)
Definition: item_prop.cpp:205
HRESULT SHELL32_ShowShellExtensionProperties(const CLSID *pClsid, IDataObject *pDO)
Definition: item_prop.cpp:196
#define HResultFromWin32
Definition: loader.cpp:14
static HANDLE hEvent
Definition: comm.c:54
unsigned int UINT
Definition: ndis.h:50
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:325
#define L(x)
Definition: ntvdm.h:50
@ COWAIT_DEFAULT
Definition: objbase.h:695
const GUID IID_IDataObject
static TCHAR * items[]
Definition: page1.c:45
#define LOWORD(l)
Definition: pedump.c:82
void WINAPI ILFree(LPITEMIDLIST pidl)
Definition: pidl.c:1044
BOOL _ILIsDrive(LPCITEMIDLIST pidl)
Definition: pidl.c:2130
#define alloc
Definition: rosglue.h:13
#define SEE_MASK_ASYNCOK
Definition: shellapi.h:54
#define SEE_MASK_INVOKEIDLIST
Definition: shellapi.h:28
static PCUIDLIST_RELATIVE HIDA_GetPIDLItem(CIDA const *pida, SIZE_T i)
Definition: shellutils.h:648
#define SHELL_ErrorBox
Definition: shellutils.h:126
void AddFSClassKeysToArray(UINT cidl, PCUITEMID_CHILD_ARRAY apidl, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:430
LSTATUS AddClassKeyToArray(const WCHAR *szClass, HKEY *array, UINT *cKeys)
Definition: shlfolder.cpp:408
BOOL WINAPI DECLSPEC_HOTPATCH ShellExecuteExA(LPSHELLEXECUTEINFOA sei)
Definition: shlexec.cpp:2394
HRESULT hr
Definition: shlfolder.c:183
#define CTF_PROCESS_REF
Definition: shlwapi.h:1980
#define CTF_COINIT
Definition: shlwapi.h:1981
#define CTF_INSIST
Definition: shlwapi.h:1978
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
const ITEMID_CHILD UNALIGNED * PCUITEMID_CHILD
Definition: shtypes.idl:70
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define _countof(array)
Definition: sndvol32.h:70
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
Definition: window.h:372
const CLSID * pClsidDefault
Definition: item_prop.cpp:51
void(CALLBACK * PFNINITIALIZE)(LPCWSTR InitString, IDataObject *pDO, HKEY *hKeys, UINT *cKeys)
Definition: item_prop.cpp:29
static DWORD CALLBACK ShowPropertiesThread(LPVOID Param)
Definition: item_prop.cpp:113
static HRESULT ShowAsync(const CLSID *pClsidDefault, IDataObject *pDO, PFNINITIALIZE InitFunc, LPCWSTR InitString)
Definition: item_prop.cpp:63
static HRESULT Show(const CLSID *pClsidDefault, IDataObject *pDO, PFNINITIALIZE InitFunc, LPCWSTR InitString)
Definition: item_prop.cpp:32
static void FreeData(DATA *pData)
Definition: item_prop.cpp:56
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:651
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:733
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830
EXTERN_C BOOL WINAPI SHOpenPropSheetW(_In_opt_ LPCWSTR pszCaption, _In_opt_ HKEY *ahKeys, _In_ UINT cKeys, _In_ const CLSID *pclsidDefault, _In_ IDataObject *pDataObject, _In_opt_ IShellBrowser *pShellBrowser, _In_opt_ LPCWSTR pszStartPage)
Definition: propsheet.cpp:204
#define ZeroMemory
Definition: winbase.h:1743
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define HRESULT_FROM_WIN32(x)
Definition: winerror.h:92
#define SW_SHOWNORMAL
Definition: winuser.h:781
#define IS_INTRESOURCE(i)
Definition: winuser.h:580
#define IID_PPV_ARG(Itype, ppType)
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185