/*++ Copyright (c) 1992-1993 Microsoft Corporation Module Name: DosPrtP.c Abstract: This contains macros and prototypes private to the DosPrint APIs. Author: John Rogers (JohnRo) 02-Oct-1992 Notes: Revision History: 02-Oct-1992 JohnRo Created for RAID 3556: DosPrintQGetInfo(from downlevel) level 3, rc=124. (4&5 too.) 08-Feb-1993 JohnRo RAID 10164: Data misalignment error during XsDosPrintQGetInfo(). DosPrint API cleanup: avoid const vs. volatile compiler warnings. Extracted job count routine to netlib for use by convprt.c stuff. Added some IN and OUT keywords. 24-Mar-1993 JohnRo RAID 2974: NET PRINT says NT printer is held when it isn't. 17-May-1993 JohnRo FindLocalJob() should use INVALID_HANDLE_VALUE for consistentcy. Use NetpKdPrint() where possible. 29-Mar-1995 AlbertT Support for pause/resume/purge printer queue added. --*/ #ifndef UNICODE #error "RxPrint APIs assume RxRemoteApi uses wide characters." #endif #define NOMINMAX #define NOSERVICE // Avoid vs. conflicts. #include #include // NET_API_STATUS. #include // NetpKdPrint(), etc. #ifdef _WINSPOOL_ #error "Include of winspool.h moved, make sure it doesn't get UNICODE." #endif #undef UNICODE #undef TEXT #define TEXT(quote) quote #include #undef TEXT #define TEXT(quote) __TEXT(quote) #define UNICODE #ifndef _WINSPOOL_ #error "Oops, winspool.h changed, make sure this code is still OK." #endif #include // prototypes #include // NetApiBufferFree(), etc. #include // NO_ERROR, NERR_, and ERROR_ equates. #include // SHARE_INFO_2, STYPE_ equates, etc. #include // PREFIX_ equates. #include // PPRQINFOW, etc. #include // strrchr(). #include // NetpAlloc{type}From{type}. #include // wscrchr(). #include "myspool.h" NET_API_STATUS CommandALocalPrinterW( IN LPWSTR PrinterName, IN DWORD Command // PRINTER_CONTROL_PAUSE, etc. ) { NET_API_STATUS ApiStatus; HANDLE PrinterHandle = INVALID_HANDLE_VALUE; PRINTER_DEFAULTSW pd = { NULL, NULL, PRINTER_ACCESS_ADMINISTER }; if ( !MyOpenPrinterW(PrinterName, &PrinterHandle, &pd)) { ApiStatus = GetLastError(); goto Cleanup; } if ( !MySetPrinterW( PrinterHandle, 0, // info level NULL, // no job structure Command) ) { ApiStatus = GetLastError(); NetpKdPrint(( PREFIX_DOSPRINT "CommandALocalPrinterW: FAILED COMMAND " FORMAT_DWORD " for printer " FORMAT_LPWSTR ", api status " FORMAT_API_STATUS ".\n", Command, PrinterName, ApiStatus )); goto Cleanup; } else { ApiStatus = NO_ERROR; } Cleanup: if (PrinterHandle != INVALID_HANDLE_VALUE) { (VOID) MyClosePrinter(PrinterHandle); } return (ApiStatus); } // CommandALocalPrinterW NET_API_STATUS CommandALocalJobA( IN HANDLE PrinterHandle, OPTIONAL IN LPWSTR LocalServerNameW, IN LPSTR LocalServerNameA, IN DWORD JobId, IN DWORD Level, IN LPBYTE pJob, IN DWORD Command // JOB_CONTROL_PAUSE, etc. ) /*++ Routine Description: Sends a command to a Job based on a JobId. If a PrintHandle is passed in, it is used; otherwise a temporary one is opened and used instead. This is the ansi version--pJob must be ansi. The LocalSeverName can be passed in either ansi or UNICODE. Arguments: PrinterHandle - Print handle to use, may be NULL. If it is is NULL, then LocalServerName should point to the printer name that should be opened. LocalServerNameW - Used only if PrintHandle is NULL. LocalServerNameA - Used only if PrintHandle and LocalServerNamwW are NULL. JobId - Job that should be modified Level - Specifies pJob info level pJob - Information to set about job, level specified by Level ** WARNING ** This is an ANSI structure. Command - Command to execute on job Return Value: Return code, may be a win32 error code (!?) --*/ { NET_API_STATUS ApiStatus; HANDLE PrinterHandleClose = INVALID_HANDLE_VALUE; // // If a print handle wasn't passed in, open one ourselves. // We store it in PrinterHandleClose so that we can close it later. // if ( PrinterHandle == NULL ) { if ( LocalServerNameW ){ if ( !MyOpenPrinterW( LocalServerNameW, &PrinterHandle, NULL )) { ApiStatus = GetLastError(); goto Cleanup; } } else { if ( !MyOpenPrinterA( LocalServerNameA, &PrinterHandle, NULL )) { ApiStatus = GetLastError(); goto Cleanup; } } PrinterHandleClose = PrinterHandle; } if ( !MySetJobA( PrinterHandle, JobId, Level, pJob, Command) ) { ApiStatus = GetLastError(); NetpKdPrint(( PREFIX_DOSPRINT "CommandALocalJobA: FAILED COMMAND " FORMAT_DWORD " for job " FORMAT_DWORD ", api status " FORMAT_API_STATUS ".\n", Command, JobId, ApiStatus )); goto Cleanup; } else { ApiStatus = NO_ERROR; } Cleanup: if (PrinterHandleClose != INVALID_HANDLE_VALUE) { (VOID) MyClosePrinter(PrinterHandle); } return (ApiStatus); } // CommandALocalJobA LPSTR FindQueueNameInPrinterNameA( IN LPCSTR PrinterName ) { LPSTR QueueName; NetpAssert( PrinterName != NULL ); QueueName = strrchr( PrinterName, '\\'); if (QueueName) { ++QueueName; // Skip past the backslash. } else { QueueName = (LPSTR) PrinterName; } NetpAssert( QueueName != NULL ); return (QueueName); } LPWSTR FindQueueNameInPrinterNameW( IN LPCWSTR PrinterName ) { LPWSTR QueueName; NetpAssert( PrinterName != NULL ); QueueName = wcsrchr( PrinterName, L'\\'); if (QueueName) { ++QueueName; // Skip past the backslash. } else { QueueName = (LPWSTR) PrinterName; } NetpAssert( QueueName != NULL ); return (QueueName); } WORD PrjStatusFromJobStatus( IN DWORD JobStatus ) { WORD PrjStatus = 0; if (JobStatus & JOB_STATUS_SPOOLING) PrjStatus |= PRJ_QS_SPOOLING; if (JobStatus & JOB_STATUS_PAUSED) PrjStatus |= PRJ_QS_PAUSED; if (JobStatus & JOB_STATUS_PRINTING) PrjStatus |= PRJ_QS_PRINTING; if (JobStatus & JOB_STATUS_ERROR) PrjStatus |= PRJ_ERROR; return (PrjStatus); } // PrjStatusFromJobStatus WORD PrqStatusFromPrinterStatus( IN DWORD PrinterStatus ) { WORD PrqStatus; if (PrinterStatus & PRINTER_STATUS_PAUSED) { PrqStatus = PRQ_PAUSED; } else if (PrinterStatus & PRINTER_STATUS_ERROR) { PrqStatus = PRQ_ERROR; } else if (PrinterStatus & PRINTER_STATUS_PENDING_DELETION) { PrqStatus = PRQ_PENDING; } else { PrqStatus = PRQ_ACTIVE; } return (PrqStatus); } // PrqStatusFromPrinterStatus