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