shell32: SHChangeNotify is really Unicode/ANSI indifferent

Rolf Kalbermatter r.kalbermatter at hccnet.nl
Mon Jan 20 14:53:34 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 

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 20:39:18 -0000
@@ -185,8 +185,7 @@
  * SHChangeNotifyDeregister			[SHELL32.4]
  */
 BOOL WINAPI
-SHChangeNotifyDeregister(
-	HANDLE hNotify)
+SHChangeNotifyDeregister(HANDLE hNotify)
 {
 	TRACE("(%p)\n",hNotify);
 
@@ -209,50 +208,7 @@
 /*************************************************************************
  * 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;
@@ -263,22 +219,32 @@
 	TRACE("(0x%08lx,0x%08x,%p,%p):stub.\n", wEventId,uFlags,dwItem1,dwItem2);
 
 	/* convert paths in IDLists*/
-	if(uFlags & SHCNF_PATHA)
+	if (uFlags & SHCNF_PATHA)
 	{
 	  DWORD dummy;
-	  if (Pidls[0]) SHILCreateFromPathA((LPCSTR)dwItem1, &Pidls[0], &dummy);
-	  if (Pidls[1]) SHILCreateFromPathA((LPCSTR)dwItem2, &Pidls[1], &dummy);
+	  if (dwItem1) SHILCreateFromPathA((LPCSTR)dwItem1, &Pidls[0], &dummy);
+	  if (dwItem2) SHILCreateFromPathA((LPCSTR)dwItem2, &Pidls[1], &dummy);
+	}
+	else if (uFlags & SHCNF_PATHW)
+	{
+	  DWORD dummy;
+	  if (dwItem1) SHILCreateFromPathW((LPCSTR)dwItem1, &Pidls[0], &dummy);
+	  if (dwItem2) SHILCreateFromPathW((LPCSTR)dwItem2, &Pidls[1], &dummy);
+	}
+	else if (uFlags & (SHCNF_PRINTERW || SHCNF_PRINTERW)
+	{
+	  FIXME("SHChangeNotify with (uFlags & SHCNF_PRINTER)");
 	}
 
 	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 +255,11 @@
 	LeaveCriticalSection(&SHELL32_ChangenotifyCS);
 
 	/* if we allocated it, free it */
-	if(uFlags & SHCNF_PATHA)
+	if (uFlags & SHCNF_PATHA || uFlags & 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