FW: shell32: ILGetDisplayName corrections

Rolf Kalbermatter rolf.kalbermatter at citeng.com
Tue Apr 15 14:18:32 CDT 2003


Resending the patch with minor modifications. If there is still any
problems with it I would appreciate a short message.

Changelog
  * dlls/shell32/shell32.spec
    Change some signatures to match the function prototype and fix
    ILGetDisplayName to link to ANSI/Unicode implementation. Add
    ILGetDisplayNameEx entry.
  * dlls/shell32/undocshell.h
    Fix prototype for ILGetDisplayNameAW and add ILGetDisplayNameExAW entry.
  * dlls/shell32/pidl.h
    Add prototypes for internal fucntions ILGetDisplayNameExA and ILGetDisplayNameExW
  * dlls/shell32/pidl.c
    Implement ILGetDisplayNameExA and ILGetDisplayNameExW and call them from
    ILGetDisplayNameAW and ILGetDisplayNameExAW
  * dlls/shell32/shlmenu.c
    Call the new ANSI specific function

License: X11/LGPL

Rolf Kalbermatter

Index: dlls/shell32/shell32.spec
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shell32.spec,v
retrieving revision 1.67
diff -u -r1.67 shell32.spec
--- dlls/shell32/shell32.spec	26 Mar 2003 23:59:51 -0000	1.67
+++ dlls/shell32/shell32.spec	15 Apr 2003 19:08:33 -0000
@@ -3,7 +3,7 @@
 #  win95 and winNT dlls import shell32.dll by ordinal)
 # This list was updated to dll version 4.72
 
-   2 stdcall SHChangeNotifyRegister(long long long long long long)
+   2 stdcall SHChangeNotifyRegister(long long long long long ptr)
    4 stdcall SHChangeNotifyDeregister (long)
    5 stdcall SHChangeNotifyUpdateEntryList (long long long long)
    9 stub PifMgr_OpenProperties at 16
@@ -173,6 +173,7 @@
  183 varargs ShellMessageBoxA(long long long str long)
  184 stdcall ArrangeWindows(long long long long long)
  185 stub SHHandleDiskFull
+ 186 stdcall ILGetDisplayNameEx(ptr ptr ptr long)
  195 stdcall SHFree(ptr)
  196 stdcall SHAlloc(long)
  197 stub SHGlobalDefect

Index: dlls/shell32/undocshell.h
===================================================================
RCS file: /home/wine/wine/dlls/shell32/undocshell.h,v
retrieving revision 1.10
diff -u -r1.10 undocshell.h
--- dlls/shell32/undocshell.h	1 Apr 2003 04:35:54 -0000	1.10
+++ dlls/shell32/undocshell.h	15 Apr 2003 19:11:53 -0000
@@ -63,7 +63,18 @@
 
 BOOL WINAPI ILGetDisplayName(
 	LPCITEMIDLIST pidl,
-	LPSTR path);
+	LPVOID path);
+
+/* type parameter for ILGetDisplayNameEx() */
+#define ILGDN_FORPARSING  0
+#define ILGDN_NORMAL      1
+#define ILGDN_INFOLDER    2
+
+BOOL WINAPI ILGetDisplayNameEx(
+	LPSHELLFOLDER psf,
+	LPCITEMIDLIST pidl,
+	LPVOID path,
+	DWORD type);
 
 DWORD WINAPI ILFree(LPITEMIDLIST pidl);
   
Index: dlls/shell32/pidl.h
===================================================================
RCS file: /home/wine/wine/dlls/shell32/pidl.h,v
retrieving revision 1.26
diff -u -r1.26 pidl.h
--- dlls/shell32/pidl.h	26 Mar 2003 23:35:23 -0000	1.26
+++ dlls/shell32/pidl.h	15 Apr 2003 19:12:44 -0000
@@ -197,5 +197,8 @@
 void _ILFreeaPidl(LPITEMIDLIST * apidl, UINT cidl);
 LPITEMIDLIST * _ILCopyaPidl(LPITEMIDLIST * apidlsrc, UINT cidl);
 LPITEMIDLIST * _ILCopyCidaToaPidl(LPITEMIDLIST* pidl, LPIDA cida);
+
+BOOL WINAPI ILGetDisplayNameExA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPSTR path, DWORD type);
+BOOL WINAPI ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWORD type);
 
 #endif
 
