551 lines
12 KiB
C++
551 lines
12 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (C) Microsoft Corporation, 1995 - 1998
|
||
|
All rights reserved.
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
printer.hxx
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
The printer object handles all information regarding a print
|
||
|
queue (and eventually server object). The printer is not
|
||
|
concerned with UI or listviews; it takes a printer name and
|
||
|
returns via callbacks any changes of the printer state.
|
||
|
|
||
|
The remote server notifies the local printer of changes through
|
||
|
either a single DWORD (downlevel connections), or full change
|
||
|
information (uplevel 3.51+ connections). The TData object
|
||
|
abstracts the changes for us.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Albert Ting (AlbertT) 10-June-1995
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _PRINTER_HXX
|
||
|
#define _PRINTER_HXX
|
||
|
|
||
|
class TPrinter;
|
||
|
|
||
|
/********************************************************************
|
||
|
|
||
|
MPrinterClient
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
class MPrinterClient : public VInfoClient, public MRefCom {
|
||
|
|
||
|
SIGNATURE( 'prc' )
|
||
|
|
||
|
public:
|
||
|
|
||
|
MPrinterClient(
|
||
|
VOID
|
||
|
) : _pPrinter( NULL )
|
||
|
{ }
|
||
|
|
||
|
VAR( TPrinter*, pPrinter );
|
||
|
|
||
|
/********************************************************************
|
||
|
|
||
|
Retrieve selected items. Used when processing commands against
|
||
|
items or saving and restoring the selection during a refresh.
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
virtual
|
||
|
COUNT
|
||
|
cSelected(
|
||
|
VOID
|
||
|
) const;
|
||
|
|
||
|
virtual
|
||
|
HITEM
|
||
|
GetFirstSelItem(
|
||
|
VOID
|
||
|
) const;
|
||
|
|
||
|
virtual
|
||
|
HITEM
|
||
|
GetNextSelItem(
|
||
|
HITEM hItem
|
||
|
) const;
|
||
|
|
||
|
virtual
|
||
|
IDENT
|
||
|
GetId(
|
||
|
HITEM hItem
|
||
|
) const;
|
||
|
|
||
|
//
|
||
|
// kContainerReloadItems: pPrinter has just refreshed and so the
|
||
|
// client must invalidate the old pointers and use re-enumerate
|
||
|
// new items.
|
||
|
//
|
||
|
// kContainerClearItems: pPrinter has just zeroed its list of items,
|
||
|
// so the client must invalidate all old pointers.
|
||
|
//
|
||
|
virtual
|
||
|
VOID
|
||
|
vContainerChanged(
|
||
|
CONTAINER_CHANGE ContainerChange,
|
||
|
INFO Info
|
||
|
) = 0;
|
||
|
|
||
|
virtual
|
||
|
VOID
|
||
|
vItemChanged(
|
||
|
ITEM_CHANGE ItemChange,
|
||
|
HITEM hItem,
|
||
|
INFO Info,
|
||
|
INFO InfoNew
|
||
|
) = 0;
|
||
|
|
||
|
/********************************************************************
|
||
|
|
||
|
VInfoClient virtual defaults.
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
virtual
|
||
|
VOID
|
||
|
vSaveSelections(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
virtual
|
||
|
VOID
|
||
|
vRestoreSelections(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
virtual
|
||
|
BOOL
|
||
|
bGetPrintLib(
|
||
|
TRefLock<TPrintLib> &refLock
|
||
|
) const = 0;
|
||
|
};
|
||
|
|
||
|
/********************************************************************
|
||
|
|
||
|
Class definitions.
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
|
||
|
class TPrinter : public MExecWork, public MDataClient {
|
||
|
|
||
|
SIGNATURE( 'prnt' )
|
||
|
SAFE_NEW
|
||
|
|
||
|
public:
|
||
|
|
||
|
/********************************************************************
|
||
|
|
||
|
Public constants.
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
enum _CONSTANTS {
|
||
|
kOneSecond = 1000,
|
||
|
kSleepRetry = 30 * kOneSecond, // 30 sec. timeout
|
||
|
};
|
||
|
|
||
|
enum _EXEC {
|
||
|
#ifdef SLEEP_ON_MINIMIZE
|
||
|
kExecSleep = 0x0000001,
|
||
|
kExecAwake = 0x0000002,
|
||
|
#endif
|
||
|
kExecError = 0x0000004, // Error: don't try re-opening.
|
||
|
kExecReopen = 0x0000008,
|
||
|
kExecDelay = 0x0000010, // GetLastError set to error.
|
||
|
kExecClose = 0x0000020,
|
||
|
kExecRequestExit = 0x0000040,
|
||
|
|
||
|
kExecNotifyStart = 0x0000100,
|
||
|
kExecRegister = 0x0000200,
|
||
|
kExecNotifyEnd = 0x0000400,
|
||
|
|
||
|
kExecRefresh = 0x0001000,
|
||
|
kExecRefreshContainer = 0x0002000,
|
||
|
kExecRefreshItem = 0x0004000,
|
||
|
kExecRefreshAll = 0x0007000,
|
||
|
|
||
|
kExecCommand = 0x0010000,
|
||
|
};
|
||
|
|
||
|
enum EJobStatusString {
|
||
|
kMultipleJobStatusString, // Prepend job status string information
|
||
|
kSingleJobStatusString, // Don't prepend job status string information
|
||
|
};
|
||
|
public:
|
||
|
|
||
|
//
|
||
|
// The sub-object that abstracts the type of remote printer from us.
|
||
|
// (May have the polling notifications, single DWORD notifications,
|
||
|
// or full information notifications.)
|
||
|
//
|
||
|
VAR( VData*, pData );
|
||
|
VAR( TRefLock<TPrintLib>, pPrintLib );
|
||
|
|
||
|
//
|
||
|
// Initialized once, then read only; no guarding needed.
|
||
|
// OR called by UI thread.
|
||
|
//
|
||
|
VAR( DWORD, dwAccess );
|
||
|
VAR( EJobStatusString, eJobStatusStringType );
|
||
|
|
||
|
BOOL
|
||
|
bValid(
|
||
|
VOID
|
||
|
) const
|
||
|
{
|
||
|
return VALID_OBJ( PrinterGuard._strPrinter );
|
||
|
}
|
||
|
|
||
|
/********************************************************************
|
||
|
|
||
|
Don't use the standard ctr and dtr to create and destroy these
|
||
|
objects; instead, use these member functions.
|
||
|
|
||
|
pNew - Returns a new printer object.
|
||
|
|
||
|
vDelete - Request that the printer destroy itself when all
|
||
|
pending commands (pausing printer, jobs, etc.) have completed.
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
static
|
||
|
TPrinter*
|
||
|
pNew(
|
||
|
MPrinterClient* pPrinterClient,
|
||
|
LPCTSTR pszPrinter,
|
||
|
DWORD dwAccess
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
vDelete(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
const TString&
|
||
|
strPrinter(
|
||
|
VOID
|
||
|
) const
|
||
|
{
|
||
|
return PrinterGuard._strPrinter;
|
||
|
}
|
||
|
|
||
|
BOOL
|
||
|
bSyncRefresh(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
/********************************************************************
|
||
|
|
||
|
UI interface routines: the UI client calls through these
|
||
|
functions for services.
|
||
|
|
||
|
vCommandQueue - Allocate a command object and put it into the
|
||
|
command queue (commands execute serially in a separate
|
||
|
thread).
|
||
|
|
||
|
vCommandRequested - Call when a new command has been added that
|
||
|
requires a sleeping printer to re-awake. This allows a
|
||
|
refresh to take place even if the printer is sleeping in
|
||
|
poll mode.
|
||
|
|
||
|
vProcessData - Call when synchronous data must be processed.
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
VOID
|
||
|
vCommandQueue(
|
||
|
TSelection* pSelection
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
vCommandRequested(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
vProcessData(
|
||
|
DWORD dwParam,
|
||
|
HBLOCK hBlock
|
||
|
);
|
||
|
|
||
|
LPTSTR
|
||
|
pszPrinterName(
|
||
|
LPTSTR pszPrinterBuffer
|
||
|
) const;
|
||
|
|
||
|
LPTSTR
|
||
|
pszServerName(
|
||
|
LPTSTR pszServerBuffer
|
||
|
) const;
|
||
|
|
||
|
/********************************************************************
|
||
|
|
||
|
Generic exported services.
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
static
|
||
|
STATUS
|
||
|
sOpenPrinter(
|
||
|
LPCTSTR pszPrinter,
|
||
|
PDWORD pdwAccess,
|
||
|
PHANDLE phPrinter
|
||
|
);
|
||
|
|
||
|
private:
|
||
|
|
||
|
class TPrinterClientRef {
|
||
|
public:
|
||
|
|
||
|
TPrinterClientRef(
|
||
|
const TPrinter* pPrinter
|
||
|
);
|
||
|
~TPrinterClientRef(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
bValid(
|
||
|
VOID
|
||
|
) const
|
||
|
{
|
||
|
return _pPrinterClient != NULL;
|
||
|
}
|
||
|
|
||
|
MPrinterClient*
|
||
|
ptr(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
return _pPrinterClient;
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
|
||
|
MPrinterClient* _pPrinterClient;
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Guarded by TExec: one thread processing TPrinter at a time,
|
||
|
// and/or guarded by state machine.
|
||
|
//
|
||
|
struct _EXEC_GUARD {
|
||
|
|
||
|
VAR( HANDLE, hPrinter );
|
||
|
|
||
|
} ExecGuard;
|
||
|
|
||
|
//
|
||
|
// All field in this structure guarded by gpCritSec.
|
||
|
//
|
||
|
struct PRINTER_GUARD {
|
||
|
|
||
|
//
|
||
|
// Written by Exec threads only; guarding not needed from
|
||
|
// reading from ExecGuard places.
|
||
|
//
|
||
|
VAR( TString, strPrinter );
|
||
|
VAR( TString, strServer );
|
||
|
VAR( HANDLE, hEventCommand );
|
||
|
VAR( DWORD, dwError );
|
||
|
|
||
|
//
|
||
|
// Only changed in UIThread.
|
||
|
//
|
||
|
VAR( MPrinterClient*, pPrinterClient );
|
||
|
|
||
|
//
|
||
|
// Linked list of commands to execute.
|
||
|
//
|
||
|
DLINK_BASE( TSelection, Selection, Selection );
|
||
|
|
||
|
} PrinterGuard;
|
||
|
|
||
|
/********************************************************************
|
||
|
|
||
|
Ctr, dtr declared private so that clients are forced to use
|
||
|
pNew, vDelete.
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
TPrinter(
|
||
|
MPrinterClient* pPrinterClient,
|
||
|
LPCTSTR pszPrinter,
|
||
|
DWORD dwAccess
|
||
|
);
|
||
|
|
||
|
~TPrinter(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
/********************************************************************
|
||
|
|
||
|
Status reporting.
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
VOID
|
||
|
vErrorStatusChanged(
|
||
|
DWORD dwStatus
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
vConnectStatusChanged(
|
||
|
CONNECT_STATUS ConnectStatus
|
||
|
);
|
||
|
|
||
|
/********************************************************************
|
||
|
|
||
|
Define virtual funcs for MExecWork:
|
||
|
|
||
|
svExecute - A job is ready to execute and should run now in the
|
||
|
current thread.
|
||
|
|
||
|
vExecFailedAddJob - This printer object tried to add a job,
|
||
|
but the add failed and we need to put up a suitable
|
||
|
error message.
|
||
|
|
||
|
vExecExitComplete - We requested an EXIT job and we are finally
|
||
|
processing it now (the exit will wait until the currently
|
||
|
pending job has completed). This routine will delete
|
||
|
the object.
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
STATEVAR
|
||
|
svExecute(
|
||
|
STATEVAR StateVar
|
||
|
);
|
||
|
VOID
|
||
|
vExecFailedAddJob(
|
||
|
VOID
|
||
|
);
|
||
|
VOID
|
||
|
vExecExitComplete(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
/********************************************************************
|
||
|
|
||
|
Called by worker threads only; these operations may hit
|
||
|
the network and therefore take a long time to complete.
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
#ifdef SLEEP_ON_MINIMIZE
|
||
|
STATEVAR
|
||
|
svAwake(
|
||
|
STATEVAR StateVar
|
||
|
);
|
||
|
#endif
|
||
|
|
||
|
STATEVAR
|
||
|
svSleep(
|
||
|
STATEVAR StateVar
|
||
|
);
|
||
|
|
||
|
STATEVAR
|
||
|
svRefresh(
|
||
|
STATEVAR StateVar
|
||
|
);
|
||
|
STATEVAR
|
||
|
svReopen(
|
||
|
STATEVAR StateVar
|
||
|
);
|
||
|
STATEVAR
|
||
|
svDelay(
|
||
|
STATEVAR StateVar
|
||
|
);
|
||
|
STATEVAR
|
||
|
svClose(
|
||
|
STATEVAR StateVar
|
||
|
);
|
||
|
|
||
|
STATEVAR
|
||
|
svRequestExit(
|
||
|
STATEVAR StateVar
|
||
|
);
|
||
|
|
||
|
STATEVAR
|
||
|
svNotifyStart(
|
||
|
STATEVAR StateVar
|
||
|
);
|
||
|
STATEVAR
|
||
|
svNotifyEnd(
|
||
|
STATEVAR StateVar
|
||
|
);
|
||
|
STATEVAR
|
||
|
svCommand(
|
||
|
STATEVAR StateVar
|
||
|
);
|
||
|
|
||
|
|
||
|
/********************************************************************
|
||
|
|
||
|
MDataClient virtual definitions.
|
||
|
|
||
|
********************************************************************/
|
||
|
|
||
|
VOID
|
||
|
vContainerChanged(
|
||
|
CONTAINER_CHANGE ContainerChange,
|
||
|
INFO Info
|
||
|
);
|
||
|
VOID
|
||
|
vItemChanged(
|
||
|
ITEM_CHANGE ItemChange,
|
||
|
HITEM hItem,
|
||
|
INFO Info,
|
||
|
INFO InfoNew
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
vSaveSelections(
|
||
|
VOID
|
||
|
);
|
||
|
VOID
|
||
|
vRestoreSelections(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
bGetPrintLib(
|
||
|
TRefLock<TPrintLib> &refLock
|
||
|
) const;
|
||
|
|
||
|
VDataNotify*
|
||
|
pNewNotify(
|
||
|
MDataClient* pDataClient
|
||
|
) const;
|
||
|
|
||
|
VDataRefresh*
|
||
|
pNewRefresh(
|
||
|
MDataClient* pDataClient
|
||
|
) const;
|
||
|
|
||
|
HANDLE
|
||
|
hPrinter(
|
||
|
VOID
|
||
|
) const;
|
||
|
HANDLE
|
||
|
hPrinterNew(
|
||
|
VOID
|
||
|
) const;
|
||
|
|
||
|
friend TPrinterClientRef;
|
||
|
};
|
||
|
|
||
|
#endif // ifndef _PRINTER_HXX
|