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

363 lines
9.4 KiB
C

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
PrtDest.c
Abstract:
This module provides RpcXlate support for the RxPrintDest APIs.
Author:
John Rogers (JohnRo) 15-Jul-1991
Environment:
Portable to any flat, 32-bit environment. (Uses Win32 typedefs.)
Requires ANSI C extensions: slash-slash comments, long external names.
Revision History:
15-Jul-1991 JohnRo
Created.
16-Jul-1991 JohnRo
Estimate bytes needed for print APIs.
17-Jul-1991 JohnRo
Extracted RxpDebug.h from Rxp.h.
26-Aug-1991 JohnRo
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> // NetpAssert().
#include <remdef.h> // REM16_, REMSmb_, equates.
#include <rx.h> // RxRemoteApi().
#include <rxp.h> // RxpEstimatedBytesNeeded().
#include <rxprint.h> // My prototypes.
DBGSTATIC NET_API_STATUS
RxpGetPrintDestInfoDescs(
IN DWORD InfoLevel,
IN BOOL AddOrSetInfoApi,
OUT LPDESC * DataDesc16,
OUT LPDESC * DataDesc32,
OUT LPDESC * DataDescSmb
)
{
switch (InfoLevel) {
case 0 :
if (AddOrSetInfoApi == TRUE) {
return (ERROR_INVALID_LEVEL);
}
*DataDesc16 = REM16_print_dest_0;
*DataDesc32 = REM32_print_dest_0;
*DataDescSmb = REMSmb_print_dest_0;
return (NERR_Success);
case 1 :
if (AddOrSetInfoApi == TRUE) {
return (ERROR_INVALID_LEVEL);
}
*DataDesc16 = REM16_print_dest_1;
*DataDesc32 = REM32_print_dest_1;
*DataDescSmb = REMSmb_print_dest_1;
return (NERR_Success);
case 2 :
if (AddOrSetInfoApi == TRUE) {
return (ERROR_INVALID_LEVEL);
}
*DataDesc16 = REM16_print_dest_2;
*DataDesc32 = REM32_print_dest_2;
*DataDescSmb = REMSmb_print_dest_2;
return (NERR_Success);
case 3 :
*DataDesc16 = REM16_print_dest_3;
*DataDesc32 = REM32_print_dest_3;
*DataDescSmb = REMSmb_print_dest_3;
return (NERR_Success);
default :
return (ERROR_INVALID_LEVEL);
}
/* NOTREACHED */
} // RxpGetPrintDestInfoDescs
SPLERR SPLENTRY
RxPrintDestAdd(
IN LPTSTR pszServer,
IN DWORD uLevel,
IN LPBYTE pbBuf,
IN DWORD cbBuf
)
{
LPDESC DataDesc16, DataDesc32, DataDescSmb;
NET_API_STATUS Status;
NetpAssert( pszServer != NULL );
NetpAssert( *pszServer != '\0' );
Status = RxpGetPrintDestInfoDescs(
uLevel,
TRUE, // this is an Add or SetInfo API
& DataDesc16,
& DataDesc32,
& DataDescSmb);
if (Status != NERR_Success) {
return (Status);
}
return( RxRemoteApi(
API_WPrintDestAdd,
pszServer,
REMSmb_DosPrintDestAdd_P,
DataDesc16,
DataDesc32,
DataDescSmb,
NULL, // no aux 16 desc
NULL, // no aux 32 desc
NULL, // no aux SMB desc
FALSE, // not a null session API
// rest of API's arguments, in 32-bit LM 2.x format:
uLevel,
pbBuf,
cbBuf) );
} // RxPrintDestAdd
SPLERR SPLENTRY
RxPrintDestControl(
IN LPTSTR pszServer,
IN LPTSTR pszDevName,
IN DWORD uControl
)
{
NetpAssert( pszServer != NULL );
NetpAssert( *pszServer != '\0' );
return( RxRemoteApi(
API_WPrintDestControl,
pszServer,
REMSmb_DosPrintDestControl_P,
NULL, // no data desc 16
NULL, // no data desc 32
NULL, // no data desc SMB
NULL, // no aux 16 desc
NULL, // no aux 32 desc
NULL, // no aux SMB desc
FALSE, // not a null session API
// rest of API's arguments, in 32-bit LM 2.x format:
pszDevName,
uControl) );
} // RxPrintDestControl
SPLERR SPLENTRY
RxPrintDestDel(
IN LPTSTR pszServer,
IN LPTSTR pszPrinterName
)
{
NetpAssert( pszServer != NULL );
NetpAssert( *pszServer != '\0' );
return( RxRemoteApi(
API_WPrintDestDel,
pszServer,
REMSmb_DosPrintDestDel_P,
NULL, // no data desc 16
NULL, // no data desc 32
NULL, // no data desc SMB
NULL, // no aux 16 desc
NULL, // no aux 32 desc
NULL, // no aux SMB desc
FALSE, // not a null session API
// rest of API's arguments, in 32-bit LM 2.x format:
pszPrinterName) );
} // RxPrintDestDel
SPLERR SPLENTRY
RxPrintDestEnum(
IN LPTSTR pszServer,
IN DWORD uLevel,
OUT LPBYTE pbBuf,
IN DWORD cbBuf,
IN LPDWORD pcReturned,
OUT LPDWORD TotalEntries
)
{
LPDESC DataDesc16, DataDesc32, DataDescSmb;
NET_API_STATUS Status;
NetpAssert( pszServer != NULL );
NetpAssert( *pszServer != '\0' );
if ( (pbBuf==NULL) || (cbBuf==0) ) {
// Avoid assertion in common code (RxRemoteApi).
return (ERROR_MORE_DATA);
}
Status = RxpGetPrintDestInfoDescs(
uLevel,
FALSE, // not an add or setinfo API
& DataDesc16,
& DataDesc32,
& DataDescSmb);
if (Status != NERR_Success) {
return (Status);
}
return( RxRemoteApi(
API_WPrintDestEnum,
pszServer,
REMSmb_DosPrintDestEnum_P,
DataDesc16,
DataDesc32,
DataDescSmb,
NULL, // no aux 16 desc
NULL, // no aux 32 desc
NULL, // no aux SMB desc
FALSE, // not a null session API
// rest of API's arguments, in 32-bit LM 2.x format:
uLevel,
pbBuf,
cbBuf,
pcReturned,
TotalEntries) );
} // RxPrintDestEnum
SPLERR SPLENTRY
RxPrintDestGetInfo(
IN LPTSTR pszServer,
IN LPTSTR pszName,
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 = RxpGetPrintDestInfoDescs(
uLevel,
FALSE, // not an add or setinfo API
& DataDesc16,
& DataDesc32,
& DataDescSmb);
if (Status != NERR_Success) {
return (Status);
}
Status = RxRemoteApi(
API_WPrintDestGetInfo,
pszServer,
REMSmb_DosPrintDestGetInfo_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 format:
pszName,
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;
}
return (Status);
} // RxPrintDestGetInfo
SPLERR SPLENTRY
RxPrintDestSetInfo(
IN LPTSTR pszServer,
IN LPTSTR pszName,
IN DWORD uLevel,
IN LPBYTE pbBuf,
IN DWORD cbBuf,
IN DWORD uParmNum
)
{
LPDESC DataDesc16, DataDesc32, DataDescSmb;
NET_API_STATUS Status;
NetpAssert( pszServer != NULL );
NetpAssert( *pszServer != '\0' );
Status = RxpGetPrintDestInfoDescs(
uLevel,
TRUE, // This is an add or setinfo API.
& DataDesc16,
& DataDesc32,
& DataDescSmb);
if (Status != NERR_Success) {
return (Status);
}
if (uParmNum == PARMNUM_ALL) {
return( RxRemoteApi(
API_WPrintDestSetInfo,
pszServer,
REMSmb_DosPrintDestSetInfo_P,
DataDesc16,
DataDesc32,
DataDescSmb,
NULL, // no aux 16 desc
NULL, // no aux 32 desc
NULL, // no aux SMB desc
FALSE, // not a null session API
// rest of API's arguments, in 32-bit LM 2.x format:
pszName,
uLevel,
pbBuf,
cbBuf,
uParmNum) );
} else {
// Level 3 parmnums and field indexes are identical, so no need to
// convert here. (Field index equates would be in remdef.h otherwise.)
return( RxpSetField (
API_WPrintDestSetInfo,
pszServer,
"z", // object desc
pszName, // object to set
REMSmb_DosPrintDestSetInfo_P, // parm desc
DataDesc16,
DataDesc32,
DataDescSmb,
pbBuf, // native info buffer
uParmNum, // parmnum to send
uParmNum, // field index
uLevel
) );
}
/* NOTREACHED */
} // RxPrintDestSetInfo