Index: dlls/shell32/pidl.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/pidl.c,v
retrieving revision 1.82
diff -u -r1.82 pidl.c
--- dlls/shell32/pidl.c	26 Mar 2003 23:35:23 -0000	1.82
+++ dlls/shell32/pidl.c	15 Apr 2003 19:13:46 -0000
@@ -50,13 +50,122 @@
 extern BOOL WINAPI Free(LPVOID);
 
 /*************************************************************************
+ * ILGetDisplayNameEx		[SHELL32.186]
+ * 
+ * Retrieves the display name of an ItemIDList
+ *
+ * PARAMS
+ *  psf        [I]   Shell Folder to start with, if NULL the desktop is used
+ *  pidl       [I]   ItemIDList relativ to the psf to get the display name for
+ *  path       [O]   Filled in with the display name, assumed to be at least MAX_PATH long
+ *  type       [I]   Type of display name to retrieve
+ *                    0 = SHGDN_FORPARSING | SHGDN_FORADDRESSBAR uses always the desktop as root
+ *                    1 = SHGDN_NORMAL relative to the root folder
+ *                    2 = SHGDN_INFOLDER relative to the root folder, only the last name
+ *
+ * RETURNS
+ *  True if the display name could be retrieved successfully, False otherwise
+ */
+BOOL WINAPI ILGetDisplayNameExA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPSTR path, DWORD type)
+{
+	BOOL ret = FALSE;
+	WCHAR wPath[MAX_PATH];
+
+	TRACE("%p %p %p %p\n", psf, pidl, path, type);
+
+	if (!pidl || !path)
+	  return FALSE;
+
+	ret = ILGetDisplayNameExW(psf, pidl, wPath, type);
+	WideCharToMultiByte(CP_ACP, 0, wPath, -1, path, MAX_PATH, NULL, NULL);
+	TRACE("%p %p %s\n", psf, pidl, debugstr_a(path));
+
+	return ret;
+}
+
+BOOL WINAPI ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWORD type)
+{
+	LPSHELLFOLDER parent, lsf = psf;
+	HRESULT ret = NO_ERROR;
+	LPITEMIDLIST pidllast;
+	STRRET strret;
+	DWORD flag;
+
+	TRACE("%p %p %p %p\n", psf, pidl, path, type);
+
+	if (!pidl || !path)
+	  return FALSE;
+
+	if (!lsf)
+	{
+	  ret = SHGetDesktopFolder(&lsf);
+	  if (FAILED(ret))
+	    return FALSE;
+	}
+
+	if (type >= 0 && type <= 2)
+	{
+	  switch (type)
+	  {
+	    case ILGDN_FORPARSING:
+	      flag = SHGDN_FORPARSING | SHGDN_FORADDRESSBAR;
+	      break;
+	    case ILGDN_NORMAL:
+	      flag = SHGDN_NORMAL;
+	      break;
+	    case ILGDN_INFOLDER:
+	      flag = SHGDN_INFOLDER;
+	      break;
+	  }
+	  if (!*(LPWORD)pidl || !type)
+	  {
+	    ret = IShellFolder_GetDisplayNameOf(lsf, pidl, flag, &strret);
+	    if (SUCCEEDED(ret))
+	    {
+	      ret = StrRetToStrNW(path, MAX_PATH, &strret, pidl);
+	    }
+	  }
+	  else
+	  {
+	    ret = SHBindToParent(pidl, &IID_IShellFolder, &parent, &pidllast);
+	    if (SUCCEEDED(ret))
+	    {
+	      ret = IShellFolder_GetDisplayNameOf(parent, pidllast, flag, &strret);
+	      if (SUCCEEDED(ret))
+	      {
+	        ret = StrRetToStrNW(path, MAX_PATH, &strret, pidllast);
+	      }
+	      IShellFolder_Release(parent);
+	    }
+	  }
+	}
+
+	TRACE("%p %p %s\n", psf, pidl, debugstr_w(path));
+
+	if (!psf)
+	  IShellFolder_Release(lsf);
+	return SUCCEEDED(ret);
+}
+
+BOOL WINAPI ILGetDisplayNameEx(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPVOID path, DWORD type)
+{
+	TRACE_(shell)("%p %p %p %d\n", psf, pidl, path, type);
+	if (SHELL_OsIsUnicode())
+	  return ILGetDisplayNameExW(psf, pidl, path, type);
+	return ILGetDisplayNameExA(psf, pidl, path, type);
+}
+
+/*************************************************************************
  * ILGetDisplayName			[SHELL32.15]
  */
-BOOL WINAPI ILGetDisplayName(LPCITEMIDLIST pidl,LPSTR path)
+BOOL WINAPI ILGetDisplayName(LPCITEMIDLIST pidl, LPVOID path)
 {
-	TRACE_(shell)("pidl=%p %p semi-stub\n",pidl,path);
-	return SHGetPathFromIDListA(pidl, path);
+	TRACE_(shell)("%p %p\n", pidl, path);
+	if (SHELL_OsIsUnicode())
+	  return ILGetDisplayNameExW(NULL, pidl, path, ILGDN_FORPARSING);
+	return ILGetDisplayNameExA(NULL, pidl, path, ILGDN_FORPARSING);
 }
+
 /*************************************************************************
  * ILFindLastID [SHELL32.16]
  *
@@ -217,8 +326,6 @@
 	  { ret = S_OK;
 	  }
 	}
-
-
 	IStream_Release (pStream);
 
 	return ret;

Index: dlls/shell32/shlmenu.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shlmenu.c,v
retrieving revision 1.31
diff -u -r1.31 shlmenu.c
--- dlls/shell32/shlmenu.c	8 Jan 2003 21:09:27 -0000	1.31
+++ dlls/shell32/shlmenu.c	15 Apr 2003 19:18:19 -0000
@@ -178,7 +178,7 @@
 	      {
 		if (SUCCEEDED (IShellFolder_GetAttributesOf(lpsf, 1, &pidlTemp, &ulItemAttr)))
 		{
-		  ILGetDisplayName( pidlTemp, sTemp);
+		  ILGetDisplayNameExA(NULL, pidlTemp, sTemp, 0);
 		  if (! (PidlToSicIndex(lpsf, pidlTemp, FALSE, 0, &iIcon)))
 		    iIcon = FM_BLANK_ICON;
 		  if ( SFGAO_FOLDER & ulItemAttr)




More information about the wine-patches mailing list