windows-nt/Source/XPSP1/NT/ds/nw/nwscript/ntcap.c
2020-09-26 16:20:57 +08:00

332 lines
9.5 KiB
C

/*************************************************************************
*
* NTCAP.C
*
* NT NetWare routines
*
* Copyright (c) 1995 Microsoft Corporation
*
* $Log: N:\NT\PRIVATE\NW4\NWSCRIPT\VCS\NTCAP.C $
*
* Rev 1.2 10 Apr 1996 14:23:04 terryt
* Hotfix for 21181hq
*
* Rev 1.2 12 Mar 1996 19:54:36 terryt
* Relative NDS names and merge
*
* Rev 1.1 22 Dec 1995 14:25:20 terryt
* Add Microsoft headers
*
* Rev 1.0 15 Nov 1995 18:07:20 terryt
* Initial revision.
*
* Rev 1.0 25 Aug 1995 15:41:14 terryt
* Initial revision.
*
*
*************************************************************************/
#include "common.h"
#include <ntddnwfs.h>
#include <nwapi.h>
#include <npapi.h>
#include "ntnw.h"
extern unsigned char NW_PROVIDERA[];
/********************************************************************
EndCapture
Routine Description:
Remove the local printer redirection
Arguments:
LPTDevice - IN
1, 2, or 3 - the local printer #
Return Value:
Error
*******************************************************************/
unsigned int
EndCapture(
unsigned char LPTDevice
)
{
char LPTname[] = "LPT1";
unsigned int dwRes;
LPTname[3] = '1' + LPTDevice - 1;
/*
* Should we check for non-NetWare printers?
*/
dwRes = WNetCancelConnection2A( LPTname, 0, TRUE );
if ( dwRes != NO_ERROR )
dwRes = GetLastError();
if ( dwRes == ERROR_EXTENDED_ERROR )
NTPrintExtendedError();
return dwRes;
}
/********************************************************************
GetCaptureFlags
Routine Description:
Return info about the printer capture status. Note that the only
options set on NT are on a per-user basis and can be changed with
the control panel.
Arguments:
LPTDevice - IN
LPT device 1, 2 or 3
pCaptureFlagsRW - OUT
Capture options
pCaptureFlagsRO - OUT
Capture options
Return Value:
*******************************************************************/
unsigned int
GetCaptureFlags(
unsigned char LPTDevice,
PNETWARE_CAPTURE_FLAGS_RW pCaptureFlagsRW,
PNETWARE_CAPTURE_FLAGS_RO pCaptureFlagsRO
)
{
LPBYTE Buffer ;
DWORD dwErr ;
HANDLE EnumHandle ;
DWORD Count ;
char LPTName[10];
DWORD BufferSize = 4096;
char *remotename;
char *p;
DWORD dwPrintOptions ;
LPTSTR pszPreferred ;
strcpy( LPTName, "LPT1" );
LPTName[3] = '1' + LPTDevice - 1;
pCaptureFlagsRO->LPTCaptureFlag = 0;
//
// allocate memory and open the enumeration
//
if (!(Buffer = LocalAlloc( LPTR, BufferSize ))) {
DisplayMessage(IDR_NOT_ENOUGH_MEMORY);
return 0xFFFF;
}
dwErr = WNetOpenEnum(RESOURCE_CONNECTED, 0, 0, NULL, &EnumHandle) ;
if (dwErr != WN_SUCCESS) {
dwErr = GetLastError();
if ( dwErr == ERROR_EXTENDED_ERROR )
NTPrintExtendedError();
(void) LocalFree((HLOCAL) Buffer) ;
return 0xFFFF;
}
do {
Count = 0xFFFFFFFF ;
BufferSize = 4096;
dwErr = WNetEnumResourceA(EnumHandle, &Count, Buffer, &BufferSize) ;
if ((dwErr == WN_SUCCESS || dwErr == WN_NO_MORE_ENTRIES)
&& ( Count != 0xFFFFFFFF) )
{
LPNETRESOURCEA lpNetResource ;
DWORD i ;
lpNetResource = (LPNETRESOURCEA) Buffer ;
//
// search for our printer
//
for ( i = 0; i < Count; lpNetResource++, i++ )
{
if ( lpNetResource->lpLocalName )
{
if ( !_strcmpi(lpNetResource->lpLocalName, LPTName ))
{
if ( lpNetResource->lpProvider )
{
if ( _strcmpi( lpNetResource->lpProvider,
NW_PROVIDERA ) )
{
pCaptureFlagsRO->LPTCaptureFlag = 0;
}
else
{
remotename = lpNetResource->lpRemoteName;
p = strchr (remotename + 2, '\\');
if ( !p )
return 0xffffffff;
*p++ = '\0';
_strupr( remotename+2 );
_strupr( p );
strcpy( pCaptureFlagsRO->ServerName, remotename+2 );
strcpy( pCaptureFlagsRO->QueueName, p );
pCaptureFlagsRO->LPTCaptureFlag = 1;
pCaptureFlagsRW->JobControlFlags = 0;
pCaptureFlagsRW->TabSize = 8;
pCaptureFlagsRW->NumCopies = 1;
//
// query NW wksta for print options
// & preferred server
//
if ( NwQueryInfo(&dwPrintOptions,
&pszPreferred)) {
pCaptureFlagsRW->PrintFlags =
CAPTURE_FLAG_NOTIFY |
CAPTURE_FLAG_PRINT_BANNER ;
}
else {
pCaptureFlagsRW->PrintFlags = 0;
if ( dwPrintOptions & NW_PRINT_PRINT_NOTIFY )
pCaptureFlagsRW->PrintFlags |=
CAPTURE_FLAG_NOTIFY;
if ( dwPrintOptions & NW_PRINT_SUPPRESS_FORMFEED)
pCaptureFlagsRW->PrintFlags |=
CAPTURE_FLAG_NO_FORMFEED;
if ( dwPrintOptions & NW_PRINT_PRINT_BANNER )
pCaptureFlagsRW->PrintFlags |=
CAPTURE_FLAG_PRINT_BANNER;
}
pCaptureFlagsRW->FormName[0] = 0;
pCaptureFlagsRW->FormType = 0;
pCaptureFlagsRW->BannerText[0] = 0;
pCaptureFlagsRW->FlushCaptureTimeout = 0;
pCaptureFlagsRW->FlushCaptureOnClose = 1;
}
}
else
{
pCaptureFlagsRO->LPTCaptureFlag = 0;
}
(void) WNetCloseEnum(EnumHandle) ;
(void) LocalFree((HLOCAL) Buffer) ;
return 0;
}
}
}
}
} while (dwErr == WN_SUCCESS) ;
if ( ( dwErr != WN_SUCCESS ) && ( dwErr != WN_NO_MORE_ENTRIES ) )
{
dwErr = GetLastError();
if ( dwErr == ERROR_EXTENDED_ERROR )
NTPrintExtendedError();
}
(void ) WNetCloseEnum(EnumHandle) ;
(void) LocalFree((HLOCAL) Buffer) ;
return 0;
}
/********************************************************************
StartQueueCapture
Routine Description:
Attach local name to the queue.
Arguments:
ConnectionHandle - IN
Handle to file server
LPTDevice - IN
LPT 1, 2 or 3
pServerName - IN
Server name
pQueueName - IN
Printer queue name
Return Value:
*******************************************************************/
unsigned int
StartQueueCapture(
unsigned int ConnectionHandle,
unsigned char LPTDevice,
unsigned char *pServerName,
unsigned char *pQueueName
)
{
NETRESOURCEA NetResource;
DWORD dwRes, dwSize;
unsigned char * pszRemoteName = NULL;
unsigned char pszLocalName[10];
char * p;
//
// validate parameters
//
if (!pServerName || !pQueueName || !LPTDevice) {
DisplayMessage(IDR_ERROR_DURING, "StartQueueCapture");
return 0xffffffff ;
}
//
// allocate memory for string
//
dwSize = strlen(pServerName) + strlen(pQueueName) + 5 ;
if (!(pszRemoteName = (unsigned char *)LocalAlloc(
LPTR,
dwSize)))
{
DisplayMessage(IDR_NOT_ENOUGH_MEMORY);
dwRes = 0xffffffff;
goto ExitPoint ;
}
sprintf(pszRemoteName, "\\\\%s\\%s", pServerName, pQueueName);
sprintf(pszLocalName, "LPT%d", LPTDevice );
NetResource.dwScope = 0 ;
NetResource.dwUsage = 0 ;
NetResource.dwType = RESOURCETYPE_PRINT;
NetResource.lpLocalName = pszLocalName;
NetResource.lpRemoteName = pszRemoteName;
NetResource.lpComment = NULL;
// NetResource.lpProvider = NW_PROVIDERA ;
// Allow OS to select provider in case localized name doesn't map to OEM code page
NetResource.lpProvider = NULL;
//
// make the connection
//
dwRes=WNetAddConnection2A ( &NetResource, NULL, NULL, 0 );
if ( dwRes != NO_ERROR )
dwRes = GetLastError();
ExitPoint:
if (pszRemoteName)
(void) LocalFree((HLOCAL) pszRemoteName) ;
return( dwRes );
}