From: Alex Henrie alexhenrie24@gmail.com
--- dlls/shell32/brsfolder.c | 2 +- dlls/shell32/pidl.c | 10 +---- dlls/shell32/shell32_main.c | 2 +- dlls/shell32/shell32_main.h | 4 +- dlls/shell32/shellstring.c | 88 +++---------------------------------- dlls/shell32/shlexec.c | 2 +- dlls/shell32/shlfolder.c | 6 +-- dlls/shell32/shlview.c | 6 +-- dlls/shell32/tests/string.c | 2 - 9 files changed, 17 insertions(+), 105 deletions(-)
diff --git a/dlls/shell32/brsfolder.c b/dlls/shell32/brsfolder.c index 63f0a3420dd..ebaf01e7989 100644 --- a/dlls/shell32/brsfolder.c +++ b/dlls/shell32/brsfolder.c @@ -327,7 +327,7 @@ static BOOL GetName(LPSHELLFOLDER lpsf, LPCITEMIDLIST lpi, DWORD dwFlags, LPWSTR
TRACE("%p %p %lx %p\n", lpsf, lpi, dwFlags, lpFriendlyName); if (SUCCEEDED(IShellFolder_GetDisplayNameOf(lpsf, lpi, dwFlags, &str))) - bSuccess = StrRetToStrNW(lpFriendlyName, MAX_PATH, &str, lpi); + bSuccess = SUCCEEDED(StrRetToBufW(&str, lpi, lpFriendlyName, MAX_PATH)); else bSuccess = FALSE;
diff --git a/dlls/shell32/pidl.c b/dlls/shell32/pidl.c index 668a5bc583a..4cf052e3bda 100644 --- a/dlls/shell32/pidl.c +++ b/dlls/shell32/pidl.c @@ -126,10 +126,7 @@ BOOL ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWO { ret = IShellFolder_GetDisplayNameOf(lsf, pidl, flag, &strret); if (SUCCEEDED(ret)) - { - if(!StrRetToStrNW(path, MAX_PATH, &strret, pidl)) - ret = E_FAIL; - } + ret = StrRetToBufW(&strret, pidl, path, MAX_PATH); } else { @@ -138,10 +135,7 @@ BOOL ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWO { ret = IShellFolder_GetDisplayNameOf(psfParent, pidllast, flag, &strret); if (SUCCEEDED(ret)) - { - if(!StrRetToStrNW(path, MAX_PATH, &strret, pidllast)) - ret = E_FAIL; - } + ret = StrRetToBufW(&strret, pidllast, path, MAX_PATH); IShellFolder_Release(psfParent); } } diff --git a/dlls/shell32/shell32_main.c b/dlls/shell32/shell32_main.c index c739e1723f7..7ff64e4df46 100644 --- a/dlls/shell32/shell32_main.c +++ b/dlls/shell32/shell32_main.c @@ -265,7 +265,7 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes, STRRET str; hr = IShellFolder_GetDisplayNameOf( psfParent, pidlLast, SHGDN_INFOLDER, &str); - StrRetToStrNW (psfi->szDisplayName, MAX_PATH, &str, pidlLast); + StrRetToBufW(&str, pidlLast, psfi->szDisplayName, MAX_PATH); } }
diff --git a/dlls/shell32/shell32_main.h b/dlls/shell32/shell32_main.h index 6b5575c6879..766c7c23adc 100644 --- a/dlls/shell32/shell32_main.h +++ b/dlls/shell32/shell32_main.h @@ -34,6 +34,7 @@ #include "docobj.h" #include "shlobj.h" #include "shellapi.h" +#include "shlwapi.h" #include "wine/heap.h" #include "wine/list.h"
@@ -270,9 +271,6 @@ typedef struct ITEMIDLIST idl; } CWTESTPATHSTRUCT;
-BOOL WINAPI StrRetToStrNA(char *, DWORD, STRRET *, const ITEMIDLIST *); -BOOL WINAPI StrRetToStrNW(WCHAR *, DWORD, STRRET *, const ITEMIDLIST *); - WCHAR *shell_get_resource_string(UINT id);
#endif diff --git a/dlls/shell32/shellstring.c b/dlls/shell32/shellstring.c index 13108dbc8b7..53840589362 100644 --- a/dlls/shell32/shellstring.c +++ b/dlls/shell32/shellstring.c @@ -38,86 +38,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell);
DWORD WINAPI CheckEscapesW(WCHAR *string, DWORD len);
-/************************* STRRET functions ****************************/ - -static const char *debugstr_strret(STRRET *s) -{ - switch (s->uType) - { - case STRRET_WSTR: - return "STRRET_WSTR"; - case STRRET_CSTR: - return "STRRET_CSTR"; - case STRRET_OFFSET: - return "STRRET_OFFSET"; - default: - return "STRRET_???"; - } -} - -BOOL WINAPI StrRetToStrNA(LPSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) -{ - TRACE("dest=%p len=0x%lx strret=%p(%s) pidl=%p\n", dest, len, src, debugstr_strret(src), pidl); - - if (!dest) - return FALSE; - - switch (src->uType) - { - case STRRET_WSTR: - WideCharToMultiByte(CP_ACP, 0, src->pOleStr, -1, dest, len, NULL, NULL); - CoTaskMemFree(src->pOleStr); - break; - case STRRET_CSTR: - lstrcpynA(dest, src->cStr, len); - break; - case STRRET_OFFSET: - lstrcpynA(dest, ((LPCSTR)&pidl->mkid)+src->uOffset, len); - break; - default: - FIXME("unknown type %u!\n", src->uType); - if (len) - *dest = '\0'; - return FALSE; - } - TRACE("-- %s\n", debugstr_a(dest) ); - return TRUE; -} - -/************************************************************************/ - -BOOL WINAPI StrRetToStrNW(LPWSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) -{ - TRACE("dest=%p len=0x%lx strret=%p(%s) pidl=%p\n", dest, len, src, debugstr_strret(src), pidl); - - if (!dest) - return FALSE; - - switch (src->uType) - { - case STRRET_WSTR: - lstrcpynW(dest, src->pOleStr, len); - CoTaskMemFree(src->pOleStr); - break; - case STRRET_CSTR: - if (!MultiByteToWideChar(CP_ACP, 0, src->cStr, -1, dest, len) && len) - dest[len-1] = 0; - break; - case STRRET_OFFSET: - if (!MultiByteToWideChar(CP_ACP, 0, ((LPCSTR)&pidl->mkid)+src->uOffset, -1, dest, len) - && len) - dest[len-1] = 0; - break; - default: - FIXME("unknown type %u!\n", src->uType); - if (len) - *dest = '\0'; - return FALSE; - } - return TRUE; -} - - /************************************************************************* * StrRetToStrN [SHELL32.96] * @@ -128,10 +48,14 @@ BOOL WINAPI StrRetToStrNW(LPWSTR dest, DWORD len, LPSTRRET src, const ITEMIDLIST */ BOOL WINAPI StrRetToStrNAW(LPVOID dest, DWORD len, LPSTRRET src, const ITEMIDLIST *pidl) { + HRESULT res; + if(SHELL_OsIsUnicode()) - return StrRetToStrNW(dest, len, src, pidl); + res = StrRetToBufW(src, pidl, dest, len); else - return StrRetToStrNA(dest, len, src, pidl); + res = StrRetToBufA(src, pidl, dest, len); + + return res == S_OK || res == E_NOT_SUFFICIENT_BUFFER || src->uType > STRRET_CSTR; }
/************************* OLESTR functions ****************************/ diff --git a/dlls/shell32/shlexec.c b/dlls/shell32/shlexec.c index 631601ad21a..e685ea78af5 100644 --- a/dlls/shell32/shlexec.c +++ b/dlls/shell32/shlexec.c @@ -287,7 +287,7 @@ static HRESULT SHELL_GetPathFromIDListForExecuteW(LPCITEMIDLIST pidl, LPWSTR psz hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &strret);
if (SUCCEEDED(hr)) - StrRetToStrNW(pszPath, uOutSize, &strret, pidl); + StrRetToBufW(&strret, pidl, pszPath, uOutSize);
IShellFolder_Release(desktop); } diff --git a/dlls/shell32/shlfolder.c b/dlls/shell32/shlfolder.c index 1ff45e7139c..31016a3dbe6 100644 --- a/dlls/shell32/shlfolder.c +++ b/dlls/shell32/shlfolder.c @@ -344,10 +344,8 @@ HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf, LPITEMIDLIST pidlNext = ILGetNext (pidl);
hr = IShellFolder2_GetDisplayNameOf (psfChild, pidlNext, dwFlags, &strTemp); - if (SUCCEEDED (hr)) { - if(!StrRetToStrNW (szOut, dwOutLen, &strTemp, pidlNext)) - hr = E_FAIL; - } + if (SUCCEEDED (hr)) + hr = StrRetToBufW (&strTemp, pidlNext, szOut, dwOutLen); IShellFolder2_Release (psfChild); } ILFree (pidlFirst); diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c index 9c699ecda08..a39d51dae2a 100644 --- a/dlls/shell32/shlview.c +++ b/dlls/shell32/shlview.c @@ -458,7 +458,7 @@ static void ShellView_InitList(IShellViewImpl *This)
lvColumn.fmt = sd.fmt; lvColumn.cx = MulDiv(sd.cxChar, tm.tmAveCharWidth * 3, 2); /* chars->pixel */ - StrRetToStrNW(nameW, ARRAY_SIZE(nameW), &sd.str, NULL); + StrRetToBufW(&sd.str, NULL, nameW, ARRAY_SIZE(nameW)); SendMessageW(This->hWndList, LVM_INSERTCOLUMNW, This->columns, (LPARAM)&lvColumn); }
@@ -1424,14 +1424,14 @@ static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpn
if (lpnmh->code == LVN_GETDISPINFOW) { - StrRetToStrNW( lpdi->item.pszText, lpdi->item.cchTextMax, &sd.str, NULL); + StrRetToBufW(&sd.str, NULL, lpdi->item.pszText, lpdi->item.cchTextMax); TRACE("-- text=%s\n", debugstr_w(lpdi->item.pszText)); } else { /* LVN_GETDISPINFOA - shouldn't happen */ NMLVDISPINFOA *lpdiA = (NMLVDISPINFOA *)lpnmh; - StrRetToStrNA( lpdiA->item.pszText, lpdiA->item.cchTextMax, &sd.str, NULL); + StrRetToBufA(&sd.str, NULL, lpdiA->item.pszText, lpdiA->item.cchTextMax); TRACE("-- text=%s\n", lpdiA->item.pszText); } } diff --git a/dlls/shell32/tests/string.c b/dlls/shell32/tests/string.c index a1202ead945..f06df25e384 100644 --- a/dlls/shell32/tests/string.c +++ b/dlls/shell32/tests/string.c @@ -82,14 +82,12 @@ static void test_StrRetToStringNW(void) strret.uType = 3; memset(buff, 0xff, sizeof(buff)); ret = pStrRetToStrNAW(buff, 0, &strret, NULL); - todo_wine ok(ret == TRUE && buff[0] == 0xffff, "Invalid STRRET type: dup failed, ret=%d\n", ret);
strret.uType = 3; memset(buff, 0xff, sizeof(buff)); ret = pStrRetToStrNAW(buff, ARRAY_SIZE(buff), &strret, NULL); - todo_wine ok(ret == TRUE && buff[0] == 0, "Invalid STRRET type: dup failed, ret=%d\n", ret);