455 lines
14 KiB
C
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
|