Module: wine Branch: master Commit: ce5fb75f7f920cabf7c3ae7efae6fe5d076848ce URL: https://source.winehq.org/git/wine.git/?a=commit;h=ce5fb75f7f920cabf7c3ae7ef...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Sun Jan 21 19:53:05 2018 +0300
shell32: Reduce code duplication in GetCommandString().
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/shell32/shlview_cmenu.c | 167 ++++++++++++++++++------------------------- 1 file changed, 68 insertions(+), 99 deletions(-)
diff --git a/dlls/shell32/shlview_cmenu.c b/dlls/shell32/shlview_cmenu.c index 5c5ba1b..3f09413 100644 --- a/dlls/shell32/shlview_cmenu.c +++ b/dlls/shell32/shlview_cmenu.c @@ -471,111 +471,80 @@ static HRESULT WINAPI ItemMenu_InvokeCommand( return S_OK; }
-static HRESULT WINAPI ItemMenu_GetCommandString( - IContextMenu3 *iface, - UINT_PTR idCommand, - UINT uFlags, - UINT* lpReserved, - LPSTR lpszName, - UINT uMaxNameLen) +static HRESULT WINAPI ItemMenu_GetCommandString(IContextMenu3 *iface, UINT_PTR cmdid, UINT flags, + UINT *reserved, LPSTR name, UINT maxlen) { - ContextMenu *This = impl_from_IContextMenu3(iface); - HRESULT hr = E_INVALIDARG; + static const WCHAR openW[] = {'o','p','e','n',0}; + static const WCHAR exploreW[] = {'e','x','p','l','o','r','e',0}; + static const WCHAR cutW[] = {'c','u','t',0}; + static const WCHAR copyW[] = {'c','o','p','y',0}; + static const WCHAR linkW[] = {'l','i','n','k',0}; + static const WCHAR deleteW[] = {'d','e','l','e','t','e',0}; + static const WCHAR propertiesW[] = {'p','r','o','p','e','r','t','i','e','s',0}; + static const WCHAR renameW[] = {'r','e','n','a','m','e',0}; + ContextMenu *This = impl_from_IContextMenu3(iface); + const WCHAR *cmdW = NULL; + HRESULT hr = S_OK;
- TRACE("(%p)->(%lx flags=%x %p name=%p len=%x)\n", This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen); + TRACE("(%p)->(%lx, %#x, %p, %p, %u)\n", This, cmdid, flags, reserved, name, maxlen);
- switch(uFlags) - { - case GCS_HELPTEXTA: - case GCS_HELPTEXTW: - hr = E_NOTIMPL; - break; + switch (flags) + { + case GCS_HELPTEXTA: + case GCS_HELPTEXTW: + hr = E_NOTIMPL; + break; + + case GCS_VERBA: + case GCS_VERBW: + switch (cmdid) + { + case FCIDM_SHVIEW_OPEN: + cmdW = openW; + break; + case FCIDM_SHVIEW_EXPLORE: + cmdW = exploreW; + break; + case FCIDM_SHVIEW_CUT: + cmdW = cutW; + break; + case FCIDM_SHVIEW_COPY: + cmdW = copyW; + break; + case FCIDM_SHVIEW_CREATELINK: + cmdW = linkW; + break; + case FCIDM_SHVIEW_DELETE: + cmdW = deleteW; + break; + case FCIDM_SHVIEW_PROPERTIES: + cmdW = propertiesW; + break; + case FCIDM_SHVIEW_RENAME: + cmdW = renameW; + break; + }
- case GCS_VERBA: - switch(idCommand) - { - case FCIDM_SHVIEW_OPEN: - strcpy(lpszName, "open"); - hr = S_OK; - break; - case FCIDM_SHVIEW_EXPLORE: - strcpy(lpszName, "explore"); - hr = S_OK; - break; - case FCIDM_SHVIEW_CUT: - strcpy(lpszName, "cut"); - hr = S_OK; - break; - case FCIDM_SHVIEW_COPY: - strcpy(lpszName, "copy"); - hr = S_OK; - break; - case FCIDM_SHVIEW_CREATELINK: - strcpy(lpszName, "link"); - hr = S_OK; - break; - case FCIDM_SHVIEW_DELETE: - strcpy(lpszName, "delete"); - hr = S_OK; - break; - case FCIDM_SHVIEW_PROPERTIES: - strcpy(lpszName, "properties"); - hr = S_OK; - break; - case FCIDM_SHVIEW_RENAME: - strcpy(lpszName, "rename"); - hr = S_OK; - break; - } - break; + if (!cmdW) + { + hr = E_INVALIDARG; + break; + }
- /* NT 4.0 with IE 3.0x or no IE will always call This with GCS_VERBW. In This - case, you need to do the lstrcpyW to the pointer passed.*/ - case GCS_VERBW: - switch(idCommand) - { - case FCIDM_SHVIEW_OPEN: - MultiByteToWideChar(CP_ACP, 0, "open", -1, (LPWSTR)lpszName, uMaxNameLen); - hr = S_OK; - break; - case FCIDM_SHVIEW_EXPLORE: - MultiByteToWideChar(CP_ACP, 0, "explore", -1, (LPWSTR)lpszName, uMaxNameLen); - hr = S_OK; - break; - case FCIDM_SHVIEW_CUT: - MultiByteToWideChar(CP_ACP, 0, "cut", -1, (LPWSTR)lpszName, uMaxNameLen); - hr = S_OK; - break; - case FCIDM_SHVIEW_COPY: - MultiByteToWideChar(CP_ACP, 0, "copy", -1, (LPWSTR)lpszName, uMaxNameLen); - hr = S_OK; - break; - case FCIDM_SHVIEW_CREATELINK: - MultiByteToWideChar(CP_ACP, 0, "link", -1, (LPWSTR)lpszName, uMaxNameLen); - hr = S_OK; - break; - case FCIDM_SHVIEW_DELETE: - MultiByteToWideChar(CP_ACP, 0, "delete", -1, (LPWSTR)lpszName, uMaxNameLen); - hr = S_OK; - break; - case FCIDM_SHVIEW_PROPERTIES: - MultiByteToWideChar(CP_ACP, 0, "properties", -1, (LPWSTR)lpszName, uMaxNameLen); - hr = S_OK; - break; - case FCIDM_SHVIEW_RENAME: - MultiByteToWideChar( CP_ACP, 0, "rename", -1, (LPWSTR)lpszName, uMaxNameLen ); - hr = S_OK; - break; - } - break; + if (flags == GCS_VERBA) + WideCharToMultiByte(CP_ACP, 0, cmdW, -1, name, maxlen, NULL, NULL); + else + lstrcpynW((WCHAR *)name, cmdW, maxlen);
- case GCS_VALIDATEA: - case GCS_VALIDATEW: - hr = S_OK; - break; - } - TRACE("-- (%p)->(name=%s)\n", This, lpszName); - return hr; + TRACE("name %s\n", flags == GCS_VERBA ? debugstr_a(name) : debugstr_w((WCHAR *)name)); + break; + + case GCS_VALIDATEA: + case GCS_VALIDATEW: + break; + } + + return hr; }
/**************************************************************************