440 lines
9.1 KiB
C++
440 lines
9.1 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 1995 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
cprinter.cxx
|
||
|
|
||
|
Abstract:
|
||
|
Contains methods for PrintQueue object, GeneralInfo property set
|
||
|
and Operation property set for the Print Queue object for the Windows NT
|
||
|
provider
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Ram Viswanathan (ramv) 11-09-95
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "winnt.hxx"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
//
|
||
|
// CWinNTPrintQueue
|
||
|
//
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::put_Model(THIS_ BSTR bstrModel)
|
||
|
{
|
||
|
PUT_PROPERTY_BSTR((IADsPrintQueue *)this, Model);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::get_Model(THIS_ BSTR FAR* retval)
|
||
|
{
|
||
|
GET_PROPERTY_BSTR((IADsPrintQueue *)this, Model);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::put_Datatype(THIS_ BSTR bstrDatatype)
|
||
|
{
|
||
|
PUT_PROPERTY_BSTR((IADsPrintQueue *)this, Datatype);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::get_Datatype(THIS_ BSTR *retval)
|
||
|
{
|
||
|
GET_PROPERTY_BSTR((IADsPrintQueue *)this, Datatype);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::put_Description(THIS_ BSTR bstrDescription)
|
||
|
{
|
||
|
PUT_PROPERTY_BSTR((IADsPrintQueue *)this, Description);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::get_Description(THIS_ BSTR FAR* retval)
|
||
|
{
|
||
|
GET_PROPERTY_BSTR((IADsPrintQueue *)this, Description);
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP CWinNTPrintQueue::put_Location(THIS_ BSTR bstrLocation)
|
||
|
{
|
||
|
PUT_PROPERTY_BSTR((IADsPrintQueue *)this, Location);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CWinNTPrintQueue::get_Location(THIS_ BSTR FAR* retval)
|
||
|
{
|
||
|
GET_PROPERTY_BSTR((IADsPrintQueue *)this, Location);
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::put_Priority(THIS_ LONG lPriority)
|
||
|
{
|
||
|
PUT_PROPERTY_LONG((IADsPrintQueue *)this, Priority);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::get_Priority(THIS_ LONG FAR* retval)
|
||
|
{
|
||
|
GET_PROPERTY_LONG((IADsPrintQueue *)this, Priority);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::put_StartTime(THIS_ DATE daStartTime)
|
||
|
{
|
||
|
PUT_PROPERTY_DATE((IADsPrintQueue *)this, StartTime);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::get_StartTime(THIS_ DATE FAR* retval)
|
||
|
{
|
||
|
GET_PROPERTY_DATE((IADsPrintQueue *)this, StartTime);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::put_UntilTime(THIS_ DATE daUntilTime)
|
||
|
{
|
||
|
PUT_PROPERTY_DATE((IADsPrintQueue *)this, UntilTime);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::get_UntilTime(THIS_ DATE FAR* retval)
|
||
|
{
|
||
|
GET_PROPERTY_DATE((IADsPrintQueue *)this, UntilTime);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::put_DefaultJobPriority(THIS_ LONG lDefaultJobPriority)
|
||
|
{
|
||
|
PUT_PROPERTY_LONG((IADsPrintQueue *)this, DefaultJobPriority);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::get_DefaultJobPriority(THIS_ LONG FAR* retval)
|
||
|
{
|
||
|
GET_PROPERTY_LONG((IADsPrintQueue *)this, DefaultJobPriority);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::put_BannerPage(THIS_ BSTR bstrBannerPage)
|
||
|
{
|
||
|
PUT_PROPERTY_BSTR((IADsPrintQueue *)this, BannerPage);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::get_BannerPage(THIS_ BSTR FAR* retval)
|
||
|
{
|
||
|
GET_PROPERTY_BSTR((IADsPrintQueue *)this, BannerPage);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::get_PrinterPath(THIS_ BSTR FAR* retval)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
hr = ADsAllocString(_pszPrinterName, retval);
|
||
|
RRETURN_EXP_IF_ERR(hr);
|
||
|
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::put_PrinterPath(THIS_ BSTR bstrPrinterPath)
|
||
|
{
|
||
|
//
|
||
|
// Cannot change this in Windows NT!
|
||
|
//
|
||
|
RRETURN_EXP_IF_ERR(E_ADS_PROPERTY_NOT_SUPPORTED);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::get_PrintProcessor(THIS_ BSTR FAR* retval)
|
||
|
{
|
||
|
GET_PROPERTY_BSTR((IADsPrintQueue *)this, PrintProcessor);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::put_PrintProcessor(THIS_ BSTR bstrPrintProcessor)
|
||
|
{
|
||
|
PUT_PROPERTY_BSTR((IADsPrintQueue *)this, PrintProcessor);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::get_PrintDevices(THIS_ VARIANT FAR* retval)
|
||
|
{
|
||
|
GET_PROPERTY_VARIANT((IADsPrintQueue *)this, PrintDevices);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::put_PrintDevices(THIS_ VARIANT vPrintDevices)
|
||
|
{
|
||
|
PUT_PROPERTY_VARIANT((IADsPrintQueue *)this, PrintDevices);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::get_NetAddresses(THIS_ VARIANT FAR* retval)
|
||
|
{
|
||
|
GET_PROPERTY_VARIANT((IADsPrintQueue *)this, NetAddresses);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::put_NetAddresses(THIS_ VARIANT vNetAddresses)
|
||
|
{
|
||
|
PUT_PROPERTY_VARIANT((IADsPrintQueue *)this, NetAddresses);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Class CWinNTPrintQueue
|
||
|
//
|
||
|
|
||
|
/* IADsFSPrintQueueOperation methods */
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::PrintJobs(
|
||
|
THIS_ IADsCollection * FAR* ppCollection
|
||
|
)
|
||
|
{
|
||
|
//
|
||
|
// The job collection object is created and it is passed the printer
|
||
|
// name. It uses this to create a printer object
|
||
|
//
|
||
|
|
||
|
HRESULT hr = S_OK;
|
||
|
CWinNTPrintJobsCollection * pJobsCollection = NULL;
|
||
|
|
||
|
|
||
|
hr = CWinNTPrintJobsCollection::Create(_ADsPath,
|
||
|
_Credentials,
|
||
|
&pJobsCollection);
|
||
|
|
||
|
BAIL_IF_ERROR(hr);
|
||
|
|
||
|
hr = pJobsCollection->QueryInterface(IID_IADsCollection,
|
||
|
(void **) ppCollection);
|
||
|
|
||
|
BAIL_IF_ERROR(hr);
|
||
|
|
||
|
pJobsCollection->Release();
|
||
|
|
||
|
cleanup:
|
||
|
|
||
|
if(FAILED(hr)){
|
||
|
delete pJobsCollection;
|
||
|
}
|
||
|
|
||
|
RRETURN_EXP_IF_ERR(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//+------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: CWinNTPrintQueue::Pause
|
||
|
//
|
||
|
// Synopsis: Binds to real printer as specified in _bstrPrinterName
|
||
|
// and attempts to pause the real printer.
|
||
|
//
|
||
|
// Arguments: none
|
||
|
//
|
||
|
// Returns: HRESULT.
|
||
|
//
|
||
|
// Modifies: nothing
|
||
|
//
|
||
|
// History: 11-07-95 RamV Created
|
||
|
// Appropriated from Old NetOle Code.
|
||
|
//
|
||
|
//---------------------------------------------------------------------------
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::Pause(THIS)
|
||
|
{
|
||
|
|
||
|
BOOL fStatus = FALSE;
|
||
|
PRINTER_DEFAULTS PrinterDefaults = {0, 0, PRINTER_ACCESS_ADMINISTER};
|
||
|
HANDLE hPrinter = NULL;
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
|
||
|
fStatus = OpenPrinter(
|
||
|
(LPTSTR)_pszPrinterName,
|
||
|
&hPrinter,
|
||
|
&PrinterDefaults);
|
||
|
|
||
|
if (!fStatus) {
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
fStatus = SetPrinter(hPrinter,
|
||
|
0,
|
||
|
NULL,
|
||
|
PRINTER_CONTROL_PAUSE);
|
||
|
if (!fStatus) {
|
||
|
goto error;
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
fStatus = ClosePrinter(hPrinter);
|
||
|
|
||
|
RRETURN(S_OK);
|
||
|
|
||
|
error:
|
||
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
||
|
if(hPrinter)
|
||
|
fStatus = ClosePrinter(hPrinter);
|
||
|
RRETURN_EXP_IF_ERR(hr);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: CWinNTPrintQueue::Resume
|
||
|
//
|
||
|
// Synopsis: Binds to real printer as specified in _bstrPrinterName and
|
||
|
// attempts to resume the real printer.
|
||
|
//
|
||
|
// Arguments: void
|
||
|
//
|
||
|
// Returns: HRESULT.
|
||
|
//
|
||
|
// Modifies:
|
||
|
//
|
||
|
// History: 11-07-95 RamV Created
|
||
|
// Appropriated from old NetOle Project
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::Resume(THIS)
|
||
|
{
|
||
|
|
||
|
BOOL fStatus = FALSE;
|
||
|
PRINTER_DEFAULTS PrinterDefaults = {0, 0, PRINTER_ACCESS_ADMINISTER};
|
||
|
HANDLE hPrinter = NULL;
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
|
||
|
fStatus = OpenPrinter(
|
||
|
(LPTSTR)_pszPrinterName,
|
||
|
&hPrinter,
|
||
|
&PrinterDefaults);
|
||
|
|
||
|
if (!fStatus) {
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
|
||
|
fStatus = SetPrinter(hPrinter,
|
||
|
0,
|
||
|
NULL,
|
||
|
PRINTER_CONTROL_RESUME);
|
||
|
if (!fStatus) {
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
fStatus = ClosePrinter(hPrinter);
|
||
|
|
||
|
RRETURN(S_OK);
|
||
|
|
||
|
error:
|
||
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
||
|
if(hPrinter)
|
||
|
fStatus = ClosePrinter(hPrinter);
|
||
|
RRETURN_EXP_IF_ERR(hr);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Function: CWinNTPrintQueue::Purge
|
||
|
//
|
||
|
// Synopsis: Binds to real printer as specified in _PrinterName and attempts
|
||
|
// to purge the real printer.
|
||
|
//
|
||
|
// Arguments: void
|
||
|
//
|
||
|
// Returns: HRESULT.
|
||
|
//
|
||
|
// Modifies:
|
||
|
//
|
||
|
// History: 11-07-95 RamV Created
|
||
|
// Appropriated from old NetOle Code
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::Purge(THIS)
|
||
|
{
|
||
|
BOOL fStatus = FALSE;
|
||
|
PRINTER_DEFAULTS PrinterDefaults = {0, 0, PRINTER_ACCESS_ADMINISTER};
|
||
|
PRINTER_INFO_2 PrinterInfo2;
|
||
|
HANDLE hPrinter = NULL;
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
|
||
|
fStatus = OpenPrinter(
|
||
|
(LPTSTR)_pszPrinterName,
|
||
|
&hPrinter,
|
||
|
&PrinterDefaults);
|
||
|
|
||
|
if (!fStatus) {
|
||
|
goto error;
|
||
|
}
|
||
|
|
||
|
fStatus = SetPrinter(hPrinter,
|
||
|
0,
|
||
|
NULL,
|
||
|
PRINTER_CONTROL_PURGE);
|
||
|
if (!fStatus) {
|
||
|
goto error;
|
||
|
|
||
|
}
|
||
|
|
||
|
fStatus = ClosePrinter(hPrinter);
|
||
|
|
||
|
RRETURN(S_OK);
|
||
|
|
||
|
error:
|
||
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
||
|
if(hPrinter)
|
||
|
fStatus = ClosePrinter(hPrinter);
|
||
|
RRETURN_EXP_IF_ERR(hr);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP
|
||
|
CWinNTPrintQueue::get_Status(THIS_ long FAR* retval)
|
||
|
{
|
||
|
HRESULT hr =S_OK;
|
||
|
LPPRINTER_INFO_2 lpPrinterInfo2 = NULL;
|
||
|
DWORD dwStatus;
|
||
|
BOOL found;
|
||
|
|
||
|
//
|
||
|
// We return the WinNT Status Code as the ADS status code
|
||
|
//
|
||
|
|
||
|
hr = GetPrinterInfo(
|
||
|
&lpPrinterInfo2,
|
||
|
_pszPrinterName
|
||
|
);
|
||
|
|
||
|
BAIL_IF_ERROR(hr);
|
||
|
|
||
|
*retval = lpPrinterInfo2->Status;
|
||
|
|
||
|
cleanup:
|
||
|
if(lpPrinterInfo2){
|
||
|
FreeADsMem((LPBYTE)lpPrinterInfo2);
|
||
|
}
|
||
|
RRETURN_EXP_IF_ERR(hr);
|
||
|
}
|