windows-nt/Source/XPSP1/NT/ds/adsi/winnt/cpgi.cxx
2020-09-26 16:20:57 +08:00

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