mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
613 lines
15 KiB
613 lines
15 KiB
/*++
|
|
Copyright (c) 1995-1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
jobhlp.cxx
|
|
|
|
Abstract:
|
|
Helper functions for Job Object
|
|
|
|
Author:
|
|
|
|
Ram Viswanathan (ramv) 11-18-95
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "winnt.hxx"
|
|
#pragma hdrstop
|
|
#define INITGUID
|
|
|
|
|
|
//
|
|
// mapping WinNT Status Codes to ADs Status Codes and vice versa
|
|
//
|
|
|
|
typedef struct _JobStatusList {
|
|
DWORD dwWinNTJobStatus;
|
|
DWORD dwADsJobStatus;
|
|
} JOB_STATUS_LIST, *PJOB_STATUS_LIST;
|
|
|
|
|
|
JOB_STATUS_LIST JobStatusList[] =
|
|
{
|
|
{JOB_STATUS_PAUSED, ADS_JOB_PAUSED },
|
|
{JOB_STATUS_ERROR, ADS_JOB_ERROR},
|
|
{JOB_STATUS_DELETING, ADS_JOB_DELETING},
|
|
{JOB_STATUS_SPOOLING, ADS_JOB_SPOOLING},
|
|
{JOB_STATUS_PRINTING, ADS_JOB_PRINTING},
|
|
{JOB_STATUS_OFFLINE, ADS_JOB_OFFLINE},
|
|
{JOB_STATUS_PAPEROUT, ADS_JOB_PAPEROUT},
|
|
{JOB_STATUS_PRINTED, ADS_JOB_PRINTED}
|
|
};
|
|
|
|
BOOL JobStatusWinNTToADs( DWORD dwWinNTStatus,
|
|
DWORD *pdwADsStatus)
|
|
{
|
|
BOOL found = FALSE;
|
|
int i;
|
|
|
|
for (i=0;i<8;i++){
|
|
|
|
if(dwWinNTStatus == JobStatusList[i].dwWinNTJobStatus){
|
|
*pdwADsStatus = JobStatusList[i].dwADsJobStatus;
|
|
found = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
return (found);
|
|
}
|
|
|
|
BOOL JobStatusADsToWinNT( DWORD dwADsStatus,
|
|
DWORD *pdwWinNTStatus)
|
|
|
|
{
|
|
BOOL found = FALSE;
|
|
int i;
|
|
|
|
for (i=0;i<8;i++){
|
|
|
|
if(dwADsStatus == JobStatusList[i].dwADsJobStatus){
|
|
*pdwWinNTStatus = JobStatusList[i].dwWinNTJobStatus;
|
|
found = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
return (found);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: MarshallAndSet
|
|
//
|
|
// Synopsis: Marshalls information from a Print Job object to a
|
|
// JOB_INFO_2 structure and sets it
|
|
//
|
|
// Arguments: [lpJobInfo2] -- Pointer to a JOB_INFO_2 struct.
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: 11/09/95 RamV Created
|
|
//
|
|
//-----------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CWinNTPrintJob::MarshallAndSet(
|
|
LPJOB_INFO_2 lpJobInfo2,
|
|
BSTR bstrPrinterName,
|
|
LONG lJobId
|
|
)
|
|
|
|
{
|
|
HRESULT hr =S_OK;
|
|
LPTSTR pszUserName = NULL;
|
|
LPTSTR pszDescription = NULL;
|
|
LPTSTR pszNotify = NULL;
|
|
LPTSTR pszDocument = NULL;
|
|
DWORD dwPriority;
|
|
DWORD dwPosition;
|
|
DWORD dwStartTime;
|
|
DWORD dwUntilTime;
|
|
DWORD dwTotalPages;
|
|
DWORD dwSize;
|
|
DWORD dwPagesPrinted;
|
|
SYSTEMTIME stTimeSubmitted;
|
|
|
|
|
|
hr = GetLPTSTRPropertyFromCache(
|
|
_pPropertyCache,
|
|
TEXT("User"),
|
|
&pszUserName
|
|
);
|
|
|
|
if(SUCCEEDED(hr)){
|
|
lpJobInfo2->pUserName = pszUserName;
|
|
}
|
|
|
|
|
|
hr = GetLPTSTRPropertyFromCache(
|
|
_pPropertyCache,
|
|
TEXT("Description"),
|
|
&pszDocument
|
|
);
|
|
if(SUCCEEDED(hr)){
|
|
lpJobInfo2->pDocument = pszDocument;
|
|
}
|
|
|
|
hr = GetLPTSTRPropertyFromCache(
|
|
_pPropertyCache,
|
|
TEXT("Notify"),
|
|
&pszNotify
|
|
);
|
|
|
|
if(SUCCEEDED(hr)){
|
|
lpJobInfo2->pNotifyName = pszNotify;
|
|
}
|
|
|
|
hr = GetDWORDPropertyFromCache(
|
|
_pPropertyCache,
|
|
TEXT("Priority"),
|
|
&dwPriority
|
|
);
|
|
|
|
if(SUCCEEDED(hr)){
|
|
lpJobInfo2->Priority = dwPriority;
|
|
}
|
|
|
|
hr = GetDWORDPropertyFromCache(
|
|
_pPropertyCache,
|
|
TEXT("Position"),
|
|
&dwPosition
|
|
);
|
|
|
|
if(SUCCEEDED(hr)){
|
|
lpJobInfo2->Position = dwPosition;
|
|
}
|
|
|
|
hr = GetDWORDPropertyFromCache(
|
|
_pPropertyCache,
|
|
TEXT("TotalPages"),
|
|
&dwTotalPages
|
|
);
|
|
|
|
if(SUCCEEDED(hr)){
|
|
lpJobInfo2->TotalPages = dwTotalPages;
|
|
}
|
|
|
|
hr = GetDWORDPropertyFromCache(
|
|
_pPropertyCache,
|
|
TEXT("Size"),
|
|
&dwSize
|
|
);
|
|
|
|
if(SUCCEEDED(hr)){
|
|
lpJobInfo2->Size = dwSize;
|
|
}
|
|
|
|
hr = GetDWORDPropertyFromCache(
|
|
_pPropertyCache,
|
|
TEXT("PagesPrinted"),
|
|
&dwPagesPrinted
|
|
);
|
|
|
|
if(SUCCEEDED(hr)){
|
|
lpJobInfo2->PagesPrinted = dwPagesPrinted;
|
|
}
|
|
|
|
hr = GetDATEPropertyFromCache(
|
|
_pPropertyCache,
|
|
TEXT("StartTime"),
|
|
&dwStartTime
|
|
);
|
|
|
|
if(SUCCEEDED(hr)){
|
|
lpJobInfo2->StartTime = dwStartTime;
|
|
}
|
|
|
|
hr = GetDATEPropertyFromCache(
|
|
_pPropertyCache,
|
|
TEXT("UntilTime"),
|
|
&dwUntilTime
|
|
);
|
|
|
|
if(SUCCEEDED(hr)){
|
|
lpJobInfo2->UntilTime = dwUntilTime;
|
|
}
|
|
|
|
hr = GetSYSTEMTIMEPropertyFromCache(
|
|
_pPropertyCache,
|
|
TEXT("TimeSubmitted"),
|
|
&stTimeSubmitted
|
|
);
|
|
|
|
if(SUCCEEDED(hr)){
|
|
lpJobInfo2->Submitted = stTimeSubmitted;
|
|
}
|
|
|
|
//
|
|
// set the relevant information
|
|
//
|
|
|
|
hr = Set(lpJobInfo2,
|
|
bstrPrinterName,
|
|
lJobId);
|
|
|
|
if(pszUserName){
|
|
FreeADsStr(pszUserName);
|
|
}
|
|
if(pszDescription){
|
|
FreeADsStr(pszDescription);
|
|
}
|
|
if(pszNotify){
|
|
FreeADsStr(pszNotify);
|
|
}
|
|
if(pszDocument){
|
|
FreeADsStr(pszDocument);
|
|
}
|
|
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
//+----------------------------------------------------------------
|
|
//
|
|
// Function: UnmarshallLevel2
|
|
//
|
|
// Synopsis: Unmarshalls information from a JOB_INFO_2 to a
|
|
// WinNT Print JOB object.
|
|
//
|
|
// Arguments: [lpJobInfo2] -- Pointer to a JOB_INFO_2 struct
|
|
//
|
|
// Returns: HRESULT
|
|
//
|
|
// Modifies: GeneralInfo and Operation Functional sets
|
|
//
|
|
// History: 11/08/95 RamV Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
CWinNTPrintJob::UnMarshallLevel2(
|
|
LPJOB_INFO_2 lpJobInfo2,
|
|
BOOL fExplicit
|
|
)
|
|
|
|
{
|
|
HRESULT hr S_OK;
|
|
|
|
hr = SetDWORDPropertyInCache(_pPropertyCache,
|
|
TEXT("TimeElapsed"),
|
|
lpJobInfo2->Time,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetDWORDPropertyInCache(_pPropertyCache,
|
|
TEXT("PagesPrinted"),
|
|
lpJobInfo2->PagesPrinted,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetDWORDPropertyInCache(_pPropertyCache,
|
|
TEXT("Position"),
|
|
lpJobInfo2->Position,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetLPTSTRPropertyInCache(_pPropertyCache,
|
|
TEXT("HostPrintQueue"),
|
|
_pszPrinterPath,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetLPTSTRPropertyInCache(_pPropertyCache,
|
|
TEXT("User"),
|
|
lpJobInfo2->pUserName,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetLPTSTRPropertyInCache(_pPropertyCache,
|
|
TEXT("Description"),
|
|
lpJobInfo2->pDocument,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetLPTSTRPropertyInCache(_pPropertyCache,
|
|
TEXT("Notify"),
|
|
lpJobInfo2->pNotifyName,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetDWORDPropertyInCache(_pPropertyCache,
|
|
TEXT("Priority"),
|
|
lpJobInfo2->Priority,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetDATEPropertyInCache(_pPropertyCache,
|
|
TEXT("StartTime"),
|
|
lpJobInfo2->StartTime,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetDATEPropertyInCache(_pPropertyCache,
|
|
TEXT("UntilTime"),
|
|
lpJobInfo2-> UntilTime,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetSYSTEMTIMEPropertyInCache(_pPropertyCache,
|
|
TEXT("TimeSubmitted"),
|
|
lpJobInfo2->Submitted,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetDWORDPropertyInCache(_pPropertyCache,
|
|
TEXT("TotalPages"),
|
|
lpJobInfo2->TotalPages,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetDWORDPropertyInCache(_pPropertyCache,
|
|
TEXT("Size"),
|
|
lpJobInfo2->Size,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetLPTSTRPropertyInCache(
|
|
_pPropertyCache,
|
|
TEXT("Name"),
|
|
_Name,
|
|
fExplicit
|
|
);
|
|
|
|
RRETURN(S_OK);
|
|
|
|
}
|
|
|
|
HRESULT
|
|
CWinNTPrintJob::UnMarshallLevel1(
|
|
LPJOB_INFO_1 lpJobInfo1,
|
|
BOOL fExplicit
|
|
)
|
|
|
|
{
|
|
HRESULT hr;
|
|
|
|
hr = SetDWORDPropertyInCache(_pPropertyCache,
|
|
TEXT("PagesPrinted"),
|
|
lpJobInfo1->PagesPrinted,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetDWORDPropertyInCache(_pPropertyCache,
|
|
TEXT("Position"),
|
|
lpJobInfo1->Position,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetLPTSTRPropertyInCache(_pPropertyCache,
|
|
TEXT("User"),
|
|
lpJobInfo1->pUserName,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetLPTSTRPropertyInCache(_pPropertyCache,
|
|
TEXT("Description"),
|
|
lpJobInfo1->pDocument,
|
|
fExplicit
|
|
);
|
|
|
|
|
|
hr = SetDWORDPropertyInCache(_pPropertyCache,
|
|
TEXT("Priority"),
|
|
lpJobInfo1->Priority,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetDWORDPropertyInCache(_pPropertyCache,
|
|
TEXT("TotalPages"),
|
|
lpJobInfo1->TotalPages,
|
|
fExplicit
|
|
);
|
|
|
|
hr = SetSYSTEMTIMEPropertyInCache(_pPropertyCache,
|
|
TEXT("TimeSubmitted"),
|
|
lpJobInfo1->Submitted,
|
|
fExplicit
|
|
);
|
|
|
|
RRETURN(S_OK);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: Set
|
|
//
|
|
// Synopsis: Helper function called by CADsPrintJob:SetInfo
|
|
//
|
|
// Arguments:
|
|
//
|
|
// Returns: HRESULT.
|
|
//
|
|
// Modifies:
|
|
//
|
|
// History: 11-08-95 RamV Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
HRESULT
|
|
Set(
|
|
LPJOB_INFO_2 lpJobInfo2,
|
|
BSTR bstrPrinterName,
|
|
LONG lJobId
|
|
)
|
|
{
|
|
|
|
BOOL fStatus = FALSE;
|
|
PRINTER_DEFAULTS PrinterDefaults = {0, 0, PRINTER_ALL_ACCESS};
|
|
HANDLE hPrinter = NULL;
|
|
HRESULT hr = S_OK;
|
|
DWORD LastError = 0;
|
|
|
|
ADsAssert(bstrPrinterName);
|
|
|
|
fStatus = OpenPrinter((LPTSTR)bstrPrinterName,
|
|
&hPrinter,
|
|
&PrinterDefaults
|
|
);
|
|
|
|
|
|
if (!fStatus) {
|
|
goto error;
|
|
}
|
|
|
|
fStatus = SetJob(hPrinter,
|
|
lJobId,
|
|
2,
|
|
(LPBYTE)lpJobInfo2,
|
|
0
|
|
);
|
|
|
|
if (!fStatus) {
|
|
goto error;
|
|
}
|
|
|
|
RRETURN(S_OK);
|
|
|
|
error:
|
|
hr =HRESULT_FROM_WIN32(GetLastError());
|
|
if(hPrinter)
|
|
fStatus = ClosePrinter(hPrinter);
|
|
RRETURN(hr);
|
|
|
|
}
|
|
|
|
|
|
HRESULT
|
|
GetJobInfo( DWORD dwLevel,
|
|
LPBYTE *ppJobInfo,
|
|
LPWSTR pszPrinterName,
|
|
LONG lJobId)
|
|
|
|
{
|
|
PRINTER_DEFAULTS PrinterDefaults = {0, 0, PRINTER_ACCESS_USE |
|
|
READ_CONTROL};
|
|
BOOL fStatus = FALSE;
|
|
DWORD dwPassed = 0, dwNeeded = 0;
|
|
DWORD LastError = 0;
|
|
HANDLE hPrinter = NULL;
|
|
LPBYTE pMem = NULL;
|
|
HRESULT hr = S_OK;
|
|
|
|
|
|
ADsAssert(dwLevel ==1 || dwLevel == 2);
|
|
|
|
fStatus = OpenPrinter(pszPrinterName,
|
|
&hPrinter,
|
|
&PrinterDefaults
|
|
);
|
|
if (!fStatus) {
|
|
LastError = GetLastError();
|
|
switch (LastError) {
|
|
|
|
case ERROR_ACCESS_DENIED:
|
|
{
|
|
PRINTER_DEFAULTS PrinterDefaults = {0, 0, PRINTER_ACCESS_USE};
|
|
fStatus = OpenPrinter(pszPrinterName,
|
|
&hPrinter,
|
|
&PrinterDefaults
|
|
);
|
|
if (fStatus) {
|
|
break;
|
|
}
|
|
}
|
|
default:
|
|
RRETURN(HRESULT_FROM_WIN32(GetLastError()));
|
|
}
|
|
}
|
|
|
|
pMem = (LPBYTE)AllocADsMem(dwPassed);
|
|
|
|
if (!pMem) {
|
|
hr = E_OUTOFMEMORY;
|
|
goto cleanup;
|
|
}
|
|
|
|
fStatus = GetJob(hPrinter,
|
|
lJobId,
|
|
dwLevel,
|
|
(LPBYTE)pMem,
|
|
dwPassed,
|
|
&dwNeeded
|
|
);
|
|
if (!fStatus) {
|
|
LastError = GetLastError();
|
|
switch (LastError) {
|
|
case ERROR_INSUFFICIENT_BUFFER:
|
|
if(pMem){
|
|
FreeADsMem(pMem);
|
|
}
|
|
dwPassed = dwNeeded;
|
|
pMem = (LPBYTE)AllocADsMem(dwPassed);
|
|
|
|
if (!pMem) {
|
|
hr = E_OUTOFMEMORY;
|
|
goto cleanup;
|
|
}
|
|
|
|
fStatus = GetJob(hPrinter,
|
|
lJobId,
|
|
dwLevel,
|
|
(LPBYTE)pMem,
|
|
dwPassed,
|
|
&dwNeeded
|
|
);
|
|
if (!fStatus) {
|
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
goto cleanup;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
goto cleanup;
|
|
|
|
}
|
|
}
|
|
|
|
*ppJobInfo = pMem;
|
|
|
|
cleanup:
|
|
if(hPrinter)
|
|
ClosePrinter(hPrinter);
|
|
RRETURN(hr);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|