Source code of Windows XP (NT5)
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

/*++
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);
}