358 lines
8.2 KiB
C++
358 lines
8.2 KiB
C++
|
//---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1992 - 1996
|
||
|
//
|
||
|
// File: cenumjob.cxx
|
||
|
//
|
||
|
// Contents: NetWare 3.12 JobCollection Enumeration Code
|
||
|
//
|
||
|
// CNWCOMPATJobCollectionEnum::Create
|
||
|
// CNWCOMPATJobCollectionEnum::GetJobObject
|
||
|
// CNWCOMPATJobCollectionEnum::EnumJobMembers
|
||
|
// CNWCOMPATJobCollectionEnum::Next
|
||
|
//
|
||
|
// History: 08-May-96 t-ptam (Patrick Tam) Created.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#include "NWCOMPAT.hxx"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: CNWCOMPATEnumVariant::Create
|
||
|
//
|
||
|
// Synopsis:
|
||
|
//
|
||
|
// Arguments: [pCollection]
|
||
|
// [ppEnumVariant]
|
||
|
//
|
||
|
// Returns: HRESULT
|
||
|
//
|
||
|
// Modifies:
|
||
|
//
|
||
|
// History: 08-Mag-96 t-ptam (Patrick Tam) Created.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
HRESULT
|
||
|
CNWCOMPATJobCollectionEnum::Create(
|
||
|
CNWCOMPATJobCollectionEnum FAR* FAR* ppEnumVariant,
|
||
|
BSTR PrinterName,
|
||
|
CCredentials &Credentials
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
CNWCOMPATJobCollectionEnum FAR* pEnumVariant = NULL;
|
||
|
POBJECTINFO pPrinterObjectInfo = NULL;
|
||
|
WCHAR szUncPrinterName[MAX_PATH];
|
||
|
|
||
|
//
|
||
|
// Validate input parameters.
|
||
|
//
|
||
|
|
||
|
if (!(ppEnumVariant) || !(PrinterName)) {
|
||
|
RRETURN(E_ADS_BAD_PARAMETER);
|
||
|
}
|
||
|
|
||
|
*ppEnumVariant = NULL;
|
||
|
|
||
|
//
|
||
|
// Allocate a Collection Enumerator object.
|
||
|
//
|
||
|
|
||
|
pEnumVariant = new CNWCOMPATJobCollectionEnum();
|
||
|
if (!pEnumVariant) {
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
hr = ADsAllocString(PrinterName, &pEnumVariant->_PrinterName);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
//
|
||
|
// Make Unc Name to open a printer.
|
||
|
//
|
||
|
|
||
|
hr = BuildObjectInfo(
|
||
|
PrinterName,
|
||
|
&pPrinterObjectInfo
|
||
|
);
|
||
|
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
pEnumVariant->_Credentials = Credentials;
|
||
|
|
||
|
//
|
||
|
// Get a handle to the bindery this object resides on.
|
||
|
//
|
||
|
|
||
|
hr = NWApiGetBinderyHandle(
|
||
|
&pEnumVariant->_hConn,
|
||
|
pPrinterObjectInfo->ComponentArray[0],
|
||
|
pEnumVariant->_Credentials
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
|
||
|
ADsAssert(pPrinterObjectInfo->NumComponents == 2);
|
||
|
|
||
|
wcscpy(PrinterName,
|
||
|
pPrinterObjectInfo->ComponentArray[0]);
|
||
|
|
||
|
MakeUncName (PrinterName,
|
||
|
szUncPrinterName);
|
||
|
|
||
|
wcscat(szUncPrinterName,TEXT("\\"));
|
||
|
wcscat(szUncPrinterName, pPrinterObjectInfo->ComponentArray[1]);
|
||
|
|
||
|
hr = NWApiOpenPrinter(
|
||
|
szUncPrinterName,
|
||
|
&pEnumVariant->_hPrinter,
|
||
|
PRINTER_ACCESS_USE
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
//
|
||
|
// Return.
|
||
|
//
|
||
|
|
||
|
*ppEnumVariant = pEnumVariant;
|
||
|
|
||
|
if(pPrinterObjectInfo){
|
||
|
FreeObjectInfo(pPrinterObjectInfo);
|
||
|
}
|
||
|
RRETURN(hr);
|
||
|
|
||
|
error:
|
||
|
if(pPrinterObjectInfo){
|
||
|
FreeObjectInfo(pPrinterObjectInfo);
|
||
|
}
|
||
|
|
||
|
delete pEnumVariant;
|
||
|
|
||
|
NW_RRETURN_EXP_IF_ERR(hr);
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: CNWCOMPATJobCollectionEnum::CNWCOMPATJobCollectionEnum
|
||
|
//
|
||
|
// Synopsis:
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
CNWCOMPATJobCollectionEnum::CNWCOMPATJobCollectionEnum():
|
||
|
_PrinterName(NULL),
|
||
|
_hPrinter(NULL),
|
||
|
_pBuffer(NULL),
|
||
|
_dwReturned(0),
|
||
|
_dwCurrentObject(0),
|
||
|
_hConn(NULL)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: CNWCOMPATJobCollectionEnum::~CNWCOMPATJobCollectionEnum
|
||
|
//
|
||
|
// Synopsis:
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
CNWCOMPATJobCollectionEnum::~CNWCOMPATJobCollectionEnum()
|
||
|
{
|
||
|
if (_PrinterName) {
|
||
|
SysFreeString(_PrinterName);
|
||
|
}
|
||
|
|
||
|
if (_hPrinter) {
|
||
|
NWApiClosePrinter(_hPrinter);
|
||
|
}
|
||
|
|
||
|
if (_pBuffer) {
|
||
|
FreeADsMem(_pBuffer);
|
||
|
}
|
||
|
|
||
|
if (_hConn)
|
||
|
NWApiReleaseBinderyHandle(_hConn);
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: CNWCOMPATJobCollectionEnum::EnumJobMembers
|
||
|
//
|
||
|
// Synopsis:
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
HRESULT
|
||
|
CNWCOMPATJobCollectionEnum::EnumJobMembers(
|
||
|
ULONG cElements,
|
||
|
VARIANT FAR* pvar,
|
||
|
ULONG FAR* pcElementFetched
|
||
|
)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
IDispatch *pDispatch = NULL;
|
||
|
DWORD i = 0;
|
||
|
|
||
|
while (i < cElements) {
|
||
|
|
||
|
hr = GetJobObject(&pDispatch);
|
||
|
if (hr == S_FALSE) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
VariantInit(&pvar[i]);
|
||
|
pvar[i].vt = VT_DISPATCH;
|
||
|
pvar[i].pdispVal = pDispatch;
|
||
|
(*pcElementFetched)++;
|
||
|
i++;
|
||
|
}
|
||
|
RRETURN(hr);
|
||
|
}
|
||
|
|
||
|
//----------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: CNWCOMPATJobCollectionEnum::GetJobObject
|
||
|
//
|
||
|
// Synopsis:
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
HRESULT
|
||
|
CNWCOMPATJobCollectionEnum::GetJobObject(
|
||
|
IDispatch ** ppDispatch
|
||
|
)
|
||
|
{
|
||
|
DWORD dwBuf = 0;
|
||
|
DWORD dwJobInQueue = 0;
|
||
|
HRESULT hr = S_OK;
|
||
|
LPBYTE lpbPrinterInfo = NULL;
|
||
|
LPJOB_INFO_1 lpJobInfo = NULL;
|
||
|
|
||
|
//
|
||
|
// Fill _pBuffer with JobID. Win32 API returns all jobs in one shot.
|
||
|
//
|
||
|
|
||
|
if (!_pBuffer) {
|
||
|
|
||
|
//
|
||
|
// Get the number of print jobs that have been queued for the printer.
|
||
|
//
|
||
|
|
||
|
hr = NWApiGetPrinter(
|
||
|
_hPrinter,
|
||
|
WIN32_API_LEVEL_2,
|
||
|
&lpbPrinterInfo
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
dwJobInQueue = ((LPPRINTER_INFO_2)lpbPrinterInfo)->cJobs;
|
||
|
|
||
|
//
|
||
|
// Enumerate for all the jobs.
|
||
|
//
|
||
|
|
||
|
hr = NWApiEnumJobs(
|
||
|
_hPrinter,
|
||
|
FIRST_PRINTJOB,
|
||
|
dwJobInQueue,
|
||
|
WIN32_API_LEVEL_1,
|
||
|
&_pBuffer,
|
||
|
&dwBuf,
|
||
|
&_dwReturned
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Traverse the buffer and return a PrintJob object.
|
||
|
//
|
||
|
|
||
|
if (_dwCurrentObject < _dwReturned) {
|
||
|
|
||
|
//
|
||
|
// Go to the next structure in the buffer.
|
||
|
//
|
||
|
|
||
|
lpJobInfo = (LPJOB_INFO_1)_pBuffer + _dwCurrentObject;
|
||
|
|
||
|
//
|
||
|
// Create a print job object.
|
||
|
//
|
||
|
|
||
|
hr = CNWCOMPATPrintJob::CreatePrintJob(
|
||
|
_PrinterName,
|
||
|
lpJobInfo->JobId,
|
||
|
_Credentials,
|
||
|
ADS_OBJECT_BOUND,
|
||
|
IID_IDispatch,
|
||
|
(void **)ppDispatch
|
||
|
);
|
||
|
BAIL_ON_FAILURE(hr);
|
||
|
|
||
|
//
|
||
|
// Return.
|
||
|
//
|
||
|
|
||
|
_dwCurrentObject++;
|
||
|
|
||
|
if(lpbPrinterInfo){
|
||
|
FreeADsMem(lpbPrinterInfo);
|
||
|
}
|
||
|
RRETURN(S_OK);
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
|
||
|
if(lpbPrinterInfo){
|
||
|
FreeADsMem(lpbPrinterInfo);
|
||
|
}
|
||
|
|
||
|
*ppDispatch = NULL;
|
||
|
|
||
|
RRETURN(S_FALSE);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: CNWCOMPATJobCollectionEnum::Next
|
||
|
//
|
||
|
// Synopsis: Returns cElements number of requested NetOle objects in the
|
||
|
// array supplied in pvar.
|
||
|
//
|
||
|
// Arguments: [cElements] -- The number of elements requested by client
|
||
|
// [pvar] -- ptr to array of VARIANTs to for return objects
|
||
|
// [pcElementFetched] -- if non-NULL, then number of elements
|
||
|
// -- actually returned is placed here
|
||
|
//
|
||
|
// Returns: HRESULT -- S_OK if number of elements requested are returned
|
||
|
// -- S_FALSE if number of elements is < requested
|
||
|
//
|
||
|
// Modifies:
|
||
|
//
|
||
|
// History: 11-3-95 krishnag Created.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
STDMETHODIMP
|
||
|
CNWCOMPATJobCollectionEnum::Next(
|
||
|
ULONG cElements,
|
||
|
VARIANT FAR* pvar,
|
||
|
ULONG FAR* pcElementFetched
|
||
|
)
|
||
|
{
|
||
|
ULONG cElementFetched = 0;
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
hr = EnumJobMembers(
|
||
|
cElements,
|
||
|
pvar,
|
||
|
&cElementFetched
|
||
|
);
|
||
|
|
||
|
if (pcElementFetched) {
|
||
|
*pcElementFetched = cElementFetched;
|
||
|
}
|
||
|
NW_RRETURN_EXP_IF_ERR(hr);
|
||
|
}
|
||
|
|
||
|
|