Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

847 lines
18 KiB

//---------------------------------------------------------------------------
//
// 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);
}