Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

432 lines
10 KiB

/*++
Copyright (c) 97 Microsoft Corporation
All rights reserved.
Module Name:
IniSection.cpp
Abstract:
Standard TCP/IP Port Monitor class to handle INI file settings
Author:
Muhunthan Sivapragasam (MuhuntS) 19-Nov-1997
Revision History:
--*/
#include "precomp.h"
#include "tcpmonui.h"
#include "rtcpdata.h"
#include "lprdata.h"
#include "IniSection.h"
BOOL
StringMatch(
LPCTSTR psz1,
LPCTSTR psz2 // * is a wild char in this
)
{
LPCTSTR p1 = NULL, p2 = NULL;
for ( p1 = psz1, p2 = psz2 ; *p1 && *p2 ; ) {
//
// A * matches any sub-string
//
if ( *p2 == TEXT('*') ) {
++p2;
if ( !*p2 ) {
return TRUE;
}
for ( ; *p1 ; ++p1 )
if ( StringMatch(p1, p2) ) {
return TRUE;
}
break;
} else if ( *p1 == *p2 ) {
++p1;
++p2;
} else
break;
}
if( !*p1 && *p2 == TEXT( '*' ))
{
++p2;
if (!*p2 ) {
return TRUE;
}
}
return !*p1 && !*p2;
}
BOOL
IniSection::
FindINISectionFromPortDescription(
LPCTSTR pszPortDesc
)
/*++
--*/
{
LPTSTR pszBuf = NULL, pszKey = NULL;
DWORD rc = 0, dwLen = 0, dwBufLen = 1024;
BOOL bRet = FALSE;
pszBuf = (LPTSTR) malloc(dwBufLen*sizeof(TCHAR));
//
// Read all the key names in the ini file
//
while ( pszBuf ) {
rc = GetPrivateProfileString(PORT_SECTION,
NULL,
NULL,
pszBuf,
dwBufLen,
m_szIniFileName);
if ( rc == 0 ) {
goto Done;
}
if ( rc < dwBufLen - 2 ) {
break; // Succesful exit; Read all port descriptions
}
free(pszBuf);
dwBufLen *= 2;
pszBuf = (LPTSTR) malloc(dwBufLen*sizeof(TCHAR));
}
if ( !pszBuf )
goto Done;
//
// Go through the list of key names in the .INI till we find a match
//
for ( pszKey = pszBuf ; *pszKey ; pszKey += dwLen + 1 ) {
//
// Keys start and end with " we need to do match w/o them
//
dwLen = _tcslen(pszKey);
pszKey[dwLen-1] = TCHAR('\0');
if ( StringMatch(pszPortDesc, pszKey+1) ) {
pszKey[dwLen-1] = TCHAR('\"');
GetPrivateProfileString(PORT_SECTION,
pszKey,
NULL,
m_szSectionName,
MAX_SECTION_NAME,
m_szIniFileName);
bRet = TRUE;
goto Done;
}
}
Done:
if ( pszBuf ) {
free(pszBuf);
}
return( bRet );
}
IniSection::
IniSection(
void
)
{
DWORD dwLen = 0, dwSize = 0;
m_szSectionName[0] = TEXT('\0');
m_szIniFileName[0] = TEXT('\0');
dwSize = sizeof(m_szIniFileName)/sizeof(m_szIniFileName[0]);
dwLen = GetSystemDirectory(m_szIniFileName, dwSize);
if ( dwLen + _tcslen(PORTMONITOR_INI_FILE) > dwSize ) {
return;
}
StringCchCat (m_szIniFileName, dwSize, PORTMONITOR_INI_FILE);
}
IniSection::
~IniSection(
)
{
// Nothing to do
}
BOOL
IniSection::
GetString(
IN LPTSTR pszKey,
OUT TCHAR szBuf[],
IN DWORD cchBuf
)
{
DWORD rc = 0;
rc = GetPrivateProfileString(m_szSectionName,
pszKey,
NULL,
szBuf,
cchBuf,
m_szIniFileName);
return rc > 0 && rc < cchBuf - 1;
}
BOOL
IniSection::
GetDWord(
IN LPTSTR pszKey,
OUT LPDWORD pdwValue
)
{
UINT uVal;
uVal = GetPrivateProfileInt(m_szSectionName,
pszKey,
-1,
m_szIniFileName);
if ( uVal != -1 ) {
*pdwValue = (DWORD) uVal;
return TRUE;
} else {
return FALSE;
}
}
BOOL
IniSection::
SetIniSection(
LPTSTR pszPortSection
)
{
lstrcpyn( m_szSectionName, pszPortSection, MAX_SECTION_NAME );
return( TRUE );
}
BOOL
IniSection::
GetIniSection(
LPTSTR pszPortDescription
)
{
BOOL bRet = FALSE;
if ( m_szIniFileName[0] != 0 ) {
bRet = FindINISectionFromPortDescription(pszPortDescription);
}
return( bRet );
}
//
// FUNCTION: GetPortInfo
//
// PURPOSE: To read information about a device from the ini file.
//
BOOL
IniSection::
GetPortInfo(LPCTSTR pAddress,
PPORT_DATA_1 pPortInfo,
DWORD dwPortIndex,
BOOL bBypassMibProbe)
{
BOOL bRet = TRUE;
TCHAR KeyName[26];
if( !Valid() ) {
bRet = FALSE;
goto Done;
}
//
// Protocol
//
StringCchPrintf (KeyName, COUNTOF (KeyName), PROTOCOL_KEY, dwPortIndex);
TCHAR tcsProtocol[50];
GetPrivateProfileString(m_szSectionName,
KeyName,
TEXT(""),
tcsProtocol,
50,
m_szIniFileName);
if( !_tcsicmp( RAW_PROTOCOL_TEXT, tcsProtocol)) {
pPortInfo->dwProtocol = PROTOCOL_RAWTCP_TYPE;
//
// Port Number
//
StringCchPrintf (KeyName, COUNTOF (KeyName), PORT_NUMBER_KEY, dwPortIndex);
pPortInfo->dwPortNumber = GetPrivateProfileInt(m_szSectionName,
KeyName,
DEFAULT_PORT_NUMBER,
m_szIniFileName);
} else if( !_tcsicmp( LPR_PROTOCOL_TEXT, tcsProtocol)) {
pPortInfo->dwProtocol = PROTOCOL_LPR_TYPE;
pPortInfo->dwPortNumber = LPR_DEFAULT_PORT_NUMBER;
//
// LPR QUEUE
//
StringCchPrintf (KeyName, COUNTOF (KeyName), QUEUE_KEY, dwPortIndex);
GetPrivateProfileString(m_szSectionName,
KeyName,
DEFAULT_QUEUE,
pPortInfo->sztQueue,
MAX_QUEUENAME_LEN,
m_szIniFileName);
//
// LPR Double Spool - default 0
//
StringCchPrintf (KeyName, COUNTOF (KeyName), DOUBLESPOOL_KEY, dwPortIndex);
pPortInfo->dwDoubleSpool = GetPrivateProfileInt(m_szSectionName,
KeyName,
0,
m_szIniFileName);
}
//
// CommunityName
//
StringCchPrintf (KeyName, COUNTOF (KeyName), COMMUNITY_KEY, dwPortIndex);
GetPrivateProfileString(m_szSectionName,
KeyName,
DEFAULT_SNMP_COMUNITY,
pPortInfo->sztSNMPCommunity,
MAX_SNMP_COMMUNITY_STR_LEN,
m_szIniFileName);
//
// DeviceIndex - default 1
//
StringCchPrintf (KeyName, COUNTOF (KeyName), DEVICE_KEY, dwPortIndex);
pPortInfo->dwSNMPDevIndex = GetPrivateProfileInt(m_szSectionName,
KeyName,
1,
m_szIniFileName);
//
// SNMP Status Enabled - default ON
//
TCHAR szTemp[50];
StringCchPrintf (KeyName, COUNTOF (KeyName), PORT_STATUS_ENABLED_KEY, dwPortIndex);
GetPrivateProfileString(m_szSectionName,
KeyName,
YES_TEXT,
szTemp,
SIZEOF_IN_CHAR(szTemp),
m_szIniFileName);
if ( !(_tcsicmp( szTemp, YES_TEXT ))){
pPortInfo->dwSNMPEnabled = TRUE;
} else if (!(_tcsicmp( szTemp, NO_TEXT ))) {
pPortInfo->dwSNMPEnabled = FALSE;
} else {
if (bBypassMibProbe)
pPortInfo->dwSNMPEnabled = FALSE;
else {
BOOL bSupported;
if (SupportsPrinterMIB( pAddress, &bSupported)) {
pPortInfo->dwSNMPEnabled = bSupported;
}
else {
// Error case, we have to disable SNMP
pPortInfo->dwSNMPEnabled = FALSE;
// The caller can check the returned error code to determine
// whether the last error is "Device Not Found". If so,
// the client should by pass Mib Probe in the next call
//
bRet = FALSE;
}
}
}
Done:
return( bRet );
} // GetPortInfo
//
BOOL
IniSection::
SupportsPrinterMIB(
LPCTSTR pAddress,
PBOOL pbSupported
)
{
BOOL bRet = FALSE;
CTcpMibABC *pTcpMib = NULL;
FARPROC pfnGetTcpMibPtr = NULL;
if ( !g_hTcpMibLib ) {
goto Done;
}
pfnGetTcpMibPtr = ::GetProcAddress(g_hTcpMibLib, "GetTcpMibPtr");
if ( !pfnGetTcpMibPtr ) {
goto Done;
}
if ( pTcpMib = (CTcpMibABC *) pfnGetTcpMibPtr() ) {
char HostName[MAX_NETWORKNAME_LEN] = "";
UNICODE_TO_MBCS(HostName, MAX_NETWORKNAME_LEN, pAddress, -1);
bRet = pTcpMib->SupportsPrinterMib(HostName,
DEFAULT_SNMP_COMMUNITYA,
DEFAULT_SNMP_DEVICE_INDEX,
pbSupported);
}
Done:
return bRet;
} // GetDeviceType