November 2001/Implementing Wireless Print for WinNT/Win2K
Listing 2: config.c
Contains four port-management functions: adding, deleting, configuring, and
enumerating
/*------------------------------------------------------------------
config.c(part): Adding, deleting, configuring, and enumerating ports
Author: Zuoliu Ding
------------------------------------------------------------------*/
BOOL AddPort(LPWSTR pName, HWND hWnd, LPWSTR pMonitorName)
{
LPWSTR pPortName;
DWORD ThreadId, WindowThreadId, Error;
BOOL rc = TRUE, DoAddPort = TRUE;
WCHAR szMonitor[MAX_PATH+1];
LoadString(hInst, IDS_WLSMONITORPORT, szMonitor, MAX_PATH);
if (_wcsicmp(pMonitorName, szMonitor)) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE; // not a Wireless Port
}
ThreadId = GetCurrentThreadId( );
WindowThreadId = GetWindowThreadProcessId(hWnd, NULL);
if (AttachThreadInput(ThreadId, WindowThreadId, TRUE))
{
pPortName = GetPortName(hWnd); // Get a port name from user
if (pPortName)
{
if (PortExists(pName, pPortName, &Error))
{
Message(hWnd, MSG_ERROR, IDS_WLSMONITORPORT,
IDS_PORTALREADYEXISTS_S, pPortName );
DoAddPort = FALSE; // error was handled, return true
}
else if (Error != NO_ERROR)
{
DoAddPort = FALSE;
rc = FALSE;
}
if (DoAddPort && IsWLSPort(pPortName))
{
CharUpperBuff(pPortName, 3);
if (RegWritePort(pPortName, L"::120"))
{
if (!ConfigurePort(NULL, hWnd, pPortName) ||
!CreatePortEntry(pPortName))
{
RegDeletePort(pPortName);
rc = FALSE;
}
}
}
} // if( pPortName )
AttachThreadInput(WindowThreadId, ThreadId, FALSE);
}
return rc;
}
BOOL DeletePort(LPWSTR pName, HWND hWnd, LPWSTR pPortName)
{
BOOL rc;
EnterSplSem();
if (rc=DeletePortEntry(pPortName)) RegDeletePort(pPortName);
LeaveSplSem();
return rc;
UNREFERENCED_PARAMETER(pName);
}
BOOL ConfigurePort(LPWSTR pName, HWND hWnd, LPWSTR pPortName)
{
DWORD ThreadId, WindowThreadId;
ThreadId = GetCurrentThreadId( );
WindowThreadId = GetWindowThreadProcessId(hWnd, NULL);
if (AttachThreadInput(ThreadId, WindowThreadId, TRUE))
{
if(IsWLSPort( pPortName ))
{
DialogBoxParam(hInst, MAKEINTRESOURCE(DLG_CONFIGURE_WCP),
hWnd, (DLGPROC)ConfigurePortDlg,
(LPARAM)&pPortName);
}
else Message(hWnd, MSG_ERROR, IDS_WLSMONITORPORT,
IDS_NOTHING_TO_CONFIGURE);
AttachThreadInput(WindowThreadId, ThreadId, FALSE);
}
return TRUE;
}
BOOL EnumPorts(LPWSTR pName, DWORD Level, LPBYTE pPorts,
DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned)
{
PINIPORT pIniPort;
DWORD cb=0, LastError=0;
LPBYTE pEnd;
EnterSplSem();
pIniPort=pIniFirstPort;
while (pIniPort) {
cb+=GetPortSize(pIniPort, Level);
pIniPort=pIniPort->pNext;
}
*pcbNeeded=cb;
if (cb <= cbBuf)
{
pEnd=pPorts+cbBuf;
*pcReturned=0;
pIniPort=pIniFirstPort;
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;
default: LastError = ERROR_INVALID_LEVEL;
goto Cleanup;
}
(*pcReturned)++;
pIniPort=pIniPort->pNext;
}
}
else LastError = ERROR_INSUFFICIENT_BUFFER;
Cleanup:
LeaveSplSem();
if (LastError) {
SetLastError(LastError);
return FALSE;
}
else return TRUE;
}
/* End of File */