Aric Stewart : shell32: Update the debug functions to handle Unicode value pidl.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Apr 11 06:42:10 CDT 2007


Module: wine
Branch: master
Commit: c0db9e573eaba6a119aefe39068a1e3d988c4778
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c0db9e573eaba6a119aefe39068a1e3d988c4778

Author: Aric Stewart <aric at codeweavers.com>
Date:   Mon Apr  9 20:52:21 2007 +0900

shell32: Update the debug functions to handle Unicode value pidl.

Add _ILIsUnicode as a simple pidl test.

---

 dlls/shell32/debughlp.c |  129 +++++++++++++++++++++++++++++++++++++++++-----
 dlls/shell32/pidl.c     |   10 ++++
 dlls/shell32/pidl.h     |    1 +
 3 files changed, 126 insertions(+), 14 deletions(-)

diff --git a/dlls/shell32/debughlp.c b/dlls/shell32/debughlp.c
index 16f79f2..b1e9238 100644
--- a/dlls/shell32/debughlp.c
+++ b/dlls/shell32/debughlp.c
@@ -104,6 +104,51 @@ LPSTR _dbg_ILGetTextPointer(LPCITEMIDLIST pidl)
 }
 
 static
+LPWSTR _dbg_ILGetTextPointerW(LPCITEMIDLIST pidl)
+{
+	LPPIDLDATA pdata =_dbg_ILGetDataPointer(pidl);
+
+	if (pdata)
+	{
+	  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;
+}
+
+
+static
 LPSTR _dbg_ILGetSTextPointer(LPCITEMIDLIST pidl)
 {
 	LPPIDLDATA pdata =_dbg_ILGetDataPointer(pidl);
@@ -126,6 +171,34 @@ LPSTR _dbg_ILGetSTextPointer(LPCITEMIDLIST pidl)
 }
 
 static
+LPWSTR _dbg_ILGetSTextPointerW(LPCITEMIDLIST pidl)
+{
+	LPPIDLDATA pdata =_dbg_ILGetDataPointer(pidl);
+
+	if (pdata)
+	{
+	  switch (pdata->type)
+	  {
+	    case PT_FOLDER:
+	    case PT_VALUE:
+	    case PT_IESPECIAL1:
+	    case PT_IESPECIAL2:
+	      /*return (LPSTR)(pdata->u.file.szNames + strlen (pdata->u.file.szNames) + 1); */
+	      return NULL;
+
+	    case PT_WORKGRP:
+	      /* return (LPSTR)(pdata->u.network.szNames + strlen (pdata->u.network.szNames) + 1); */
+	      return NULL;
+
+	    case PT_VALUEW:
+	      return (LPWSTR)(pdata->u.file.szNames + lstrlenW ((LPWSTR)pdata->u.file.szNames) + 1);
+	  }
+	}
+	return NULL;
+}
+
+
+static
 IID* _dbg_ILGetGUIDPointer(LPCITEMIDLIST pidl)
 {
 	LPPIDLDATA pdata =_ILGetDataPointer(pidl);
@@ -147,6 +220,7 @@ static
 void _dbg_ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize)
 {
 	LPSTR		szSrc;
+	LPWSTR		szSrcW;
 	GUID const * 	riid;
 
 	if (!pidl) return;
@@ -164,6 +238,13 @@ void _dbg_ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize)
 	  /* filesystem */
 	  if (szOut) lstrcpynA(szOut, szSrc, uOutSize);
 	}
