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