ReactOS 0.4.16-dev-1049-g378a335
utility.cpp File Reference
#include "objects.h"
#include <strsafe.h>
#include <wine/debug.h>
Include dependency graph for utility.cpp:

Go to the source code of this file.

Macros

#define PATH_VALID_ELEMENT
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (shdocvw)
 
static INT_PTR GetMenuItemIdByPos (HMENU hMenu, UINT Pos)
 
static BOOL IsMenuSeparator (HMENU hMenu, UINT Pos)
 
EXTERN_C HRESULT SHELL_GetIDListFromObject (IUnknown *punk, PIDLIST_ABSOLUTE *ppidl)
 
static HRESULT SHELL_CompareAbsoluteIDs (LPARAM lParam, PCIDLIST_ABSOLUTE a, PCIDLIST_ABSOLUTE b)
 
EXTERN_C BOOL SHELL_IsEqualAbsoluteID (PCIDLIST_ABSOLUTE a, PCIDLIST_ABSOLUTE b)
 
EXTERN_C BOOL SHELL_IsVerb (IContextMenu *pcm, UINT_PTR idCmd, LPCWSTR Verb)
 
static int SHELL_FindVerbPos (IContextMenu *pcm, UINT idCmdFirst, HMENU hMenu, LPCWSTR Verb)
 
EXTERN_C VOID SHELL_RemoveVerb (IContextMenu *pcm, UINT idCmdFirst, HMENU hMenu, LPCWSTR Verb)
 
EXTERN_C BOOL _ILIsDesktop (LPCITEMIDLIST pidl)
 
EXTERN_C BOOL WINAPI IEILIsEqual (_In_ LPCITEMIDLIST pidl1, _In_ LPCITEMIDLIST pidl2, _In_ BOOL bUnknown)
 
static VOID SHDOCVW_PathDeleteInvalidChars (LPWSTR pszDisplayName)
 
static HRESULT SHDOCVW_CreateShortcut (_In_ LPCWSTR pszLnkFileName, _In_ PCIDLIST_ABSOLUTE pidlTarget, _In_opt_ LPCWSTR pszDescription)
 
EXTERN_C HRESULT WINAPI AddUrlToFavorites (_In_ HWND hwnd, _In_ LPCWSTR pszUrlW, _In_opt_ LPCWSTR pszTitleW, _In_ BOOL fDisplayUI)
 

Macro Definition Documentation

◆ PATH_VALID_ELEMENT

#define PATH_VALID_ELEMENT
Value:
( \
)
#define PATH_CHAR_CLASS_OTHER_VALID
Definition: path.c:4316
#define PATH_CHAR_CLASS_SPACE
Definition: path.c:4315
#define PATH_CHAR_CLASS_SEMICOLON
Definition: path.c:4313
#define PATH_CHAR_CLASS_COMMA
Definition: path.c:4314
#define PATH_CHAR_CLASS_DOT
Definition: path.c:4310

Function Documentation

◆ _ILIsDesktop()

EXTERN_C BOOL _ILIsDesktop ( LPCITEMIDLIST  pidl)
inline

Definition at line 123 of file utility.cpp.

124{
125 return (pidl == NULL || pidl->mkid.cb == 0);
126}
#define NULL
Definition: types.h:112

◆ AddUrlToFavorites()

EXTERN_C HRESULT WINAPI AddUrlToFavorites ( _In_ HWND  hwnd,
_In_ LPCWSTR  pszUrlW,
_In_opt_ LPCWSTR  pszTitleW,
_In_ BOOL  fDisplayUI 
)

Definition at line 192 of file utility.cpp.

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}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_FAIL
Definition: ddrawi.h:102
#define TRUE
Definition: types.h:120
#define MAX_PATH
Definition: compat.h:34
#define FAILED_UNEXPECTEDLY(hr)
Definition: debug.h:83
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
BOOL WINAPI SHGetSpecialFolderPathW(HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:3219
BOOL WINAPI PathIsURLW(LPCWSTR lpstrPath)
Definition: url.c:2432
#define wine_dbgstr_w
Definition: kernel32.h:34
TCHAR szTitle[MAX_LOADSTRING]
Definition: magnifier.c:35
LPCWSTR szPath
Definition: env.c:37
#define L(x)
Definition: ntvdm.h:50
#define PathAddExtensionW
Definition: pathcch.h:305
#define PathAppendW
Definition: pathcch.h:309
HRESULT WINAPI SHParseDisplayName(LPCWSTR pszName, IBindCtx *pbc, LPITEMIDLIST *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut)
Definition: pidl.c:1541
BOOL WINAPI ILGetDisplayNameEx(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPVOID path, DWORD type)
Definition: pidl.c:171
HRESULT hr
Definition: shlfolder.c:183
#define CSIDL_FAVORITES
Definition: shlobj.h:2187
#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
#define ILGDN_NORMAL
Definition: undocshell.h:81
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by CShellBrowser::OnAddToFavorites().

◆ GetMenuItemIdByPos()

static INT_PTR GetMenuItemIdByPos ( HMENU  hMenu,
UINT  Pos 
)
inlinestatic

Definition at line 16 of file utility.cpp.

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}
ush Pos
Definition: deflate.h:92
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
#define MIIM_ID
Definition: winuser.h:733
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)

Referenced by SHELL_FindVerbPos().

◆ IEILIsEqual()

EXTERN_C BOOL WINAPI IEILIsEqual ( _In_ LPCITEMIDLIST  pidl1,
_In_ LPCITEMIDLIST  pidl2,
_In_ BOOL  bUnknown 
)

Definition at line 132 of file utility.cpp.

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}
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define FALSE
Definition: types.h:117
unsigned int UINT
Definition: ndis.h:50
#define ILGetSize
Definition: shellclasses.h:638

