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

536 lines
10 KiB
C++

//---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1996
//
// File: printhlp.cxx
//
// Contents: Helper functions for printer object.
//
// History: 08-May-96 t-ptam (PatrickT) migrated
//
//----------------------------------------------------------------------------
#include "nds.hxx"
#pragma hdrstop
//----------------------------------------------------------------------------
//
// Function: WinNTEnumJobs
//
// Synopsis:
//
//----------------------------------------------------------------------------
BOOL
WinNTEnumJobs(
HANDLE hPrinter,
DWORD dwFirstJob,
DWORD dwNoJobs,
DWORD dwLevel,
LPBYTE *lplpbJobs,
DWORD *pcbBuf,
LPDWORD lpdwReturned
)
{
BOOL fStatus = FALSE;
DWORD dwNeeded = 0;
DWORD dwError = 0;
//
// Enumerate Jobs using Win32 API.
//
fStatus = EnumJobs(
hPrinter,
dwFirstJob,
dwNoJobs,
dwLevel,
*lplpbJobs,
*pcbBuf,
&dwNeeded,
lpdwReturned
);
//
// Enumerate for Jobs again with a bigger buffer if a bigger one is needed
// for the result.
//
if (!fStatus) {
if ((dwError = GetLastError()) == ERROR_INSUFFICIENT_BUFFER) {
if (*lplpbJobs) {
FreeADsMem( *lplpbJobs );
}
*lplpbJobs = (LPBYTE)AllocADsMem(dwNeeded);
if (!*lplpbJobs) {
*pcbBuf = 0;
return(FALSE);
}
*pcbBuf = dwNeeded;
fStatus = EnumJobs(
hPrinter,
dwFirstJob,
dwNoJobs,
dwLevel,
*lplpbJobs,
*pcbBuf,
&dwNeeded,
lpdwReturned
);
if (!fStatus) {
return(FALSE);
}
else {
return(TRUE);
}
}
else {
return(FALSE);
}
}
else {
return(TRUE);
}
}
//----------------------------------------------------------------------------
//
// Function: WinNTEnumPrinters
//
// Synopsis:
//
//----------------------------------------------------------------------------
BOOL
WinNTEnumPrinters(
DWORD dwType,
LPTSTR lpszName,
DWORD dwLevel,
LPBYTE *lplpbPrinters,
LPDWORD lpdwReturned
)
{
BOOL fStatus = FALSE;
DWORD dwPassed = 1024;
DWORD dwNeeded = 0;
DWORD dwError = 0;
LPBYTE pMem = NULL;
//
// Allocate memory for return buffer.
//
pMem = (LPBYTE)AllocADsMem(dwPassed);
if (!pMem) {
goto error;
}
//
// Enumerate Printers using Win32 API.
//
fStatus = EnumPrinters(
dwType,
lpszName,
dwLevel,
pMem,
dwPassed,
&dwNeeded,
lpdwReturned
);
//
// Enumerate for Printers again with a bigger buffer if a bigger one is
// needed for the result.
//
if (!fStatus) {
if ((dwError = GetLastError()) != ERROR_INSUFFICIENT_BUFFER) {
goto error;
}
if (pMem) {
FreeADsMem(pMem);
}
pMem = (LPBYTE)AllocADsMem(
dwNeeded
);
if (!pMem) {
goto error;
}
dwPassed = dwNeeded;
fStatus = EnumPrinters(
dwType,
lpszName,
dwLevel,
pMem,
dwPassed,
&dwNeeded,
lpdwReturned
);
if (!fStatus) {
goto error;
}
}
//
// Return.
//
*lplpbPrinters = pMem;
return(TRUE);
error:
if (pMem) {
FreeADsMem(pMem);
}
return(FALSE);
}
//----------------------------------------------------------------------------
//
// Function: WinNTGetPrinter
//
// Synopsis:
//
//----------------------------------------------------------------------------
BOOL
WinNTGetPrinter(
HANDLE hPrinter,
DWORD dwLevel,
LPBYTE *lplpbPrinters
)
{
BOOL fStatus = FALSE;
DWORD dwPassed = 1024;
DWORD dwNeeded = 0;
DWORD dwError = 0;
LPBYTE pMem = NULL;
//
// Allocate memory for return buffer.
//
pMem = (LPBYTE)AllocADsMem(dwPassed);
if (!pMem) {
goto error;
}
//
// Get printer's information.
//
fStatus = GetPrinter(
hPrinter,
dwLevel,
pMem,
dwPassed,
&dwNeeded
);
//
// Get printer's information again with a bigger buffer if a bigger buffer
// is needed for the result.
//
if (!fStatus) {
if ((dwError = GetLastError()) != ERROR_INSUFFICIENT_BUFFER) {
goto error;
}
if (pMem) {
FreeADsMem(pMem);
}
pMem = (LPBYTE)AllocADsMem(
dwNeeded
);
if (!pMem) {
goto error;
}
dwPassed = dwNeeded;
fStatus = GetPrinter(
hPrinter,
dwLevel,
pMem,
dwPassed,
&dwNeeded
);
if (!fStatus) {
goto error;
}
}
//
// Return.
//
*lplpbPrinters = pMem;
return(TRUE);
error:
if (pMem) {
FreeADsMem(pMem);
}
return(FALSE);
}
//----------------------------------------------------------------------------
//
// Function: GetPrinterInfo
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT
GetPrinterInfo(
THIS_ LPPRINTER_INFO_2 *lplpPrinterInfo2,
BSTR bstrPrinterName
)
{
//
// Do a GetPrinter call to bstrPrinterName
//
BOOL fStatus = FALSE;
PRINTER_DEFAULTS PrinterDefaults = {0, 0, PRINTER_ACCESS_USE |
READ_CONTROL};
DWORD LastError = 0;
HANDLE hPrinter = NULL;
LPBYTE pMem = NULL;
HRESULT hr = S_OK;
ADsAssert(bstrPrinterName);
//
// Open a printer handle.
//
fStatus = OpenPrinter(
(LPTSTR)bstrPrinterName,
&hPrinter,
&PrinterDefaults
);
//
// If access is denied, do it again with a different access right.
//
if (!fStatus) {
LastError = GetLastError();
switch (LastError) {
case ERROR_ACCESS_DENIED:
{
PRINTER_DEFAULTS PrinterDefaults = {0, 0, PRINTER_ACCESS_USE};
fStatus = OpenPrinter(
(LPTSTR)bstrPrinterName,
&hPrinter,
&PrinterDefaults
);
if (fStatus) {
break;
}
}
default:
RRETURN(HRESULT_FROM_WIN32(GetLastError()));
}
}
//
// Get printer's info.
//
fStatus = WinNTGetPrinter(
hPrinter,
2,
(LPBYTE *)&pMem
);
if (!fStatus) {
hr = HRESULT_FROM_WIN32(GetLastError());
goto cleanup;
}
//
// Return.
//
*lplpPrinterInfo2 = (LPPRINTER_INFO_2)pMem;
cleanup:
if(hPrinter)
fStatus = ClosePrinter(hPrinter);
RRETURN(hr);
}
//----------------------------------------------------------------------------
//
// Function: Set
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT
Set(
LPPRINTER_INFO_2 lpPrinterInfo2,
LPTSTR pszPrinterName
)
{
BOOL fStatus = FALSE;
PRINTER_DEFAULTS PrinterDefaults = {0, 0, PRINTER_ALL_ACCESS};
HANDLE hPrinter = NULL;
HRESULT hr;
ADsAssert(pszPrinterName);
//
// Open a printer handle.
//
fStatus = OpenPrinter(
pszPrinterName,
&hPrinter,
&PrinterDefaults
);
if (!fStatus) {
goto error;
}
//
// Set printer's data.
//
fStatus = SetPrinter(
hPrinter,
2,
(LPBYTE)lpPrinterInfo2,
0
);
if (!fStatus) {
goto error;
}
//
// Return.
//
fStatus = ClosePrinter(hPrinter);
RRETURN(S_OK);
error:
hr = HRESULT_FROM_WIN32(GetLastError());
if(hPrinter)
fStatus = ClosePrinter(hPrinter);
RRETURN(hr);
}
//----------------------------------------------------------------------------
//
// Function: WinNTDeletePrinter
//
// Synopsis:
//
//----------------------------------------------------------------------------
HRESULT
WinNTDeletePrinter(
POBJECTINFO pObjectInfo
)
{
WCHAR szUncServerName[MAX_PATH];
WCHAR szUncPrinterName[MAX_PATH];
HANDLE hPrinter = NULL;
PRINTER_DEFAULTS PrinterDefaults = {0, 0, PRINTER_ACCESS_ADMINISTER};
BOOL fStatus = FALSE;
HRESULT hr = S_OK;
//
// Make Unc Name for OpenPrinter.
//
//
// Cleanup
//
/*
MakeUncName(pObjectInfo->ComponentArray[1],
szUncServerName
);
wcscpy(szUncPrinterName, szUncServerName);
wcscat(szUncPrinterName, L"\\");
wcscat(szUncPrinterName, (LPTSTR)pObjectInfo->ComponentArray[2]);*/
//
// Open a printer handle.
//
fStatus = OpenPrinter(
(LPTSTR)szUncPrinterName,
&hPrinter,
&PrinterDefaults
);
if (!fStatus) {
goto error;
}
//
// Delete the given printer.
//
fStatus = DeletePrinter(hPrinter);
//
// Return.
//
if (!fStatus) {
hr = GetLastError();
fStatus = ClosePrinter(hPrinter);
goto error;
}
error:
RRETURN(hr);
}