1437 lines
40 KiB
C++
1437 lines
40 KiB
C++
|
/**********************************************************************/
|
||
|
/** Microsoft Windows/NT **/
|
||
|
/** Copyright(c) Microsoft Corporation, 1997 - 1999 **/
|
||
|
/**********************************************************************/
|
||
|
|
||
|
/*
|
||
|
ipxstats.cpp
|
||
|
IPX Statistics implementation.
|
||
|
|
||
|
FILE HISTORY:
|
||
|
|
||
|
*/
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "rtrutil.h" // smart MPR handle pointers
|
||
|
#include "format.h" // FormatNumber function
|
||
|
#include "column.h" // containercolumninfo
|
||
|
#include "ipxconn.h" // IPXConnection
|
||
|
#include "ipxutil.h"
|
||
|
#include "rtrlib.h" // DWORD_CMP
|
||
|
#include "ipxrtdef.h"
|
||
|
#include "routprot.h"
|
||
|
#include "stm.h" // for IPX_SERVICE
|
||
|
#include "listctrl.h"
|
||
|
|
||
|
#include "statsdlg.h"
|
||
|
#include "ipxstats.h"
|
||
|
#include "resource.h"
|
||
|
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
IPXStatisticsDialog implementation
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
|
||
|
BOOL IPXStatisticsDialog::OnInitDialog()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
CString stType;
|
||
|
CString stHost;
|
||
|
|
||
|
GetWindowText(stType);
|
||
|
|
||
|
stHost.Format((LPCTSTR) stType,
|
||
|
m_pIPXConn->GetMachineName());
|
||
|
|
||
|
SetWindowText(stHost);
|
||
|
|
||
|
return StatsDialog::OnInitDialog();
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IPXStatisticsDialog::PostNcDestroy
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
void IPXStatisticsDialog::PostNcDestroy()
|
||
|
{
|
||
|
StatsDialog::PostNcDestroy();
|
||
|
m_dwSortSubitem = 0xFFFFFFFF;
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IPXStatisticsDialog::Sort
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
void IPXStatisticsDialog::Sort(UINT nColumnId)
|
||
|
{
|
||
|
DWORD dwSubitemId;
|
||
|
|
||
|
if (m_pConfig)
|
||
|
dwSubitemId = m_pConfig->MapColumnToSubitem(m_ulId, nColumnId);
|
||
|
else
|
||
|
dwSubitemId = m_viewInfo.MapColumnToSubitem(nColumnId);
|
||
|
|
||
|
if (m_dwSortSubitem != -1)
|
||
|
{
|
||
|
if (dwSubitemId == m_dwSortSubitem)
|
||
|
m_fSortDirection = !m_fSortDirection;
|
||
|
else
|
||
|
m_fSortDirection = 0;
|
||
|
}
|
||
|
|
||
|
if (m_fSortDirection && GetInverseSortFunction())
|
||
|
m_listCtrl.SortItems(GetInverseSortFunction(), dwSubitemId);
|
||
|
else if (GetSortFunction())
|
||
|
m_listCtrl.SortItems(GetSortFunction(), dwSubitemId);
|
||
|
m_dwSortSubitem = dwSubitemId;
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IPXStatisticsDialog::SetConnectionData
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
void IPXStatisticsDialog::SetConnectionData(IPXConnection *pIPXConn)
|
||
|
{
|
||
|
if (m_pIPXConn)
|
||
|
m_pIPXConn->Release();
|
||
|
|
||
|
m_pIPXConn = pIPXConn;
|
||
|
|
||
|
if (pIPXConn)
|
||
|
pIPXConn->AddRef();
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IPXStatisticsDialog::GetSortFunction
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
PFNLVCOMPARE IPXStatisticsDialog::GetSortFunction()
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IPXStatisticsDialog::GetInverseSortFunction
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
PFNLVCOMPARE IPXStatisticsDialog::GetInverseSortFunction()
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// This list MUST be kept in sync with the enum above.
|
||
|
//
|
||
|
extern const ContainerColumnInfo s_rgIpxStatsColumnInfo[];
|
||
|
const ContainerColumnInfo s_rgIpxStatsColumnInfo[] =
|
||
|
{
|
||
|
{ IDS_STATS_IPX_STATE, 0, TRUE, COL_STATUS },
|
||
|
{ IDS_STATS_IPX_NETWORK, 0, TRUE, COL_IPXNET },
|
||
|
{ IDS_STATS_IPX_NODE, 0, TRUE, COL_STRING },
|
||
|
{ IDS_STATS_IPX_INTERFACE_COUNT, 0, TRUE, COL_LARGE_NUM },
|
||
|
{ IDS_STATS_IPX_ROUTE_COUNT, 0, TRUE, COL_LARGE_NUM },
|
||
|
{ IDS_STATS_IPX_SERVICE_COUNT, 0, TRUE, COL_LARGE_NUM },
|
||
|
{ IDS_STATS_IPX_PACKETS_SENT, 0, TRUE, COL_LARGE_NUM },
|
||
|
{ IDS_STATS_IPX_PACKETS_RCVD, 0, TRUE, COL_LARGE_NUM },
|
||
|
{ IDS_STATS_IPX_PACKETS_FRWD, 0, TRUE, COL_LARGE_NUM },
|
||
|
};
|
||
|
|
||
|
DEBUG_DECLARE_INSTANCE_COUNTER(IpxInfoStatistics);
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxInfoStatistics::IpxInfoStatistics
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
IpxInfoStatistics::IpxInfoStatistics()
|
||
|
: IPXStatisticsDialog(/*STATSDLG_FULLWINDOW | */
|
||
|
STATSDLG_CONTEXTMENU |
|
||
|
STATSDLG_SELECT_COLUMNS |
|
||
|
STATSDLG_VERTICAL)
|
||
|
{
|
||
|
SetColumnInfo(s_rgIpxStatsColumnInfo,
|
||
|
DimensionOf(s_rgIpxStatsColumnInfo));
|
||
|
|
||
|
DEBUG_INCREMENT_INSTANCE_COUNTER(IpxInfoStatistics);
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxInfoStatistics::~IpxInfoStatistics
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
IpxInfoStatistics::~IpxInfoStatistics()
|
||
|
{
|
||
|
SetConnectionData(NULL);
|
||
|
|
||
|
DEBUG_DECREMENT_INSTANCE_COUNTER(IpxInfoStatistics);
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxInfoStatistics::RefreshData
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
struct SIpxInfoData
|
||
|
{
|
||
|
IPXMIB_BASE m_mibBase;
|
||
|
|
||
|
DWORD m_cForwarded;
|
||
|
DWORD m_cReceived;
|
||
|
DWORD m_cSent;
|
||
|
};
|
||
|
|
||
|
HRESULT IpxInfoStatistics::RefreshData(BOOL fGrabNewData)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
int i;
|
||
|
int iPos;
|
||
|
DWORD dwValue;
|
||
|
CString st;
|
||
|
TCHAR szNumber[32];
|
||
|
IPX_MIB_GET_INPUT_DATA MibGetInputData;
|
||
|
PIPXMIB_BASE pIpxMib = NULL;
|
||
|
DWORD cbIpxMib;
|
||
|
DWORD dwErr;
|
||
|
SIpxInfoData ipxInfo;
|
||
|
SPMprMibBuffer spMib;
|
||
|
PIPX_INTERFACE pIpxIf = NULL;
|
||
|
DWORD cbIpxIf;
|
||
|
HRESULT hr = hrOK;
|
||
|
|
||
|
MibGetInputData.TableId = IPX_BASE_ENTRY;
|
||
|
dwErr = ::MprAdminMIBEntryGet(m_pIPXConn->GetMibHandle(),
|
||
|
PID_IPX,
|
||
|
IPX_PROTOCOL_BASE,
|
||
|
&MibGetInputData,
|
||
|
sizeof(MibGetInputData),
|
||
|
(LPVOID *) &pIpxMib,
|
||
|
&cbIpxMib);
|
||
|
hr = HRESULT_FROM_WIN32(dwErr);
|
||
|
if (FHrSucceeded(hr))
|
||
|
{
|
||
|
spMib = (PBYTE) pIpxMib;
|
||
|
|
||
|
ipxInfo.m_mibBase = *pIpxMib;
|
||
|
|
||
|
// Now loop over the interfaces to grab the aggregate data
|
||
|
ipxInfo.m_cForwarded = 0;
|
||
|
ipxInfo.m_cSent = 0;
|
||
|
ipxInfo.m_cReceived = 0;
|
||
|
|
||
|
MibGetInputData.TableId = IPX_INTERFACE_TABLE;
|
||
|
dwErr = ::MprAdminMIBEntryGetFirst(m_pIPXConn->GetMibHandle(),
|
||
|
PID_IPX,
|
||
|
IPX_PROTOCOL_BASE,
|
||
|
&MibGetInputData,
|
||
|
sizeof(MibGetInputData),
|
||
|
(LPVOID *) &pIpxIf,
|
||
|
&cbIpxIf);
|
||
|
hr = HRESULT_FROM_WIN32(dwErr);
|
||
|
spMib.Free();
|
||
|
spMib = (PBYTE) pIpxIf;
|
||
|
|
||
|
while (FHrSucceeded(hr))
|
||
|
{
|
||
|
if (pIpxIf->InterfaceIndex == 0)
|
||
|
ipxInfo.m_cForwarded -= pIpxIf->IfStats.InDelivers;
|
||
|
else
|
||
|
{
|
||
|
ipxInfo.m_cReceived += pIpxIf->IfStats.InDelivers;
|
||
|
ipxInfo.m_cForwarded += pIpxIf->IfStats.OutDelivers;
|
||
|
ipxInfo.m_cSent += pIpxIf->IfStats.OutDelivers;
|
||
|
}
|
||
|
|
||
|
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex =
|
||
|
pIpxIf->InterfaceIndex;
|
||
|
|
||
|
spMib.Free();
|
||
|
pIpxIf = NULL;
|
||
|
|
||
|
dwErr = ::MprAdminMIBEntryGetNext(m_pIPXConn->GetMibHandle(),
|
||
|
PID_IPX,
|
||
|
IPX_PROTOCOL_BASE,
|
||
|
&MibGetInputData,
|
||
|
sizeof(MibGetInputData),
|
||
|
(LPVOID *) &pIpxIf,
|
||
|
&cbIpxIf);
|
||
|
spMib = (PBYTE) pIpxIf;
|
||
|
hr = HRESULT_FROM_WIN32(dwErr);
|
||
|
}
|
||
|
|
||
|
if (hr == HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS))
|
||
|
hr = hrOK;
|
||
|
}
|
||
|
|
||
|
for (i=0; i<MVR_IPX_COUNT; i++)
|
||
|
{
|
||
|
if (IsSubitemVisible(i))
|
||
|
{
|
||
|
if (!FHrSucceeded(hr))
|
||
|
st.LoadString(IDS_STATS_NA);
|
||
|
else
|
||
|
{
|
||
|
st.Empty();
|
||
|
dwValue = 0;
|
||
|
|
||
|
switch (i)
|
||
|
{
|
||
|
case MVR_IPX_STATE:
|
||
|
st = IpxOperStateToCString(
|
||
|
ipxInfo.m_mibBase.OperState);
|
||
|
break;
|
||
|
case MVR_IPX_NETWORK:
|
||
|
FormatIpxNetworkNumber(szNumber,
|
||
|
DimensionOf(szNumber),
|
||
|
ipxInfo.m_mibBase.PrimaryNetNumber,
|
||
|
DimensionOf(ipxInfo.m_mibBase.PrimaryNetNumber));
|
||
|
st = szNumber;
|
||
|
break;
|
||
|
case MVR_IPX_NODE:
|
||
|
FormatMACAddress(szNumber,
|
||
|
DimensionOf(szNumber),
|
||
|
ipxInfo.m_mibBase.Node,
|
||
|
DimensionOf(ipxInfo.m_mibBase.Node));
|
||
|
st = szNumber;
|
||
|
break;
|
||
|
case MVR_IPX_INTERFACE_COUNT:
|
||
|
dwValue = ipxInfo.m_mibBase.IfCount;
|
||
|
break;
|
||
|
case MVR_IPX_ROUTE_COUNT:
|
||
|
dwValue = ipxInfo.m_mibBase.DestCount;
|
||
|
break;
|
||
|
case MVR_IPX_SERVICE_COUNT:
|
||
|
dwValue = ipxInfo.m_mibBase.ServCount;
|
||
|
break;
|
||
|
case MVR_IPX_PACKETS_SENT:
|
||
|
dwValue = ipxInfo.m_cSent;
|
||
|
break;
|
||
|
case MVR_IPX_PACKETS_RCVD:
|
||
|
dwValue = ipxInfo.m_cReceived;
|
||
|
break;
|
||
|
case MVR_IPX_PACKETS_FRWD:
|
||
|
dwValue = ipxInfo.m_cForwarded;
|
||
|
break;
|
||
|
default:
|
||
|
Panic1("Unknown IPX statistic id : %d", i);
|
||
|
st.LoadString(IDS_STATS_NA);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (st.IsEmpty())
|
||
|
{
|
||
|
FormatNumber(dwValue, szNumber, DimensionOf(szNumber),
|
||
|
FALSE);
|
||
|
st = szNumber;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
iPos = MapSubitemToColumn(i);
|
||
|
m_listCtrl.SetItemText(iPos, 1, (LPCTSTR) st);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxInfoStatistics::OnInitDialog
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
BOOL IpxInfoStatistics::OnInitDialog()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
CString st;
|
||
|
|
||
|
st.LoadString(IDS_STATS_IPX_INFO_TITLE);
|
||
|
SetWindowText((LPCTSTR) st);
|
||
|
return IPXStatisticsDialog::OnInitDialog();
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxInfoStatistics::Sort
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
void IpxInfoStatistics::Sort(UINT nColumnId)
|
||
|
{
|
||
|
// Don't do anything, the statistics are displayed in a
|
||
|
// vertical format
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
IpxRoutingStatistics implementation
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
extern const ContainerColumnInfo s_rgIpxRoutingStatsColumnInfo[];
|
||
|
const ContainerColumnInfo s_rgIpxRoutingStatsColumnInfo[] =
|
||
|
{
|
||
|
{ IDS_STATS_IPXROUTING_NETWORK, 0, TRUE, COL_IPXNET },
|
||
|
{ IDS_STATS_IPXROUTING_NEXT_HOP_MAC, 0, TRUE, COL_IPXNET },
|
||
|
{ IDS_STATS_IPXROUTING_TICK_COUNT, 0, TRUE, COL_LARGE_NUM },
|
||
|
{ IDS_STATS_IPXROUTING_HOP_COUNT, 0, TRUE, COL_SMALL_NUM },
|
||
|
{ IDS_STATS_IPXROUTING_IF_NAME, 0, TRUE, COL_IF_NAME },
|
||
|
{ IDS_STATS_IPXROUTING_PROTOCOL, 0, TRUE, COL_STRING },
|
||
|
{ IDS_STATS_IPXROUTING_ROUTE_NOTES, 0, TRUE, COL_STRING },
|
||
|
};
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(IpxRoutingStatistics, IPXStatisticsDialog)
|
||
|
ON_NOTIFY(LVN_GETDISPINFO, IDC_STATSDLG_LIST, OnNotifyGetDispInfo)
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxRoutingStatistics::IpxRoutingStatistics
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
IpxRoutingStatistics::IpxRoutingStatistics()
|
||
|
: IPXStatisticsDialog(/* STATSDLG_FULLWINDOW |*/
|
||
|
STATSDLG_CONTEXTMENU |
|
||
|
STATSDLG_SELECT_COLUMNS),
|
||
|
m_dwSortSubitem(0xFFFFFFFF)
|
||
|
{
|
||
|
m_ColWidthMultiple = 1;
|
||
|
m_ColWidthAdder = 15;
|
||
|
SetColumnInfo(s_rgIpxRoutingStatsColumnInfo, DimensionOf(s_rgIpxRoutingStatsColumnInfo));
|
||
|
|
||
|
if (m_pConfig)
|
||
|
{
|
||
|
ULONG cColumns = m_pConfig->GetColumnCount(m_ulId);
|
||
|
ColumnData *pColumnData = (ColumnData *) alloca(sizeof(ColumnData) * cColumns);
|
||
|
m_pConfig->GetColumnData(m_ulId, cColumns, pColumnData);
|
||
|
pColumnData[3].fmt = LVCFMT_RIGHT;
|
||
|
pColumnData[4].fmt = LVCFMT_RIGHT;
|
||
|
m_pConfig->SetColumnData(m_ulId, cColumns, pColumnData);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ULONG cColumns = m_viewInfo.GetColumnCount();
|
||
|
ColumnData *pColumnData = (ColumnData *) alloca(sizeof(ColumnData) * cColumns);
|
||
|
m_viewInfo.GetColumnData(cColumns, pColumnData);
|
||
|
pColumnData[3].fmt = LVCFMT_RIGHT;
|
||
|
pColumnData[4].fmt = LVCFMT_RIGHT;
|
||
|
m_viewInfo.SetColumnData(cColumns, pColumnData);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxRoutingStatistics::~IpxRoutingStatistics
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
IpxRoutingStatistics::~IpxRoutingStatistics()
|
||
|
{
|
||
|
SetConnectionData(NULL);
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxRoutingStatistics::SetRouterInfo
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
void IpxRoutingStatistics::SetRouterInfo(IRouterInfo *pRouterInfo)
|
||
|
{
|
||
|
m_spRouterInfo.Set(pRouterInfo);
|
||
|
}
|
||
|
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxRoutingStatistics::RefreshData
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
HRESULT IpxRoutingStatistics::RefreshData(BOOL fGrabNewData)
|
||
|
{
|
||
|
HRESULT hr = hrOK;
|
||
|
int i, cItems;
|
||
|
|
||
|
FixColumnAlignment();
|
||
|
|
||
|
CORg( GetIpxRoutingData() );
|
||
|
|
||
|
// Prepare the list control for the large amount of entries
|
||
|
if (m_listCtrl.GetItemCount() < m_Items.GetSize())
|
||
|
m_listCtrl.SetItemCount((int) m_Items.GetSize());
|
||
|
|
||
|
|
||
|
// Iterate through the array adding the data to the list control
|
||
|
cItems = (int) m_Items.GetSize();
|
||
|
for (i=0; i<cItems; i++)
|
||
|
{
|
||
|
// Add the items as callback items
|
||
|
m_listCtrl.InsertItem(LVIF_TEXT | LVIF_PARAM, i, LPSTR_TEXTCALLBACK,
|
||
|
0, 0, 0, (LPARAM) i);
|
||
|
}
|
||
|
|
||
|
Error:
|
||
|
return hrOK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxRoutingStatistics::GetIpxRoutingData
|
||
|
Grabs the IPX routing table and fills in the m_Items array with
|
||
|
that data.
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
HRESULT IpxRoutingStatistics::GetIpxRoutingData()
|
||
|
{
|
||
|
IPX_MIB_GET_INPUT_DATA MibGetInputData;
|
||
|
PIPXMIB_BASE pIpxMib = NULL;
|
||
|
DWORD cbIpxMib;
|
||
|
DWORD dwErr;
|
||
|
HRESULT hr = hrOK;
|
||
|
SPMprMibBuffer spMib;
|
||
|
PIPX_ROUTE pRoute = NULL;
|
||
|
SPMprMibBuffer spMibRoute;
|
||
|
DWORD cbRoute;
|
||
|
int cEntries = 0;
|
||
|
|
||
|
// Load up on the interface titles
|
||
|
CORg( FillInterfaceTable() );
|
||
|
|
||
|
MibGetInputData.TableId = IPX_BASE_ENTRY;
|
||
|
CWRg( ::MprAdminMIBEntryGet(m_pIPXConn->GetMibHandle(),
|
||
|
PID_IPX,
|
||
|
IPX_PROTOCOL_BASE,
|
||
|
&MibGetInputData,
|
||
|
sizeof(MibGetInputData),
|
||
|
(LPVOID *) &pIpxMib,
|
||
|
&cbIpxMib) );
|
||
|
if(pIpxMib == NULL)
|
||
|
{
|
||
|
hr = E_FAIL;
|
||
|
goto Error;
|
||
|
}
|
||
|
|
||
|
spMib = (PBYTE) pIpxMib;
|
||
|
|
||
|
// Prepare the data array for the number of items (+ some buffer)
|
||
|
m_Items.SetSize( pIpxMib->DestCount + 100);
|
||
|
|
||
|
MibGetInputData.TableId = IPX_DEST_TABLE;
|
||
|
|
||
|
dwErr = ::MprAdminMIBEntryGetFirst(m_pIPXConn->GetMibHandle(),
|
||
|
PID_IPX,
|
||
|
IPX_PROTOCOL_BASE,
|
||
|
&MibGetInputData,
|
||
|
sizeof(MibGetInputData),
|
||
|
(LPVOID *) &pRoute,
|
||
|
&cbRoute);
|
||
|
hr = HRESULT_FROM_WIN32(dwErr);
|
||
|
spMibRoute = (PBYTE) pRoute;
|
||
|
|
||
|
cEntries = 0;
|
||
|
|
||
|
while (FHrSucceeded(hr))
|
||
|
{
|
||
|
Assert(pRoute);
|
||
|
|
||
|
// Add this data at position cEntries
|
||
|
m_Items.SetAtGrow(cEntries, *pRoute);
|
||
|
cEntries++;
|
||
|
|
||
|
// Get the next set of data
|
||
|
MibGetInputData.TableId = IPX_DEST_TABLE;
|
||
|
memcpy(MibGetInputData.MibIndex.RoutingTableIndex.Network,
|
||
|
pRoute->Network,
|
||
|
sizeof(MibGetInputData.MibIndex.RoutingTableIndex.Network));
|
||
|
pRoute = NULL;
|
||
|
spMibRoute.Free();
|
||
|
|
||
|
dwErr = ::MprAdminMIBEntryGetNext(m_pIPXConn->GetMibHandle(),
|
||
|
PID_IPX,
|
||
|
IPX_PROTOCOL_BASE,
|
||
|
&MibGetInputData,
|
||
|
sizeof(MibGetInputData),
|
||
|
(LPVOID *) &pRoute,
|
||
|
&cbRoute);
|
||
|
hr = HRESULT_FROM_WIN32(dwErr);
|
||
|
spMibRoute = (PBYTE) pRoute;
|
||
|
}
|
||
|
|
||
|
// Do this to make sure that we don't have bogus entries at the top
|
||
|
// of the array and that we can use the GetSize() to get an accurate
|
||
|
// count of the number of items.
|
||
|
m_Items.SetSize(cEntries);
|
||
|
|
||
|
Error:
|
||
|
if (hr == HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS))
|
||
|
hr = hrOK;
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxRoutingStatistics::FillInterfaceTable
|
||
|
Fills m_rgIfTitle with the interface titles.
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
HRESULT IpxRoutingStatistics::FillInterfaceTable()
|
||
|
{
|
||
|
HRESULT hr = hrOK;
|
||
|
IPX_MIB_GET_INPUT_DATA MibGetInputData;
|
||
|
PIPX_INTERFACE pIpxIf = NULL;
|
||
|
DWORD cbIfTable;
|
||
|
SPIInterfaceInfo spIf;
|
||
|
SPIEnumInterfaceInfo spEnumIf;
|
||
|
LPCOLESTR poszIfName;
|
||
|
SPMprMibBuffer spMib;
|
||
|
DWORD dwErr;
|
||
|
USES_CONVERSION;
|
||
|
|
||
|
MibGetInputData.TableId = IPX_INTERFACE_TABLE;
|
||
|
CWRg( ::MprAdminMIBEntryGetFirst(m_pIPXConn->GetMibHandle(),
|
||
|
PID_IPX,
|
||
|
IPX_PROTOCOL_BASE,
|
||
|
&MibGetInputData,
|
||
|
sizeof(MibGetInputData),
|
||
|
(LPVOID *) &pIpxIf,
|
||
|
&cbIfTable));
|
||
|
spMib = (PBYTE) pIpxIf;
|
||
|
|
||
|
m_spRouterInfo->EnumInterface(&spEnumIf);
|
||
|
|
||
|
while (FHrSucceeded(hr))
|
||
|
{
|
||
|
poszIfName = A2COLE((LPCSTR)(pIpxIf->InterfaceName));
|
||
|
|
||
|
spIf.Release();
|
||
|
|
||
|
spEnumIf->Reset();
|
||
|
for (; spEnumIf->Next(1, &spIf, NULL) == hrOK; spIf.Release())
|
||
|
{
|
||
|
// Look for a match on the interface name
|
||
|
if (StriCmpOle(poszIfName, spIf->GetId()) == 0)
|
||
|
{
|
||
|
m_rgIfTitle.SetAtGrow(pIpxIf->InterfaceIndex,
|
||
|
OLE2CT(spIf->GetTitle()));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex =
|
||
|
pIpxIf->InterfaceIndex;
|
||
|
|
||
|
// Get the next name
|
||
|
spMib.Free();
|
||
|
pIpxIf = NULL;
|
||
|
|
||
|
dwErr = ::MprAdminMIBEntryGetNext(m_pIPXConn->GetMibHandle(),
|
||
|
PID_IPX,
|
||
|
IPX_PROTOCOL_BASE,
|
||
|
&MibGetInputData,
|
||
|
sizeof(MibGetInputData),
|
||
|
(LPVOID *) &pIpxIf,
|
||
|
&cbIfTable);
|
||
|
hr = HRESULT_FROM_WIN32(dwErr);
|
||
|
spMib = (PBYTE) pIpxIf;
|
||
|
}
|
||
|
|
||
|
Error:
|
||
|
if (hr == HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS))
|
||
|
hr = hrOK;
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxRoutingStatistics::FixColumnAlignment
|
||
|
-
|
||
|
Author: Deonb
|
||
|
Fixes the column allignment for the Tick & Hop count columns.
|
||
|
---------------------------------------------------------------------------*/
|
||
|
void IpxRoutingStatistics::FixColumnAlignment()
|
||
|
{
|
||
|
ULONG cColumns;
|
||
|
ColumnData *pColumnData;
|
||
|
|
||
|
if (m_pConfig)
|
||
|
{
|
||
|
cColumns = m_pConfig->GetColumnCount(m_ulId);
|
||
|
pColumnData = (ColumnData *) alloca(sizeof(ColumnData) * cColumns);
|
||
|
|
||
|
m_pConfig->GetColumnData(m_ulId, cColumns, pColumnData);
|
||
|
for (ULONG i = 0; i < cColumns; i++)
|
||
|
pColumnData[m_pConfig->MapColumnToSubitem(m_ulId, i)].fmt = LVCFMT_LEFT;
|
||
|
|
||
|
pColumnData[m_pConfig->MapColumnToSubitem(m_ulId, 2)].fmt = LVCFMT_RIGHT;
|
||
|
pColumnData[m_pConfig->MapColumnToSubitem(m_ulId, 3)].fmt = LVCFMT_RIGHT;
|
||
|
m_pConfig->SetColumnData(m_ulId, cColumns, pColumnData);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
cColumns = m_viewInfo.GetColumnCount();
|
||
|
pColumnData = (ColumnData *) alloca(sizeof(ColumnData) * cColumns);
|
||
|
|
||
|
m_viewInfo.GetColumnData(cColumns, pColumnData);
|
||
|
|
||
|
for (ULONG i = 0; i < cColumns; i++)
|
||
|
pColumnData[m_viewInfo.MapColumnToSubitem(i)].fmt = LVCFMT_LEFT;
|
||
|
|
||
|
pColumnData[m_viewInfo.MapColumnToSubitem(2)].fmt = LVCFMT_RIGHT;
|
||
|
pColumnData[m_viewInfo.MapColumnToSubitem(3)].fmt = LVCFMT_RIGHT;
|
||
|
m_viewInfo.SetColumnData(cColumns, pColumnData);
|
||
|
}
|
||
|
|
||
|
for (ULONG i = 0; i < cColumns; i++)
|
||
|
{
|
||
|
LVCOLUMN lvc;
|
||
|
lvc.mask = LVCF_FMT;
|
||
|
lvc.fmt = pColumnData[i].fmt;
|
||
|
m_listCtrl.SendMessage(LVM_SETCOLUMN, i, (LPARAM)&lvc);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxRoutingStatistics::OnInitDialog
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
BOOL IpxRoutingStatistics::OnInitDialog()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
CString st;
|
||
|
|
||
|
st.LoadString(IDS_STATS_IPX_ROUTING_TITLE);
|
||
|
SetWindowText((LPCTSTR) st);
|
||
|
|
||
|
FixColumnAlignment();
|
||
|
|
||
|
return IPXStatisticsDialog::OnInitDialog();
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxRoutingStatistics::PostNcDestroy
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
void IpxRoutingStatistics::PostNcDestroy()
|
||
|
{
|
||
|
IPXStatisticsDialog::PostNcDestroy();
|
||
|
m_dwSortSubitem = 0xFFFFFFFF;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxRoutingStatisticsCompareProc
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
struct SIpxRoutingSortInfo
|
||
|
{
|
||
|
DWORD m_dwSubitemId;
|
||
|
IpxRoutingStatistics * m_pIpx;
|
||
|
};
|
||
|
|
||
|
int CALLBACK IpxRoutingStatisticsCompareProc(LPARAM lParam1, LPARAM lParam2,
|
||
|
LPARAM lParamSort)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
int iReturn = 0;
|
||
|
SIpxRoutingSortInfo * pSort = (SIpxRoutingSortInfo *) lParamSort;
|
||
|
IpxRoutingStatistics * pIpx;
|
||
|
PIPX_ROUTE pRoute1;
|
||
|
PIPX_ROUTE pRoute2;
|
||
|
|
||
|
pIpx = pSort->m_pIpx;
|
||
|
pRoute1 = &(pIpx->m_Items[(int)lParam1]);
|
||
|
pRoute2 = &(pIpx->m_Items[(int)lParam2]);
|
||
|
|
||
|
switch (pSort->m_dwSubitemId)
|
||
|
{
|
||
|
case MVR_IPXROUTING_NETWORK:
|
||
|
iReturn = memcmp(pRoute1->Network,
|
||
|
pRoute2->Network,
|
||
|
sizeof(pRoute1->Network));
|
||
|
break;
|
||
|
case MVR_IPXROUTING_NEXT_HOP_MAC:
|
||
|
iReturn = memcmp(pRoute1->NextHopMacAddress,
|
||
|
pRoute2->NextHopMacAddress,
|
||
|
sizeof(pRoute1->NextHopMacAddress));
|
||
|
break;
|
||
|
case MVR_IPXROUTING_TICK_COUNT:
|
||
|
iReturn = DWORD_CMP(pRoute1->TickCount,
|
||
|
pRoute2->TickCount);
|
||
|
break;
|
||
|
case MVR_IPXROUTING_HOP_COUNT:
|
||
|
iReturn = DWORD_CMP(pRoute1->HopCount,
|
||
|
pRoute2->HopCount);
|
||
|
break;
|
||
|
case MVR_IPXROUTING_IF_NAME:
|
||
|
{
|
||
|
CString st1, st2;
|
||
|
if (pRoute1->InterfaceIndex == GLOBAL_INTERFACE_INDEX)
|
||
|
st1.LoadString(IDS_IPX_WAN_CLIENT_ROUTE);
|
||
|
else
|
||
|
st1 = pIpx->m_rgIfTitle[pRoute1->InterfaceIndex];
|
||
|
|
||
|
if (pRoute2->InterfaceIndex == GLOBAL_INTERFACE_INDEX)
|
||
|
st2.LoadString(IDS_IPX_WAN_CLIENT_ROUTE);
|
||
|
else
|
||
|
st2 = pIpx->m_rgIfTitle[pRoute2->InterfaceIndex];
|
||
|
iReturn = StriCmp((LPCTSTR) st1, (LPCTSTR) st2);
|
||
|
}
|
||
|
break;
|
||
|
case MVR_IPXROUTING_PROTOCOL:
|
||
|
{
|
||
|
CString st1, st2;
|
||
|
st1 = IpxProtocolToCString(pRoute1->Protocol);
|
||
|
st2 = IpxProtocolToCString(pRoute2->Protocol);
|
||
|
iReturn = StriCmp((LPCTSTR) st1, (LPCTSTR) st2);
|
||
|
}
|
||
|
break;
|
||
|
case MVR_IPXROUTING_ROUTE_NOTES:
|
||
|
iReturn = DWORD_CMP(pRoute1->Flags,
|
||
|
pRoute2->Flags);
|
||
|
break;
|
||
|
}
|
||
|
return iReturn;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxRoutingStatisticsCompareProcMinus
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
int CALLBACK IpxRoutingStatisticsCompareProcMinus(LPARAM lParam1, LPARAM lParam2,
|
||
|
LPARAM lParamSort)
|
||
|
|
||
|
{
|
||
|
return -IpxRoutingStatisticsCompareProc(lParam1, lParam2, lParamSort);
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxRoutingStatistics::Sort
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
void IpxRoutingStatistics::Sort(UINT nColumnId)
|
||
|
{
|
||
|
SIpxRoutingSortInfo ipxSortInfo;
|
||
|
DWORD dwSubitemId;
|
||
|
|
||
|
if (m_pConfig)
|
||
|
dwSubitemId = m_pConfig->MapColumnToSubitem(m_ulId, nColumnId);
|
||
|
else
|
||
|
dwSubitemId = m_viewInfo.MapColumnToSubitem(nColumnId);
|
||
|
|
||
|
if (m_dwSortSubitem != -1)
|
||
|
{
|
||
|
if (dwSubitemId == m_dwSortSubitem)
|
||
|
m_fSortDirection = !m_fSortDirection;
|
||
|
else
|
||
|
m_fSortDirection = 0;
|
||
|
}
|
||
|
|
||
|
ipxSortInfo.m_dwSubitemId = dwSubitemId;
|
||
|
ipxSortInfo.m_pIpx = this;
|
||
|
|
||
|
if (m_fSortDirection)
|
||
|
{
|
||
|
m_listCtrl.SortItems(IpxRoutingStatisticsCompareProcMinus, (LPARAM) &ipxSortInfo);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_listCtrl.SortItems(IpxRoutingStatisticsCompareProc, (LPARAM) &ipxSortInfo);
|
||
|
}
|
||
|
m_dwSortSubitem = dwSubitemId;
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxRoutingStatistics::PreDeleteAllItems
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
void IpxRoutingStatistics::PreDeleteAllItems()
|
||
|
{
|
||
|
m_Items.SetSize(0);
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxRoutingStatistics::OnNotifyGetDispInfo
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
void IpxRoutingStatistics::OnNotifyGetDispInfo(NMHDR *pNmHdr, LRESULT *pResult)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
LV_DISPINFO * plvDispInfo = reinterpret_cast<LV_DISPINFO *>(pNmHdr);
|
||
|
LV_ITEM * plvItem = &(plvDispInfo->item);
|
||
|
ULONG iIndex = (ULONG)plvItem->lParam;
|
||
|
TCHAR szNumber[32];
|
||
|
CString st;
|
||
|
|
||
|
if ((plvItem->mask & LVIF_PARAM) == 0)
|
||
|
{
|
||
|
// Ok, this lParam is not valid, we will need to request
|
||
|
// the lParam for this item
|
||
|
iIndex = (ULONG)m_listCtrl.GetItemData(plvItem->iItem);
|
||
|
}
|
||
|
|
||
|
// Ok, we can now get the data for this item
|
||
|
switch (MapColumnToSubitem(plvItem->iSubItem))
|
||
|
{
|
||
|
case MVR_IPXROUTING_NETWORK:
|
||
|
FormatIpxNetworkNumber(szNumber, DimensionOf(szNumber),
|
||
|
m_Items[iIndex].Network,
|
||
|
DimensionOf(m_Items[iIndex].Network));
|
||
|
st = szNumber;
|
||
|
break;
|
||
|
case MVR_IPXROUTING_NEXT_HOP_MAC:
|
||
|
FormatMACAddress(szNumber, DimensionOf(szNumber),
|
||
|
m_Items[iIndex].NextHopMacAddress,
|
||
|
DimensionOf(m_Items[iIndex].NextHopMacAddress));
|
||
|
st = szNumber;
|
||
|
break;
|
||
|
case MVR_IPXROUTING_TICK_COUNT:
|
||
|
FormatNumber(m_Items[iIndex].TickCount,
|
||
|
szNumber, DimensionOf(szNumber),
|
||
|
FALSE);
|
||
|
st = szNumber;
|
||
|
break;
|
||
|
case MVR_IPXROUTING_HOP_COUNT:
|
||
|
FormatNumber(m_Items[iIndex].HopCount,
|
||
|
szNumber, DimensionOf(szNumber),
|
||
|
FALSE);
|
||
|
st = szNumber;
|
||
|
break;
|
||
|
case MVR_IPXROUTING_IF_NAME:
|
||
|
if (m_Items[iIndex].InterfaceIndex == GLOBAL_INTERFACE_INDEX)
|
||
|
st.LoadString(IDS_IPX_WAN_CLIENT_ROUTE);
|
||
|
else
|
||
|
st = m_rgIfTitle[m_Items[iIndex].InterfaceIndex];
|
||
|
break;
|
||
|
case MVR_IPXROUTING_PROTOCOL:
|
||
|
st = IpxProtocolToCString(m_Items[iIndex].Protocol);
|
||
|
break;
|
||
|
case MVR_IPXROUTING_ROUTE_NOTES:
|
||
|
st = IpxRouteNotesToCString(m_Items[iIndex].Flags);
|
||
|
break;
|
||
|
default:
|
||
|
Panic1("Unknown IPX routing id! %d",
|
||
|
MapColumnToSubitem(plvItem->iSubItem));
|
||
|
break;
|
||
|
}
|
||
|
lstrcpyn(plvItem->pszText, (LPCTSTR) st, plvItem->cchTextMax);
|
||
|
}
|
||
|
|
||
|
|
||
|
/*---------------------------------------------------------------------------
|
||
|
IpxServiceStatistics implementation
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
extern const ContainerColumnInfo s_rgIpxServiceStatsColumnInfo[];
|
||
|
const ContainerColumnInfo s_rgIpxServiceStatsColumnInfo[] =
|
||
|
{
|
||
|
{ IDS_STATS_IPXSERVICE_SERVICE_NAME, 0, TRUE, COL_STRING },
|
||
|
{ IDS_STATS_IPXSERVICE_SERVICE_TYPE, 0, TRUE, COL_STRING },
|
||
|
{ IDS_STATS_IPXSERVICE_SERVICE_ADDRESS, 0, TRUE, COL_STRING },
|
||
|
{ IDS_STATS_IPXSERVICE_HOP_COUNT, 0, TRUE, COL_SMALL_NUM },
|
||
|
{ IDS_STATS_IPXSERVICE_IF_NAME, 0, TRUE, COL_IF_NAME },
|
||
|
{ IDS_STATS_IPXSERVICE_PROTOCOL, 0, TRUE, COL_STRING },
|
||
|
};
|
||
|
|
||
|
BEGIN_MESSAGE_MAP(IpxServiceStatistics, IPXStatisticsDialog)
|
||
|
ON_NOTIFY(LVN_GETDISPINFO, IDC_STATSDLG_LIST, OnNotifyGetDispInfo)
|
||
|
END_MESSAGE_MAP()
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxServiceStatistics::IpxServiceStatistics
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
IpxServiceStatistics::IpxServiceStatistics()
|
||
|
: IPXStatisticsDialog(/*STATSDLG_FULLWINDOW |*/
|
||
|
STATSDLG_CONTEXTMENU |
|
||
|
STATSDLG_SELECT_COLUMNS),
|
||
|
m_dwSortSubitem(0xFFFFFFFF)
|
||
|
{
|
||
|
SetColumnInfo(s_rgIpxServiceStatsColumnInfo,
|
||
|
DimensionOf(s_rgIpxServiceStatsColumnInfo));
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxServiceStatistics::~IpxServiceStatistics
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
IpxServiceStatistics::~IpxServiceStatistics()
|
||
|
{
|
||
|
m_Items.SetSize(0);
|
||
|
SetConnectionData(NULL);
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxServiceStatistics::SetRouterInfo
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
void IpxServiceStatistics::SetRouterInfo(IRouterInfo *pRouterInfo)
|
||
|
{
|
||
|
m_spRouterInfo.Set(pRouterInfo);
|
||
|
}
|
||
|
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxServiceStatistics::RefreshData
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
HRESULT IpxServiceStatistics::RefreshData(BOOL fGrabNewData)
|
||
|
{
|
||
|
HRESULT hr = hrOK;
|
||
|
int i, cItems;
|
||
|
|
||
|
if (fGrabNewData)
|
||
|
{
|
||
|
m_Items.SetSize(0);
|
||
|
|
||
|
CORg( GetIpxServiceData() );
|
||
|
|
||
|
// Prepare the list control for the large amount of entries
|
||
|
if (m_listCtrl.GetItemCount() < m_Items.GetSize())
|
||
|
m_listCtrl.SetItemCount((int) m_Items.GetSize());
|
||
|
}
|
||
|
|
||
|
|
||
|
// Iterate through the array adding the data to the list control
|
||
|
cItems = (int) m_Items.GetSize();
|
||
|
for (i=0; i<cItems; i++)
|
||
|
{
|
||
|
// Add the items as callback items
|
||
|
m_listCtrl.InsertItem(LVIF_TEXT | LVIF_PARAM, i, LPSTR_TEXTCALLBACK,
|
||
|
0, 0, 0, (DWORD) i);
|
||
|
}
|
||
|
|
||
|
Error:
|
||
|
return hrOK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxServiceStatistics::GetIpxServiceData
|
||
|
Grabs the IPX service table and fills in the m_Items array with
|
||
|
that data.
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
HRESULT IpxServiceStatistics::GetIpxServiceData()
|
||
|
{
|
||
|
IPX_MIB_GET_INPUT_DATA MibGetInputData;
|
||
|
PIPXMIB_BASE pIpxMib = NULL;
|
||
|
DWORD cbIpxMib;
|
||
|
DWORD dwErr;
|
||
|
HRESULT hr = hrOK;
|
||
|
SPMprMibBuffer spMib;
|
||
|
PIPX_SERVICE pService = NULL;
|
||
|
SPMprMibBuffer spMibRoute;
|
||
|
DWORD cbService;
|
||
|
int cEntries = 0;
|
||
|
|
||
|
// Load up on the interface titles
|
||
|
CORg( FillInterfaceTable() );
|
||
|
|
||
|
MibGetInputData.TableId = IPX_BASE_ENTRY;
|
||
|
CWRg( ::MprAdminMIBEntryGet(m_pIPXConn->GetMibHandle(),
|
||
|
PID_IPX,
|
||
|
IPX_PROTOCOL_BASE,
|
||
|
&MibGetInputData,
|
||
|
sizeof(MibGetInputData),
|
||
|
(LPVOID *) &pIpxMib,
|
||
|
&cbIpxMib) );
|
||
|
if(pIpxMib == NULL)
|
||
|
{
|
||
|
hr = E_FAIL;
|
||
|
goto Error;
|
||
|
}
|
||
|
|
||
|
spMib = (PBYTE) pIpxMib;
|
||
|
|
||
|
// Prepare the data array for the number of items (+ some buffer)
|
||
|
m_Items.SetSize( pIpxMib->DestCount + 100);
|
||
|
|
||
|
MibGetInputData.TableId = IPX_SERV_TABLE;
|
||
|
|
||
|
dwErr = ::MprAdminMIBEntryGetFirst(m_pIPXConn->GetMibHandle(),
|
||
|
PID_IPX,
|
||
|
IPX_PROTOCOL_BASE,
|
||
|
&MibGetInputData,
|
||
|
sizeof(MibGetInputData),
|
||
|
(LPVOID *) &pService,
|
||
|
&cbService);
|
||
|
hr = HRESULT_FROM_WIN32(dwErr);
|
||
|
spMibRoute = (PBYTE) pService;
|
||
|
|
||
|
cEntries = 0;
|
||
|
|
||
|
while (FHrSucceeded(hr))
|
||
|
{
|
||
|
Assert(pService);
|
||
|
|
||
|
// Add this data at position cEntries
|
||
|
m_Items.SetAtGrow(cEntries, *pService);
|
||
|
cEntries++;
|
||
|
|
||
|
// Get the next set of data
|
||
|
MibGetInputData.TableId = IPX_SERV_TABLE;
|
||
|
MibGetInputData.MibIndex.ServicesTableIndex.ServiceType =
|
||
|
pService->Server.Type;
|
||
|
memcpy(MibGetInputData.MibIndex.ServicesTableIndex.ServiceName,
|
||
|
pService->Server.Name,
|
||
|
sizeof(MibGetInputData.MibIndex.ServicesTableIndex.ServiceName));
|
||
|
pService = NULL;
|
||
|
spMibRoute.Free();
|
||
|
|
||
|
dwErr = ::MprAdminMIBEntryGetNext(m_pIPXConn->GetMibHandle(),
|
||
|
PID_IPX,
|
||
|
IPX_PROTOCOL_BASE,
|
||
|
&MibGetInputData,
|
||
|
sizeof(MibGetInputData),
|
||
|
(LPVOID *) &pService,
|
||
|
&cbService);
|
||
|
hr = HRESULT_FROM_WIN32(dwErr);
|
||
|
spMibRoute = (PBYTE) pService;
|
||
|
}
|
||
|
|
||
|
// Do this to make sure that we don't have bogus entries at the top
|
||
|
// of the array and that we can use the GetSize() to get an accurate
|
||
|
// count of the number of items.
|
||
|
m_Items.SetSize(cEntries);
|
||
|
|
||
|
Error:
|
||
|
if (hr == HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS))
|
||
|
hr = hrOK;
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxServiceStatistics::FillInterfaceTable
|
||
|
Fills m_rgIfTitle with the interface titles.
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
HRESULT IpxServiceStatistics::FillInterfaceTable()
|
||
|
{
|
||
|
HRESULT hr = hrOK;
|
||
|
IPX_MIB_GET_INPUT_DATA MibGetInputData;
|
||
|
PIPX_INTERFACE pIpxIf = NULL;
|
||
|
DWORD cbIfTable;
|
||
|
SPIInterfaceInfo spIf;
|
||
|
SPIEnumInterfaceInfo spEnumIf;
|
||
|
LPCOLESTR poszIfName;
|
||
|
SPMprMibBuffer spMib;
|
||
|
DWORD dwErr;
|
||
|
USES_CONVERSION;
|
||
|
|
||
|
MibGetInputData.TableId = IPX_INTERFACE_TABLE;
|
||
|
CWRg( ::MprAdminMIBEntryGetFirst(m_pIPXConn->GetMibHandle(),
|
||
|
PID_IPX,
|
||
|
IPX_PROTOCOL_BASE,
|
||
|
&MibGetInputData,
|
||
|
sizeof(MibGetInputData),
|
||
|
(LPVOID *) &pIpxIf,
|
||
|
&cbIfTable));
|
||
|
spMib = (PBYTE) pIpxIf;
|
||
|
|
||
|
m_spRouterInfo->EnumInterface(&spEnumIf);
|
||
|
|
||
|
while (FHrSucceeded(hr))
|
||
|
{
|
||
|
poszIfName = A2COLE((LPCSTR)(pIpxIf->InterfaceName));
|
||
|
|
||
|
spIf.Release();
|
||
|
|
||
|
spEnumIf->Reset();
|
||
|
for (; spEnumIf->Next(1, &spIf, NULL) == hrOK; spIf.Release())
|
||
|
{
|
||
|
// Look for a match on the interface name
|
||
|
if (StriCmpOle(poszIfName, spIf->GetId()) == 0)
|
||
|
{
|
||
|
m_rgIfTitle.SetAtGrow(pIpxIf->InterfaceIndex,
|
||
|
OLE2CT(spIf->GetTitle()));
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
MibGetInputData.MibIndex.InterfaceTableIndex.InterfaceIndex =
|
||
|
pIpxIf->InterfaceIndex;
|
||
|
|
||
|
// Get the next name
|
||
|
spMib.Free();
|
||
|
pIpxIf = NULL;
|
||
|
|
||
|
dwErr = ::MprAdminMIBEntryGetNext(m_pIPXConn->GetMibHandle(),
|
||
|
PID_IPX,
|
||
|
IPX_PROTOCOL_BASE,
|
||
|
&MibGetInputData,
|
||
|
sizeof(MibGetInputData),
|
||
|
(LPVOID *) &pIpxIf,
|
||
|
&cbIfTable);
|
||
|
hr = HRESULT_FROM_WIN32(dwErr);
|
||
|
spMib = (PBYTE) pIpxIf;
|
||
|
}
|
||
|
|
||
|
Error:
|
||
|
if (hr == HRESULT_FROM_WIN32(ERROR_NO_MORE_ITEMS))
|
||
|
hr = hrOK;
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxServiceStatistics::OnInitDialog
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
BOOL IpxServiceStatistics::OnInitDialog()
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
CString st;
|
||
|
|
||
|
st.LoadString(IDS_STATS_IPX_SERVICE_TITLE);
|
||
|
SetWindowText((LPCTSTR) st);
|
||
|
return IPXStatisticsDialog::OnInitDialog();
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxServiceStatistics::PostNcDestroy
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
void IpxServiceStatistics::PostNcDestroy()
|
||
|
{
|
||
|
IPXStatisticsDialog::PostNcDestroy();
|
||
|
m_dwSortSubitem = 0xFFFFFFFF;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxServiceStatisticsCompareProc
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
|
||
|
struct SIpxServiceSortInfo
|
||
|
{
|
||
|
DWORD m_dwSubitemId;
|
||
|
IpxServiceStatistics * m_pIpx;
|
||
|
};
|
||
|
|
||
|
int CALLBACK IpxServiceStatisticsCompareProc(LPARAM lParam1, LPARAM lParam2,
|
||
|
LPARAM lParamSort)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
int iReturn = 0;
|
||
|
SIpxServiceSortInfo * pSort = (SIpxServiceSortInfo *) lParamSort;
|
||
|
IpxServiceStatistics * pIpx;
|
||
|
PIPX_SERVICE pService1;
|
||
|
PIPX_SERVICE pService2;
|
||
|
|
||
|
pIpx = pSort->m_pIpx;
|
||
|
pService1 = &(pIpx->m_Items[(int)lParam1]);
|
||
|
pService2 = &(pIpx->m_Items[(int)lParam2]);
|
||
|
|
||
|
switch (pSort->m_dwSubitemId)
|
||
|
{
|
||
|
case MVR_IPXSERVICE_SERVICE_TYPE:
|
||
|
iReturn = pService1->Server.Type - pService2->Server.Type;
|
||
|
break;
|
||
|
case MVR_IPXSERVICE_SERVICE_NAME:
|
||
|
iReturn = StriCmpA((LPCSTR) pService1->Server.Name,
|
||
|
(LPCSTR) pService2->Server.Name);
|
||
|
break;
|
||
|
case MVR_IPXSERVICE_SERVICE_ADDRESS:
|
||
|
iReturn = memcmp(pService1->Server.Network,
|
||
|
pService2->Server.Network,
|
||
|
sizeof(pService1->Server.Network));
|
||
|
if (iReturn == 0)
|
||
|
iReturn = memcmp(pService1->Server.Node,
|
||
|
pService2->Server.Node,
|
||
|
sizeof(pService1->Server.Node));
|
||
|
if (iReturn == 0)
|
||
|
iReturn = memcmp(pService1->Server.Socket,
|
||
|
pService2->Server.Socket,
|
||
|
sizeof(pService1->Server.Socket));
|
||
|
break;
|
||
|
case MVR_IPXSERVICE_HOP_COUNT:
|
||
|
iReturn = DWORD_CMP(pService1->Server.HopCount,
|
||
|
pService2->Server.HopCount);
|
||
|
break;
|
||
|
case MVR_IPXSERVICE_IF_NAME:
|
||
|
{
|
||
|
CString st1, st2;
|
||
|
if (pService1->InterfaceIndex == GLOBAL_INTERFACE_INDEX)
|
||
|
st1.LoadString(IDS_IPX_WAN_CLIENT_ROUTE);
|
||
|
else
|
||
|
st1 = pIpx->m_rgIfTitle[pService1->InterfaceIndex];
|
||
|
|
||
|
if (pService2->InterfaceIndex == GLOBAL_INTERFACE_INDEX)
|
||
|
st2.LoadString(IDS_IPX_WAN_CLIENT_ROUTE);
|
||
|
else
|
||
|
st2 = pIpx->m_rgIfTitle[pService2->InterfaceIndex];
|
||
|
|
||
|
iReturn = StriCmp((LPCTSTR) st1, (LPCTSTR) st2);
|
||
|
}
|
||
|
break;
|
||
|
case MVR_IPXSERVICE_PROTOCOL:
|
||
|
{
|
||
|
CString st1, st2;
|
||
|
st1 = IpxProtocolToCString(pService1->Protocol);
|
||
|
st2 = IpxProtocolToCString(pService2->Protocol);
|
||
|
iReturn = StriCmp((LPCTSTR) st1, (LPCTSTR) st2);
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
return iReturn;
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxServiceStatisticsCompareProcMinus
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
int CALLBACK IpxServiceStatisticsCompareProcMinus(LPARAM lParam1, LPARAM lParam2,
|
||
|
LPARAM lParamSort)
|
||
|
|
||
|
{
|
||
|
return -IpxServiceStatisticsCompareProc(lParam1, lParam2, lParamSort);
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxServiceStatistics::Sort
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
void IpxServiceStatistics::Sort(UINT nColumnId)
|
||
|
{
|
||
|
SIpxServiceSortInfo ipxSortInfo;
|
||
|
DWORD dwSubitemId;
|
||
|
|
||
|
if (m_pConfig)
|
||
|
dwSubitemId = m_pConfig->MapColumnToSubitem(m_ulId, nColumnId);
|
||
|
else
|
||
|
dwSubitemId = m_viewInfo.MapColumnToSubitem(nColumnId);
|
||
|
|
||
|
if (m_dwSortSubitem != -1)
|
||
|
{
|
||
|
if (dwSubitemId == m_dwSortSubitem)
|
||
|
m_fSortDirection = !m_fSortDirection;
|
||
|
else
|
||
|
m_fSortDirection = 0;
|
||
|
}
|
||
|
|
||
|
ipxSortInfo.m_dwSubitemId = dwSubitemId;
|
||
|
ipxSortInfo.m_pIpx = this;
|
||
|
|
||
|
if (m_fSortDirection)
|
||
|
{
|
||
|
m_listCtrl.SortItems(IpxServiceStatisticsCompareProcMinus, (LPARAM) &ipxSortInfo);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_listCtrl.SortItems(IpxServiceStatisticsCompareProc, (LPARAM) &ipxSortInfo);
|
||
|
}
|
||
|
m_dwSortSubitem = dwSubitemId;
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxServiceStatistics::PreDeleteAllItems
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
void IpxServiceStatistics::PreDeleteAllItems()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
/*!--------------------------------------------------------------------------
|
||
|
IpxServiceStatistics::OnNotifyGetDispInfo
|
||
|
-
|
||
|
Author: KennT
|
||
|
---------------------------------------------------------------------------*/
|
||
|
void IpxServiceStatistics::OnNotifyGetDispInfo(NMHDR *pNmHdr, LRESULT *pResult)
|
||
|
{
|
||
|
AFX_MANAGE_STATE(AfxGetStaticModuleState());
|
||
|
LV_DISPINFO * plvDispInfo = reinterpret_cast<LV_DISPINFO *>(pNmHdr);
|
||
|
LV_ITEM * plvItem = &(plvDispInfo->item);
|
||
|
ULONG iIndex = (ULONG)plvItem->lParam;
|
||
|
TCHAR szNumber[32];
|
||
|
CString st;
|
||
|
|
||
|
if ((plvItem->mask & LVIF_PARAM) == 0)
|
||
|
{
|
||
|
// Ok, this lParam is not valid, we will need to request
|
||
|
// the lParam for this item
|
||
|
iIndex = (ULONG)m_listCtrl.GetItemData(plvItem->iItem);
|
||
|
}
|
||
|
|
||
|
// Ok, we can now get the data for this item
|
||
|
switch (MapColumnToSubitem(plvItem->iSubItem))
|
||
|
{
|
||
|
case MVR_IPXSERVICE_SERVICE_NAME:
|
||
|
st.Format(_T("%.48hs"), m_Items[iIndex].Server.Name);
|
||
|
break;
|
||
|
case MVR_IPXSERVICE_SERVICE_TYPE:
|
||
|
st.Format(_T("%.4x"), m_Items[iIndex].Server.Type);
|
||
|
break;
|
||
|
case MVR_IPXSERVICE_SERVICE_ADDRESS:
|
||
|
FormatIpxNetworkNumber(szNumber, DimensionOf(szNumber),
|
||
|
m_Items[iIndex].Server.Network,
|
||
|
DimensionOf(m_Items[iIndex].Server.Network));
|
||
|
st = szNumber;
|
||
|
FormatMACAddress(szNumber, DimensionOf(szNumber),
|
||
|
m_Items[iIndex].Server.Node,
|
||
|
DimensionOf(m_Items[iIndex].Server.Node));
|
||
|
st += _T(".");
|
||
|
st += szNumber;
|
||
|
|
||
|
wsprintf(szNumber, _T("%.2x%.2x"),
|
||
|
m_Items[iIndex].Server.Socket[0],
|
||
|
m_Items[iIndex].Server.Socket[1]);
|
||
|
st += _T(".");
|
||
|
st += szNumber;
|
||
|
break;
|
||
|
|
||
|
case MVR_IPXSERVICE_HOP_COUNT:
|
||
|
FormatNumber(m_Items[iIndex].Server.HopCount,
|
||
|
szNumber, DimensionOf(szNumber),
|
||
|
FALSE);
|
||
|
st = szNumber;
|
||
|
break;
|
||
|
|
||
|
case MVR_IPXSERVICE_IF_NAME:
|
||
|
if (m_Items[iIndex].InterfaceIndex == GLOBAL_INTERFACE_INDEX)
|
||
|
st.LoadString(IDS_IPX_WAN_CLIENT_ROUTE);
|
||
|
else
|
||
|
st = m_rgIfTitle[m_Items[iIndex].InterfaceIndex];
|
||
|
break;
|
||
|
|
||
|
case MVR_IPXSERVICE_PROTOCOL:
|
||
|
st = IpxProtocolToCString(m_Items[iIndex].Protocol);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
Panic1("Unknown IPX service id! %d",
|
||
|
MapColumnToSubitem(plvItem->iSubItem));
|
||
|
break;
|
||
|
}
|
||
|
lstrcpyn(plvItem->pszText, (LPCTSTR) st, plvItem->cchTextMax);
|
||
|
}
|
||
|
|
||
|
|