|
|
//+----------------------------------------------------------------------------
//
// File: ConnStat.cpp
//
// Module: CMDIAL32.DLL
//
// Synopsis: Implementation of class CConnStatistics
//
// Copyright (c) 1998-1999 Microsoft Corporation
//
// Author: Fengsun Created 10/15/97
//
//+----------------------------------------------------------------------------
#include "cmmaster.h"
#include "ConnStat.h"
//
// Include the constants describing the reg keys used for perf stats
//
#include "perf_str.h"
//
// Constructor and destructor
//
CConnStatistics::CConnStatistics() { MYDBGASSERT(!OS_NT4); // class is never used on NT4
m_hKey = NULL; m_dwInitBytesRead = -1; m_dwInitBytesWrite = -1; m_dwBaudRate = 0;
m_pszTotalBytesRecvd = NULL; m_pszTotalBytesXmit = NULL; m_pszConnectSpeed = NULL; }
CConnStatistics::~CConnStatistics() { CmFree( m_pszTotalBytesRecvd ); CmFree( m_pszTotalBytesXmit ); CmFree( m_pszConnectSpeed ); }
//+----------------------------------------------------------------------------
//
// Function: CConnStatistics::GetStatRegValues
//
// Synopsis: Helper method, builds the reg value names using the localized
// form of the word "Dial-up Adapter".
//
// Arguments: HINSTANCE hInst
//
// Returns: Nothing
//
// History: nickball Created 11/14/98
//
//+----------------------------------------------------------------------------
void CConnStatistics::GetStatRegValues(HINSTANCE hInst) { //
// bug 149367 The word "Dial-up Adapter" need to be localized.
// Load it from resource if no loaded yet
//
if (m_pszTotalBytesRecvd == NULL) { m_pszTotalBytesRecvd = CmLoadString(hInst, IDS_REG_DIALUP_ADAPTER); CmStrCatAlloc(&m_pszTotalBytesRecvd, m_fAdapter2 ? c_pszDialup_2_TotalBytesRcvd : c_pszDialupTotalBytesRcvd);
m_pszTotalBytesXmit = CmLoadString(hInst, IDS_REG_DIALUP_ADAPTER); CmStrCatAlloc(&m_pszTotalBytesXmit, m_fAdapter2 ? c_pszDialup_2_TotalBytesXmit : c_pszDialupTotalBytesXmit);
m_pszConnectSpeed = CmLoadString(hInst, IDS_REG_DIALUP_ADAPTER); CmStrCatAlloc(&m_pszConnectSpeed, m_fAdapter2 ? c_pszDialup_2_ConnectSpeed : c_pszDialupConnectSpeed); } }
//+---------------------------------------------------------------------------
//
// Function: InitStatistics()
//
// Synopsis: Retrieves Performance Data. On 9x this data is pulled from
// the registry. Defaults are used NT5. Not used on NT4.
//
// Arguments: None
//
// Returns: TRUE if succeed
// FALSE otherwise
//
// History: byao 07/16/97 created
// fengsun 10/97 make it a member fuction
// nickball 03/04/98 always close key
// nickball 03/04/00 added NT5 support
//
//----------------------------------------------------------------------------
BOOL CConnStatistics::InitStatistics() { if (OS_W9X) { MYDBGASSERT(NULL == m_hKey); // Not already opened
if (m_hKey) { RegCloseKey(m_hKey); m_hKey = NULL; }
DWORD dwErrCode; BOOL bRet = FALSE;
//
// If there is already a connected dial up connection
// use the adapter#2 registry key
//
m_fAdapter2 = RasConnectionExists();
dwErrCode = RegOpenKeyExU(HKEY_DYN_DATA, c_pszDialupPerfKey, 0, KEY_ALL_ACCESS, &m_hKey ); CMTRACE1(TEXT("OpenDAPPerfKey() RegOpenKeyEx() returned GLE=%u."), dwErrCode);
if ( dwErrCode != ERROR_SUCCESS ) { m_hKey = NULL; } else { GetStatRegValues(g_hInst);
//
// Get the initial statistic info
//
if (!GetPerfData(m_dwInitBytesRead, m_dwInitBytesWrite, m_dwBaudRate)) { //
// No dial-up statistic info
//
RegCloseKey(m_hKey); m_hKey = NULL; } } return m_hKey != NULL; } else { //
// On NT5, there is the starting bytes is always zero because
// numbers aren't available to us until the connection is up.
// Note: Adapter2 indicates the reg key to be examined on 9x
// it is a non-issue on NT.
//
m_fAdapter2 = FALSE;
m_dwInitBytesRead = 0; m_dwInitBytesWrite = 0; }
return TRUE; }
//+---------------------------------------------------------------------------
//
// Function: GetPerfData
//
// Synopsis: Get Performance Data from DUN1.2 performance registry
//
// Arguments:
//
// Returns: TRUE: succeed
// FALSE otherwise
//
// History: byao created 7/16/97
// fengsun change it into a member function 10/14/97
//
//----------------------------------------------------------------------------
BOOL CConnStatistics::GetPerfData(DWORD& dwRead, DWORD& dwWrite, DWORD& dwBaudRate) const { MYDBGASSERT(m_hKey != NULL); MYDBGASSERT(m_pszTotalBytesRecvd && *m_pszTotalBytesRecvd);
LONG dwErrCode;
DWORD dwValueSize, dwValueType; DWORD dwValue; LPTSTR lpKeyName;
//
// "Dial-up Adapter\TotalBytesRecvd"
//
dwValueSize = sizeof(DWORD); dwErrCode = RegQueryValueExU(m_hKey, m_pszTotalBytesRecvd, NULL, &dwValueType, (PBYTE)&dwValue, &dwValueSize);
if (dwErrCode == ERROR_SUCCESS) { dwRead = dwValue; } else { return FALSE; }
//
// "Dial-up Adapter\TotalBytesXmit"
//
dwValueSize = sizeof(DWORD); dwErrCode = RegQueryValueExU(m_hKey, m_pszTotalBytesXmit, NULL, &dwValueType, (PBYTE)&dwValue, &dwValueSize);
if (dwErrCode == ERROR_SUCCESS) { dwWrite = dwValue; } else { return FALSE; }
//
// "Dial-up Adapter\ConnectSpeed"
//
dwValueSize = sizeof(DWORD); dwErrCode = RegQueryValueExU(m_hKey, m_pszConnectSpeed, NULL, &dwValueType, (PBYTE)&dwValue, &dwValueSize);
if (dwErrCode == ERROR_SUCCESS) { dwBaudRate = dwValue; } else { return FALSE; }
return TRUE; }
//+----------------------------------------------------------------------------
//
// Function: CConnStatistics::RasConnectionExists
//
// Synopsis: Whether there is a connected ras connection running on Win9x.
//
// Arguments: None
//
// Returns: BOOL - TRUE if there is one up and connected
//
// History: fengsun Created 1/15/98
//
//+----------------------------------------------------------------------------
BOOL CConnStatistics::RasConnectionExists() { //
// Try RasEnumConnections to find out active connections
//
HINSTANCE hRasInstance = LoadLibraryExA("RASAPI32", NULL, 0);
MYDBGASSERT(hRasInstance); if (!hRasInstance) { return FALSE; }
typedef DWORD (WINAPI *PFN_RasEnumConnections)(LPRASCONN, LPDWORD, LPDWORD); PFN_RasEnumConnections lpRasEnumConnections;
lpRasEnumConnections = (PFN_RasEnumConnections)GetProcAddress(hRasInstance, "RasEnumConnectionsA");
MYDBGASSERT(lpRasEnumConnections); if (!lpRasEnumConnections) { FreeLibrary(hRasInstance); return FALSE; }
DWORD dwConnections = 0; DWORD dwSizeNeeded = 0; if (lpRasEnumConnections(NULL,&dwSizeNeeded,&dwConnections)) { MYDBGASSERT(dwConnections < 2); if (dwConnections > 0) { FreeLibrary(hRasInstance); return TRUE; } }
FreeLibrary(hRasInstance); return FALSE; }
//+----------------------------------------------------------------------------
//
// Function: CConnStatistics::Close
//
// Synopsis: Stop gathering statistic and close the handle
//
// Arguments: None
//
// Returns: Nothing
//
// History: Anonymous Created Header 10/15/97
// nickball Reduced to close key 03/04/98
//
//+----------------------------------------------------------------------------
void CConnStatistics::Close() { if (m_hKey) { DWORD dwErrCode = RegCloseKey(m_hKey); CMTRACE1(TEXT("Close() RegCloseKey() returned GLE=%u."), dwErrCode); m_hKey = NULL; } }
|