FW: shell32: SHChangeNotify is really Unicode/ANSI indifferent, take3
Rolf Kalbermatter
rolf.kalbermatter at citeng.com
Tue Jan 21 05:22:54 CST 2003
Changelog
* dlls/shell32/changenotify.c
* dlls/shell32/shfldr_fs.c
* dlls/shell32/shlfileop.c
* include/shlobj.h
* dlls/shell32/shell32.spec
Change SHChangeNotify to be Unicode and ANSI indifferent, as the type
of parameters is really defined by uFlags parameter
This is the third version, which fixes the selector in the SHChangeNotify
function as found by Robert Shearman, Francois Gouget, and Dimitry. Thanks guys!
License: X11/LGPL
Rolf Kalbermatter
Index: dlls/shell32/changenotify.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/changenotify.c,v
retrieving revision 1.19
diff -u -r1.19 changenotify.c
--- dlls/shell32/changenotify.c 13 Dec 2002 00:36:52 -0000 1.19
+++ dlls/shell32/changenotify.c 20 Jan 2003 22:57:24 -0000
@@ -185,8 +185,7 @@
* SHChangeNotifyDeregister [SHELL32.4]
*/
BOOL WINAPI
-SHChangeNotifyDeregister(
- HANDLE hNotify)
+SHChangeNotifyDeregister(HANDLE hNotify)
{
TRACE("(%p)\n",hNotify);
@@ -209,76 +208,45 @@
/*************************************************************************
* SHChangeNotify [SHELL32.@]
*/
-void WINAPI SHChangeNotifyW (LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
-{
- LPITEMIDLIST pidl1=(LPITEMIDLIST)dwItem1, pidl2=(LPITEMIDLIST)dwItem2;
- LPNOTIFICATIONLIST ptr;
-
- TRACE("(0x%08lx,0x%08x,%p,%p):stub.\n", wEventId,uFlags,dwItem1,dwItem2);
-
- /* convert paths in IDLists*/
- if(uFlags & SHCNF_PATHA)
- {
- DWORD dummy;
- if (dwItem1) SHILCreateFromPathA((LPCSTR)dwItem1, &pidl1, &dummy);
- if (dwItem2) SHILCreateFromPathA((LPCSTR)dwItem2, &pidl2, &dummy);
- }
-
- EnterCriticalSection(&SHELL32_ChangenotifyCS);
-
- /* loop through the list */
- ptr = head.next;
- while(ptr != &tail)
- {
- TRACE("trying %p\n", ptr);
-
- if(wEventId & ptr->wEventMask)
- {
- TRACE("notifying\n");
- SendMessageA(ptr->hwnd, ptr->uMsg, (WPARAM)pidl1, (LPARAM)pidl2);
- }
- ptr = ptr->next;
- }
-
- LeaveCriticalSection(&SHELL32_ChangenotifyCS);
-
- if(uFlags & SHCNF_PATHA)
- {
- if (pidl1) SHFree(pidl1);
- if (pidl2) SHFree(pidl2);
- }
-}
-
-/*************************************************************************
- * SHChangeNotify [SHELL32.@]
- */
-void WINAPI SHChangeNotifyA (LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
+void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
{
LPITEMIDLIST Pidls[2];
LPNOTIFICATIONLIST ptr;
+ UINT typeFlag = uFlags & SHCNF_TYPE;
Pidls[0] = (LPITEMIDLIST)dwItem1;
Pidls[1] = (LPITEMIDLIST)dwItem2;
- TRACE("(0x%08lx,0x%08x,%p,%p):stub.\n", wEventId,uFlags,dwItem1,dwItem2);
+ TRACE("(0x%08lx,0x%08x,%p,%p):stub.\n", wEventId, uFlags, dwItem1, dwItem2);
/* convert paths in IDLists*/
- if(uFlags & SHCNF_PATHA)
+ switch (typeFlag)
{
DWORD dummy;
- if (Pidls[0]) SHILCreateFromPathA((LPCSTR)dwItem1, &Pidls[0], &dummy);
- if (Pidls[1]) SHILCreateFromPathA((LPCSTR)dwItem2, &Pidls[1], &dummy);
+
+ case SHCNF_PATHA:
+ if (dwItem1) SHILCreateFromPathA((LPCSTR)dwItem1, &Pidls[0], &dummy);
+ if (dwItem2) SHILCreateFromPathA((LPCSTR)dwItem2, &Pidls[1], &dummy);
+ break;
+ case SHCNF_PATHW:
+ if (dwItem1) SHILCreateFromPathW((LPCWSTR)dwItem1, &Pidls[0], &dummy);
+ if (dwItem2) SHILCreateFromPathW((LPCWSTR)dwItem2, &Pidls[1], &dummy);
+ break;
+ case SHCNF_PRINTERA:
+ case SHCNF_PRINTERW:
+ FIXME("SHChangeNotify with (uFlags & SHCNF_PRINTER)");
+ break;
}
EnterCriticalSection(&SHELL32_ChangenotifyCS);
/* loop through the list */
ptr = head.next;
- while(ptr != &tail)
+ while (ptr != &tail)
{
TRACE("trying %p\n", ptr);
- if(wEventId & ptr->wEventMask)
+ if (wEventId & ptr->wEventMask)
{
TRACE("notifying\n");
SendMessageA(ptr->hwnd, ptr->uMsg, (WPARAM)&Pidls, (LPARAM)wEventId);
@@ -289,22 +257,11 @@
LeaveCriticalSection(&SHELL32_ChangenotifyCS);
/* if we allocated it, free it */
- if(uFlags & SHCNF_PATHA)
+ if (uFlags & (SHCNF_PATHA | SHCNF_PATHW))
{
- if (Pidls[0]) SHFree(Pidls[0]);
- if (Pidls[1]) SHFree(Pidls[1]);
+ if (Pidls[0]) SHFree(Pidls[0]);
+ if (Pidls[1]) SHFree(Pidls[1]);
}
-}
-
-/*************************************************************************
- * SHChangeNotify [SHELL32.@]
- */
-void WINAPI SHChangeNotifyAW (LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
-{
- if(SHELL_OsIsUnicode())
- SHChangeNotifyW (wEventId, uFlags, dwItem1, dwItem2);
- else
- SHChangeNotifyA (wEventId, uFlags, dwItem1, dwItem2);
}
/*************************************************************************
Index: dlls/shell32/shfldr_fs.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shfldr_fs.c,v
retrieving revision 1.7
diff -u -r1.7 shfldr_fs.c
--- dlls/shell32/shfldr_fs.c 7 Jan 2003 20:36:24 -0000 1.7
+++ dlls/shell32/shfldr_fs.c 20 Jan 2003 20:50:08 -0000
@@ -706,7 +706,7 @@
if (MoveFileA (szSrc, szDest)) {
if (pPidlOut)
*pPidlOut = SHSimpleIDListFromPathA (szDest);
- SHChangeNotifyA (bIsFolder ? SHCNE_RENAMEFOLDER : SHCNE_RENAMEITEM, SHCNF_PATHA, szSrc, szDest);
+ SHChangeNotify (bIsFolder ? SHCNE_RENAMEFOLDER : SHCNE_RENAMEITEM, SHCNF_PATHA, szSrc, szDest);
return S_OK;
}
return E_FAIL;
@@ -940,7 +940,7 @@
pidlitem = SHSimpleIDListFromPathA (lpstrNewDir);
pidl = ILCombine (This->pidlRoot, pidlitem);
- SHChangeNotifyA (SHCNE_MKDIR, SHCNF_IDLIST, pidl, NULL);
+ SHChangeNotify (SHCNE_MKDIR, SHCNF_IDLIST, pidl, NULL);
SHFree (pidl);
if (ppidlOut)
@@ -999,7 +999,7 @@
return E_FAIL;
}
pidl = ILCombine (This->pidlRoot, apidl[i]);
- SHChangeNotifyA (SHCNE_RMDIR, SHCNF_IDLIST, pidl, NULL);
+ SHChangeNotify (SHCNE_RMDIR, SHCNF_IDLIST, pidl, NULL);
SHFree (pidl);
} else if (_ILIsValue (apidl[i])) {
LPITEMIDLIST pidl;
@@ -1010,7 +1010,7 @@
return E_FAIL;
}
pidl = ILCombine (This->pidlRoot, apidl[i]);
- SHChangeNotifyA (SHCNE_DELETE, SHCNF_IDLIST, pidl, NULL);
+ SHChangeNotify (SHCNE_DELETE, SHCNF_IDLIST, pidl, NULL);
SHFree (pidl);
}
Index: dlls/shell32/shlfileop.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shlfileop.c,v
retrieving revision 1.22
diff -u -r1.22 shlfileop.c
--- dlls/shell32/shlfileop.c 19 Dec 2002 04:11:22 -0000 1.22
+++ dlls/shell32/shlfileop.c 20 Jan 2003 20:52:09 -0000
@@ -141,7 +141,7 @@
TRACE("(%p,%s)\n",sec,path);
if ((ret = CreateDirectoryA(path,sec)))
{
- SHChangeNotifyA(SHCNE_MKDIR, SHCNF_PATHA, path, NULL);
+ SHChangeNotify(SHCNE_MKDIR, SHCNF_PATHA, path, NULL);
}
return ret;
}
@@ -152,17 +152,15 @@
* Deletes a file. Also triggers a change notify if one exists.
*
* FIXME:
- * Verified on Win98 / IE 5 (SHELL32 4.72, March 1999 build) to be
- * ANSI. Is this Unicode on NT?
- *
+ * Verified on Win98 / IE 5 (SHELL32 4.72, March 1999 build) to be ANSI.
+ * This is Unicode on NT/2000
*/
-
BOOL WINAPI Win32DeleteFile(LPSTR fName)
{
TRACE("%p(%s)\n", fName, fName);
DeleteFileA(fName);
- SHChangeNotifyA(SHCNE_DELETE, SHCNF_PATHA, fName, NULL);
+ SHChangeNotify(SHCNE_DELETE, SHCNF_PATHA, fName, NULL);
return TRUE;
}
Index: include/shlobj.h
===================================================================
RCS file: /home/wine/wine/include/shlobj.h,v
retrieving revision 1.57
diff -u -r1.57 shlobj.h
--- include/shlobj.h 3 Jan 2003 03:07:21 -0000 1.57
+++ include/shlobj.h 20 Jan 2003 20:46:02 -0000
@@ -495,9 +495,7 @@
#define SHCNF_FLUSH 0x1000
#define SHCNF_FLUSHNOWAIT 0x2000
-void WINAPI SHChangeNotifyA(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2);
-void WINAPI SHChangeNotifyW(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2);
-#define SHChangeNotify WINELIB_NAME_AW(SHChangeNotify)
+void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2);
/****************************************************************************
* SHGetSpecialFolderLocation API
Index: dlls/shell32/shell32.spec
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shell32.spec,v
retrieving revision 1.61
diff -u -r1.61 shell32.spec
--- dlls/shell32/shell32.spec 13 Dec 2002 02:17:54 -0000 1.61
+++ dlls/shell32/shell32.spec 20 Jan 2003 20:42:50 -0000
@@ -68,7 +68,7 @@
74 stdcall SHCreateStdEnumFmtEtc(long ptr ptr) SHCreateStdEnumFmtEtc
75 stdcall PathYetAnotherMakeUniqueName(ptr ptr ptr ptr) PathYetAnotherMakeUniqueNameA
76 stub DragQueryInfo
- 77 stdcall SHMapPIDLToSystemImageListIndex(long long long) SHMapPIDLToSystemImageListIndex
+ 77 stdcall SHMapPIDLToSystemImageListIndex(ptr ptr ptr) SHMapPIDLToSystemImageListIndex
78 stdcall OleStrToStrN(str long wstr long) OleStrToStrNAW
79 stdcall StrToOleStrN(wstr long str long) StrToOleStrNAW
80 stdcall DragFinish(long) DragFinish
@@ -79,7 +79,7 @@
85 forward OpenRegStream shlwapi.SHOpenRegStreamA
86 stdcall SHRegisterDragDrop(long ptr) SHRegisterDragDrop
87 stdcall SHRevokeDragDrop(long) SHRevokeDragDrop
- 88 stdcall SHDoDragDrop(long long long long long) SHDoDragDrop
+ 88 stdcall SHDoDragDrop(long ptr ptr long ptr) SHDoDragDrop
89 stdcall SHCloneSpecialIDList(long long long) SHCloneSpecialIDList
90 stub SHFindFiles
91 stub SHFindComputer
@@ -87,7 +87,7 @@
93 stub Win32CreateDirectory
94 stub Win32RemoveDirectory
95 stdcall SHLogILFromFSIL (ptr) SHLogILFromFSIL
- 96 stdcall StrRetToStrN (long long long long) StrRetToStrNAW
+ 96 stdcall StrRetToStrN (ptr long ptr ptr) StrRetToStrNAW
97 stdcall SHWaitForFileToOpen (long long long) SHWaitForFileToOpen
98 stdcall SHGetRealIDL (long long long) SHGetRealIDL
99 stdcall SetAppStartingCursor (long long) SetAppStartingCursor
@@ -354,7 +354,7 @@
@ stdcall SHBrowseForFolder(ptr) SHBrowseForFolderA
@ stdcall SHBrowseForFolderA(ptr) SHBrowseForFolderA
@ stdcall SHBrowseForFolderW(ptr) SHBrowseForFolderW
-@ stdcall SHChangeNotify (long long ptr ptr) SHChangeNotifyAW
+@ stdcall SHChangeNotify (long long ptr ptr) SHChangeNotify
@ stub ShellHookProc
@ stub SHEmptyRecycleBinA at 12
@ stub SHEmptyRecycleBinW at 12
@@ -371,8 +371,8 @@
@ stdcall SHGetMalloc(ptr)SHGetMalloc
@ stub SHGetNewLinkInfo at 20
@ stdcall SHGetPathFromIDList(ptr ptr)SHGetPathFromIDListAW
-@ stdcall SHGetPathFromIDListA(long long)SHGetPathFromIDListA
-@ stdcall SHGetPathFromIDListW(long long)SHGetPathFromIDListW
+@ stdcall SHGetPathFromIDListA(ptr ptr)SHGetPathFromIDListA
+@ stdcall SHGetPathFromIDListW(ptr ptr)SHGetPathFromIDListW
@ stdcall SHGetSettings(ptr long) SHGetSettings
@ stdcall SHGetSpecialFolderLocation(long long ptr)SHGetSpecialFolderLocation
@ stdcall SHHelpShortcuts_RunDLL(long long long long) SHHelpShortcuts_RunDLL
More information about the wine-patches
mailing list