ReactOS 0.4.16-dev-981-g80eb313
utility.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS shdocvw
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: Utility routines
5 * COPYRIGHT: Copyright 2024 Whindmar Saksit <whindsaks@proton.me>
6 * Copyright 2025 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
7 */
8
9#include "objects.h"
10#include <strsafe.h>
11
12#include <wine/debug.h>
14
15static inline INT_PTR
17{
18 MENUITEMINFOW mii;
19 mii.cbSize = FIELD_OFFSET(MENUITEMINFOW, hbmpItem); /* USER32 version agnostic */
20 mii.fMask = MIIM_ID; /* GetMenuItemID does not handle sub-menus, this does */
21 mii.cch = 0;
22 return GetMenuItemInfoW(hMenu, Pos, TRUE, &mii) ? mii.wID : -1;
23}
24
25static inline BOOL
27{
28 MENUITEMINFOW mii;
29 mii.cbSize = FIELD_OFFSET(MENUITEMINFOW, hbmpItem); /* USER32 version agnostic */
30 mii.fMask = MIIM_FTYPE;
31 mii.cch = 0;
32 return GetMenuItemInfoW(hMenu, Pos, TRUE, &mii) && (mii.fType & MFT_SEPARATOR);
33}
34
37{
38#if DLL_EXPORT_VERSION >= _WIN32_WINNT_VISTA && 0 // FIXME: SHELL32 not ready yet
39 return SHGetIDListFromObject(punk, ppidl);
40#else
41 HRESULT hr;
42 IPersistFolder2 *pf2;
44 {
45 hr = pf2->GetCurFolder(ppidl);
46 pf2->Release();
47 }
48 IPersistIDList *pil;
50 {
51 hr = pil->GetIDList(ppidl);
52 pil->Release();
53 }
54 return hr;
55#endif
56}
57
59{
60 IShellFolder *psf;
62 if (FAILED(hr))
63 return hr;
64 hr = psf->CompareIDs(lParam, a, b);
65 psf->Release();
66 return hr;
67}
68
71{
73}
74
77{
78 HRESULT hr;
79 WCHAR wide[MAX_PATH];
80 if (SUCCEEDED(hr = pcm->GetCommandString(idCmd, GCS_VERBW, NULL, (LPSTR)wide, _countof(wide))))
81 return !lstrcmpiW(wide, Verb);
82
83 CHAR ansi[_countof(wide)], buf[MAX_PATH];
85 {
86 if (SUCCEEDED(hr = pcm->GetCommandString(idCmd, GCS_VERBA, NULL, ansi, _countof(ansi))))
87 return !lstrcmpiA(ansi, buf);
88 }
89 return FALSE;
90}
91
92static int
94{
95 for (UINT i = 0, c = GetMenuItemCount(hMenu); i < c; ++i)
96 {
97 INT_PTR id = GetMenuItemIdByPos(hMenu, i);
98 if (id != -1 && SHELL_IsVerb(pcm, id - idCmdFirst, Verb))
99 return i;
100 }
101 return -1;
102}
103
106{
107 int nPos = SHELL_FindVerbPos(pcm, idCmdFirst, hMenu, Verb);
108 if (nPos < 0)
109 return;
110 int nCount = GetMenuItemCount(hMenu);
111 BOOL bSepBefore = nPos && IsMenuSeparator(hMenu, nPos - 1);
112 BOOL bSepAfter = IsMenuSeparator(hMenu, nPos + 1);
113 if (DeleteMenu(hMenu, nPos, MF_BYPOSITION))
114 {
115 if ((bSepBefore && bSepAfter) || (bSepAfter && nPos == 0))
116 DeleteMenu(hMenu, nPos, MF_BYPOSITION);
117 else if (bSepBefore && nPos + 1 == nCount)
118 DeleteMenu(hMenu, nPos - 1, MF_BYPOSITION);
119 }
120}
121
124{
125 return (pidl == NULL || pidl->mkid.cb == 0);
126}
127
128/*************************************************************************
129 * IEILIsEqual [SHDOCVW.219]
130 */
133 _In_ LPCITEMIDLIST pidl1,
134 _In_ LPCITEMIDLIST pidl2,
135 _In_ BOOL bUnknown)
136{
137 UINT cb1 = ILGetSize(pidl1), cb2 = ILGetSize(pidl2);
138 if (cb1 == cb2 && memcmp(pidl1, pidl2, cb1) == 0)
139 return TRUE;
140
141 FIXME("%p, %p\n", pidl1, pidl2);
142 return FALSE;
143}
144
145static VOID
147{
148#define PATH_VALID_ELEMENT ( \
149 PATH_CHAR_CLASS_DOT | PATH_CHAR_CLASS_SEMICOLON | PATH_CHAR_CLASS_COMMA | \
150 PATH_CHAR_CLASS_SPACE | PATH_CHAR_CLASS_OTHER_VALID \
151)
152 PWCHAR pch, pchSrc;
153 for (pch = pchSrc = pszDisplayName; *pchSrc; ++pchSrc)
154 {
156 *pch++ = *pchSrc;
157 }
158 *pch = UNICODE_NULL;
159}
160
161static HRESULT
163 _In_ LPCWSTR pszLnkFileName,
164 _In_ PCIDLIST_ABSOLUTE pidlTarget,
165 _In_opt_ LPCWSTR pszDescription)
166{
167 HRESULT hr;
168
169 CComPtr<IShellLink> psl;
170 hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
171 IID_PPV_ARG(IShellLink, &psl));
173 return hr;
174
175 psl->SetIDList(pidlTarget);
176
177 if (pszDescription)
178 psl->SetDescription(pszDescription);
179
180 CComPtr<IPersistFile> ppf;
183 return hr;
184
185 return ppf->Save(pszLnkFileName, TRUE);
186}
187
188/*************************************************************************
189 * AddUrlToFavorites [SHDOCVW.106]
190 */
193 _In_ HWND hwnd,
194 _In_ LPCWSTR pszUrlW,
195 _In_opt_ LPCWSTR pszTitleW,
196 _In_ BOOL fDisplayUI)
197{
198 TRACE("%p, %s, %s, %d\n", hwnd, wine_dbgstr_w(pszUrlW), wine_dbgstr_w(pszTitleW), fDisplayUI);
199
200 if (fDisplayUI)
201 FIXME("fDisplayUI\n"); // NOTE: Use SHBrowseForFolder callback
202
203 if (PathIsURLW(pszUrlW))
204 FIXME("Internet Shortcut\n");
205
206 CComHeapPtr<ITEMIDLIST> pidl;
207 HRESULT hr = SHParseDisplayName(pszUrlW, NULL, &pidl, 0, NULL);
209 return hr;
210
211 // Get title
213 if (pszTitleW)
215 else
217
218 // Delete invalid characters
220
221 // Build shortcut pathname
224 return E_FAIL;
226 PathAddExtensionW(szPath, L".lnk");
227
228 return SHDOCVW_CreateShortcut(szPath, pidl, NULL);
229}
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
#define EXTERN_C
Definition: basetyps.h:12
LPARAM lParam
Definition: combotst.c:139
#define E_FAIL
Definition: ddrawi.h:102
ush Pos
Definition: deflate.h:92
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define SHCIDS_CANONICALONLY
Definition: shobjidl.idl:226
#define MAX_PATH
Definition: compat.h:34
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4262
int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4224
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
#define PATH_VALID_ELEMENT
EXTERN_C BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: utility.cpp:123
static INT_PTR GetMenuItemIdByPos(HMENU hMenu, UINT Pos)
Definition: utility.cpp:16
static BOOL IsMenuSeparator(HMENU hMenu, UINT Pos)
Definition: utility.cpp:26
static HRESULT SHELL_CompareAbsoluteIDs(LPARAM lParam, PCIDLIST_ABSOLUTE a, PCIDLIST_ABSOLUTE b)
Definition: utility.cpp:58
EXTERN_C BOOL WINAPI IEILIsEqual(_In_ LPCITEMIDLIST pidl1, _In_ LPCITEMIDLIST pidl2, _In_ BOOL bUnknown)
Definition: utility.cpp:132
static HRESULT SHDOCVW_CreateShortcut(_In_ LPCWSTR pszLnkFileName, _In_ PCIDLIST_ABSOLUTE pidlTarget, _In_opt_ LPCWSTR pszDescription)
Definition: utility.cpp:162
static VOID SHDOCVW_PathDeleteInvalidChars(LPWSTR pszDisplayName)
Definition: utility.cpp:146
EXTERN_C VOID SHELL_RemoveVerb(IContextMenu *pcm, UINT idCmdFirst, HMENU hMenu, LPCWSTR Verb)
Definition: utility.cpp:105
EXTERN_C BOOL SHELL_IsVerb(IContextMenu *pcm, UINT_PTR idCmd, LPCWSTR Verb)
Definition: utility.cpp:76
EXTERN_C BOOL SHELL_IsEqualAbsoluteID(PCIDLIST_ABSOLUTE a, PCIDLIST_ABSOLUTE b)
Definition: utility.cpp:70
static int SHELL_FindVerbPos(IContextMenu *pcm, UINT idCmdFirst, HMENU hMenu, LPCWSTR Verb)
Definition: utility.cpp:93
EXTERN_C HRESULT SHELL_GetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl)
Definition: utility.cpp:36
EXTERN_C HRESULT WINAPI AddUrlToFavorites(_In_ HWND hwnd, _In_ LPCWSTR pszUrlW, _In_opt_ LPCWSTR pszTitleW, _In_ BOOL fDisplayUI)
Definition: utility.cpp:192
BOOL WINAPI SHGetSpecialFolderPathW(HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:3243
BOOL WINAPI PathIsValidCharW(WCHAR c, DWORD class)
Definition: path.c:4409
INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen)
Definition: string.c:2797
BOOL WINAPI PathIsURLW(LPCWSTR lpstrPath)
Definition: url.c:2432
unsigned int BOOL
Definition: ntddk_ex.h:94
const GLubyte * c
Definition: glext.h:8905
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
HRESULT GetCommandString([in] UINT_PTR idCmd, [in] UINT uType, [out] UINT *pwReserved, [out, size_is(cchMax)] LPSTR pszName, [in] UINT cchMax)
HRESULT GetCurFolder([out] PIDLIST_ABSOLUTE *ppidl)
HRESULT GetIDList([out] PIDLIST_ABSOLUTE *ppidl)
HRESULT CompareIDs([in] LPARAM lParam, [in] PCUIDLIST_RELATIVE pidl1, [in] PCUIDLIST_RELATIVE pidl2)
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
ULONG Release()
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define c
Definition: ke_i.h:80
#define wine_dbgstr_w
Definition: kernel32.h:34
TCHAR szTitle[MAX_LOADSTRING]
Definition: magnifier.c:35
#define pch(ap)
Definition: match.c:418
LPCWSTR szPath
Definition: env.c:37
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
unsigned int UINT
Definition: ndis.h:50
#define _In_
Definition: no_sal2.h:158
#define _In_opt_
Definition: no_sal2.h:212
#define UNICODE_NULL
#define L(x)
Definition: ntvdm.h:50
#define PathAddExtensionW
Definition: pathcch.h:305
#define PathAppendW
Definition: pathcch.h:309
HRESULT WINAPI SHGetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl)
Definition: pidl.c:1638
HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc, LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut)
Definition: pidl.c:1506
BOOL WINAPI ILGetDisplayNameEx(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPVOID path, DWORD type)
Definition: pidl.c:171
#define ILGetSize
Definition: shellclasses.h:638
HRESULT hr
Definition: shlfolder.c:183
#define CSIDL_FAVORITES
Definition: shlobj.h:2187
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define _countof(array)
Definition: sndvol32.h:70
#define TRACE(s)
Definition: solgame.cpp:4
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
int32_t INT_PTR
Definition: typedefs.h:64
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
uint16_t * PWCHAR
Definition: typedefs.h:56
#define ILGDN_NORMAL
Definition: undocshell.h:81
static UINT WPARAM LPARAM BOOL ansi
Definition: misc.c:135
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
LONG_PTR LPARAM
Definition: windef.h:208
#define WINAPI
Definition: msvc.h:6
#define MIIM_ID
Definition: winuser.h:733
int WINAPI GetMenuItemCount(_In_opt_ HMENU)
#define MIIM_FTYPE
Definition: winuser.h:740
BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
#define MFT_SEPARATOR
Definition: winuser.h:755
#define MF_BYPOSITION
Definition: winuser.h:203
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)
#define IID_PPV_ARG(Itype, ppType)
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
char CHAR
Definition: xmlstorage.h:175