+	else if (( szSrcW = _dbg_ILGetTextPointerW(pidl) ))
+	{
+	  CHAR tmp[MAX_PATH];
+	  /* unicode filesystem */
+	  WideCharToMultiByte(CP_ACP,0,szSrcW, -1, tmp, MAX_PATH, NULL, NULL);
+	  if (szOut) lstrcpynA(szOut, tmp, uOutSize);
+	}
 	else if (( riid = _dbg_ILGetGUIDPointer(pidl) ))
 	{
 	  if (szOut)
@@ -194,20 +275,40 @@ void pdump (LPCITEMIDLIST pidl)
 	  {
 	    do
 	    {
-	      DWORD dwAttrib = 0;
-	      LPPIDLDATA pData   = _dbg_ILGetDataPointer(pidltemp);
-	      DWORD type = pData ? pData->type : 0;
-	      LPSTR szLongName   = _dbg_ILGetTextPointer(pidltemp);
-	      LPSTR szShortName  = _dbg_ILGetSTextPointer(pidltemp);
-	      char szName[MAX_PATH];
-
-	      _dbg_ILSimpleGetText(pidltemp, szName, MAX_PATH);
-	      if ( pData && (PT_FOLDER == type || PT_VALUE == type) )
-	        dwAttrib = pData->u.file.uFileAttribs;
-
-	      MESSAGE ("[%p] size=%04u type=%x attr=0x%08x name=%s (%s,%s)\n",
-	               pidltemp, pidltemp->mkid.cb, type, dwAttrib,
-                       debugstr_a(szName), debugstr_a(szLongName), debugstr_a(szShortName));
+          if (_ILIsUnicode(pidltemp))
+          {
+              DWORD dwAttrib = 0;
+              LPPIDLDATA pData   = _dbg_ILGetDataPointer(pidltemp);
+              DWORD type = pData ? pData->type : 0;
+              LPWSTR szLongName   = _dbg_ILGetTextPointerW(pidltemp);
+              LPWSTR szShortName  = _dbg_ILGetSTextPointerW(pidltemp);
+              char szName[MAX_PATH];
+
+              _dbg_ILSimpleGetText(pidltemp, szName, MAX_PATH);
+              if ( pData && (PT_FOLDER == type || PT_VALUE == type) )
+                dwAttrib = pData->u.file.uFileAttribs;
+
+              MESSAGE ("[%p] size=%04u type=%x attr=0x%08x name=%s (%s,%s)\n",
+                       pidltemp, pidltemp->mkid.cb, type, dwAttrib,
+                           debugstr_a(szName), debugstr_w(szLongName), debugstr_w(szShortName));
+          }
+          else
+          {
+              DWORD dwAttrib = 0;
+              LPPIDLDATA pData   = _dbg_ILGetDataPointer(pidltemp);
+              DWORD type = pData ? pData->type : 0;
+              LPSTR szLongName   = _dbg_ILGetTextPointer(pidltemp);
+              LPSTR szShortName  = _dbg_ILGetSTextPointer(pidltemp);
+              char szName[MAX_PATH];
+
+              _dbg_ILSimpleGetText(pidltemp, szName, MAX_PATH);
+              if ( pData && (PT_FOLDER == type || PT_VALUE == type) )
+                dwAttrib = pData->u.file.uFileAttribs;
+
+              MESSAGE ("[%p] size=%04u type=%x attr=0x%08x name=%s (%s,%s)\n",
+                       pidltemp, pidltemp->mkid.cb, type, dwAttrib,
+                           debugstr_a(szName), debugstr_a(szLongName), debugstr_a(szShortName));
+          }
 
 	      pidltemp = _dbg_ILGetNext(pidltemp);
 
diff --git a/dlls/shell32/pidl.c b/dlls/shell32/pidl.c
index e1d19f2..bc8fdfc 100644
--- a/dlls/shell32/pidl.c
+++ b/dlls/shell32/pidl.c
@@ -1642,6 +1642,7 @@ DWORD _ILGetDrive(LPCITEMIDLIST pidl,LPSTR pOut, UINT uSize)
  *    ### 2. section testing pidls ###
  *
  **************************************************************************
+ *  _ILIsUnicode()
  *  _ILIsDesktop()
  *  _ILIsMyComputer()
  *  _ILIsSpecialFolder()
@@ -1650,6 +1651,15 @@ DWORD _ILGetDrive(LPCITEMIDLIST pidl,LPSTR pOut, UINT uSize)
  *  _ILIsValue()
  *  _ILIsPidlSimple()
  */
+BOOL _ILIsUnicode(LPCITEMIDLIST pidl)
+{
+    LPPIDLDATA lpPData = _ILGetDataPointer(pidl);
+
+    TRACE("(%p)\n",pidl);
+
+    return (pidl && lpPData && PT_VALUEW == lpPData->type);
+}
+
 BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
 {
     TRACE("(%p)\n",pidl);
diff --git a/dlls/shell32/pidl.h b/dlls/shell32/pidl.h
index 34112fe..c2b5cd9 100644
--- a/dlls/shell32/pidl.h
+++ b/dlls/shell32/pidl.h
@@ -201,6 +201,7 @@ DWORD	_ILGetDrive		(LPCITEMIDLIST, LPSTR, UINT);
 /*
  * testing simple pidls
  */
+BOOL	_ILIsUnicode		(LPCITEMIDLIST pidl);
 BOOL	_ILIsDesktop		(LPCITEMIDLIST pidl);
 BOOL	_ILIsMyComputer		(LPCITEMIDLIST pidl);
 BOOL	_ILIsDrive		(LPCITEMIDLIST pidl);




More information about the wine-cvs mailing list