windows-nt/Source/XPSP1/NT/net/mmc/dhcp/servstat.cpp
2020-09-26 16:20:57 +08:00

284 lines
7.5 KiB
C++

/**********************************************************************/
/** Microsoft Windows/NT **/
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
/**********************************************************************/
/*
ServStat.cpp
The server statistics dialog
FILE HISTORY:
*/
#include "stdafx.h"
#include "ServStat.h"
#include "server.h"
#include "intltime.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
enum
{
SERVER_STAT_START_TIME = 0,
SERVER_STAT_UPTIME,
SERVER_STAT_DISCOVERS,
SERVER_STAT_OFFERS,
SERVER_STAT_REQUESTS,
SERVER_STAT_ACKS,
SERVER_STAT_NACKS,
SERVER_STAT_DECLINES,
SERVER_STAT_RELEASES,
SERVER_STAT_TOTAL_SCOPES,
SERVER_STAT_TOTAL_ADDRESSES,
SERVER_STAT_IN_USE,
SERVER_STAT_AVAILABLE,
SERVER_STAT_MAX
};
/*---------------------------------------------------------------------------
CServerStats implementation
---------------------------------------------------------------------------*/
const ContainerColumnInfo s_rgServerStatsColumnInfo[] =
{
{ IDS_SERVER_STATS_START_TIME, 0, TRUE },
{ IDS_SERVER_STATS_UPTIME, 0, TRUE },
{ IDS_SERVER_STATS_DISCOVERS, 0, TRUE },
{ IDS_SERVER_STATS_OFFERS, 0, TRUE },
{ IDS_SERVER_STATS_REQUESTS, 0, TRUE },
{ IDS_SERVER_STATS_ACKS, 0, TRUE },
{ IDS_SERVER_STATS_NACKS, 0, TRUE },
{ IDS_SERVER_STATS_DECLINES, 0, TRUE },
{ IDS_SERVER_STATS_RELEASES, 0, TRUE },
{ IDS_STATS_TOTAL_SCOPES, 0, TRUE },
{ IDS_STATS_TOTAL_ADDRESSES, 0, TRUE },
{ IDS_STATS_IN_USE, 0, TRUE },
{ IDS_STATS_AVAILABLE, 0, TRUE },
};
CServerStats::CServerStats()
: StatsDialog(STATSDLG_VERTICAL)
{
SetColumnInfo(s_rgServerStatsColumnInfo,
DimensionOf(s_rgServerStatsColumnInfo));
}
CServerStats::~CServerStats()
{
}
BEGIN_MESSAGE_MAP(CServerStats, StatsDialog)
//{{AFX_MSG_MAP(CServerStatistics)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_NEW_STATS_AVAILABLE, OnNewStatsAvailable)
END_MESSAGE_MAP()
HRESULT CServerStats::RefreshData(BOOL fGrabNewData)
{
if (fGrabNewData)
{
DWORD dwError = 0;
LPDHCP_MIB_INFO pMibInfo = NULL;
BEGIN_WAIT_CURSOR;
dwError = ::DhcpGetMibInfo(m_strServerAddress, &pMibInfo);
END_WAIT_CURSOR;
if (dwError != ERROR_SUCCESS)
{
::DhcpMessageBox(dwError);
return hrOK;
}
UpdateWindow(pMibInfo);
if (pMibInfo)
::DhcpRpcFreeMemory(pMibInfo);
}
return hrOK;
}
BOOL CServerStats::OnInitDialog()
{
CString st;
BOOL bRet;
AfxFormatString1(st, IDS_SERVER_STATS_TITLE, m_strServerAddress);
SetWindowText((LPCTSTR) st);
bRet = StatsDialog::OnInitDialog();
// set the default window size
RECT rect;
GetWindowRect(&rect);
SetWindowPos(NULL, rect.left, rect.top, SERVER_STATS_DEFAULT_WIDTH, SERVER_STATS_DEFAULT_HEIGHT, SWP_SHOWWINDOW);
// Set the default column widths to the width of the widest column
SetColumnWidths(2 /* Number of Columns */);
return bRet;
}
void CServerStats::Sort(UINT nColumnId)
{
// we don't sort any of our stats
}
afx_msg long CServerStats::OnNewStatsAvailable(UINT wParam, LONG lParam)
{
SPITFSNode spNode;
CDhcpServer * pServer;
pServer = GETHANDLER(CDhcpServer, m_spNode);
LPDHCP_MIB_INFO pMibInfo = pServer->DuplicateMibInfo();
Assert(pMibInfo);
if (!pMibInfo)
return 0;
UpdateWindow(pMibInfo);
pServer->FreeDupMibInfo(pMibInfo);
return 0;
}
void CServerStats::UpdateWindow(LPDHCP_MIB_INFO pMibInfo)
{
Assert (pMibInfo);
UINT i;
UINT nTotalAddresses = 0, nTotalInUse = 0, nTotalAvailable = 0;
if (pMibInfo)
{
LPSCOPE_MIB_INFO pScopeMibInfo = pMibInfo->ScopeInfo;
// walk the list of scopes and calculate totals
for (i = 0; i < pMibInfo->Scopes; i++)
{
nTotalAddresses += (pScopeMibInfo[i].NumAddressesInuse + pScopeMibInfo[i].NumAddressesFree);
nTotalInUse += pScopeMibInfo[i].NumAddressesInuse;
nTotalAvailable += pScopeMibInfo[i].NumAddressesFree;
}
}
int nPercent;
CString st;
TCHAR szFormat[] = _T("%d");
TCHAR szPercentFormat[] = _T("%d (%d%%)");
for (i = 0; i < SERVER_STAT_MAX; i++)
{
if (!pMibInfo)
st = _T("---");
else
{
switch (i)
{
case SERVER_STAT_START_TIME:
{
FILETIME filetime;
filetime.dwLowDateTime = pMibInfo->ServerStartTime.dwLowDateTime;
filetime.dwHighDateTime = pMibInfo->ServerStartTime.dwHighDateTime;
FormatDateTime(st, &filetime);
}
break;
case SERVER_STAT_UPTIME:
{
FILETIME filetime;
filetime.dwLowDateTime = pMibInfo->ServerStartTime.dwLowDateTime;
filetime.dwHighDateTime = pMibInfo->ServerStartTime.dwHighDateTime;
CTime timeServerStart(filetime);
CTime timeCurrent = CTime::GetCurrentTime();
CTimeSpan timeUp = timeCurrent - timeServerStart;
LONG_PTR nHours = timeUp.GetTotalHours();
LONG nMinutes = timeUp.GetMinutes();
LONG nSeconds = timeUp.GetSeconds();
CString strFormat;
strFormat.LoadString(IDS_UPTIME_FORMAT);
st.Format(strFormat, nHours, nMinutes, nSeconds);
}
break;
case SERVER_STAT_DISCOVERS:
st.Format(szFormat, pMibInfo->Discovers);
break;
case SERVER_STAT_OFFERS:
st.Format(szFormat, pMibInfo->Offers);
break;
case SERVER_STAT_REQUESTS:
st.Format(szFormat, pMibInfo->Requests);
break;
case SERVER_STAT_ACKS:
st.Format(szFormat, pMibInfo->Acks);
break;
case SERVER_STAT_NACKS:
st.Format(szFormat, pMibInfo->Naks);
break;
case SERVER_STAT_DECLINES:
st.Format(szFormat, pMibInfo->Declines);
break;
case SERVER_STAT_RELEASES:
st.Format(szFormat, pMibInfo->Releases);
break;
case SERVER_STAT_TOTAL_SCOPES:
st.Format(szFormat, pMibInfo->Scopes);
break;
case SERVER_STAT_TOTAL_ADDRESSES:
st.Format(szFormat, nTotalAddresses);
break;
case SERVER_STAT_IN_USE:
if (nTotalAddresses > 0)
nPercent = (int) ((float) (nTotalInUse * 100) / (float) nTotalAddresses);
else
nPercent = 0;
st.Format(szPercentFormat, nTotalInUse, nPercent);
break;
case SERVER_STAT_AVAILABLE:
if (nTotalAddresses > 0)
nPercent = (int) ((float) (nTotalAvailable * 100) / (float) nTotalAddresses);
else
nPercent = 0;
st.Format(szPercentFormat, nTotalAvailable, nPercent);
break;
default:
Panic1("Unknown server id : %d", i);
break;
}
}
m_listCtrl.SetItemText(i, 1, (LPCTSTR) st);
}
}