530 lines
10 KiB
C++
530 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 "nwcompat.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.
|
||
|
//
|
||
|
|
||
|
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);
|
||
|
}
|
||
|
|
||
|
|