/*++ Copyright (c) 1991 Microsoft Corporation Module Name: PrtJob.c Abstract: This module provides RpcXlate support for the DosPrint APIs. Author: John Rogers (JohnRo) 20-May-1991 Environment: Portable to any flat, 32-bit environment. (Uses Win32 typedefs.) Requires ANSI C extensions: slash-slash comments, long external names. Revision History: 20-May-1991 JohnRo Created. 21-May-1991 JohnRo Added RxPrintJobDel(). Added module header. Explicitly fail enum attempt for level 3. 21-May-1991 JohnRo Added RxPrintJobGetInfo support. 22-May-1991 JohnRo Added RxPrintJobPause and RxPrintJobContinue support. Moved RxPrintJobDel into its place in alphabetical order. Added IN, OUT, and OPTIONAL where applicable. 26-May-1991 JohnRo Minor parm list changes: use LPBYTE and LPTSTR where possible. 16-Jul-1991 JohnRo Added RxPrintJobSetInfo support. Added hex dump of job info in RxPrintJobGetInfo. 17-Jul-1991 JohnRo Extracted RxpDebug.h from Rxp.h. 21-Nov-1991 JohnRo Removed NT dependencies to reduce recompiles. --*/ // These must be included first: #include // IN, LPTSTR, etc. #include // NET_API_STATUS, etc. // These may be included in any order: #include // API_ equates. #include // NERR_ and ERROR_ equates. #include // DBGSTATIC, NetpAssert(). #include // NetpSetOptionalArg(). #include // RapValueWouldBeTruncated(). #include // REM16_, REMSmb_, field index equates. #include // RxRemoteApi(). #include // RxpEstimatedBytesNeeded(). #include // IF_DEBUG(). #include // My prototypes. DBGSTATIC NET_API_STATUS RxpGetPrintJobInfoDescs( IN DWORD InfoLevel, IN BOOL SetInfoApi, OUT LPDESC * DataDesc16 OPTIONAL, OUT LPDESC * DataDesc32 OPTIONAL, OUT LPDESC * DataDescSmb OPTIONAL ) { switch (InfoLevel) { case 0 : if (SetInfoApi == TRUE) { return (ERROR_INVALID_LEVEL); } NetpSetOptionalArg(DataDesc16, REM16_print_job_0); NetpSetOptionalArg(DataDesc32, REM32_print_job_0); NetpSetOptionalArg(DataDescSmb, REMSmb_print_job_0); return (NERR_Success); case 1 : NetpSetOptionalArg(DataDesc16, REM16_print_job_1); NetpSetOptionalArg(DataDesc32, REM32_print_job_1); NetpSetOptionalArg(DataDescSmb, REMSmb_print_job_1); return (NERR_Success); case 2 : if (SetInfoApi == TRUE) { return (ERROR_INVALID_LEVEL); } NetpSetOptionalArg(DataDesc16, REM16_print_job_2); NetpSetOptionalArg(DataDesc32, REM32_print_job_2); NetpSetOptionalArg(DataDescSmb, REMSmb_print_job_2); return (NERR_Success); case 3 : NetpSetOptionalArg(DataDesc16, REM16_print_job_3); NetpSetOptionalArg(DataDesc32, REM32_print_job_3); NetpSetOptionalArg(DataDescSmb, REMSmb_print_job_3); return (NERR_Success); default : return (ERROR_INVALID_LEVEL); } /* NOTREACHED */ } // RxpGetPrintJobInfoDescs SPLERR SPLENTRY RxPrintJobContinue( IN LPTSTR pszServer, IN DWORD uJobId ) { NET_API_STATUS Status; NetpAssert(pszServer != NULL); NetpAssert(*pszServer != '\0'); Status = RxRemoteApi( API_WPrintJobContinue, pszServer, REMSmb_DosPrintJobContinue_P, // parm desc NULL, // no data desc (16-bit) NULL, // no data desc (32-bit) NULL, // no data desc (SMB version) NULL, // no aux data desc 16 NULL, // no aux data desc 32 NULL, // no aux data desc SMB FALSE, // not a null session API // rest of LM2.x API's arguments, in 32-bit format: uJobId); return (Status); } // RxPrintJobContinue SPLERR SPLENTRY RxPrintJobDel( IN LPTSTR pszServer, IN DWORD uJobId ) { NET_API_STATUS Status; NetpAssert(pszServer != NULL); NetpAssert(*pszServer != '\0'); Status = RxRemoteApi( API_WPrintJobDel, pszServer, REMSmb_DosPrintJobDel_P, // parm desc NULL, // no data desc (16-bit) NULL, // no data desc (32-bit) NULL, // no data desc (SMB version) NULL, // no aux data desc 16 NULL, // no aux data desc 32 NULL, // no aux data desc SMB FALSE, // not a null session API // rest of LM2.x API's arguments, in 32-bit format: uJobId); return (Status); } // RxPrintJobDel SPLERR SPLENTRY RxPrintJobEnum( IN LPTSTR pszServer, IN LPTSTR pszQueueName, IN DWORD uLevel, OUT LPBYTE pbBuf, IN DWORD cbBuf, OUT LPDWORD pcReturned, OUT LPDWORD TotalEntries ) { LPDESC DataDesc16, DataDesc32, DataDescSmb; NET_API_STATUS Status; NetpAssert(pszServer != NULL); NetpAssert(*pszServer != '\0'); Status = RxpGetPrintJobInfoDescs( uLevel, FALSE, // not a setinfo API. & DataDesc16, & DataDesc32, & DataDescSmb); if (Status != NERR_Success) { return (Status); } // DosPrintJobEnum does not support level 3, despite what Ralph Ryan's // book says. I (JohnRo) have tried it, and DaveSn has looked at the // source code. So, we might as well check for it here. if (uLevel == 3) { return (ERROR_INVALID_LEVEL); } Status = RxRemoteApi( API_WPrintJobEnum, pszServer, REMSmb_DosPrintJobEnum_P, DataDesc16, DataDesc32, DataDescSmb, NULL, // no aux desc 16 NULL, // no aux desc 32 NULL, // no aux desc SMB FALSE, // not a null session API. // rest of API's arguments, in 32-bit LM 2.x form: pszQueueName, uLevel, pbBuf, cbBuf, pcReturned, TotalEntries); return (Status); } // RxPrintJobEnum SPLERR SPLENTRY RxPrintJobGetInfo( IN LPTSTR pszServer, IN DWORD uJobId, IN DWORD uLevel, OUT LPBYTE pbBuf, IN DWORD cbBuf, OUT LPDWORD BytesNeeded // estimated (probably too large). ) { DWORD BytesNeeded16; LPDESC DataDesc16, DataDesc32, DataDescSmb; NET_API_STATUS Status; NetpAssert(pszServer != NULL); NetpAssert(*pszServer != '\0'); Status = RxpGetPrintJobInfoDescs( uLevel, FALSE, // not a setinfo API & DataDesc16, & DataDesc32, & DataDescSmb); if (Status != NERR_Success) { return (Status); } Status = RxRemoteApi( API_WPrintJobGetInfo, pszServer, REMSmb_DosPrintJobGetInfo_P, DataDesc16, DataDesc32, DataDescSmb, NULL, // no aux desc 16 NULL, // no aux desc 32 NULL, // no aux desc SMB FALSE, // not a null session API. // rest of API's arguments, in LM 2.x form (32-bit version): uJobId, uLevel, pbBuf, cbBuf, & BytesNeeded16); // downlevel buffer size needed. // If buffer too small, convert BytesNeeded to native num. if ( (Status == ERROR_MORE_DATA) || (Status == NERR_BufTooSmall) ) { *BytesNeeded = RxpEstimateBytesNeeded(BytesNeeded16); } else { *BytesNeeded = cbBuf; } IF_DEBUG(PRTJOB) { NetpKdPrint(( "RxPrintJobGetInfo: output (level " FORMAT_DWORD "):\n", uLevel )); NetpDbgHexDump( (LPVOID) pbBuf, *BytesNeeded ); } return (Status); } // RxPrintJobGetInfo SPLERR SPLENTRY RxPrintJobPause( IN LPTSTR pszServer, IN DWORD uJobId ) { NET_API_STATUS Status; NetpAssert(pszServer != NULL); NetpAssert(*pszServer != '\0'); Status = RxRemoteApi( API_WPrintJobPause, pszServer, REMSmb_DosPrintJobPause_P, // parm desc NULL, // no data desc (16-bit) NULL, // no data desc (32-bit) NULL, // no data desc (SMB version) NULL, // no aux data desc 16 NULL, // no aux data desc 32 NULL, // no aux data desc SMB FALSE, // not a null session API // rest of LM2.x API's arguments, in 32-bit format: uJobId); return (Status); } // RxPrintJobPause SPLERR SPLENTRY RxPrintJobSetInfo( IN LPTSTR UncServerName, IN DWORD JobId, IN DWORD Level, IN LPBYTE Buffer, IN DWORD BufferSize, IN DWORD ParmNum ) { LPDESC DataDesc16, DataDesc32, DataDescSmb; NET_API_STATUS Status; NetpAssert(UncServerName != NULL); NetpAssert(*UncServerName != '\0'); Status = RxpGetPrintJobInfoDescs( Level, TRUE, // This is a setinfo API. & DataDesc16, & DataDesc32, & DataDescSmb); if (Status != NERR_Success) { return (Status); } if (ParmNum == PARMNUM_ALL) { Status = RxRemoteApi( API_WPrintJobSetInfo, // API number UncServerName, REMSmb_DosPrintJobSetInfo_P, // parm desc DataDesc16, DataDesc32, DataDescSmb, NULL, // no aux desc 16 NULL, // no aux desc 32 NULL, // no aux desc SMB FALSE, // not a null session API // rest of API's arguments, in 32-bit LM 2.x format: JobId, Level, Buffer, BufferSize, ParmNum); } else { WORD DownLevelJobId; DWORD FieldIndex; if (RapValueWouldBeTruncated(JobId)) { IF_DEBUG(PRTJOB) { NetpKdPrint(( "RxPrintJobSetInfo: invalid (ID trunc).\n" )); } return (ERROR_INVALID_PARAMETER); } // Compute field index from parmnum and level. NetpAssert( (Level==1) || (Level==3) ); // Already verified. switch (ParmNum) { case PRJ_NOTIFYNAME_PARMNUM : if (Level==1) { FieldIndex = PRJ_NOTIFYNAME_LVL1_FIELDINDEX; } else { FieldIndex = PRJ_NOTIFYNAME_LVL3_FIELDINDEX; } break; case PRJ_DATATYPE_PARMNUM : if (Level==1) { FieldIndex = PRJ_DATATYPE_LVL1_FIELDINDEX; } else { FieldIndex = PRJ_DATATYPE_LVL3_FIELDINDEX; } break; case PRJ_PARMS_PARMNUM : if (Level==1) { FieldIndex = PRJ_PARMS_LVL1_FIELDINDEX; } else { FieldIndex = PRJ_PARMS_LVL3_FIELDINDEX; } break; case PRJ_POSITION_PARMNUM : if (Level==1) { FieldIndex = PRJ_POSITION_LVL1_FIELDINDEX; } else { FieldIndex = PRJ_POSITION_LVL3_FIELDINDEX; } break; case PRJ_COMMENT_PARMNUM : if (Level==1) { FieldIndex = PRJ_COMMENT_LVL1_FIELDINDEX; } else { FieldIndex = PRJ_COMMENT_LVL3_FIELDINDEX; } break; case PRJ_DOCUMENT_PARMNUM : if (Level==1) { return (ERROR_INVALID_LEVEL); } else { FieldIndex = PRJ_DOCUMENT_LVL3_FIELDINDEX; } break; case PRJ_PRIORITY_PARMNUM : if (Level==1) { return (ERROR_INVALID_LEVEL); } else { FieldIndex = PRJ_PRIORITY_LVL3_FIELDINDEX; } break; case PRJ_PROCPARMS_PARMNUM : if (Level==1) { return (ERROR_INVALID_LEVEL); } else { FieldIndex = PRJ_PROCPARMS_LVL3_FIELDINDEX; } break; case PRJ_DRIVERDATA_PARMNUM : // Can't set driver data from NT /* FALLTHROUGH */ default : IF_DEBUG(PRTJOB) { NetpKdPrint(( "RxPrintJobSetInfo: invalid (bad parmnum).\n" )); } return (ERROR_INVALID_PARAMETER); } DownLevelJobId = (WORD) JobId; Status = RxpSetField ( API_WPrintJobSetInfo, // API number UncServerName, "w", // object's desc & DownLevelJobId, // object to set REMSmb_DosPrintJobSetInfo_P, // parm desc DataDesc16, DataDesc32, DataDescSmb, (LPVOID) Buffer, // native info buffer ParmNum, // parm num to send FieldIndex, // field index Level); } return (Status); } // RxPrintJobSetInfo