|
|
//---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996
//
// File: cjob.cxx
//
// Contents: CNWCOMPATPrintJob
//
//
// History: 1-May-96 t-ptam (Patrick Tam) Created.
// 1-Jul-96 ramv (Ram Viswanathan) Modified to use propcache
//----------------------------------------------------------------------------
#include "NWCOMPAT.hxx"
#pragma hdrstop
//
// Macro-ized implementation.
//
DEFINE_IDispatch_ExtMgr_Implementation(CNWCOMPATPrintJob);
DEFINE_IADs_TempImplementation(CNWCOMPATPrintJob);
DEFINE_IADs_PutGetImplementation(CNWCOMPATPrintJob, PrintJobClass, gdwJobTableSize);
DEFINE_IADsPropertyList_Implementation(CNWCOMPATPrintJob, PrintJobClass, gdwJobTableSize);
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATPrintJob::CNWCOMPATPrintJob
//
// Synopsis:
//
//----------------------------------------------------------------------------
CNWCOMPATPrintJob::CNWCOMPATPrintJob():
_pDispMgr(NULL), _pExtMgr(NULL), _lJobId(0), _lStatus(0), _pPropertyCache(NULL), _pszPrinterPath(NULL) { ENLIST_TRACKING(CNWCOMPATPrintJob); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATPrintJob::~CNWCOMPATPrintJob
//
// Synopsis:
//
//----------------------------------------------------------------------------
CNWCOMPATPrintJob::~CNWCOMPATPrintJob() { delete _pExtMgr; // created last, destroyed first
delete _pDispMgr; delete _pPropertyCache; if(_pszPrinterPath){ FreeADsStr(_pszPrinterPath); } }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATPrintJob::CreatePrintJob
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT CNWCOMPATPrintJob::CreatePrintJob( LPTSTR pszPrinterPath, LONG lJobId, DWORD dwObjectState, REFIID riid, LPVOID *ppvoid ) { CNWCOMPATPrintJob *pPrintJob = NULL; HRESULT hr = S_OK; TCHAR szJobName[MAX_LONG_LENGTH]; POBJECTINFO pObjectInfo = NULL; TCHAR szUncPrinterName[MAX_PATH];
//
// Allocate memory for a print job object.
//
hr = AllocatePrintJobObject( &pPrintJob ); BAIL_ON_FAILURE(hr);
//
// Convert the JobId that we have into a string that we move
// into the Name field
//
_ltow( lJobId, szJobName, 10 );
//
// Initialize its core object.
//
hr = pPrintJob->InitializeCoreObject( pszPrinterPath, szJobName, PRINTJOB_CLASS_NAME, PRINTJOB_SCHEMA_NAME, CLSID_NWCOMPATPrintJob, dwObjectState ); BAIL_ON_FAILURE(hr);
//
// Job ID.
//
pPrintJob->_lJobId = lJobId; pPrintJob->_pszPrinterPath = AllocADsStr(pszPrinterPath);
if(! pPrintJob->_pszPrinterPath) { hr = E_OUTOFMEMORY; goto error; }
//
// Get interface pointer.
//
hr = pPrintJob->QueryInterface( riid, (void **)ppvoid ); BAIL_ON_FAILURE(hr);
pPrintJob->Release();
hr = pPrintJob->_pExtMgr->FinalInitializeExtensions(); BAIL_ON_FAILURE(hr);
//
// Return.
//
if (pObjectInfo) { FreeObjectInfo(pObjectInfo); }
RRETURN(hr);
error:
if (pObjectInfo) { FreeObjectInfo(pObjectInfo); }
delete pPrintJob;
RRETURN_EXP_IF_ERR(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATPrintJob::AllocatePrintJobObject
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT CNWCOMPATPrintJob::AllocatePrintJobObject( CNWCOMPATPrintJob ** ppPrintJob ) { CAggregatorDispMgr FAR * pDispMgr = NULL; CADsExtMgr FAR * pExtensionMgr = NULL; CPropertyCache FAR * pPropertyCache = NULL; CNWCOMPATPrintJob FAR * pPrintJob = NULL; CNWCOMPATFSPrintJobGeneralInfo FAR * pGenInfo = NULL; CNWCOMPATFSPrintJobOperation FAR * pOperation = NULL; HRESULT hr = S_OK;
//
// Allocate memory for a PrintJob object.
//
pPrintJob = new CNWCOMPATPrintJob(); if (pPrintJob == NULL) { hr = E_OUTOFMEMORY; } BAIL_ON_FAILURE(hr);
//
// Create a Dispatch Manager object.
//
pDispMgr = new CAggregatorDispMgr; if (pDispMgr == NULL) { hr = E_OUTOFMEMORY; } BAIL_ON_FAILURE(hr);
//
// Load type info.
//
hr = LoadTypeInfoEntry( pDispMgr, LIBID_ADs, IID_IADsPrintJob, (IADsPrintJob *) pPrintJob, DISPID_REGULAR ); BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry( pDispMgr, LIBID_ADs, IID_IADsPrintJobOperations, (IADsPrintJobOperations *)pPrintJob, DISPID_REGULAR ); BAIL_ON_FAILURE(hr);
hr = LoadTypeInfoEntry( pDispMgr, LIBID_ADs, IID_IADsPropertyList, (IADsPropertyList *)pPrintJob, DISPID_VALUE ); BAIL_ON_FAILURE(hr);
//
// Return.
//
hr = CPropertyCache::createpropertycache( PrintJobClass, gdwJobTableSize, (CCoreADsObject *)pPrintJob, &pPropertyCache );
BAIL_ON_FAILURE(hr);
pDispMgr->RegisterPropertyCache( pPropertyCache );
hr = ADSILoadExtensionManager( PRINTJOB_CLASS_NAME, (IADsPrintJob *)pPrintJob, pDispMgr, &pExtensionMgr ); BAIL_ON_FAILURE(hr);
pPrintJob->_pExtMgr = pExtensionMgr; pPrintJob->_pPropertyCache = pPropertyCache; pPrintJob->_pDispMgr = pDispMgr; *ppPrintJob = pPrintJob;
RRETURN(hr);
error:
delete pPropertyCache; delete pDispMgr; delete pExtensionMgr; delete pPrintJob;
RRETURN(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATPrintJob::QueryInterface
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATPrintJob::QueryInterface( REFIID riid, LPVOID FAR* ppvObj ) { if(!ppvObj){ RRETURN(E_POINTER); }
if (IsEqualIID(riid, IID_IUnknown)) { *ppvObj = (IADsPrintJob FAR *)this; } else if (IsEqualIID(riid, IID_IDispatch)) { *ppvObj = (IADsPrintJob *)this; } else if (IsEqualIID(riid, IID_ISupportErrorInfo)) { *ppvObj = (ISupportErrorInfo FAR *) this; } else if (IsEqualIID(riid, IID_IADs)) { *ppvObj = (IADsPrintJob FAR *) this; } else if (IsEqualIID(riid, IID_IADsPrintJob)) { *ppvObj = (IADsPrintJob FAR *) this; } else if (IsEqualIID(riid, IID_IADsPrintJobOperations)) { *ppvObj = (IADsPrintJobOperations FAR *) this; } else if (IsEqualIID(riid, IID_IADsPropertyList)) { *ppvObj = (IADsPropertyList FAR *) this; } else if (_pExtMgr) { RRETURN( _pExtMgr->QueryInterface(riid, ppvObj)); }
else { *ppvObj = NULL; RRETURN(E_NOINTERFACE); }
AddRef(); return NOERROR; }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATPrintJob::InterfaceSupportsErrorInfo
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATPrintJob::InterfaceSupportsErrorInfo( THIS_ REFIID riid ) { if (IsEqualIID(riid, IID_IADs) || IsEqualIID(riid, IID_IADsPropertyList) || IsEqualIID(riid, IID_IADsPrintJob) || IsEqualIID(riid, IID_IADsPrintJobOperations)) { RRETURN(S_OK); } else { RRETURN(S_FALSE); } }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATPrintJob::SetInfo
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATPrintJob::SetInfo(THIS) { HANDLE hPrinter = NULL; HRESULT hr = S_OK; LPBYTE lpbBuffer = NULL; WCHAR szUncPrinterName[MAX_PATH];
//
// Make sure object is bound to a tangible resource.
//
if (GetObjectState() == ADS_OBJECT_UNBOUND) { hr = CreateObject(); BAIL_ON_FAILURE(hr);
SetObjectState(ADS_OBJECT_BOUND); }
//
// Make Unc printer name.
//
hr = NWApiUncFromADsPath( _pszPrinterPath, szUncPrinterName ); BAIL_ON_FAILURE(hr);
//
// Open a handle to a printer.
//
hr = NWApiOpenPrinter( szUncPrinterName, &hPrinter, PRINTER_ALL_ACCESS ); BAIL_ON_FAILURE(hr);
//
// Get job Info structure.
//
hr = NWApiGetJob( hPrinter, (DWORD) _lJobId, WIN32_API_LEVEL_2, &lpbBuffer ); BAIL_ON_FAILURE(hr);
//
// Set info.
//
hr = MarshallAndSet( hPrinter, (LPJOB_INFO_2) lpbBuffer ); error:
//
// Close Printer handle.
//
if (hPrinter) { NWApiClosePrinter(hPrinter); }
RRETURN_EXP_IF_ERR(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATPrintJob::GetInfo
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATPrintJob::GetInfo(THIS) { _pPropertyCache->flushpropcache();
RRETURN(GetInfo( TRUE, JOB_API_LEVEL )); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATPrintJob::CreateObject
//
// Synopsis:
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATPrintJob::CreateObject() { RRETURN_EXP_IF_ERR(E_NOTIMPL); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATPrintJob::GetInfo
//
// Synopsis: Please note that only Level 2 is used, unlike the WinNT side.
// Since Level 1 is simply a subset of Level 2 in this case, its just
// a matter of style which one to use.
//
//----------------------------------------------------------------------------
STDMETHODIMP CNWCOMPATPrintJob::GetInfo( THIS_ BOOL fExplicit, DWORD dwPropertyID ) { //
// Please note that the input DWORD is treated as dwApiLevel, unlike ohter
// NWCompat objects that treat it as dwPropertyID. The reason is that Win32
// APIs are used for retrieving information of the object.
//
HANDLE hPrinter = NULL; HRESULT hr = S_OK; LPBYTE lpbJobInfo = NULL; WCHAR szUncPrinterName[MAX_PATH];
//
// Make Unc printer name.
//
hr = NWApiUncFromADsPath( _pszPrinterPath, szUncPrinterName ); BAIL_ON_FAILURE(hr);
//
// Open a handle to a printer.
//
hr = NWApiOpenPrinter( szUncPrinterName, &hPrinter, PRINTER_ALL_ACCESS ); BAIL_ON_FAILURE(hr);
//
// Get job's info.
//
hr = NWApiGetJob( hPrinter, (DWORD) _lJobId, WIN32_API_LEVEL_2, &lpbJobInfo ); BAIL_ON_FAILURE(hr);
//
// Unmarshall.
//
hr = UnMarshall_GeneralInfo( (LPJOB_INFO_2) lpbJobInfo, fExplicit ); BAIL_ON_FAILURE(hr);
hr = UnMarshall_Operation( (LPJOB_INFO_2) lpbJobInfo, fExplicit ); BAIL_ON_FAILURE(hr);
error:
if (hPrinter) { NWApiClosePrinter(hPrinter); }
if(lpbJobInfo){ FreeADsMem(lpbJobInfo); }
RRETURN_EXP_IF_ERR(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATPrintJob::UnMarshall_GeneralInfo
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT CNWCOMPATPrintJob::UnMarshall_GeneralInfo( LPJOB_INFO_2 lpJobInfo2, BOOL fExplicit ) { DATE daTemp = 0; HRESULT hr = S_OK; LPWSTR lpszTemp = NULL; WCHAR szTemp[MAX_PATH];
hr = SetLPTSTRPropertyInCache( _pPropertyCache, TEXT("HostPrintQueue"), _pszPrinterPath, fExplicit );
hr = SetLPTSTRPropertyInCache( _pPropertyCache, TEXT("User"), lpJobInfo2->pUserName, fExplicit );
hr = SetLPTSTRPropertyInCache( _pPropertyCache, TEXT("Description"), lpJobInfo2->pDocument, fExplicit );
hr = SetLPTSTRPropertyInCache( _pPropertyCache, TEXT("Notify"), lpJobInfo2->pNotifyName, fExplicit );
hr = SetSYSTEMTIMEPropertyInCache( _pPropertyCache, TEXT("TimeSubmitted"), lpJobInfo2->Submitted, fExplicit );
hr = SetDWORDPropertyInCache( _pPropertyCache, TEXT("Priority"), lpJobInfo2->Priority, fExplicit );
hr = SetDWORDPropertyInCache( _pPropertyCache, TEXT("TotalPages"), lpJobInfo2-> TotalPages, fExplicit );
hr = SetDATEPropertyInCache( _pPropertyCache, TEXT("StartTime"), lpJobInfo2->StartTime, fExplicit );
hr = SetDATEPropertyInCache( _pPropertyCache, TEXT("UntilTime"), lpJobInfo2->UntilTime, fExplicit );
hr = SetDWORDPropertyInCache( _pPropertyCache, TEXT("Size"), lpJobInfo2->Size, fExplicit );
hr = S_OK;
RRETURN(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATPrintJob::UnMarshall_Operation
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT CNWCOMPATPrintJob::UnMarshall_Operation( LPJOB_INFO_2 lpJobInfo2, BOOL fExplicit ) { HRESULT hr = S_OK;
hr = SetDWORDPropertyInCache( _pPropertyCache, TEXT("Position"), lpJobInfo2->Position, fExplicit ); BAIL_ON_FAILURE(hr);
hr = SetDWORDPropertyInCache( _pPropertyCache, TEXT("PagesPrinted"), lpJobInfo2->PagesPrinted, fExplicit );
BAIL_ON_FAILURE(hr);
hr = SetDATEPropertyInCache( _pPropertyCache, TEXT("TimeElapsed"), lpJobInfo2->Time, fExplicit );
hr = SetDWORDPropertyInCache( _pPropertyCache, TEXT("Status"), lpJobInfo2->Status, fExplicit );
BAIL_ON_FAILURE(hr);
_lStatus = lpJobInfo2->Status;
error:
RRETURN(hr); }
//----------------------------------------------------------------------------
//
// Function: CNWCOMPATPrintJob::MarshallAndSet
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT CNWCOMPATPrintJob::MarshallAndSet( HANDLE hPrinter, LPJOB_INFO_2 lpJobInfo2 ) { LPTSTR pszDescription = NULL; LPTSTR pszNotify = NULL; DWORD dwValue; HRESULT hr = S_OK;
//
// Set Description.
//
hr = GetLPTSTRPropertyFromCache( _pPropertyCache, TEXT("Description"), &pszDescription );
if(SUCCEEDED(hr)){ lpJobInfo2->pDocument = pszDescription; }
//
// Set Notify.
//
hr = GetLPTSTRPropertyFromCache( _pPropertyCache, TEXT("Notify"), &pszNotify );
if(SUCCEEDED(hr)){ lpJobInfo2->pNotifyName = pszNotify; }
//
// Set Priority.
//
hr = GetDWORDPropertyFromCache( _pPropertyCache, TEXT("Priority"), &dwValue );
if(SUCCEEDED(hr)){ lpJobInfo2->Priority = dwValue; }
//
// Set StartTime.
//
hr = GetDATEPropertyFromCache( _pPropertyCache, TEXT("StartTime"), &dwValue );
if(SUCCEEDED(hr)){ lpJobInfo2->StartTime = dwValue; }
//
// Set UntilTime
//
hr = GetDATEPropertyFromCache( _pPropertyCache, TEXT("UntilTime"), &dwValue );
if(SUCCEEDED(hr)){ lpJobInfo2->UntilTime = dwValue; }
/* Clarify the precedence between Notify & NotifyPath
hr = UM_GET_BSTR_PROPERTY(_pGenInfo, NotifyPath, fExplicit); BAIL_ON_FAILURE(hr); */
//
// Set Position.
//
hr = GetDWORDPropertyFromCache( _pPropertyCache, TEXT("Position"), &dwValue );
if(SUCCEEDED(hr)){ lpJobInfo2->Position = dwValue; }
//
// Commit changes.
//
hr = NWApiSetJob( hPrinter, (DWORD) _lJobId, WIN32_API_LEVEL_2, (LPBYTE) lpJobInfo2, 0 ); BAIL_ON_FAILURE(hr);
error: if(pszDescription) FreeADsStr(pszDescription); if(pszNotify) FreeADsStr(pszNotify);
RRETURN(S_OK); }
|