windows-nt/Source/XPSP1/NT/printscan/ui/printui/docdata.cxx
2020-09-26 16:20:57 +08:00

484 lines
8.5 KiB
C++

/*++
Copyright (C) Microsoft Corporation, 1995 - 1998
All rights reserved.
Module Name:
docdata.cxx
Abstract:
Document Data Property Sheet Data Set
Author:
Steve Kiraly (SteveKi) 10/25/95
Revision History:
--*/
#include "precomp.hxx"
#pragma hdrstop
#include "docdata.hxx"
/*++
Routine Name:
TDocumentData
Routine Description:
Document data property sheet constructor.
Arguments:
pszPrinterName - Name of printer or queue where jobs reside.
JobId - Job id to display properties of.
iCmdShow - Show dialog style.
lParam - Indicates which page to display initialy
Return Value:
Nothing.
--*/
TDocumentData::
TDocumentData(
IN LPCTSTR pszPrinterName,
IN IDENT JobId,
IN INT iCmdShow,
IN LPARAM lParam
) : MSingletonWin( pszPrinterName ),
_JobId( JobId ),
_iCmdShow( iCmdShow ),
_strNotifyName( TEXT( "" ) ),
_uStartPage( (UINT)lParam ),
_bIsDataStored( FALSE ),
_bErrorSaving( TRUE ),
_bAdministrator( TRUE ),
_pJobInfo( NULL ),
_hPrinter( NULL ),
_dwAccess( 0 )
{
// DBGMSG( DBG_TRACE, ( "TDocumentData::ctor\n") );
_bValid = MSingletonWin::bValid() && VALID_OBJ( _strNotifyName );
}
/*++
Routine Name:
~TDocumentData
Routine Description:
Stores the document data back to the server.
Arguments:
None.
Return Value:
Nothing.
--*/
TDocumentData::
~TDocumentData(
VOID
)
{
// DBGMSG( DBG_TRACE, ( "TDocumentData::dtor\n") );
//
// If we have allocated the job info structure, release it.
//
if( _pJobInfo ){
delete [] _pJobInfo;
}
//
// If we have valid printer handle, close printer.
//
if( _hPrinter ){
ClosePrinter( _hPrinter );
}
}
/*++
Routine Name:
bLoad
Routine Description:
Loads all the document property specific data.
Arguments:
None.
Return Value:
TRUE - Document data loaded successfully,
FALSE - if document data was not loaded.
--*/
BOOL
TDocumentData::
bLoad(
VOID
)
{
// DBGMSG( DBG_TRACE, ( "TDocumentData::bLoad\n") );
//
// Open the specified printer.
//
TStatus Status( DBG_WARN );
Status DBGCHK = TPrinter::sOpenPrinter( _strPrinterName, &_dwAccess, &_hPrinter );
if( Status ){
return FALSE;
}
//
// Release any old job information.
//
if( _pJobInfo ) {
delete _pJobInfo;
}
//
// Get the job specific information.
//
BOOL bStatus;
bStatus = bGetJobInfo( _hPrinter, _JobId, &_pJobInfo );
if( !bStatus ){
return FALSE;
}
//
// Make a copy of the job info - apply button.
//
bStatus = _JobInfo.bUpdate( _pJobInfo );
if( !bStatus ) {
return FALSE;
}
return TRUE;
}
/*++
Routine Name:
bStore
Routine Description:
Stores the document data from back to the printer system.
Arguments:
None.
Return Value:
TRUE - Document data stored successfully,
FALSE - if document data was not stored.
--*/
BOOL
TDocumentData::
bStore(
VOID
)
{
SPLASSERT( _JobId );
SPLASSERT( _pJobInfo );
SPLASSERT( _hPrinter );
// DBGMSG( DBG_TRACE, ( "TDocumentData::bStore\n") );
TStatusB bStatus;
bStatus DBGNOCHK = TRUE;
//
// Only do a set job is the data has changed.
//
if( bCheckForChange() )
{
//
// Attempt to set the document data.
//
bStatus DBGCHK = bSetJobInfo( _hPrinter, _JobId, _pJobInfo );
if( bStatus ) {
//
// Update the copy of the job info - apply button.
//
(VOID)_JobInfo.bUpdate( _pJobInfo );
}
//
// Indicate the data has now been stored.
//
_bIsDataStored = TRUE;
}
return bStatus;
}
/*++
Routine Name:
bGetJobInfo
Routine Description:
Read the job information from the specified printer.
Arguments:
hPrinter - Opened printer handle.
JobId - Job Id of job to get info level 2 information
pJob - Pointer where to return pointer to job info level 2.
Return Value:
TRUE valid information and pJop points to JOB_INFO_2 structure.
FALSE failure reading job information.
--*/
BOOL
TDocumentData::
bGetJobInfo(
HANDLE hPrinter,
DWORD JobId,
LPJOB_INFO_2 *xpJob
)
{
DWORD cbNeeded = 0;
BOOL bStatus = FALSE;
LPJOB_INFO_2 pJob = NULL;
SPLASSERT( JobId );
// DBGMSG( DBG_TRACE, ( "TDocumentData::bGetJobInfo\n") );
//
// Attempt to retrieve the buffer needed for the job info.
//
if( !GetJob( hPrinter, JobId, 2, NULL, 0, &cbNeeded ) ){
//
// If error is too small buffer contine.
//
if( GetLastError() == ERROR_INSUFFICIENT_BUFFER ){
//
// Allocate job info buffer
//
pJob = (LPJOB_INFO_2)new BYTE [cbNeeded];
//
// If buffer allocated
//
if( pJob ){
//
// Fill in the job info buffer.
//
if( GetJob( hPrinter, JobId, 2, (LPBYTE)pJob, cbNeeded, &cbNeeded ) ){
bStatus = TRUE;
}
//
// Buffer allocation failure.
//
} else {
bStatus = FALSE;
}
//
// Some other get job error occurred.
//
} else {
bStatus = FALSE;
}
}
//
// If error occurred clean up.
//
if( !bStatus ){
if( pJob ){
delete [] pJob;
}
//
// Success copy back the job info buffer.
//
} else {
*xpJob = pJob;
}
return bStatus;
}
/*++
Routine Name:
bSetJobInfo
Routine Description:
Write the job informationto the specified printer.
Arguments:
hPrinter - Opened printer handle.
JobId - Job Id of job to get info level 2 information
pJob - Pointer where to return pointer to job info level 2.
Return Value:
TRUE if job informaton was set, FALSE error writing job information.
--*/
BOOL
TDocumentData::
bSetJobInfo(
HANDLE hPrinter,
DWORD JobId,
LPJOB_INFO_2 pJob
)
{
// DBGMSG( DBG_TRACE, ( "TDocumentData::bSetJobInfo\n") );
//
// Attempt to set the job information.
//
return SetJob( hPrinter, JobId, 2, (LPBYTE)pJob, 0 );
}
/*++
Routine Name:
bCheckForChange
Routine Description:
Checks if anything changed on the dialog.
Arguments:
None.
Return Value:
FALSE something changed, TRUE no change.
--*/
BOOL
TDocumentData::
bCheckForChange(
VOID
)
{
if( !_tcscmp( _strNotifyName, _JobInfo._strNotifyName ) &&
_pJobInfo->Priority == _JobInfo._dwPriority &&
_pJobInfo->StartTime == _JobInfo._dwStartTime &&
_pJobInfo->UntilTime == _JobInfo._dwUntilTime )
{
return FALSE;
}
#if DBG
DBGMSG( DBG_TRACE, ("Item changed:\n" ));
if( _tcscmp( _strNotifyName, _JobInfo._strNotifyName ) )
DBGMSG( DBG_TRACE, ("NotifyName: "TSTR " " TSTR "\n", (LPCTSTR)_strNotifyName, (LPCTSTR)_JobInfo._strNotifyName ));
if( _pJobInfo->Priority != _JobInfo._dwPriority )
DBGMSG( DBG_TRACE, ("Priority: %x %x\n", _pJobInfo->Priority, _JobInfo._dwPriority ));
if( _pJobInfo->StartTime != _JobInfo._dwStartTime )
DBGMSG( DBG_TRACE, ("StartTime: %x %x\n", _pJobInfo->StartTime, _JobInfo._dwStartTime ));
if( _pJobInfo->UntilTime != _JobInfo._dwUntilTime )
DBGMSG( DBG_TRACE, ("UntilTime: %x %x\n", _pJobInfo->UntilTime, _JobInfo._dwUntilTime ));
#endif
return TRUE;
}
/********************************************************************
Job info class used for the apply button.
********************************************************************/
TDocumentData::TJobInfo::
TJobInfo(
VOID
) : _dwPriority( 0 ),
_dwStartTime( 0 ),
_dwUntilTime( 0 )
{
}
TDocumentData::TJobInfo::
~TJobInfo(
VOID
)
{
}
BOOL
TDocumentData::TJobInfo::
bUpdate(
IN LPJOB_INFO_2 pJobInfo
)
{
SPLASSERT( pJobInfo );
TStatusB bStatus;
bStatus DBGNOCHK = FALSE;
if( pJobInfo ) {
bStatus DBGCHK = _strNotifyName.bUpdate( pJobInfo->pNotifyName );
_dwPriority = pJobInfo->Priority;
_dwStartTime = pJobInfo->StartTime;
_dwUntilTime = pJobInfo->UntilTime;
}
return bStatus;
}