windows-nt/Source/XPSP1/NT/ds/netapi/rpcxlate/rxapi/prtjob.c
2020-09-26 16:20:57 +08:00

455 lines
14 KiB
C

/*++
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 <windef.h> // IN, LPTSTR, etc.
#include <lmcons.h> // NET_API_STATUS, etc.
// These may be included in any order:
#include <apinums.h> // API_ equates.
#include <lmerr.h> // NERR_ and ERROR_ equates.
#include <netdebug.h> // DBGSTATIC, NetpAssert().
#include <netlib.h> // NetpSetOptionalArg().
#include <rap.h> // RapValueWouldBeTruncated().
#include <remdef.h> // REM16_, REMSmb_, field index equates.
#include <rx.h> // RxRemoteApi().
#include <rxp.h> // RxpEstimatedBytesNeeded().
#include <rxpdebug.h> // IF_DEBUG().
#include <rxprint.h> // 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