SHELL32: handle IFileSystemBindData in ISF_Desktop_fnParseDisplayName

Mike McCormack mike at codeweavers.com
Tue Feb 22 19:26:24 CST 2005


ChangeLog:
* handle IFileSystemBindData in ISF_Desktop_fnParseDisplayName
* more unicode conversion
-------------- next part --------------
Index: dlls/shell32/enumidlist.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/enumidlist.c,v
retrieving revision 1.42
diff -u -p -r1.42 enumidlist.c
--- dlls/shell32/enumidlist.c	14 Jan 2005 16:02:20 -0000	1.42
+++ dlls/shell32/enumidlist.c	23 Feb 2005 01:22:34 -0000
@@ -25,6 +25,7 @@
 #define COBJMACROS
 
 #include "wine/debug.h"
+#include "wine/unicode.h"
 #include "windef.h"
 #include "winbase.h"
 #include "winreg.h"
@@ -103,24 +104,27 @@ BOOL AddToEnumList(
  */
 BOOL CreateFolderEnumList(
 	IEnumIDList *list,
-	LPCSTR lpszPath,
+	LPCWSTR lpszPath,
 	DWORD dwFlags)
 {
     LPITEMIDLIST pidl=NULL;
-    WIN32_FIND_DATAA stffile;
+    WIN32_FIND_DATAW stffile;
     HANDLE hFile;
-    CHAR  szPath[MAX_PATH];
+    WCHAR  szPath[MAX_PATH];
     BOOL succeeded = TRUE;
+    const static WCHAR stars[] = { '*','.','*',0 };
+    const static WCHAR dot[] = { '.',0 };
+    const static WCHAR dotdot[] = { '.','.',0 };
 
-    TRACE("(%p)->(path=%s flags=0x%08lx) \n",list,debugstr_a(lpszPath),dwFlags);
+    TRACE("(%p)->(path=%s flags=0x%08lx) \n",list,debugstr_w(lpszPath),dwFlags);
 
     if(!lpszPath || !lpszPath[0]) return FALSE;
 
-    strcpy(szPath, lpszPath);
-    PathAddBackslashA(szPath);
-    strcat(szPath,"*.*");
+    strcpyW(szPath, lpszPath);
+    PathAddBackslashW(szPath);
+    strcatW(szPath,stars);
 
-    hFile = FindFirstFileA(szPath,&stffile);
+    hFile = FindFirstFileW(szPath,&stffile);
     if ( hFile != INVALID_HANDLE_VALUE )
     {
         BOOL findFinished = FALSE;
@@ -132,21 +136,21 @@ BOOL CreateFolderEnumList(
             {
                 if ( (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
                  dwFlags & SHCONTF_FOLDERS &&
-                 strcmp (stffile.cFileName, ".") && strcmp (stffile.cFileName, ".."))
+                 strcmpW(stffile.cFileName, dot) && strcmpW(stffile.cFileName, dotdot))
                 {
-                    pidl = _ILCreateFromFindDataA(&stffile);
+                    pidl = _ILCreateFromFindDataW(&stffile);
                     succeeded = succeeded && AddToEnumList(list, pidl);
                 }
                 else if (!(stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                  && dwFlags & SHCONTF_NONFOLDERS)
                 {
-                    pidl = _ILCreateFromFindDataA(&stffile);
+                    pidl = _ILCreateFromFindDataW(&stffile);
                     succeeded = succeeded && AddToEnumList(list, pidl);
                 }
             }
             if (succeeded)
             {
-                if (!FindNextFileA(hFile, &stffile))
+                if (!FindNextFileW(hFile, &stffile))
                 {
                     if (GetLastError() == ERROR_NO_MORE_FILES)
                         findFinished = TRUE;
Index: dlls/shell32/enumidlist.h
===================================================================
RCS file: /home/wine/wine/dlls/shell32/enumidlist.h,v
retrieving revision 1.2
diff -u -p -r1.2 enumidlist.h
--- dlls/shell32/enumidlist.h	8 Apr 2004 19:50:17 -0000	1.2
+++ dlls/shell32/enumidlist.h	23 Feb 2005 01:22:34 -0000
@@ -25,6 +25,6 @@ BOOL AddToEnumList(IEnumIDList *list, LP
 /* Enumerates the folders and/or files (depending on dwFlags) in lpszPath and
  * adds them to the already-created list.
  */
-BOOL CreateFolderEnumList(IEnumIDList *list, LPCSTR lpszPath, DWORD dwFlags);
+BOOL CreateFolderEnumList(IEnumIDList *list, LPCWSTR lpszPath, DWORD dwFlags);
 
 #endif /* ndef __ENUMIDLIST_H__ */
Index: dlls/shell32/pidl.h
===================================================================
RCS file: /home/wine/wine/dlls/shell32/pidl.h,v
retrieving revision 1.45
diff -u -p -r1.45 pidl.h
--- dlls/shell32/pidl.h	22 Feb 2005 15:47:21 -0000	1.45
+++ dlls/shell32/pidl.h	23 Feb 2005 01:22:36 -0000
@@ -208,6 +208,7 @@ LPITEMIDLIST	_ILCreateGuid(PIDLTYPE type
 
 /* Like _ILCreateGuid, but using the string szGUID. */
 LPITEMIDLIST	_ILCreateGuidFromStrA(LPCSTR szGUID);
+LPITEMIDLIST	_ILCreateGuidFromStrW(LPCWSTR szGUID);
 
 /* Commonly used PIDLs representing file system objects. */
 LPITEMIDLIST	_ILCreateDesktop	(void);
Index: dlls/shell32/shfldr.h
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shfldr.h,v
retrieving revision 1.7
diff -u -p -r1.7 shfldr.h
--- dlls/shell32/shfldr.h	28 Sep 2004 19:33:44 -0000	1.7
+++ dlls/shell32/shfldr.h	23 Feb 2005 01:22:36 -0000
@@ -46,6 +46,7 @@ HRESULT SHELL32_BindToChild (LPCITEMIDLI
 			     LPCSTR pathRoot, LPCITEMIDLIST pidlComplete, REFIID riid, LPVOID * ppvOut);
 
 HRESULT SHELL32_CompareIDs (IShellFolder * iface, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2);
+LPITEMIDLIST SHELL32_CreatePidlFromBindCtx(IBindCtx *pbc, LPCWSTR path);
 
 static inline int SHELL32_GUIDToStringA (REFGUID guid, LPSTR str)
 {
Index: dlls/shell32/shfldr_desktop.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shfldr_desktop.c,v
retrieving revision 1.31
diff -u -p -r1.31 shfldr_desktop.c
--- dlls/shell32/shfldr_desktop.c	21 Feb 2005 18:36:47 -0000	1.31
+++ dlls/shell32/shfldr_desktop.c	23 Feb 2005 01:22:36 -0000
@@ -240,6 +240,11 @@ static HRESULT WINAPI ISF_Desktop_fnPars
         pidlTemp = _ILCreateNetwork();
         szNext = lpszDisplayName;
     }
+    else if( (pidlTemp = SHELL32_CreatePidlFromBindCtx(pbc, lpszDisplayName)) )
+    {
+        *ppidl = pidlTemp;
+        return S_OK;
+    }
     else
     {
         /* it's a filesystem path on the desktop. Let a FSFolder parse it */
@@ -288,7 +293,7 @@ static HRESULT WINAPI ISF_Desktop_fnPars
 static BOOL CreateDesktopEnumList(IEnumIDList *list, DWORD dwFlags)
 {
     BOOL ret = TRUE;
-    char szPath[MAX_PATH];
+    WCHAR szPath[MAX_PATH];
 
     TRACE("(%p)->(flags=0x%08lx) \n",list,dwFlags);
 
@@ -307,7 +312,7 @@ static BOOL CreateDesktopEnumList(IEnumI
                           0, KEY_READ, &hkey);
         if (ret && ERROR_SUCCESS == r)
         {
-            char iid[50];
+            WCHAR iid[50];
             int i=0;
             BOOL moreKeys = TRUE;
 
@@ -316,10 +321,10 @@ static BOOL CreateDesktopEnumList(IEnumI
                 DWORD size;
 
                 size = sizeof (iid);
-                r = RegEnumKeyExA(hkey, i, iid, &size, 0, NULL, NULL, NULL);
+                r = RegEnumKeyExW(hkey, i, iid, &size, 0, NULL, NULL, NULL);
                 if (ERROR_SUCCESS == r)
                 {
-                    ret = AddToEnumList(list, _ILCreateGuidFromStrA(iid));
+                    ret = AddToEnumList(list, _ILCreateGuidFromStrW(iid));
                     i++;
                 }
                 else if (ERROR_NO_MORE_ITEMS == r)
@@ -332,7 +337,7 @@ static BOOL CreateDesktopEnumList(IEnumI
     }
 
     /* enumerate the elements in %windir%\desktop */
-    SHGetSpecialFolderPathA(0, szPath, CSIDL_DESKTOPDIRECTORY, FALSE);
+    SHGetSpecialFolderPathW(0, szPath, CSIDL_DESKTOPDIRECTORY, FALSE);
     ret = ret && CreateFolderEnumList(list, szPath, dwFlags);
 
     return ret;
Index: dlls/shell32/shfldr_fs.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shfldr_fs.c,v
retrieving revision 1.30
diff -u -p -r1.30 shfldr_fs.c
--- dlls/shell32/shfldr_fs.c	22 Feb 2005 15:47:21 -0000	1.30
+++ dlls/shell32/shfldr_fs.c	23 Feb 2005 01:22:36 -0000
@@ -444,7 +444,11 @@ IShellFolder_fnEnumObjects (IShellFolder
 
     *ppEnumIDList = IEnumIDList_Constructor();
     if (*ppEnumIDList)
-        CreateFolderEnumList(*ppEnumIDList, This->sPathTarget, dwFlags);
+    {
+        WCHAR path[MAX_PATH];
+        MultiByteToWideChar(CP_ACP, 0, This->sPathTarget, -1, path, MAX_PATH);
+        CreateFolderEnumList(*ppEnumIDList, path, dwFlags);
+    }
 
     TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList);
 


More information about the wine-patches mailing list