//--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1996 // // File: cprinter.cxx // // Contents: CNWCOMPATPrinter // // // History: 30-Apr-96 t-ptam (Patrick Tam) Created. // //---------------------------------------------------------------------------- #include "NWCOMPAT.hxx" #pragma hdrstop // // Printer Class // // // Macro-ized implementation. // DEFINE_IDispatch_ExtMgr_Implementation(CNWCOMPATPrintQueue) DEFINE_IADs_TempImplementation(CNWCOMPATPrintQueue) DEFINE_IADs_PutGetImplementation(CNWCOMPATPrintQueue, PrintQueueClass, gdwPrinterTableSize) DEFINE_IADsPropertyList_Implementation(CNWCOMPATPrintQueue, PrintQueueClass, gdwPrinterTableSize) //---------------------------------------------------------------------------- // // Function: CNWCOMPATPrintQueue::CNWCOMPATPrintQueue // // Synopsis: // //---------------------------------------------------------------------------- CNWCOMPATPrintQueue::CNWCOMPATPrintQueue(): _pDispMgr(NULL), _pExtMgr(NULL) { ENLIST_TRACKING(CNWCOMPATPrintQueue); _pPropertyCache = NULL; } //---------------------------------------------------------------------------- // // Function: CNWCOMPATPrintQueue::~CNWCOMPATPrintQueue // // Synopsis: // //---------------------------------------------------------------------------- CNWCOMPATPrintQueue::~CNWCOMPATPrintQueue() { delete _pExtMgr; // created last, destroyed first delete _pDispMgr; delete _pPropertyCache; } //---------------------------------------------------------------------------- // // Function: CNWCOMPATPrintQueue:: CreatePrintQueue // // Synopsis: // //---------------------------------------------------------------------------- HRESULT CNWCOMPATPrintQueue:: CreatePrintQueue( LPTSTR pszADsParent, LPTSTR pszPrinterName, DWORD dwObjectState, REFIID riid, LPVOID * ppvoid ) { CNWCOMPATPrintQueue *pPrintQueue = NULL; HRESULT hr = S_OK; LPWSTR lpszTempName = NULL; // // Create the printer object // hr = AllocatePrintQueueObject( &pPrintQueue ); BAIL_ON_FAILURE(hr); // // Initialize the core object // hr = pPrintQueue->InitializeCoreObject( pszADsParent, pszPrinterName, PRINTER_CLASS_NAME, PRINTER_SCHEMA_NAME, CLSID_NWCOMPATPrintQueue, dwObjectState ); BAIL_ON_FAILURE(hr); // // Query for the specified interface. // hr = pPrintQueue->QueryInterface( riid, (void **)ppvoid ); BAIL_ON_FAILURE(hr); // // Make Unc Printer name for Win32 API. // hr = BuildPrinterNameFromADsPath( pszADsParent, pszPrinterName, pPrintQueue->_szUncPrinterName ); BAIL_ON_FAILURE(hr); // // Return. // pPrintQueue->Release(); hr = pPrintQueue->_pExtMgr->FinalInitializeExtensions(); BAIL_ON_FAILURE(hr); RRETURN(hr); error: delete pPrintQueue; RRETURN_EXP_IF_ERR(hr); } //---------------------------------------------------------------------------- // // Function: CNWCOMPATPrintQueue::QueryInterface // // Synopsis: // //---------------------------------------------------------------------------- STDMETHODIMP CNWCOMPATPrintQueue::QueryInterface( REFIID riid, LPVOID FAR* ppvObj ) { if(!ppvObj) { RRETURN(E_POINTER); } if (IsEqualIID(riid, IID_IUnknown)) { *ppvObj = (IADsPrintQueue FAR *)this; } else if (IsEqualIID(riid, IID_IDispatch)) { *ppvObj = (IADsPrintQueue FAR *)this; } else if (IsEqualIID(riid, IID_ISupportErrorInfo)) { *ppvObj = (ISupportErrorInfo FAR *) this; } else if (IsEqualIID(riid, IID_IADs)) { *ppvObj = (IADsPrintQueue FAR *) this; } else if (IsEqualIID(riid, IID_IADsPrintQueue)) { *ppvObj = (IADsPrintQueue FAR *) this; } else if (IsEqualIID(riid, IID_IADsPrintQueueOperations)) { *ppvObj = (IADsPrintQueueOperations 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: CNWCOMPATPrintQueue::InterfaceSupportsErrorInfo // // Synopsis: // //---------------------------------------------------------------------------- STDMETHODIMP CNWCOMPATPrintQueue::InterfaceSupportsErrorInfo( THIS_ REFIID riid ) { if (IsEqualIID(riid, IID_IADs) || IsEqualIID(riid, IID_IADsPrintQueue) || IsEqualIID(riid, IID_IADsPrintQueueOperations) || IsEqualIID(riid, IID_IADsPropertyList)) { RRETURN(S_OK); } else { RRETURN(S_FALSE); } } //---------------------------------------------------------------------------- // // Function: CNWCOMPATPrintQueue::SetInfo // // Synopsis: // //---------------------------------------------------------------------------- STDMETHODIMP CNWCOMPATPrintQueue::SetInfo(THIS) { HANDLE hPrinter = NULL; HRESULT hr = S_OK; LPBYTE lpbBuffer = NULL; // // Make sure object is bound to a tangible resource. // if (GetObjectState() == ADS_OBJECT_UNBOUND) { /* hr = NWApiAddPrinter(); BAIL_ON_FAILURE(hr); */ SetObjectState(ADS_OBJECT_BOUND); } // // Open a handle to a printer. // hr = NWApiOpenPrinter( _szUncPrinterName, &hPrinter, PRINTER_ALL_ACCESS ); BAIL_ON_FAILURE(hr); // // Get Printer Info structure. // hr = NWApiGetPrinter( hPrinter, WIN32_API_LEVEL_2, &lpbBuffer ); BAIL_ON_FAILURE(hr); // // Set info. // hr = MarshallAndSet( hPrinter, (LPPRINTER_INFO_2) lpbBuffer ); error: // // Close Printer handle. // if (hPrinter) { NWApiClosePrinter(hPrinter); } if (lpbBuffer) { FreeADsMem((void*)lpbBuffer); } RRETURN_EXP_IF_ERR(hr); } //---------------------------------------------------------------------------- // // Function: CNWCOMPATPrintQueue::GetInfo // // Synopsis: // //---------------------------------------------------------------------------- STDMETHODIMP CNWCOMPATPrintQueue::GetInfo(THIS) { _pPropertyCache->flushpropcache(); RRETURN (GetInfo( TRUE, PRINTER_API_LEVEL )); } //---------------------------------------------------------------------------- // // Function: CNWCOMPATPrintQueue::AllocatePrintQueueObject // // Synopsis: // //---------------------------------------------------------------------------- HRESULT CNWCOMPATPrintQueue::AllocatePrintQueueObject( CNWCOMPATPrintQueue FAR * FAR * ppPrintQueue ) { CNWCOMPATPrintQueue FAR * pPrintQueue = NULL; CAggregatorDispMgr FAR * pDispMgr = NULL; CADsExtMgr FAR * pExtensionMgr = NULL; HRESULT hr = S_OK; // // Allocate memory for a PrintQueue object. // pPrintQueue = new CNWCOMPATPrintQueue(); if (pPrintQueue == 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_IADsPrintQueue, (IADsPrintQueue *) pPrintQueue, DISPID_REGULAR ); BAIL_ON_FAILURE(hr); hr = LoadTypeInfoEntry( pDispMgr, LIBID_ADs, IID_IADsPrintQueueOperations, (IADsPrintQueueOperations *) pPrintQueue, DISPID_REGULAR ); BAIL_ON_FAILURE(hr); hr = LoadTypeInfoEntry( pDispMgr, LIBID_ADs, IID_IADsPropertyList, (IADsPropertyList *) pPrintQueue, DISPID_VALUE ); BAIL_ON_FAILURE(hr); hr = CPropertyCache::createpropertycache( PrintQueueClass, gdwPrinterTableSize, (CCoreADsObject *)pPrintQueue, &(pPrintQueue->_pPropertyCache) ); BAIL_ON_FAILURE(hr); pDispMgr->RegisterPropertyCache( pPrintQueue->_pPropertyCache ); hr = ADSILoadExtensionManager( PRINTER_CLASS_NAME, (IADsPrintQueue *) pPrintQueue, pDispMgr, &pExtensionMgr ); BAIL_ON_FAILURE(hr); // // Return. // pPrintQueue->_pDispMgr = pDispMgr; pPrintQueue->_pExtMgr = pExtensionMgr; *ppPrintQueue = pPrintQueue; RRETURN(hr); error: delete pDispMgr; delete pPrintQueue; delete pExtensionMgr; RRETURN(hr); } //---------------------------------------------------------------------------- // // Function: CNWCOMPATPrintQueue::GetInfo // // Synopsis: // //---------------------------------------------------------------------------- STDMETHODIMP CNWCOMPATPrintQueue::GetInfo( THIS_ BOOL fExplicit, DWORD dwPropertyID ) { HANDLE hPrinter = NULL; HRESULT hr = S_OK; LPBYTE lpbPrinterInfo = NULL; // // Open a handle to a printer. // hr = NWApiOpenPrinter( _szUncPrinterName, &hPrinter, PRINTER_ACCESS_USE ); BAIL_ON_FAILURE(hr); // // Get printer's info. // hr = NWApiGetPrinter( hPrinter, WIN32_API_LEVEL_2, &lpbPrinterInfo ); BAIL_ON_FAILURE(hr); // // Unmarshall. // hr = UnMarshall_GeneralInfo( (LPPRINTER_INFO_2) lpbPrinterInfo, fExplicit ); BAIL_ON_FAILURE(hr); hr = UnMarshall_Operation( (LPPRINTER_INFO_2) lpbPrinterInfo, fExplicit ); BAIL_ON_FAILURE(hr); error: if(lpbPrinterInfo){ FreeADsMem(lpbPrinterInfo); } if (hPrinter) { NWApiClosePrinter(hPrinter); } RRETURN_EXP_IF_ERR(hr); } //---------------------------------------------------------------------------- // // Function: CNWCOMPATPrintQueue::UnMarshall_GeneralInfo // // Synopsis: // //---------------------------------------------------------------------------- HRESULT CNWCOMPATPrintQueue::UnMarshall_GeneralInfo( LPPRINTER_INFO_2 lpPrinterInfo2, BOOL fExplicit ) { HRESULT hr = S_OK; DATE daStartTime = 0; DATE daUntilTime = 0; VARIANT vPortNames; hr = SetLPTSTRPropertyInCache(_pPropertyCache, TEXT("PrinterPath"), _szUncPrinterName, fExplicit ); hr = SetLPTSTRPropertyInCache(_pPropertyCache, TEXT("Model"), lpPrinterInfo2->pDriverName, fExplicit ); hr = SetLPTSTRPropertyInCache(_pPropertyCache, TEXT("Datatype"), lpPrinterInfo2->pDatatype, fExplicit ); hr = SetLPTSTRPropertyInCache(_pPropertyCache, TEXT("PrintProcessor"), lpPrinterInfo2->pPrintProcessor, fExplicit ); hr = SetLPTSTRPropertyInCache(_pPropertyCache, TEXT("Description"), lpPrinterInfo2->pComment, fExplicit ); hr = SetLPTSTRPropertyInCache(_pPropertyCache, TEXT("Location"), lpPrinterInfo2->pLocation, fExplicit ); hr = SetDATEPropertyInCache(_pPropertyCache, TEXT("StartTime"), lpPrinterInfo2->StartTime, fExplicit ); hr = SetDATEPropertyInCache(_pPropertyCache, TEXT("UntilTime"), lpPrinterInfo2->UntilTime, fExplicit ); hr = SetDWORDPropertyInCache(_pPropertyCache, TEXT("DefaultJobPriority"), lpPrinterInfo2->DefaultPriority, fExplicit ); hr = SetDWORDPropertyInCache(_pPropertyCache, TEXT("Priority"), lpPrinterInfo2->Priority, fExplicit ); hr = SetLPTSTRPropertyInCache(_pPropertyCache, TEXT("BannerPage"), lpPrinterInfo2->pSepFile, fExplicit ); hr = SetDelimitedStringPropertyInCache(_pPropertyCache, TEXT("PrintDevices"), lpPrinterInfo2->pPortName, fExplicit ); hr = S_OK; RRETURN(hr); } //---------------------------------------------------------------------------- // // Function: CNWCOMPATPrintQueue::UnMarshall_Operation // // Synopsis: // //---------------------------------------------------------------------------- HRESULT CNWCOMPATPrintQueue::UnMarshall_Operation( LPPRINTER_INFO_2 lpPrinterInfo2, BOOL fExplicit ) { HRESULT hr = S_OK; hr = SetDWORDPropertyInCache(_pPropertyCache, TEXT("Status"), lpPrinterInfo2->Status, fExplicit ); RRETURN(hr); } //---------------------------------------------------------------------------- // // Function: CNWCOMPATPrintQueue:: MarshallAndSet // // Synopsis: // //---------------------------------------------------------------------------- HRESULT CNWCOMPATPrintQueue::MarshallAndSet( HANDLE hPrinter, LPPRINTER_INFO_2 lpPrinterInfo2 ) { LPTSTR pszDriverName = NULL; LPTSTR pszDatatype = NULL; LPTSTR pszDescription = NULL; LPTSTR pszLocation = NULL; LPTSTR pszBannerPage = NULL; LPTSTR pszHostComputer = NULL; LPTSTR pszPrintProcessor = NULL; HRESULT hr = S_OK; LPTSTR pszPorts = NULL; VARIANT vTemp; DWORD dwTimeValue; DWORD dwPriority; // // Set Model. // hr = GetLPTSTRPropertyFromCache( _pPropertyCache, TEXT("Model"), &pszDriverName ); if (SUCCEEDED(hr)){ lpPrinterInfo2->pDriverName = (LPTSTR)pszDriverName; } // // Set Datatype. // hr = GetLPTSTRPropertyFromCache( _pPropertyCache, TEXT("Datatype"), &pszDatatype ); if (SUCCEEDED(hr)){ lpPrinterInfo2->pDatatype = (LPTSTR)pszDatatype; } // // Set Description. // hr = GetLPTSTRPropertyFromCache( _pPropertyCache, TEXT("Description"), &pszDescription ); if (SUCCEEDED(hr)){ lpPrinterInfo2->pComment = (LPTSTR)pszDescription; } // // Set Location. // hr = GetLPTSTRPropertyFromCache( _pPropertyCache, TEXT("Location"), &pszLocation ); if (SUCCEEDED(hr)){ lpPrinterInfo2->pLocation = (LPTSTR)pszLocation; } // // Set Priority. // hr = GetDWORDPropertyFromCache( _pPropertyCache, TEXT("Priority"), &dwPriority ); if(SUCCEEDED(hr)){ lpPrinterInfo2->Priority = dwPriority; } // // Set StartTime. // hr = GetDATEPropertyFromCache( _pPropertyCache, TEXT("StartTime"), &dwTimeValue ); if(SUCCEEDED(hr)){ lpPrinterInfo2->StartTime = dwTimeValue; } // // Set UntilTime. // hr = GetDATEPropertyFromCache( _pPropertyCache, TEXT("UntilTime"), &dwTimeValue ); if(SUCCEEDED(hr)){ lpPrinterInfo2->UntilTime = dwTimeValue; } // // Set DefaultJobPriority. // hr = GetDWORDPropertyFromCache( _pPropertyCache, TEXT("DefaultJobPriority"), &dwPriority ); if(SUCCEEDED(hr)){ lpPrinterInfo2->DefaultPriority = dwPriority; } // // Set BannerPage. // hr = GetLPTSTRPropertyFromCache( _pPropertyCache, TEXT("BannerPage"), &pszBannerPage ); if(SUCCEEDED(hr)){ lpPrinterInfo2->pSepFile = pszBannerPage; } // // Set PrintProcessor. // hr = GetLPTSTRPropertyFromCache( _pPropertyCache, TEXT("PrintProcessor"), &pszPrintProcessor ); if(SUCCEEDED(hr)){ lpPrinterInfo2->pPrintProcessor = pszPrintProcessor; } // // Set Ports. // hr = GetDelimitedStringPropertyFromCache( _pPropertyCache, TEXT("PrintDevices"), &pszPorts ); if(SUCCEEDED(hr)){ lpPrinterInfo2->pPortName = pszPorts; } // // Commit changes. // hr = NWApiSetPrinter( hPrinter, WIN32_API_LEVEL_2, (LPBYTE) lpPrinterInfo2, 0 ); BAIL_ON_FAILURE(hr); error: if(pszDriverName) FreeADsStr(pszDriverName); if(pszDatatype) FreeADsStr(pszDatatype); if(pszDescription) FreeADsStr(pszDescription); if(pszLocation) FreeADsStr(pszLocation); if(pszBannerPage) FreeADsStr(pszBannerPage); if(pszPrintProcessor) FreeADsStr(pszPrintProcessor); if(pszPorts) FreeADsStr(pszPorts); RRETURN(hr); }