|
|
/*++
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; }
|