Added declarations for newly documented SHChangeNotify API and fixed

some prototypes.
This commit is contained in:
Rolf Kalbermatter 2003-09-22 19:24:13 +00:00 committed by Alexandre Julliard
parent f42bc61b86
commit 58c0561bad
5 changed files with 98 additions and 70 deletions

View File

@ -18,10 +18,14 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#include <stdarg.h>
#include <string.h> #include <string.h>
#include "wine/debug.h" #define NONAMELESSUNION
#define NONAMELESSSTRUCT
#include "windef.h" #include "windef.h"
#include "winbase.h"
#include "wine/debug.h"
#include "wingdi.h" #include "wingdi.h"
#include "pidl.h" #include "pidl.h"
#include "shell32_main.h" #include "shell32_main.h"
@ -38,6 +42,8 @@ static CRITICAL_SECTION_DEBUG critsect_debug =
}; };
static CRITICAL_SECTION SHELL32_ChangenotifyCS = { &critsect_debug, -1, 0, 0, 0, 0 }; static CRITICAL_SECTION SHELL32_ChangenotifyCS = { &critsect_debug, -1, 0, 0, 0, 0 };
typedef SHChangeNotifyEntry *LPNOTIFYREGISTER;
/* internal list of notification clients (internal) */ /* internal list of notification clients (internal) */
typedef struct _NOTIFICATIONLIST typedef struct _NOTIFICATIONLIST
{ {
@ -107,7 +113,7 @@ static const char * NodeName(LPNOTIFICATIONLIST item)
const char *str; const char *str;
WCHAR path[MAX_PATH]; WCHAR path[MAX_PATH];
if(SHGetPathFromIDListW(item->apidl[0].pidlPath, path )) if(SHGetPathFromIDListW(item->apidl[0].pidl, path ))
str = wine_dbg_sprintf("%s", debugstr_w(path)); str = wine_dbg_sprintf("%s", debugstr_w(path));
else else
str = wine_dbg_sprintf("<not a disk file>" ); str = wine_dbg_sprintf("<not a disk file>" );
@ -155,7 +161,7 @@ static void DeleteNode(LPNOTIFICATIONLIST item)
/* free the item */ /* free the item */
for (i=0; i<item->cidl; i++) for (i=0; i<item->cidl; i++)
SHFree(item->apidl[i].pidlPath); SHFree((LPITEMIDLIST)item->apidl[i].pidl);
SHFree(item->apidl); SHFree(item->apidl);
SHFree(item); SHFree(item);
} }
@ -182,37 +188,37 @@ void FreeChangeNotifications(void)
* SHChangeNotifyRegister [SHELL32.2] * SHChangeNotifyRegister [SHELL32.2]
* *
*/ */
HANDLE WINAPI ULONG WINAPI
SHChangeNotifyRegister( SHChangeNotifyRegister(
HWND hwnd, HWND hwnd,
LONG dwFlags, int fSources,
LONG wEventMask, LONG wEventMask,
UINT uMsg, UINT uMsg,
int cItems, int cItems,
LPCNOTIFYREGISTER lpItems) SHChangeNotifyEntry *lpItems)
{ {
LPNOTIFICATIONLIST item; LPNOTIFICATIONLIST item;
int i; int i;
item = SHAlloc(sizeof(NOTIFICATIONLIST)); item = SHAlloc(sizeof(NOTIFICATIONLIST));
TRACE("(%p,0x%08lx,0x%08lx,0x%08x,0x%08x,%p) item=%p\n", TRACE("(%p,0x%08x,0x%08lx,0x%08x,%d,%p) item=%p\n",
hwnd, dwFlags, wEventMask, uMsg, cItems, lpItems, item); hwnd, fSources, wEventMask, uMsg, cItems, lpItems, item);
item->next = NULL; item->next = NULL;
item->prev = NULL; item->prev = NULL;
item->cidl = cItems; item->cidl = cItems;
item->apidl = SHAlloc(sizeof(NOTIFYREGISTER) * cItems); item->apidl = SHAlloc(sizeof(SHChangeNotifyEntry) * cItems);
for(i=0;i<cItems;i++) for(i=0;i<cItems;i++)
{ {
item->apidl[i].pidlPath = ILClone(lpItems[i].pidlPath); item->apidl[i].pidl = ILClone(lpItems[i].pidl);
item->apidl[i].bWatchSubtree = lpItems[i].bWatchSubtree; item->apidl[i].fRecursive = lpItems[i].fRecursive;
} }
item->hwnd = hwnd; item->hwnd = hwnd;
item->uMsg = uMsg; item->uMsg = uMsg;
item->wEventMask = wEventMask; item->wEventMask = wEventMask;
item->wSignalledEvent = 0; item->wSignalledEvent = 0;
item->dwFlags = dwFlags; item->dwFlags = fSources;
TRACE("new node: %s\n", NodeName( item )); TRACE("new node: %s\n", NodeName( item ));
@ -222,21 +228,21 @@ SHChangeNotifyRegister(
LeaveCriticalSection(&SHELL32_ChangenotifyCS); LeaveCriticalSection(&SHELL32_ChangenotifyCS);
return (HANDLE)item; return (ULONG)item;
} }
/************************************************************************* /*************************************************************************
* SHChangeNotifyDeregister [SHELL32.4] * SHChangeNotifyDeregister [SHELL32.4]
*/ */
BOOL WINAPI SHChangeNotifyDeregister(HANDLE hNotify) BOOL WINAPI SHChangeNotifyDeregister(ULONG hNotify)
{ {
LPNOTIFICATIONLIST node; LPNOTIFICATIONLIST node;
TRACE("(%p)\n",hNotify); TRACE("(0x%08lx)\n", hNotify);
EnterCriticalSection(&SHELL32_ChangenotifyCS); EnterCriticalSection(&SHELL32_ChangenotifyCS);
node = FindNode(hNotify); node = FindNode((HANDLE)hNotify);
if( node ) if( node )
DeleteNode(node); DeleteNode(node);
@ -257,7 +263,7 @@ BOOL WINAPI SHChangeNotifyUpdateEntryList(DWORD unknown1, DWORD unknown2,
return -1; return -1;
} }
static BOOL should_notify( LPITEMIDLIST changed, LPITEMIDLIST watched, BOOL sub ) static BOOL should_notify( LPITEMIDLIST changed, LPCITEMIDLIST watched, BOOL sub )
{ {
TRACE("%p %p %d\n", changed, watched, sub ); TRACE("%p %p %d\n", changed, watched, sub );
if ( !watched ) if ( !watched )
@ -357,8 +363,8 @@ void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID
for( i=0; (i<ptr->cidl) && !notify ; i++ ) for( i=0; (i<ptr->cidl) && !notify ; i++ )
{ {
LPITEMIDLIST pidl = ptr->apidl[i].pidlPath; LPCITEMIDLIST pidl = ptr->apidl[i].pidl;
BOOL subtree = ptr->apidl[i].bWatchSubtree; BOOL subtree = ptr->apidl[i].fRecursive;
if (wEventId & ptr->wEventMask) if (wEventId & ptr->wEventMask)
{ {
@ -411,7 +417,7 @@ DWORD WINAPI NTSHChangeNotifyRegister(
LONG events2, LONG events2,
DWORD msg, DWORD msg,
int count, int count,
LPCNOTIFYREGISTER idlist) SHChangeNotifyEntry *idlist)
{ {
FIXME("(%p,0x%08lx,0x%08lx,0x%08lx,0x%08x,%p):semi stub.\n", FIXME("(%p,0x%08lx,0x%08lx,0x%08lx,0x%08x,%p):semi stub.\n",
hwnd,events1,events2,msg,count,idlist); hwnd,events1,events2,msg,count,idlist);
@ -425,12 +431,12 @@ DWORD WINAPI NTSHChangeNotifyRegister(
HANDLE WINAPI SHChangeNotification_Lock( HANDLE WINAPI SHChangeNotification_Lock(
HANDLE hChange, HANDLE hChange,
DWORD dwProcessId, DWORD dwProcessId,
LPCITEMIDLIST **lppidls, LPITEMIDLIST **lppidls,
LPLONG lpwEventId) LPLONG lpwEventId)
{ {
DWORD i; DWORD i;
LPNOTIFICATIONLIST node; LPNOTIFICATIONLIST node;
LPCITEMIDLIST *idlist; LPITEMIDLIST *idlist;
TRACE("%p %08lx %p %p\n", hChange, dwProcessId, lppidls, lpwEventId); TRACE("%p %08lx %p %p\n", hChange, dwProcessId, lppidls, lpwEventId);
@ -441,7 +447,7 @@ HANDLE WINAPI SHChangeNotification_Lock(
{ {
idlist = SHAlloc( sizeof(LPCITEMIDLIST *) * node->cidl ); idlist = SHAlloc( sizeof(LPCITEMIDLIST *) * node->cidl );
for(i=0; i<node->cidl; i++) for(i=0; i<node->cidl; i++)
idlist[i] = node->pidlSignaled; idlist[i] = (LPITEMIDLIST)node->pidlSignaled;
*lpwEventId = node->wSignalledEvent; *lpwEventId = node->wSignalledEvent;
*lppidls = idlist; *lppidls = idlist;
node->wSignalledEvent = 0; node->wSignalledEvent = 0;
@ -466,9 +472,9 @@ BOOL WINAPI SHChangeNotification_Unlock ( HANDLE hLock)
/************************************************************************* /*************************************************************************
* NTSHChangeNotifyDeregister [SHELL32.641] * NTSHChangeNotifyDeregister [SHELL32.641]
*/ */
DWORD WINAPI NTSHChangeNotifyDeregister(LONG x1) DWORD WINAPI NTSHChangeNotifyDeregister(ULONG x1)
{ {
FIXME("(0x%08lx):semi stub.\n",x1); FIXME("(0x%08lx):semi stub.\n",x1);
return SHChangeNotifyDeregister( (HANDLE)x1 ); return SHChangeNotifyDeregister( x1 );
} }

View File

@ -629,11 +629,11 @@ LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1,LPCITEMIDLIST pidl2)
* *
* NOTES * NOTES
*/ */
LPITEMIDLIST WINAPI SHGetRealIDL(LPSHELLFOLDER lpsf, LPITEMIDLIST pidl, DWORD z) HRESULT WINAPI SHGetRealIDL(LPSHELLFOLDER lpsf, LPCITEMIDLIST pidlSimple, LPITEMIDLIST *pidlReal)
{ {
FIXME("sf=%p pidl=%p 0x%04lx\n",lpsf,pidl,z); FIXME("sf=%p pidlSimple=%p pidlReal=%p\n", lpsf, pidlSimple, pidlReal);
pdump (pidl); pdump (pidlSimple);
return 0; return 0;
} }

View File

@ -89,7 +89,7 @@ typedef struct
UINT cidl; UINT cidl;
LPITEMIDLIST *apidl; LPITEMIDLIST *apidl;
LISTVIEW_SORT_INFO ListViewSortInfo; LISTVIEW_SORT_INFO ListViewSortInfo;
HANDLE hNotify; /* change notification handle */ ULONG hNotify; /* change notification handle */
HANDLE hAccel; HANDLE hAccel;
} IShellViewImpl; } IShellViewImpl;
@ -630,7 +630,7 @@ static HRESULT ShellView_FillList(IShellViewImpl * This)
static LRESULT ShellView_OnCreate(IShellViewImpl * This) static LRESULT ShellView_OnCreate(IShellViewImpl * This)
{ {
IDropTarget* pdt; IDropTarget* pdt;
NOTIFYREGISTER ntreg; SHChangeNotifyEntry ntreg;
IPersistFolder2 * ppf2 = NULL; IPersistFolder2 * ppf2 = NULL;
TRACE("%p\n",This); TRACE("%p\n",This);
@ -656,10 +656,10 @@ static LRESULT ShellView_OnCreate(IShellViewImpl * This)
IShellFolder_QueryInterface(This->pSFParent, &IID_IPersistFolder2, (LPVOID*)&ppf2); IShellFolder_QueryInterface(This->pSFParent, &IID_IPersistFolder2, (LPVOID*)&ppf2);
if (ppf2) if (ppf2)
{ {
IPersistFolder2_GetCurFolder(ppf2, &ntreg.pidlPath); IPersistFolder2_GetCurFolder(ppf2, (LPITEMIDLIST*)&ntreg.pidl);
ntreg.bWatchSubtree = FALSE; ntreg.fRecursive = FALSE;
This->hNotify = SHChangeNotifyRegister(This->hWnd, SHCNF_IDLIST, SHCNE_ALLEVENTS, SHV_CHANGE_NOTIFY, 1, &ntreg); This->hNotify = SHChangeNotifyRegister(This->hWnd, SHCNF_IDLIST, SHCNE_ALLEVENTS, SHV_CHANGE_NOTIFY, 1, &ntreg);
SHFree(ntreg.pidlPath); SHFree((LPITEMIDLIST)ntreg.pidl);
IPersistFolder2_Release(ppf2); IPersistFolder2_Release(ppf2);
} }

View File

@ -148,39 +148,6 @@ HRESULT WINAPI StrRetToStrNAW (
#define SHCNRF_RecursiveInterrupt 0x1000 /* Must be combined with SHCNRF_InterruptLevel */ #define SHCNRF_RecursiveInterrupt 0x1000 /* Must be combined with SHCNRF_InterruptLevel */
#define SHCNRF_NewDelivery 0x8000 /* Messages use shared memory */ #define SHCNRF_NewDelivery 0x8000 /* Messages use shared memory */
typedef struct
{
LPITEMIDLIST pidlPath;
BOOL bWatchSubtree;
} NOTIFYREGISTER, *LPNOTIFYREGISTER;
typedef const LPNOTIFYREGISTER LPCNOTIFYREGISTER;
typedef struct
{
USHORT cb;
DWORD dwItem1;
DWORD dwItem2;
} DWORDITEMID;
HANDLE WINAPI SHChangeNotifyRegister(
HWND hwnd,
LONG dwFlags,
LONG wEventMask,
UINT uMsg,
int cItems,
LPNOTIFYREGISTER lpItems);
BOOL WINAPI SHChangeNotifyDeregister(HANDLE hNotify);
HANDLE WINAPI SHChangeNotification_Lock(
HANDLE hMemoryMap,
DWORD dwProcessId,
LPCITEMIDLIST **lppidls,
LPLONG lpwEventId);
BOOL WINAPI SHChangeNotification_Unlock(HANDLE hLock);
/**************************************************************************** /****************************************************************************
* Shell Common Dialogs * Shell Common Dialogs
*/ */

View File

@ -495,9 +495,15 @@ VOID WINAPI SHGetSettings(LPSHELLFLAGSTATE lpsfs, DWORD dwMask);
#define SSF_NOCONFIRMRECYCLE 0x8000 #define SSF_NOCONFIRMRECYCLE 0x8000
#define SSF_HIDEICONS 0x4000 #define SSF_HIDEICONS 0x4000
/********************************************************************** /****************************************************************************
* SHChangeNotify * SHChangeNotify API
*/ */
typedef struct _SHChangeNotifyEntry
{
LPCITEMIDLIST pidl;
BOOL fRecursive;
} SHChangeNotifyEntry;
#define SHCNE_RENAMEITEM 0x00000001 #define SHCNE_RENAMEITEM 0x00000001
#define SHCNE_CREATE 0x00000002 #define SHCNE_CREATE 0x00000002
#define SHCNE_DELETE 0x00000004 #define SHCNE_DELETE 0x00000004
@ -525,7 +531,9 @@ VOID WINAPI SHGetSettings(LPSHELLFLAGSTATE lpsfs, DWORD dwMask);
#define SHCNE_ALLEVENTS 0x7FFFFFFF #define SHCNE_ALLEVENTS 0x7FFFFFFF
#define SHCNE_INTERRUPT 0x80000000 #define SHCNE_INTERRUPT 0x80000000
#define SHCNEE_ORDERCHANGED 0x00000002 #define SHCNEE_ORDERCHANGED 0x0002L
#define SHCNEE_MSI_CHANGE 0x0004L
#define SHCNEE_MSI_UNINSTALL 0x0005L
#define SHCNF_IDLIST 0x0000 #define SHCNF_IDLIST 0x0000
#define SHCNF_PATHA 0x0001 #define SHCNF_PATHA 0x0001
@ -537,8 +545,55 @@ VOID WINAPI SHGetSettings(LPSHELLFLAGSTATE lpsfs, DWORD dwMask);
#define SHCNF_FLUSH 0x1000 #define SHCNF_FLUSH 0x1000
#define SHCNF_FLUSHNOWAIT 0x2000 #define SHCNF_FLUSHNOWAIT 0x2000
#define SHCNF_PATH WINELIB_NAME_AW(SHCNF_PATH)
#define SHCNF_PRINTER WINELIB_NAME_AW(SHCNF_PRINTER)
void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2); void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2);
/*
* IShellChangeNotify
*/
typedef struct IShellChangeNotify IShellChangeNotify, *LPSHELLCHANGENOTIFY;
#define INTERFACE IShellChangeNotify
#define IShellChangeNotify_METHODS \
IUnknown_METHODS \
STDMETHOD(OnChange)(THIS_ LONG lEvent, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) PURE;
ICOM_DEFINE(IShellChangeNotify, IUnknown)
#undef INTERFACE
#ifdef COBJMACROS
/*** IUnknown methods ***/
#define IShellChangeNotify_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
#define IShellChangeNotify_AddRef(p) (p)->lpVtbl->AddRef(p)
#define IShellChangeNotify_Release(p) (p)->lpVtbl->Release(p)
/*** IShellChangeNotify methods ***/
#define IShellChangeNotify_OnChange(p,a,b,c) (p)->lpVtbl->OnChange(p,a,b,c)
#endif
typedef struct _SHChangeDWORDAsIDList {
USHORT cb;
DWORD dwItem1;
DWORD dwItem2;
USHORT cbZero;
} SHChangeDWORDAsIDList, *LPSHChangeDWORDAsIDList;
typedef struct _SHChangeProductKeyAsIDList {
USHORT cb;
WCHAR wszProductKey[39];
USHORT cbZero;
} SHChangeProductKeyAsIDList, *LPSHChangeProductKeyAsIDList;
ULONG WINAPI SHChangeNotifyRegister(HWND hwnd, int fSources, LONG fEvents, UINT wMsg,
int cEntries, SHChangeNotifyEntry *pshcne);
BOOL WINAPI SHChangeNotifyDeregister(ULONG ulID);
HANDLE WINAPI SHChangeNotification_Lock(HANDLE hChangeNotification, DWORD dwProcessId,
LPITEMIDLIST **pppidl, LONG *plEvent);
BOOL WINAPI SHChangeNotification_Unlock(HANDLE hLock);
HRESULT WINAPI SHGetRealIDL(IShellFolder *psf, LPCITEMIDLIST pidlSimple, LPITEMIDLIST * ppidlReal);
/**************************************************************************** /****************************************************************************
* SHCreateDirectory API * SHCreateDirectory API
*/ */