185 lines
4.5 KiB
C++
185 lines
4.5 KiB
C++
/*****************************************************************************\
|
|
* MODULE: ppchange.h
|
|
*
|
|
* This module contains functions that handle notification
|
|
*
|
|
*
|
|
* Copyright (C) 1996-1997 Microsoft Corporation
|
|
*
|
|
* History:
|
|
* 28-Apr-1998 Weihai Chen (weihaic)
|
|
*
|
|
\*****************************************************************************/
|
|
|
|
#include "precomp.h"
|
|
#include "priv.h"
|
|
|
|
|
|
typedef struct INET_HPRINTER_LIST {
|
|
LPINET_HPRINTER hPrinter;
|
|
struct INET_HPRINTER_LIST *next;
|
|
} INET_HPRINTER_LIST;
|
|
|
|
typedef INET_HPRINTER_LIST *PINET_HPRINTER_LIST;
|
|
typedef INET_HPRINTER_LIST *NPINET_HPRINTER_LIST;
|
|
typedef INET_HPRINTER_LIST *LPINET_HPRINTER_LIST;
|
|
|
|
|
|
static INET_HPRINTER_LIST g_pHandleList = {NULL, NULL};
|
|
|
|
/*****************************************************************************\
|
|
* AddHandleToList
|
|
*
|
|
* Add the printer handle to a global link list
|
|
*
|
|
\*****************************************************************************/
|
|
BOOL
|
|
AddHandleToList (
|
|
LPINET_HPRINTER hPrinter
|
|
)
|
|
{
|
|
LPINET_HPRINTER_LIST pPrt;
|
|
|
|
if (pPrt = (LPINET_HPRINTER_LIST)memAlloc(sizeof(INET_HPRINTER_LIST))) {
|
|
pPrt->next = g_pHandleList.next;
|
|
pPrt->hPrinter = hPrinter;
|
|
g_pHandleList.next = pPrt;
|
|
|
|
return TRUE;
|
|
}
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
/*****************************************************************************\
|
|
* DeleteHandleFromList
|
|
*
|
|
* Remove a printer handle from the global link list
|
|
*
|
|
\*****************************************************************************/
|
|
BOOL
|
|
DeleteHandleFromList (
|
|
LPINET_HPRINTER hPrinter
|
|
)
|
|
{
|
|
LPINET_HPRINTER_LIST pPrt = &g_pHandleList;
|
|
LPINET_HPRINTER_LIST pTmp;
|
|
|
|
while (pPrt->next) {
|
|
if (pPrt->next->hPrinter == hPrinter) {
|
|
pTmp = pPrt->next;
|
|
pPrt->next = pTmp->next;
|
|
memFree (pTmp, sizeof(INET_HPRINTER_LIST));
|
|
return TRUE;
|
|
}
|
|
pPrt = pPrt->next;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/*****************************************************************************\
|
|
* RefreshNotificationPort
|
|
*
|
|
* Go through the handle list and call the refresh if the notify handle is not
|
|
* null
|
|
*
|
|
\*****************************************************************************/
|
|
void
|
|
RefreshNotificationPort (
|
|
HANDLE hPort
|
|
)
|
|
{
|
|
LPINET_HPRINTER_LIST pPrt = g_pHandleList.next;
|
|
|
|
DBG_MSG(DBG_LEV_CALLTREE, (TEXT("Call: RefreshNotificationPort: Port(%08lX)"), hPort));
|
|
|
|
while (pPrt) {
|
|
if (utlValidatePrinterHandle (pPrt->hPrinter) == hPort) {
|
|
if (pPrt->hPrinter->hNotify) {
|
|
|
|
DBG_MSG(DBG_LEV_CALLTREE, (TEXT("Call: ReplyPrinterChangeNotification: hNotify(%08lX)"),
|
|
pPrt->hPrinter->hNotify));
|
|
|
|
ReplyPrinterChangeNotification (pPrt->hPrinter->hNotify,
|
|
PRINTER_CHANGE_ALL,
|
|
NULL,
|
|
NULL);
|
|
}
|
|
|
|
}
|
|
pPrt = pPrt->next;
|
|
}
|
|
}
|
|
|
|
|
|
/*****************************************************************************\
|
|
* RefreshNotification
|
|
*
|
|
* Go through the handle list and call the refresh if the notify handle is not
|
|
* null
|
|
*
|
|
\*****************************************************************************/
|
|
void
|
|
RefreshNotification (
|
|
LPINET_HPRINTER hPrinter
|
|
)
|
|
{
|
|
|
|
RefreshNotificationPort (hPrinter->hPort);
|
|
}
|
|
|
|
/*****************************************************************************\
|
|
* PPFindFirstPrinterChangeNotification
|
|
*
|
|
* Handle the notification request
|
|
*
|
|
\*****************************************************************************/
|
|
BOOL
|
|
PPFindFirstPrinterChangeNotification(
|
|
HANDLE hPrinter,
|
|
DWORD fdwFlags,
|
|
DWORD fdwOptions,
|
|
HANDLE hNotify,
|
|
PDWORD pfdwStatus,
|
|
PVOID pPrinterNotifyOptions,
|
|
PVOID pPrinterNotifyInit
|
|
)
|
|
{
|
|
static PRINTER_NOTIFY_INIT PPNotify = {
|
|
sizeof (PRINTER_NOTIFY_INIT),
|
|
0,
|
|
30000
|
|
};
|
|
|
|
DBG_MSG(DBG_LEV_CALLTREE, (TEXT("Call: PPFindFirstPrinterChangeNotification: Printer(%08lX)"), hPrinter));
|
|
|
|
DBG_MSG(DBG_LEV_CALLTREE, (TEXT("Call: hNotify(%08lX)"),hNotify));
|
|
|
|
semEnterCrit();
|
|
|
|
if (utlValidatePrinterHandle(hPrinter)) {
|
|
|
|
((LPINET_HPRINTER )hPrinter) ->hNotify = hNotify;
|
|
fdwFlags = PRINTER_CHANGE_ALL;
|
|
*pfdwStatus = PRINTER_NOTIFY_STATUS_POLL | PRINTER_NOTIFY_STATUS_ENDPOINT;
|
|
* ((LPPRINTER_NOTIFY_INIT *) pPrinterNotifyInit) = &PPNotify;
|
|
}
|
|
|
|
semLeaveCrit ();
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL
|
|
PPFindClosePrinterChangeNotification(
|
|
HANDLE hPrinter
|
|
)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|