/***************************************************************************** * * $Workfile: DevPort.cpp $ * * Copyright (C) 1997 Hewlett-Packard Company. * Copyright (C) 1997 Microsoft Corporation. * All rights reserved. * * 11311 Chinden Blvd. * Boise, Idaho 83714 * *****************************************************************************/ #include "precomp.h" #include "DevPort.h" #include "winreg.h" #include "TcpMonUI.h" #include "rtcpdata.h" #include "lprdata.h" #include "inisection.h" // // FUNCTION: CDevicePortList Constructor // // PURPOSE: to construct a list of devices and their associated ports // from the registry, an ini file or from a static table in the code. // CDevicePortList::CDevicePortList() : m_pList( NULL ), m_pCurrent( NULL ) { } // Constructor // // FUNCTION: CDevicePortList Destructor // // PURPOSE: clean up // CDevicePortList::~CDevicePortList() { DeletePortList(); } // Destructor void CDevicePortList::DeletePortList() { while(m_pList != NULL) { m_pCurrent = m_pList->GetNextPtr(); delete m_pList; m_pList = m_pCurrent; } } // // FUNCTION: GetDevicePortsList // // PURPOSE: To create a Device types list getting values from the ini file. // BOOL CDevicePortList::GetDevicePortsList(LPTSTR pszDeviceName) { BOOL bRet = FALSE; TCHAR szSystemPath[MAX_PATH] = NULLSTR; TCHAR szFileName[MAX_PATH] = NULLSTR; size_t cchFileName = COUNTOF (szFileName); DeletePortList(); GetSystemDirectory(szSystemPath, sizeof(szSystemPath) / sizeof (TCHAR)); StringCchCopy (szFileName, cchFileName, szSystemPath); StringCchCat (szFileName, cchFileName, PORTMONITOR_INI_FILE ); // // Get the section names from the ini file: // if( pszDeviceName == NULL ) { // Get all the devices DWORD nSize = 0; TCHAR *lpszReturnBuffer = NULL; if ( !GetSectionNames(szFileName, &lpszReturnBuffer, nSize) ) goto Done; // // For each section name Load up the number of ports // TCHAR *lpszSectionName = lpszReturnBuffer; LPCTSTR lpKeyName = PORTS_KEY; while( lpszSectionName && *lpszSectionName ) { TCHAR KeyName[26] = NULLSTR; LPCTSTR lpPortsKeyName = PORTS_KEY; UINT NumberOfPorts = GetPrivateProfileInt(lpszSectionName, lpPortsKeyName, 0, szFileName); // // Name // StringCchPrintf (KeyName, COUNTOF (KeyName), PORT_NAME_KEY); TCHAR tcsPortName[MAX_PORTNAME_LEN] = NULLSTR; if ( GetPrivateProfileString(lpszSectionName, KeyName, TEXT(""), tcsPortName, MAX_PORTNAME_LEN, szFileName) ) { // // Setup a new DevicePort struct // if ( m_pCurrent = new CDevicePort() ) { m_pCurrent->Set(tcsPortName, _tcslen(tcsPortName), lpszSectionName, _tcslen(lpszSectionName), (NumberOfPorts == 1)); m_pCurrent->SetNextPtr(m_pList); m_pList = m_pCurrent; } else // Out of memory, abort // goto Done; } /* else If the call fails, we continue to the next adapter name */ lpszSectionName = _tcschr(lpszSectionName, '\0'); // find the end of the current string. lpszSectionName = _tcsinc(lpszSectionName); // increment to the beginning of the next string. } // // free memory // free(lpszReturnBuffer); } else {// Just the names in multiport section TCHAR KeyName[26]; // // Name // LPCTSTR lpKeyName = PORTS_KEY; UINT NumberOfPorts = GetPrivateProfileInt(pszDeviceName, lpKeyName, 0, szFileName); for ( UINT i=0; iSet(tcsPortName, _tcslen(tcsPortName), pszDeviceName, _tcslen(pszDeviceName), i+1); m_pCurrent->SetNextPtr(m_pList); m_pList = m_pCurrent; } else goto Done; } } bRet = TRUE; Done: // // Do not leave with a partial list // if ( !bRet ) DeletePortList(); return bRet; } // GetDevicePortsList // // FUNCTION: ReadPortInfo // // PURPOSE: To read information about a device from the ini file. // void CDevicePort::ReadPortInfo( LPCTSTR pszAddress, PPORT_DATA_1 pPortInfo, BOOL bBypassNetProbe) { IniSection *pIniSection; if ( m_psztPortKeyName ) { if ( pIniSection = new IniSection() ) { pIniSection->SetIniSection( m_psztPortKeyName ); pIniSection->GetPortInfo( pszAddress, pPortInfo, m_dwPortIndex, bBypassNetProbe); delete( pIniSection ); } } } // ReadPortInfo // // FUNCTION: GetSectionNames // // PURPOSE: // BOOL CDevicePortList:: GetSectionNames( LPCTSTR lpFileName, TCHAR **lpszReturnBuffer, DWORD &nSize ) { DWORD nReturnSize = 0; LPTSTR pNewBuf; do { nSize += 512; pNewBuf = (TCHAR *)realloc(*lpszReturnBuffer, nSize * sizeof(TCHAR)); if ( pNewBuf == NULL ) { if ( *lpszReturnBuffer ) { free(*lpszReturnBuffer); *lpszReturnBuffer = NULL; } return FALSE; } *lpszReturnBuffer = pNewBuf; nReturnSize = GetPrivateProfileSectionNames(*lpszReturnBuffer, nSize, lpFileName); } while(nReturnSize >= nSize-2); return TRUE; } // GetSectionNames // // FUNCTION: CDevicePort Constructor // // PURPOSE: // CDevicePort::CDevicePort() { m_psztName = NULL; m_psztPortKeyName = NULL; m_pNext = NULL; } // Constructor // // FUNCTION: CDevicePort Destructor // // PURPOSE: // CDevicePort::~CDevicePort() { if(m_psztName != NULL) { delete m_psztName; } if(m_psztPortKeyName != NULL) { delete m_psztPortKeyName; } } // destructor // // FUNCTION: Set // // PURPOSE: // void CDevicePort::Set(TCHAR *psztNewName, DWORD dwNameSize, TCHAR *psztNewKeyName, DWORD dwNewKeyNameSize, DWORD dwPortIndex) { if ( psztNewName != NULL ) { if ( m_psztName != NULL ) { delete m_psztName; m_psztName = NULL; } if ( dwNameSize == 0 ) dwNameSize = _tcslen(psztNewName); m_psztName = new TCHAR[(dwNameSize + 1) * sizeof(TCHAR)]; if ( m_psztName ) lstrcpyn(m_psztName, psztNewName, dwNameSize+1); } if ( psztNewKeyName != NULL ) { if ( m_psztPortKeyName != NULL ) { delete m_psztPortKeyName; m_psztPortKeyName = NULL; } if ( dwNewKeyNameSize == 0 ) { dwNewKeyNameSize = _tcslen(psztNewKeyName); } m_psztPortKeyName = new TCHAR[(dwNewKeyNameSize + 1) * sizeof(TCHAR)]; if ( m_psztPortKeyName ) { lstrcpyn(m_psztPortKeyName, psztNewKeyName, dwNewKeyNameSize+1); } } m_dwPortIndex = dwPortIndex; } // Set