mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
550 lines
12 KiB
550 lines
12 KiB
/*++
|
|
|
|
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
|