232 lines
4.8 KiB
C
232 lines
4.8 KiB
C
/*++
|
|
|
|
Copyright (c) 1990-1994 Microsoft Corporation
|
|
All rights reserved
|
|
|
|
Module Name:
|
|
|
|
Change.c
|
|
|
|
Abstract:
|
|
|
|
Handles implementation for WaitForPrinterChange and related apis.
|
|
|
|
FindFirstPrinterChangeNotification
|
|
FindClosePrinterChangeNotification
|
|
|
|
RefreshPrinterChangeNotification
|
|
|
|
Author:
|
|
|
|
Albert Ting (AlbertT) 24-Apr-94
|
|
|
|
Environment:
|
|
|
|
User Mode -Win32
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include <precomp.h>
|
|
#pragma hdrstop
|
|
|
|
|
|
|
|
BOOL
|
|
RemoteFindFirstPrinterChangeNotification(
|
|
HANDLE hPrinter,
|
|
DWORD fdwFlags,
|
|
DWORD fdwOptions,
|
|
HANDLE hNotify,
|
|
PDWORD pfdwStatus,
|
|
PVOID pvReserved0,
|
|
PVOID pvReserved1);
|
|
|
|
BOOL
|
|
RemoteFindClosePrinterChangeNotification(
|
|
HANDLE hPrinter);
|
|
|
|
BOOL
|
|
RemoteFindFirstPrinterChangeNotification(
|
|
HANDLE hPrinter,
|
|
DWORD fdwFlags,
|
|
DWORD fdwOptions,
|
|
HANDLE hNotify,
|
|
PDWORD pfdwStatus,
|
|
PVOID pvReserved0,
|
|
PVOID pvReserved1)
|
|
{
|
|
BOOL bReturnValue = TRUE;
|
|
PWSPOOL pSpool = (PWSPOOL)hPrinter;
|
|
|
|
VALIDATEW32HANDLE( pSpool );
|
|
|
|
SPLASSERT( !*pfdwStatus );
|
|
|
|
if( pSpool->Status & WSPOOL_STATUS_NOTIFY ){
|
|
DBGMSG( DBG_WARNING, ( "RemoteFFPCN: Already waiting.\n" ));
|
|
SetLastError( ERROR_ALREADY_WAITING );
|
|
return FALSE;
|
|
}
|
|
|
|
if( pSpool->Type == SJ_WIN32HANDLE ){
|
|
|
|
DWORD dwStatus;
|
|
|
|
SYNCRPCHANDLE( pSpool );
|
|
|
|
dwStatus = CallRouterFindFirstPrinterChangeNotification(
|
|
pSpool->RpcHandle,
|
|
fdwFlags,
|
|
fdwOptions,
|
|
hNotify,
|
|
pvReserved0);
|
|
|
|
switch( dwStatus ){
|
|
case RPC_S_SERVER_UNAVAILABLE:
|
|
|
|
//
|
|
// Drop into polling mode. This can happen if the
|
|
// server service on the client is disabled.
|
|
//
|
|
*pfdwStatus = PRINTER_NOTIFY_STATUS_ENDPOINT |
|
|
PRINTER_NOTIFY_STATUS_POLL;
|
|
|
|
pSpool->Status |= WSPOOL_STATUS_NOTIFY_POLL;
|
|
|
|
DBGMSG( DBG_WARNING, ( "RemoteFFPCN: Dropping into poll mode.\n" ));
|
|
break;
|
|
|
|
case ERROR_SUCCESS:
|
|
|
|
//
|
|
// Using regular notification system; not polling.
|
|
//
|
|
pSpool->Status &= ~WSPOOL_STATUS_NOTIFY_POLL;
|
|
break;
|
|
|
|
default:
|
|
|
|
SetLastError(dwStatus);
|
|
bReturnValue = FALSE;
|
|
break;
|
|
}
|
|
|
|
} else {
|
|
|
|
bReturnValue = LMFindFirstPrinterChangeNotification(
|
|
hPrinter,
|
|
fdwFlags,
|
|
fdwOptions,
|
|
hNotify,
|
|
pfdwStatus);
|
|
}
|
|
|
|
if( bReturnValue ){
|
|
pSpool->Status |= WSPOOL_STATUS_NOTIFY;
|
|
}
|
|
|
|
return bReturnValue;
|
|
}
|
|
|
|
|
|
BOOL
|
|
RemoteFindClosePrinterChangeNotification(
|
|
HANDLE hPrinter)
|
|
{
|
|
DWORD ReturnValue;
|
|
PWSPOOL pSpool = (PWSPOOL)hPrinter;
|
|
|
|
VALIDATEW32HANDLE( pSpool );
|
|
|
|
pSpool->Status &= ~WSPOOL_STATUS_NOTIFY;
|
|
|
|
if( pSpool->Status & WSPOOL_STATUS_NOTIFY_POLL ){
|
|
|
|
//
|
|
// In the polling case, there's no cleanup.
|
|
//
|
|
return TRUE;
|
|
}
|
|
|
|
if (pSpool->Type == SJ_WIN32HANDLE) {
|
|
|
|
SYNCRPCHANDLE( pSpool );
|
|
|
|
RpcTryExcept {
|
|
|
|
if (ReturnValue = RpcFindClosePrinterChangeNotification(
|
|
pSpool->RpcHandle)) {
|
|
|
|
SetLastError(ReturnValue);
|
|
ReturnValue = FALSE;
|
|
|
|
} else
|
|
|
|
ReturnValue = TRUE;
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
SetLastError(RpcExceptionCode());
|
|
ReturnValue = FALSE;
|
|
|
|
} RpcEndExcept
|
|
|
|
} else {
|
|
|
|
EnterSplSem();
|
|
ReturnValue = LMFindClosePrinterChangeNotification(hPrinter);
|
|
LeaveSplSem();
|
|
}
|
|
|
|
return ReturnValue;
|
|
}
|
|
|
|
BOOL
|
|
RemoteRefreshPrinterChangeNotification(
|
|
HANDLE hPrinter,
|
|
DWORD dwColor,
|
|
PVOID pPrinterNotifyOptions,
|
|
PVOID* ppPrinterNotifyInfo)
|
|
{
|
|
DWORD ReturnValue;
|
|
PWSPOOL pSpool = (PWSPOOL)hPrinter;
|
|
|
|
VALIDATEW32HANDLE( pSpool );
|
|
|
|
if (ppPrinterNotifyInfo)
|
|
*ppPrinterNotifyInfo = NULL;
|
|
|
|
if (pSpool->Type != SJ_WIN32HANDLE) {
|
|
SetLastError(ERROR_INVALID_FUNCTION);
|
|
return FALSE;
|
|
}
|
|
|
|
SYNCRPCHANDLE( pSpool );
|
|
|
|
RpcTryExcept {
|
|
|
|
if (ReturnValue = RpcRouterRefreshPrinterChangeNotification(
|
|
pSpool->RpcHandle,
|
|
dwColor,
|
|
pPrinterNotifyOptions,
|
|
(PRPC_V2_NOTIFY_INFO*)ppPrinterNotifyInfo)) {
|
|
|
|
SetLastError(ReturnValue);
|
|
ReturnValue = FALSE;
|
|
|
|
} else
|
|
|
|
ReturnValue = TRUE;
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
SetLastError(RpcExceptionCode());
|
|
ReturnValue = FALSE;
|
|
|
|
} RpcEndExcept
|
|
|
|
return ReturnValue;
|
|
}
|