windows-nt/Source/XPSP1/NT/printscan/ui/printui/permc.cxx
2020-09-26 16:20:57 +08:00

206 lines
5.3 KiB
C++

/*++
Copyright (C) Microsoft Corporation, 1997 - 1997
All rights reserved.
Module Name:
permc.cxx
Abstract:
Per Machine Connections
Author:
Ramanathan Venkatapathy (3/18/97)
Revision History:
--*/
#include "precomp.hxx"
#pragma hdrstop
#include "permc.hxx"
#include "rundll.hxx"
VOID
vAddPerMachineConnection(
IN LPCTSTR pServer,
IN LPCTSTR pPrinterName,
IN LPCTSTR pProvider,
IN BOOL bQuiet
)
/*++
Function Description: This function calls AddPerMachineConnection API. If the call fails
and quiet mode is not set, a message box gives the last error.
Parameters: pServer,pPrinterName,pPrintServer,pProvider - arguments for the
AddPerMachineConnection API call.
bQuiet - flag for quiet mode. This is set if /q option is used.
Return Value: NONE.
--*/
{
LPCTSTR pPrintServer;
LPCTSTR pPrinter;
TCHAR szScratch[kPrinterBufMax];
//
// Split the printer name into its components.
//
vPrinterSplitFullName( szScratch, pPrinterName, &pPrintServer, &pPrinter );
if (!AddPerMachineConnection(pServer,pPrinterName,pPrintServer,pProvider)
&& !bQuiet) {
iMessage( NULL,
IDS_RUNDLL_TITLE,
IDS_ERR_ADD_MACHINE_CONNECTION,
MB_OK|MB_ICONSTOP|MB_SETFOREGROUND,
kMsgGetLastError,
NULL );
}
}
VOID
vDeletePerMachineConnection(
IN LPCTSTR pServer,
IN LPCTSTR pPrinterName,
IN BOOL bQuiet
)
/*++
Function Description: This function calls DeletePerMachineConnection API. If the call fails
and quiet mode is not set, a message box gives the last error.
Parameters: pServer,pPrinterName - arguments for the DeletePerMachineConnection API call.
bQuiet - flag for quiet mode. This is set if /q option is used.
Return Value: NONE.
--*/
{
if (!DeletePerMachineConnection(pServer,pPrinterName)
&& !bQuiet) {
iMessage( NULL,
IDS_RUNDLL_TITLE,
IDS_ERR_DELETE_MACHINE_CONNECTION,
MB_OK|MB_ICONSTOP|MB_SETFOREGROUND,
kMsgGetLastError,
NULL );
}
}
VOID
vEnumPerMachineConnections(
IN LPCTSTR pServer,
IN LPCTSTR pszFileName,
IN BOOL bQuiet
)
/*++
Function Description: This function calls the EnumPerMachineConnection API to enumerate
the per machine printer connections at pServer.
Parameters: pServer - pointer to the name of the machine on which the per machine connections
are to be enumerated.
pszFileName - pointer to the file name where the connection data is to be dumped.
If it is NULL or szNULL, the data is displayed in a EditBox.
bQuiet - flag indicating quiet mode. It is set by using the /q option.
Return Values: NONE.
--*/
{
DWORD cbBuf = 0;
DWORD cbNeeded;
DWORD cReturned;
DWORD dwWritten;
PPRINTER_INFO_4 pPrinterEnum=NULL;
DWORD index;
TStatusB bStatus;
HANDLE hOutputFile = NULL;
TCHAR szNewLine[] = TEXT("\r\n");
bStatus DBGNOCHK = TRUE;
TRunDllDisplay PrEnum(NULL, pszFileName,
(pszFileName && *pszFileName) ? TRunDllDisplay::kFile
: TRunDllDisplay::kEditBox);
bStatus DBGCHK = VALID_OBJ( PrEnum );
if (bStatus) {
if (!(pszFileName && *pszFileName)) {
TString strTemp;
if (bStatus DBGCHK = strTemp.bLoadString( ghInst, IDS_ERR_RUNDLL_MACHINE_CONNECTION )) {
bStatus DBGCHK = PrEnum.SetTitle( strTemp );
}
}
}
if (bStatus) {
cbBuf = 1000;
if (!(pPrinterEnum = (PPRINTER_INFO_4) AllocMem(cbBuf))) {
bStatus DBGCHK = FALSE;
}
}
if (bStatus) {
while (!(bStatus DBGCHK = EnumPerMachineConnections(pServer,(LPBYTE)pPrinterEnum,cbBuf,
&cbNeeded,&cReturned)) &&
(GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {
FreeMem(pPrinterEnum);
if (!(pPrinterEnum = (PPRINTER_INFO_4) AllocMem(cbNeeded))) {
bStatus DBGCHK = FALSE;
break;
}
cbBuf = cbNeeded;
}
}
if (bStatus) {
for (index=0;cReturned;cReturned--,index++) {
if (!PrEnum.WriteOut(TEXT("Printer Name: ")) ||
!PrEnum.WriteOut(pPrinterEnum[index].pPrinterName) ||
!PrEnum.WriteOut(szNewLine) ||
!PrEnum.WriteOut(TEXT("Server Name: ")) ||
!PrEnum.WriteOut(pPrinterEnum[index].pServerName) ||
!PrEnum.WriteOut(szNewLine) ||
!PrEnum.WriteOut(szNewLine)) {
bStatus DBGCHK = FALSE;
break;
}
}
}
if (bStatus) {
PrEnum.bDoModal();
}
if (pPrinterEnum) {
FreeMem(pPrinterEnum);
}
if (!bStatus && !bQuiet) {
iMessage( NULL,
IDS_RUNDLL_TITLE,
IDS_ERR_ENUM_MACHINE_CONNECTION,
MB_OK|MB_ICONSTOP|MB_SETFOREGROUND,
GetLastError() != ERROR_SUCCESS ? kMsgGetLastError : kMsgNone,
NULL );
}
return;
}