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