Aric Stewart : shell32: Avoid unneeded A->
W conversions in _ILSimpleGetTextW.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Apr 11 06:42:10 CDT 2007
Module: wine
Branch: master
Commit: 3533be811cc28a7bee392005f852944b50d29198
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3533be811cc28a7bee392005f852944b50d29198
Author: Aric Stewart <aric at codeweavers.com>
Date: Mon Apr 9 20:12:00 2007 +0900
shell32: Avoid unneeded A->W conversions in _ILSimpleGetTextW.
Implement _ILGetTextPointerW, though it does little now.
Handle the LPWSTR from _ILGetTextPointerW in _ILSimpleGetText and
_ILSimpleGetTextW.
---
dlls/shell32/pidl.c | 118 +++++++++++++++++++++++++++++++++++++++++++++++++-
dlls/shell32/pidl.h | 1 +
2 files changed, 116 insertions(+), 3 deletions(-)
diff --git a/dlls/shell32/pidl.c b/dlls/shell32/pidl.c
index c5a79e0..e1d19f2 100644
--- a/dlls/shell32/pidl.c
+++ b/dlls/shell32/pidl.c
@@ -1754,6 +1754,7 @@ DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize)
{
DWORD dwReturn=0;
LPSTR szSrc;
+ LPWSTR szSrcW;
GUID const * riid;
char szTemp[MAX_PATH];
@@ -1784,6 +1785,16 @@ DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize)
dwReturn = strlen(szSrc);
}
+ else if (( szSrcW = _ILGetTextPointerW(pidl) ))
+ {
+ /* unicode filesystem */
+ WideCharToMultiByte(CP_ACP,0,szSrcW, -1, szTemp, MAX_PATH, NULL, NULL);
+
+ if (szOut)
+ lstrcpynA(szOut, szTemp, uOutSize);
+
+ dwReturn = strlen (szTemp);
+ }
else if (( riid = _ILGetGUIDPointer(pidl) ))
{
/* special folder */
@@ -1814,7 +1825,6 @@ DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize)
DWORD _ILSimpleGetTextW (LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
{
DWORD dwReturn;
- char szTemp[MAX_PATH];
FileStructW *pFileStructW = _ILGetFileStructW(pidl);
TRACE("(%p %p %x)\n",pidl,szOut,uOutSize);
@@ -1823,10 +1833,62 @@ DWORD _ILSimpleGetTextW (LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
lstrcpynW(szOut, pFileStructW->wszName, uOutSize);
dwReturn = lstrlenW(pFileStructW->wszName);
} else {
- dwReturn = _ILSimpleGetText(pidl, szTemp, MAX_PATH);
+ GUID const * riid;
+ WCHAR szTemp[MAX_PATH];
+ LPSTR szSrc;
+ LPWSTR szSrcW;
+ dwReturn=0;
- if (!MultiByteToWideChar(CP_ACP, 0, szTemp, -1, szOut, uOutSize))
+ if (!pidl)
+ return 0;
+
+ if (szOut)
*szOut = 0;
+
+ if (_ILIsDesktop(pidl))
+ {
+ /* desktop */
+ if (HCR_GetClassNameW(&CLSID_ShellDesktop, szTemp, MAX_PATH))
+ {
+ if (szOut)
+ lstrcpynW(szOut, szTemp, uOutSize);
+
+ dwReturn = lstrlenW (szTemp);
+ }
+ }
+ else if (( szSrcW = _ILGetTextPointerW(pidl) ))
+ {
+ /* unicode filesystem */
+ if (szOut)
+ lstrcpynW(szOut, szSrcW, uOutSize);
+
+ dwReturn = lstrlenW(szSrcW);
+ }
+ else if (( szSrc = _ILGetTextPointer(pidl) ))
+ {
+ /* filesystem */
+ MultiByteToWideChar(CP_ACP, 0, szSrc, -1, szTemp, MAX_PATH);
+
+ if (szOut)
+ lstrcpynW(szOut, szTemp, uOutSize);
+
+ dwReturn = lstrlenW (szTemp);
+ }
+ else if (( riid = _ILGetGUIDPointer(pidl) ))
+ {
+ /* special folder */
+ if ( HCR_GetClassNameW(riid, szTemp, MAX_PATH) )
+ {
+ if (szOut)
+ lstrcpynW(szOut, szTemp, uOutSize);
+
+ dwReturn = lstrlenW (szTemp);
+ }
+ }
+ else
+ {
+ ERR("-- no text\n");
+ }
}
TRACE("-- (%p=%s 0x%08x)\n",szOut,debugstr_w(szOut),dwReturn);
@@ -1848,6 +1910,56 @@ LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl)
}
/**************************************************************************
+ * _ILGetTextPointerW()
+ * gets a pointer to the unicode long filename string stored in the pidl
+ */
+LPWSTR _ILGetTextPointerW(LPCITEMIDLIST pidl)
+{
+ /* TRACE(pidl,"(pidl%p)\n", pidl);*/
+
+ LPPIDLDATA pdata = _ILGetDataPointer(pidl);
+
+ if (!pdata)
+ return NULL;
+
+ switch (pdata->type)
+ {
+ case PT_GUID:
+ case PT_SHELLEXT:
+ case PT_YAGUID:
+ return NULL;
+
+ case PT_DRIVE:
+ case PT_DRIVE1:
+ case PT_DRIVE2:
+ case PT_DRIVE3:
+ /*return (LPSTR)&(pdata->u.drive.szDriveName);*/
+ return NULL;
+
+ case PT_FOLDER:
+ case PT_FOLDER1:
+ case PT_VALUE:
+ case PT_IESPECIAL1:
+ case PT_IESPECIAL2:
+ /*return (LPSTR)&(pdata->u.file.szNames);*/
+ return NULL;
+
+ case PT_WORKGRP:
+ case PT_COMP:
+ case PT_NETWORK:
+ case PT_NETPROVIDER:
+ case PT_SHARE:
+ /*return (LPSTR)&(pdata->u.network.szNames);*/
+ return NULL;
+
+ case PT_VALUEW:
+ return (LPWSTR)&(pdata->u.file.szNames);
+ }
+ return NULL;
+}
+
+
+/**************************************************************************
* _ILGetTextPointer()
* gets a pointer to the long filename string stored in the pidl
*/
diff --git a/dlls/shell32/pidl.h b/dlls/shell32/pidl.h
index 0bdae80..34112fe 100644
--- a/dlls/shell32/pidl.h
+++ b/dlls/shell32/pidl.h
@@ -261,6 +261,7 @@ LPITEMIDLIST _ILCreateDrive (LPCWSTR);
*/
LPPIDLDATA _ILGetDataPointer (LPCITEMIDLIST);
LPSTR _ILGetTextPointer (LPCITEMIDLIST);
+LPWSTR _ILGetTextPointerW (LPCITEMIDLIST);
LPSTR _ILGetSTextPointer (LPCITEMIDLIST);
IID *_ILGetGUIDPointer (LPCITEMIDLIST pidl);
FileStructW *_ILGetFileStructW (LPCITEMIDLIST pidl);
More information about the wine-cvs
mailing list