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