Windows2003-3790/net/mmc/dhcp/sscpstat.cpp
2020-09-30 16:53:55 +02:00

243 lines
6.4 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1997 - 1997 **/
/**********************************************************************/
/*
SscpStat.h
The superscope statistics dialog
FILE HISTORY:
*/
#include "stdafx.h"
#include "sscpstat.h"
#include "server.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
enum
{
SUPERSCOPE_STAT_TOTAL_SCOPES = 0,
SUPERSCOPE_STAT_TOTAL_ADDRESSES,
SUPERSCOPE_STAT_IN_USE,
SUPERSCOPE_STAT_AVAILABLE,
SUPERSCOPE_STAT_MAX
};
/*---------------------------------------------------------------------------
CSuperscopeStats implementation
---------------------------------------------------------------------------*/
const ContainerColumnInfo s_rgSuperscopeStatsColumnInfo[] =
{
{ IDS_STATS_TOTAL_SCOPES, 0, TRUE },
{ IDS_STATS_TOTAL_ADDRESSES, 0, TRUE },
{ IDS_STATS_IN_USE, 0, TRUE },
{ IDS_STATS_AVAILABLE, 0, TRUE },
};
CSuperscopeStats::CSuperscopeStats()
: StatsDialog(STATSDLG_VERTICAL)
{
SetColumnInfo(s_rgSuperscopeStatsColumnInfo,
DimensionOf(s_rgSuperscopeStatsColumnInfo));
}
CSuperscopeStats::~CSuperscopeStats()
{
}
BEGIN_MESSAGE_MAP(CSuperscopeStats, StatsDialog)
//{{AFX_MSG_MAP(CSuperscopeStats)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_NEW_STATS_AVAILABLE, OnNewStatsAvailable)
END_MESSAGE_MAP()
HRESULT CSuperscopeStats::RefreshData(BOOL fGrabNewData)
{
if (fGrabNewData)
{
DWORD dwError = 0;
LPDHCP_MIB_INFO pMibInfo = NULL;
LPDHCP_SUPER_SCOPE_TABLE pSuperscopeTable = NULL;
LPDHCP_SUPER_SCOPE_TABLE_ENTRY pSuperscopeTableEntry = NULL;
// build up a list of scopes to get info from
BEGIN_WAIT_CURSOR;
dwError = ::DhcpGetSuperScopeInfoV4(m_strServerAddress, &pSuperscopeTable);
if (dwError != ERROR_SUCCESS)
{
::DhcpMessageBox(dwError);
return dwError;
}
// walk the list returned by the server
pSuperscopeTableEntry = pSuperscopeTable->pEntries;
if (pSuperscopeTableEntry == NULL && pSuperscopeTable->cEntries != 0)
{
ASSERT(FALSE);
return dwError; // Just in case
}
// clear the array out
m_dwScopeArray.RemoveAll();
// find any scope addresses that belong to this superscope and build our
// array for later
for (int iSuperscopeEntry = pSuperscopeTable->cEntries;
iSuperscopeEntry > 0;
iSuperscopeEntry--, pSuperscopeTableEntry++)
{
if (pSuperscopeTableEntry->SuperScopeName &&
m_strSuperscopeName.Compare(pSuperscopeTableEntry->SuperScopeName) == 0)
{
m_dwScopeArray.Add(pSuperscopeTableEntry->SubnetAddress);
}
}
dwError = ::DhcpGetMibInfo(m_strServerAddress, &pMibInfo);
END_WAIT_CURSOR;
if (dwError != ERROR_SUCCESS)
{
::DhcpMessageBox(dwError);
return dwError;
}
UpdateWindow(pMibInfo);
if (pMibInfo)
::DhcpRpcFreeMemory(pMibInfo);
}
return hrOK;
}
BOOL CSuperscopeStats::OnInitDialog()
{
CString st, strScopeAddress;
BOOL bRet;
AfxFormatString1(st, IDS_SUPERSCOPE_STATS_TITLE, m_strSuperscopeName);
SetWindowText((LPCTSTR) st);
bRet = StatsDialog::OnInitDialog();
// Set the default column widths to the width of the widest column
SetColumnWidths(2 /* Number of Columns */);
return bRet;
}
void CSuperscopeStats::Sort(UINT nColumnId)
{
// we don't sort any of our stats
}
afx_msg long CSuperscopeStats::OnNewStatsAvailable(UINT wParam, LONG lParam)
{
CDhcpSuperscope * pSuperscope;
CDhcpServer * pServer;
pSuperscope = GETHANDLER(CDhcpSuperscope, m_spNode);
pServer = pSuperscope->GetServerObject();
LPDHCP_MIB_INFO pMibInfo = pServer->DuplicateMibInfo();
Assert(pMibInfo);
if (!pMibInfo)
return 0;
UpdateWindow(pMibInfo);
pServer->FreeDupMibInfo(pMibInfo);
return 0;
}
void CSuperscopeStats::UpdateWindow(LPDHCP_MIB_INFO pMibInfo)
{
Assert (pMibInfo);
UINT i, j;
int nTotalAddresses = 0, nTotalInUse = 0, nTotalAvailable = 0;
if (pMibInfo)
{
LPSCOPE_MIB_INFO pScopeMibInfo = pMibInfo->ScopeInfo;
// walk the list of scopes and total the scopes that are in the superscope
for (i = 0; i < pMibInfo->Scopes; i++)
{
for (j = 0; j < (UINT) m_dwScopeArray.GetSize(); j++)
{
if (pScopeMibInfo[i].Subnet == m_dwScopeArray[j])
{
nTotalAddresses += (pScopeMibInfo[i].NumAddressesInuse + pScopeMibInfo[i].NumAddressesFree);
nTotalInUse += pScopeMibInfo[i].NumAddressesInuse;
nTotalAvailable += pScopeMibInfo[i].NumAddressesFree;
break;
}
}
}
}
int nPercent;
CString st;
TCHAR szFormat[] = _T("%d");
TCHAR szPercentFormat[] = _T("%d (%d%%)");
for (i = 0; i < SUPERSCOPE_STAT_MAX; i++)
{
if (!pMibInfo)
st = _T("---");
else
{
switch (i)
{
case SUPERSCOPE_STAT_TOTAL_SCOPES:
st.Format(szFormat, m_dwScopeArray.GetSize());
break;
case SUPERSCOPE_STAT_TOTAL_ADDRESSES:
st.Format(szFormat, nTotalAddresses);
break;
case SUPERSCOPE_STAT_IN_USE:
if (nTotalAddresses > 0)
nPercent = (nTotalInUse * 100) / nTotalAddresses;
else
nPercent = 0;
st.Format(szPercentFormat, nTotalInUse, nPercent);
break;
case SUPERSCOPE_STAT_AVAILABLE:
if (nTotalAddresses > 0)
nPercent = (nTotalAvailable * 100) / nTotalAddresses;
else
nPercent = 0;
st.Format(szPercentFormat, nTotalAvailable, nPercent);
break;
default:
Panic1("Unknown scope stat id : %d", i);
break;
}
}
m_listCtrl.SetItemText(i, 1, (LPCTSTR) st);
}
}