windows-nt/Source/XPSP1/NT/printscan/print/spooler/spoolss/win32/cachemon.c
2020-09-26 16:20:57 +08:00

381 lines
6.4 KiB
C

/*++
Copyright (c) 1994 Microsoft Corporation
Module Name:
cachemon.c
Abstract:
This module contains the Cache Port handling for Win32Spl
true connected printers.
Author:
Matthew A Felton ( MattFe ) July 23 1994
Revision History:
July 23 1994 - Created.
Notes:
We shold collapse the LM Ports and the Win32 ports so they have use common
ports.
--*/
#include <windows.h>
#include <winspool.h>
#include <winsplp.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wchar.h>
#include "splapip.h"
#include <w32types.h>
#include "local.h"
#include "splcom.h"
PWINIPORT pW32FirstPort = NULL;
BOOL
OpenPort(
LPWSTR pName,
PHANDLE pHandle
)
{
DBGMSG(DBG_TRACE, ("OpenPort %ws %x\n", pName, pHandle));
*pHandle = NULL;
return TRUE;
}
BOOL
StartDocPort(
HANDLE hPort,
LPWSTR pPrinterName,
DWORD JobId,
DWORD Level,
LPBYTE pDocInfo
)
{
DBGMSG(DBG_TRACE, ("StartDocPort %x %ws %d %d %x\n", hPort, pPrinterName, JobId, Level, pDocInfo));
return TRUE;
}
BOOL
ReadPort(
HANDLE hPort,
LPBYTE pBuffer,
DWORD cbBuf,
LPDWORD pcbRead
)
{
DBGMSG(DBG_TRACE, ("ReadPort %x %x %d %x\n", hPort, pBuffer, cbBuf, pcbRead));
return TRUE;
}
BOOL
WritePort(
HANDLE hPort,
LPBYTE pBuffer,
DWORD cbBuf,
LPDWORD pcbWritten
)
{
DBGMSG(DBG_TRACE, ("WritePort %x %x %d %x\n", hPort, pBuffer, cbBuf, pcbWritten));
return TRUE;
}
BOOL
EndDocPort(
HANDLE hPort
)
{
DBGMSG(DBG_TRACE, ("EndDocPort %x\n", hPort ));
return TRUE;
}
BOOL
XcvOpenPort(
PCWSTR pszObject,
ACCESS_MASK GrantedAccess,
PHANDLE phXcv
)
{
DBGMSG(DBG_TRACE, ("XcvOpenPort\n"));
return TRUE;
}
DWORD
XcvDataPort(
HANDLE hXcv,
PCWSTR pszDataName,
PBYTE pInputData,
DWORD cbInputData,
PBYTE pOutputData,
DWORD cbOutputData,
PDWORD pcbOutputNeeded
)
{
DBGMSG(DBG_TRACE, ("XcvDataPort\n"));
return TRUE;
}
BOOL
XcvClosePort(
HANDLE hXcv
)
{
DBGMSG(DBG_TRACE, ("XcvClosePort\n"));
return TRUE;
}
BOOL
ClosePort(
HANDLE hPort
)
{
DBGMSG(DBG_TRACE, ("ClosePort %x\n", hPort ));
return TRUE;
}
BOOL
DeletePortW(
LPWSTR pName,
HWND hWnd,
LPWSTR pPortName
)
{
DBGMSG(DBG_TRACE, ("DeletePortW %ws %x %ws\n", pName, hWnd, pPortName));
return TRUE;
}
BOOL
AddPortW(
LPWSTR pName,
HWND hWnd,
LPWSTR pMonitorName
)
{
BOOL ReturnValue = FALSE;
DBGMSG(DBG_TRACE, ("AddPortW %ws %x %ws\n", pName, hWnd, pMonitorName));
if ( _wcsicmp( pMonitorName, pszMonitorName ) ) {
SetLastError(ERROR_INVALID_PARAMETER);
goto AddPortWErrorReturn;
}
SetLastError( ERROR_NOT_SUPPORTED );
AddPortWErrorReturn:
return ReturnValue;
}
BOOL
ConfigurePortW(
LPWSTR pName,
HWND hWnd,
LPWSTR pPortName
)
{
DBGMSG(DBG_TRACE, ("ConfigurePortW %ws %x %ws\n", pName, hWnd, pPortName));
return TRUE;
}
BOOL
AddPortEx(
LPWSTR pName,
DWORD Level,
LPBYTE pBuffer,
LPWSTR pMonitorName
)
{
BOOL ReturnValue = FALSE;
DWORD LastError = ERROR_SUCCESS;
PPORT_INFO_1 pPortInfo = (PPORT_INFO_1)pBuffer;
EnterSplSem();
DBGMSG(DBG_TRACE, ("AddPortEx %x %d %x %ws %ws\n", pName, Level, pBuffer, pPortInfo->pName, pMonitorName));
if ( _wcsicmp( pMonitorName, pszMonitorName ) ) {
LastError = ERROR_INVALID_PARAMETER;
goto AddPortExErrorReturn;
}
//
// Make Sure Port doesn't already exist
//
if ( FindPort( pPortInfo->pName, pW32FirstPort ) ) {
LastError = ERROR_INVALID_NAME;
goto AddPortExErrorReturn;
}
if ( CreatePortEntry( pPortInfo->pName, &pW32FirstPort ) )
ReturnValue = TRUE;
AddPortExErrorReturn:
LeaveSplSem();
if (LastError != ERROR_SUCCESS) {
SetLastError( LastError );
ReturnValue = FALSE;
}
return ReturnValue;
}
BOOL
EnumPortsW(
LPWSTR pName,
DWORD Level,
LPBYTE pPorts,
DWORD cbBuf,
LPDWORD pcbNeeded,
LPDWORD pcReturned
)
{
PWINIPORT pIniPort;
DWORD cb;
LPBYTE pEnd;
DWORD LastError=0;
switch (Level) {
case 1:
case 2:
break;
default:
SetLastError(ERROR_INVALID_LEVEL);
return FALSE;
}
EnterSplSem();
DBGMSG(DBG_TRACE, ("EnumPortW %x %d %x %d %x %x\n", pName, Level, pPorts, cbBuf, pcbNeeded, pcReturned));
cb=0;
pIniPort = pW32FirstPort;
while (pIniPort) {
cb += GetPortSize(pIniPort, Level);
pIniPort = pIniPort->pNext;
}
*pcbNeeded=cb;
if (cb <= cbBuf) {
pEnd=pPorts+cbBuf;
*pcReturned=0;
pIniPort = pW32FirstPort;
while (pIniPort) {
pEnd = CopyIniPortToPort(pIniPort, Level, pPorts, pEnd);
switch (Level) {
case 1:
pPorts+=sizeof(PORT_INFO_1);
break;
case 2:
pPorts+=sizeof(PORT_INFO_2);
break;
}
pIniPort=pIniPort->pNext;
(*pcReturned)++;
}
} else {
*pcReturned = 0;
LastError = ERROR_INSUFFICIENT_BUFFER;
}
LeaveSplSem();
if (LastError) {
SetLastError(LastError);
return FALSE;
} else
return TRUE;
}
MONITOREX MonitorEx = {
sizeof(MONITOR),
{
EnumPortsW,
OpenPort,
NULL, // OpenPortEx is not supported
StartDocPort,
WritePort,
ReadPort,
EndDocPort,
ClosePort,
AddPort,
AddPortEx,
ConfigurePortW,
DeletePortW,
NULL, // GetPrinterDataFromPort not supported
NULL, // SetPortTimeouts not supported
XcvOpenPort,
XcvDataPort,
XcvClosePort
}
};
LPMONITOREX
InitializePrintMonitor(
LPWSTR pRegistryRoot
)
{
BOOL bRet = TRUE;
DBGMSG(DBG_TRACE, ("InitializeMonitor %ws\n", pRegistryRoot));
EnterSplSem();
if (!FindPort(L"NExx:", pW32FirstPort ) ) {
if ( !CreatePortEntry( L"NExx:", &pW32FirstPort ) ) {
DBGMSG( DBG_WARNING,("InitializeMonitor Failed to CreatePortEntry\n"));
bRet = FALSE;
}
}
LeaveSplSem();
return bRet ? &MonitorEx : NULL;
}