206 lines
5.3 KiB
C++
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;
|
||
|
}
|
||
|
|
||
|
|