/**********************************************************************/
/**                       Microsoft Windows/NT                       **/
/**                Copyright(c) Microsoft Corporation, 1997 - 1999 **/
/**********************************************************************/

/*
	ipstats.cpp
		IP 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 "routprot.h"
#include "ipxutil.h"

#include "statsdlg.h"
#include "sapstats.h"
#include "resource.h"


/*---------------------------------------------------------------------------
	SAPParamsStatistics implementation
 ---------------------------------------------------------------------------*/


extern const ContainerColumnInfo s_rgSAPParamsStatsColumnInfo[];
const ContainerColumnInfo s_rgSAPParamsStatsColumnInfo[] =
{
	{ IDS_STATS_SAPPARAMS_OPER_STATE,	0,		TRUE, COL_STATUS },
	{ IDS_STATS_SAPPARAMS_SENT_PACKETS,	0,		TRUE, COL_LARGE_NUM },
	{ IDS_STATS_SAPPARAMS_RCVD_PACKETS,	0,		TRUE, COL_LARGE_NUM  },
};

SAPParamsStatistics::SAPParamsStatistics()
	: IPXStatisticsDialog(STATSDLG_VERTICAL |
						 STATSDLG_FULLWINDOW |
						 STATSDLG_CONTEXTMENU |
						 STATSDLG_SELECT_COLUMNS)
{
	SetColumnInfo(s_rgSAPParamsStatsColumnInfo,
				  DimensionOf(s_rgSAPParamsStatsColumnInfo));
}

			
HRESULT SAPParamsStatistics::RefreshData(BOOL fGrabNewData)
{
	HRESULT	hr = hrOK;
	CString	st;
	ULONG	iPos;
	TCHAR	szNumber[32];
	SAP_MIB_GET_INPUT_DATA	MibGetInputData;
	PSAP_MIB_BASE	pSapBase = NULL;
	DWORD			cbSapBase;
	SPMprMibBuffer	spMib;
	PSAP_INTERFACE	pSapIf = NULL;
	DWORD			cbSapIf;
	DWORD			cSent = 0;
	DWORD			cRcvd = 0;
	DWORD			dwErr;

	Assert(m_pIPXConn);

	MibGetInputData.TableId = SAP_BASE_ENTRY;

	dwErr = ::MprAdminMIBEntryGet(m_pIPXConn->GetMibHandle(),
								  PID_IPX,
								  IPX_PROTOCOL_SAP,
								  &MibGetInputData,
								  sizeof(MibGetInputData),
								  (LPVOID *) &pSapBase,
								  &cbSapBase);
	spMib = (LPBYTE) pSapBase;
	hr = HRESULT_FROM_WIN32(dwErr);
	CORg( hr );

	if (IsSubitemVisible(MVR_SAPPARAMS_OPER_STATE))
	{
		st = IpxOperStateToCString(pSapBase->SapOperState);
		iPos = MapSubitemToColumn(MVR_SAPPARAMS_OPER_STATE);
		m_listCtrl.SetItemText(iPos, 1, (LPCTSTR) st);
	}

	spMib.Free();
	MibGetInputData.TableId = SAP_INTERFACE_TABLE;

	dwErr = MprAdminMIBEntryGetFirst(m_pIPXConn->GetMibHandle(),
									 PID_IPX,
									 IPX_PROTOCOL_SAP,
									 &MibGetInputData,
									 sizeof(MibGetInputData),
									 (LPVOID *) &pSapIf,
									 &cbSapIf);
	hr = HRESULT_FROM_WIN32(dwErr);
	spMib = (LPBYTE) pSapIf;

	while (FHrSucceeded(hr))
	{
		if (pSapIf->InterfaceIndex)
		{
			cSent += pSapIf->SapIfStats.SapIfOutputPackets;
			cRcvd += pSapIf->SapIfStats.SapIfInputPackets;
		}
		
		MibGetInputData.InterfaceIndex = pSapIf->InterfaceIndex;
		spMib.Free();
		pSapIf = NULL;

		dwErr = MprAdminMIBEntryGetNext(m_pIPXConn->GetMibHandle(),
										PID_IPX,
										IPX_PROTOCOL_SAP,
										&MibGetInputData,
										sizeof(MibGetInputData),
										(LPVOID *) &pSapIf,
										&cbSapIf);
		hr = HRESULT_FROM_WIN32(dwErr);
		spMib = (LPBYTE) pSapIf;
	}

	
	if (IsSubitemVisible(MVR_SAPPARAMS_SENT_PKTS))
	{
		FormatNumber(cSent, szNumber, DimensionOf(szNumber), FALSE);
		iPos = MapSubitemToColumn(MVR_SAPPARAMS_SENT_PKTS);
		m_listCtrl.SetItemText(iPos, 1, (LPCTSTR) szNumber);
	}


	if (IsSubitemVisible(MVR_SAPPARAMS_RCVD_PKTS))
	{
		FormatNumber(cRcvd, szNumber, DimensionOf(szNumber), FALSE);
		iPos = MapSubitemToColumn(MVR_SAPPARAMS_RCVD_PKTS);
		m_listCtrl.SetItemText(iPos, 1, (LPCTSTR) szNumber);
	}

Error:
	return hr;
}

BOOL SAPParamsStatistics::OnInitDialog()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
	CString	st;

	st.LoadString(IDS_STATS_SAPPARAMS_TITLE);
	SetWindowText((LPCTSTR) st);
	return IPXStatisticsDialog::OnInitDialog();
}

void SAPParamsStatistics::Sort(UINT)
{
}