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