/*++ 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 // IN, LPTSTR, etc. #include // NET_API_STATUS, etc. // These may be included in any order: #include // API_ equates. #include // NERR_ and ERROR_ equates. #include // NetpAssert(). #include // REM16_, REMSmb_, equates. #include // RxRemoteApi(). #include // RxpEstimatedBytesNeeded(). #include // 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