Referenced by CMruBase::_IsEqual().

◆ IsMenuSeparator()

static BOOL IsMenuSeparator ( HMENU  hMenu,
UINT  Pos 
)
inlinestatic

Definition at line 26 of file utility.cpp.

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}
#define MIIM_FTYPE
Definition: winuser.h:740
#define MFT_SEPARATOR
Definition: winuser.h:755

Referenced by SHELL_RemoveVerb().

◆ SHDOCVW_CreateShortcut()

static HRESULT SHDOCVW_CreateShortcut ( _In_ LPCWSTR  pszLnkFileName,
_In_ PCIDLIST_ABSOLUTE  pidlTarget,
_In_opt_ LPCWSTR  pszDescription 
)
static

Definition at line 162 of file utility.cpp.

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}
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define IID_PPV_ARG(Itype, ppType)

Referenced by AddUrlToFavorites().

◆ SHDOCVW_PathDeleteInvalidChars()

static VOID SHDOCVW_PathDeleteInvalidChars ( LPWSTR  pszDisplayName)
static

Definition at line 146 of file utility.cpp.

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}
#define PATH_VALID_ELEMENT
BOOL WINAPI PathIsValidCharW(WCHAR c, DWORD class)
Definition: path.c:4409
#define pch(ap)
Definition: match.c:418
#define UNICODE_NULL
uint16_t * PWCHAR
Definition: typedefs.h:56

Referenced by AddUrlToFavorites().

◆ SHELL_CompareAbsoluteIDs()

static HRESULT SHELL_CompareAbsoluteIDs ( LPARAM  lParam,
PCIDLIST_ABSOLUTE  a,
PCIDLIST_ABSOLUTE  b 
)
static

Definition at line 58 of file utility.cpp.

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}
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
LPARAM lParam
Definition: combotst.c:139
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6204
HRESULT CompareIDs([in] LPARAM lParam, [in] PCUIDLIST_RELATIVE pidl1, [in] PCUIDLIST_RELATIVE pidl2)
ULONG Release()
#define FAILED(hr)
Definition: intsafe.h:51

Referenced by SHELL_IsEqualAbsoluteID().

◆ SHELL_FindVerbPos()

static int SHELL_FindVerbPos ( IContextMenu pcm,
UINT  idCmdFirst,
HMENU  hMenu,
LPCWSTR  Verb 
)
static

Definition at line 93 of file utility.cpp.

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}
static INT_PTR GetMenuItemIdByPos(HMENU hMenu, UINT Pos)
Definition: utility.cpp:16
EXTERN_C BOOL SHELL_IsVerb(IContextMenu *pcm, UINT_PTR idCmd, LPCWSTR Verb)
Definition: utility.cpp:76
const GLubyte * c
Definition: glext.h:8905
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
#define c
Definition: ke_i.h:80
int32_t INT_PTR
Definition: typedefs.h:64
int WINAPI GetMenuItemCount(_In_opt_ HMENU)

Referenced by SHELL_RemoveVerb().

◆ SHELL_GetIDListFromObject()

EXTERN_C HRESULT SHELL_GetIDListFromObject ( IUnknown punk,
PIDLIST_ABSOLUTE ppidl 
)

Definition at line 36 of file utility.cpp.

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}
HRESULT GetCurFolder([out] PIDLIST_ABSOLUTE *ppidl)
HRESULT GetIDList([out] PIDLIST_ABSOLUTE *ppidl)
#define SUCCEEDED(hr)
Definition: intsafe.h:50
HRESULT WINAPI SHGetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl)
Definition: pidl.c:1673

Referenced by SHDOCVW_GetCurrentLocationFromView().

◆ SHELL_IsEqualAbsoluteID()

EXTERN_C BOOL SHELL_IsEqualAbsoluteID ( PCIDLIST_ABSOLUTE  a,
PCIDLIST_ABSOLUTE  b 
)

Definition at line 70 of file utility.cpp.

71{
73}
#define SHCIDS_CANONICALONLY
Definition: shobjidl.idl:226
static HRESULT SHELL_CompareAbsoluteIDs(LPARAM lParam, PCIDLIST_ABSOLUTE a, PCIDLIST_ABSOLUTE b)
Definition: utility.cpp:58

◆ SHELL_IsVerb()

EXTERN_C BOOL SHELL_IsVerb ( IContextMenu pcm,
UINT_PTR  idCmd,
LPCWSTR  Verb 
)

Definition at line 76 of file utility.cpp.

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}
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4262
int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4224
INT WINAPI SHUnicodeToAnsi(LPCWSTR lpSrcStr, LPSTR lpDstStr, INT iLen)
Definition: string.c:2797
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
HRESULT GetCommandString([in] UINT_PTR idCmd, [in] UINT uType, [out] UINT *pwReserved, [out, size_is(cchMax)] LPSTR pszName, [in] UINT cchMax)
static UINT WPARAM LPARAM BOOL ansi
Definition: misc.c:135
char * LPSTR
Definition: xmlstorage.h:182
char CHAR
Definition: xmlstorage.h:175

Referenced by SHELL_FindVerbPos().

◆ SHELL_RemoveVerb()

EXTERN_C VOID SHELL_RemoveVerb ( IContextMenu pcm,
UINT  idCmdFirst,
HMENU  hMenu,
LPCWSTR  Verb 
)

Definition at line 105 of file utility.cpp.

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}
static BOOL IsMenuSeparator(HMENU hMenu, UINT Pos)
Definition: utility.cpp:26
static int SHELL_FindVerbPos(IContextMenu *pcm, UINT idCmdFirst, HMENU hMenu, LPCWSTR Verb)
Definition: utility.cpp:93
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
#define MF_BYPOSITION
Definition: winuser.h:203

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( shdocvw  )