243 lines
6.4 KiB
C++
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);
|
|
}
|
|
|
|
}
|
|
|
|
|