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

674 lines
17 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 1998
//
// File: traffic.cpp
//
//--------------------------------------------------------------------------
// Traffic.cpp : implementation file
//
#include "stdafx.h"
#include "helper.h"
#include "acsadmin.h"
#include "acsdata.h"
#include "Traffic.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CPgTraffic property page
IMPLEMENT_DYNCREATE(CPgTraffic, CACSPage)
CPgTraffic::CPgTraffic() : CACSPage(CPgTraffic::IDD)
{
DataInit();
}
CPgTraffic::CPgTraffic(CACSPolicyElement* pData) : CACSPage(CPgTraffic::IDD)
{
ASSERT(pData);
m_spData = pData;
DataInit();
}
void CPgTraffic::DataInit()
{
//{{AFX_DATA_INIT(CPgTraffic)
m_dwPFDataRate = 0;
m_dwPFDuration = 0;
m_dwPFPeakRate = 0;
m_dwTTDataRate = 0;
m_dwTTFlows = 0;
m_bPFDataRate = FALSE;
m_bPFPeakRate = FALSE;
m_bTTDataRate = FALSE;
m_bTTFlows = FALSE;
m_bPFDuration = FALSE;
m_bTTPeakRate = FALSE;
m_dwTTPeakRate = 0;
//}}AFX_DATA_INIT
m_pServiceType = NULL;
m_pDirection = NULL;
}
CPgTraffic::~CPgTraffic()
{
delete m_pDirection;
delete m_pServiceType;
m_aDirections.DeleteAll();
m_aServiceTypes.DeleteAll();
}
void CPgTraffic::DoDataExchange(CDataExchange* pDX)
{
CACSPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPgTraffic)
DDX_Check(pDX, IDC_CHECK_PF_DATARATE, m_bPFDataRate);
DDX_Check(pDX, IDC_CHECK_PF_PEAKRATE, m_bPFPeakRate);
DDX_Check(pDX, IDC_CHECK_TT_DATARATE, m_bTTDataRate);
DDX_Check(pDX, IDC_CHECK_TT_FLOWS, m_bTTFlows);
DDX_Check(pDX, IDC_CHECK_PF_DURATION, m_bPFDuration);
DDX_Check(pDX, IDC_CHECK_TT_PEAKRATE, m_bTTPeakRate);
if(m_bPFDataRate)
{
DDX_Text(pDX, IDC_EDIT_PF_DATARATE, m_dwPFDataRate);
DDV_MinMaxDWord(pDX, m_dwPFDataRate, 0, DWORD_LIMIT/1024);
}
if(m_bPFDuration)
{
DDX_Text(pDX, IDC_EDIT_PF_DURATION, m_dwPFDuration);
DDV_MinMaxDWord(pDX, m_dwPFDuration, 0, DWORD_LIMIT/60);
}
if(m_bPFPeakRate)
{
DDX_Text(pDX, IDC_EDIT_PF_PEAKRATE, m_dwPFPeakRate);
DDV_MinMaxDWord(pDX, m_dwPFPeakRate, 0, DWORD_LIMIT/1024);
}
if(m_bTTDataRate)
{
DDX_Text(pDX, IDC_EDIT_TT_DATARATE, m_dwTTDataRate);
DDV_MinMaxDWord(pDX, m_dwTTDataRate, 0, DWORD_LIMIT/1024);
}
if(m_bTTFlows)
{
DDX_Text(pDX, IDC_EDIT_TT_FLOWS, m_dwTTFlows);
DDV_MinMaxDWord(pDX, m_dwTTFlows, 0, DWORD_LIMIT);
}
if(m_bTTPeakRate)
{
DDX_Text(pDX, IDC_EDIT_TT_PEAKRATE, m_dwTTPeakRate);
DDV_MinMaxDWord(pDX, m_dwTTPeakRate, 0, DWORD_LIMIT/1024);
}
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPgTraffic, CACSPage)
//{{AFX_MSG_MAP(CPgTraffic)
ON_CBN_SELCHANGE(IDC_COMBODIRECTION, OnSelchangeCombodirectioin)
ON_CBN_SELCHANGE(IDC_COMBOSERVICELEVEL, OnSelchangeComboservicelevel)
ON_EN_CHANGE(IDC_EDIT_PF_DATARATE, OnChangeEditPfDatarate)
ON_EN_CHANGE(IDC_EDIT_PF_DURATION, OnChangeEditPfDuration)
ON_EN_CHANGE(IDC_EDIT_PF_PEAKRATE, OnChangeEditPfPeakrate)
ON_EN_CHANGE(IDC_EDIT_TT_DATARATE, OnChangeEditTtDatarate)
ON_EN_CHANGE(IDC_EDIT_TT_FLOWS, OnChangeEditTtFlows)
ON_BN_CLICKED(IDC_CHECK_PF_DATARATE, OnCheckPfDatarate)
ON_BN_CLICKED(IDC_CHECK_PF_PEAKRATE, OnCheckPfPeakrate)
ON_BN_CLICKED(IDC_CHECK_TT_DATARATE, OnCheckTtDatarate)
ON_BN_CLICKED(IDC_CHECK_TT_FLOWS, OnCheckTtFlows)
ON_BN_CLICKED(IDC_CHECK_PF_DURATION, OnCheckPfDuration)
ON_BN_CLICKED(IDC_CHECK_TT_PEAKRATE, OnCheckTtPeakrate)
ON_EN_CHANGE(IDC_EDIT_TT_PEAKRATE, OnChangeEditTtPeakrate)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPgTraffic message handlers
enum DirectionIndex
{
// DIRECTION_DEFAULT = 0,
DIRECTION_SEND,
DIRECTION_RECEIVE,
DIRECTION_SENDRECEIVE
};
enum ServiceTypeIndex
{
// SERVICETYPE_DEFAULT = 0,
SERVICETYPE_ALL,
SERVICETYPE_BESTEFFORT,
SERVICETYPE_CONTROLLEDLOAD,
SERVICETYPE_GUARANTEEDSERVICE
};
BOOL CPgTraffic::OnApply()
{
CString* pStr = NULL;
// check if the values input on the page is valid
UINT cId = 0;
UINT mId = 0;
if(m_bPFPeakRate && m_bPFDataRate && m_dwPFDataRate > m_dwPFPeakRate)
{
cId = IDC_EDIT_PF_PEAKRATE;
mId = IDS_ERR_PEAKRATE_LESS_RATE;
}
if(!cId && m_bTTDataRate && m_bPFDataRate && m_dwPFDataRate > m_dwTTDataRate)
{
cId = IDC_EDIT_TT_DATARATE;
mId = IDS_ERR_TOTALRATE_LESS_RATE;
}
if(!cId && m_bTTDataRate && m_bPFPeakRate && m_dwPFPeakRate > m_dwTTDataRate)
{
cId = IDC_EDIT_TT_DATARATE;
mId = IDS_ERR_TOTALRATE_LESS_PEAKRATE;
}
if(!cId && m_bTTDataRate && m_bTTPeakRate && m_dwTTPeakRate < m_dwTTDataRate)
{
cId = IDC_EDIT_TT_PEAKRATE;
mId = IDS_ERR_TOTALPEAK_LESS_TOTALRATE;
}
if(!cId && m_bTTPeakRate && m_bPFPeakRate && m_dwTTPeakRate < m_dwPFPeakRate)
{
cId = IDC_EDIT_TT_PEAKRATE;
mId = IDS_ERR_TOTALPEAK_LESS_PEAK;
}
if(cId)
{
CWnd* pWnd = GetDlgItem(cId);
ASSERT(pWnd);
GotoDlgCtrl( pWnd );
AfxMessageBox(mId);
return FALSE;
}
// direction
if(m_pDirection)
{
switch(m_pDirection->GetSelected())
{
case DIRECTION_SEND:
m_spData->m_dwDirection = ACS_DIRECTION_SEND;
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_DIRECTION, true);
break;
case DIRECTION_RECEIVE:
m_spData->m_dwDirection = ACS_DIRECTION_RECEIVE;
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_DIRECTION, true);
break;
case DIRECTION_SENDRECEIVE:
m_spData->m_dwDirection = ACS_DIRECTION_BOTH;
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_DIRECTION, true);
break;
default:
// no valid value should come here
ASSERT(0);
}
}
else // save what ever is loaded
{
if(m_spData->GetFlags(ATTR_FLAG_LOAD, ACS_PAF_DIRECTION))
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_DIRECTION, true);
else
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_DIRECTION, false);
}
// service type
if(m_pServiceType)
{
switch(m_pServiceType->GetSelected())
{
case SERVICETYPE_BESTEFFORT:
m_spData->m_dwServiceType = ACS_SERVICETYPE_BESTEFFORT;
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_SERVICETYPE, true);
break;
case SERVICETYPE_CONTROLLEDLOAD:
m_spData->m_dwServiceType = ACS_SERVICETYPE_CONTROLLEDLOAD;
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_SERVICETYPE, true);
break;
case SERVICETYPE_GUARANTEEDSERVICE:
m_spData->m_dwServiceType = ACS_SERVICETYPE_GUARANTEEDSERVICE;
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_SERVICETYPE, true);
break;
case SERVICETYPE_ALL:
m_spData->m_dwServiceType = ACS_SERVICETYPE_ALL;
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_SERVICETYPE, true);
break;
default:
// no valid value should come here
ASSERT(0);
}
}
else // save what ever is loaded
{
if(m_spData->GetFlags(ATTR_FLAG_LOAD, ACS_PAF_SERVICETYPE))
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_SERVICETYPE, true);
else
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_SERVICETYPE, false);
}
//------------------
// per flow
// data rate
if(m_bPFDataRate)
{
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_PF_TOKENRATE, true);
m_spData->m_ddPFTokenRate.LowPart = FROMKBS(m_dwPFDataRate);
m_spData->m_ddPFTokenRate.HighPart = 0;
}
else
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_PF_TOKENRATE, false);
// Peak data rate
if(m_bPFPeakRate)
{
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_PF_PEAKBANDWIDTH, true);
m_spData->m_ddPFPeakBandWidth.LowPart = FROMKBS(m_dwPFPeakRate);
m_spData->m_ddPFPeakBandWidth.HighPart = 0;
}
else
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_PF_PEAKBANDWIDTH, false);
// duration
if(m_bPFDuration)
{
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_PF_DURATION, true);
m_spData->m_dwPFDuration = MIN2SEC(m_dwPFDuration);
}
else
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_PF_DURATION, false);
//------------------
// total
// data rate
if(m_bTTDataRate)
{
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_TT_TOKENRATE, true);
m_spData->m_ddTTTokenRate.LowPart = FROMKBS(m_dwTTDataRate);
m_spData->m_ddTTTokenRate.HighPart = 0;
}
else
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_TT_TOKENRATE, false);
// total peak bandwidth
if(m_bTTPeakRate)
{
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_TT_PEAKBANDWIDTH, true);
m_spData->m_ddTTPeakBandWidth.LowPart = FROMKBS(m_dwTTPeakRate);
m_spData->m_ddTTPeakBandWidth.HighPart = 0;
}
else
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_TT_PEAKBANDWIDTH, false);
// flows
if(m_bTTFlows)
{
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_TT_FLOWS, true);
m_spData->m_dwTTFlows = m_dwTTFlows;
}
else
m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_TT_FLOWS, false);
// persist the data into DS
DWORD dwAttrFlags = ATTR_FLAGS_NONE;
dwAttrFlags |= (ACS_PAF_SERVICETYPE | ACS_PAF_DIRECTION);
dwAttrFlags |= (ACS_PAF_PF_DURATION | ACS_PAF_PF_PEAKBANDWIDTH | ACS_PAF_PF_TOKENRATE);
dwAttrFlags |= (ACS_PAF_TT_FLOWS | ACS_PAF_TT_TOKENRATE | ACS_PAF_TT_PEAKBANDWIDTH);
HRESULT hr = m_spData->Save(dwAttrFlags);
if(FAILED(hr)) ReportError(hr, IDS_ERR_SAVEPOLICY, NULL);
return CACSPage::OnApply();
}
BOOL CPgTraffic::OnInitDialog()
{
CString* pStr = NULL;
// direction
// fillin the list box
try{
// removed based on bug: 156787
// pStr = new CString();
// pStr->LoadString(IDS_DEFAULT);
// m_aDirections.Add(pStr);
pStr = new CString();
pStr->LoadString(IDS_SEND);
m_aDirections.Add(pStr);
pStr = new CString();
pStr->LoadString(IDS_RECEIVE);
m_aDirections.Add(pStr);
pStr = new CString();
pStr->LoadString(IDS_SENDRECEIVE);
m_aDirections.Add(pStr);
m_pDirection = new CStrBox<CComboBox>(this, IDC_COMBODIRECTION, m_aDirections);
m_pDirection->Fill();
// decide which one to select
if(m_spData->GetFlags(ATTR_FLAG_LOAD, ACS_PAF_DIRECTION))
{
int current = -1;
switch(m_spData->m_dwDirection)
{
case ACS_DIRECTION_SEND:
current = DIRECTION_SEND;
break;
case ACS_DIRECTION_RECEIVE:
current = DIRECTION_RECEIVE;
break;
case ACS_DIRECTION_BOTH:
current = DIRECTION_SENDRECEIVE;
break;
default:
// invalid value
ASSERT(0);
// message box
}
m_pDirection->Select(current);
}
else
{
m_pDirection->Select(DIRECTION_SENDRECEIVE); // default
}
}catch(CMemoryException&){};
// service type
try{
pStr = new CString();
pStr->LoadString(IDS_ALL);
m_aServiceTypes.Add(pStr);
pStr = new CString();
pStr->LoadString(IDS_BESTEFFORT);
m_aServiceTypes.Add(pStr);
pStr = new CString();
pStr->LoadString(IDS_CONTROLLEDLOAD);
m_aServiceTypes.Add(pStr);
pStr = new CString();
pStr->LoadString(IDS_GUARANTEEDSERVICE);
m_aServiceTypes.Add(pStr);
m_pServiceType = new CStrBox<CComboBox>(this, IDC_COMBOSERVICELEVEL, m_aServiceTypes);
m_pServiceType->Fill();
// decide which one to select
if(m_spData->GetFlags(ATTR_FLAG_LOAD, ACS_PAF_SERVICETYPE))
{
int current = -1;
switch(m_spData->m_dwServiceType)
{
case ACS_SERVICETYPE_BESTEFFORT:
current = SERVICETYPE_BESTEFFORT;
break;
case ACS_SERVICETYPE_CONTROLLEDLOAD:
current = SERVICETYPE_CONTROLLEDLOAD;
break;
case ACS_SERVICETYPE_GUARANTEEDSERVICE:
current = SERVICETYPE_GUARANTEEDSERVICE;
break;
case ACS_SERVICETYPE_ALL:
current = SERVICETYPE_ALL;
break;
default:
// invalid value
ASSERT(0);
// message box
}
m_pServiceType->Select(current);
}
else
{
m_pServiceType->Select(SERVICETYPE_ALL); // default
}
}catch(CMemoryException&){};
//------------------
// per flow
// data rate
if(m_spData->GetFlags(ATTR_FLAG_LOAD, ACS_PAF_PF_TOKENRATE))
{
m_bPFDataRate = TRUE;
m_dwPFDataRate = TOKBS(m_spData->m_ddPFTokenRate.LowPart);
}
else
m_bPFDataRate = FALSE;
// Peak data rate
if(m_spData->GetFlags(ATTR_FLAG_LOAD, ACS_PAF_PF_PEAKBANDWIDTH))
{
m_bPFPeakRate = TRUE;
m_dwPFPeakRate = TOKBS(m_spData->m_ddPFPeakBandWidth.LowPart);
}
else
m_bPFPeakRate = FALSE;
// duration
if(m_spData->GetFlags(ATTR_FLAG_LOAD, ACS_PAF_PF_DURATION))
{
m_bPFDuration = TRUE;
m_dwPFDuration = SEC2MIN(m_spData->m_dwPFDuration);
}
else
m_bPFDuration = FALSE;
//------------------
// total
// data rate
if(m_spData->GetFlags(ATTR_FLAG_LOAD, ACS_PAF_TT_TOKENRATE))
{
m_bTTDataRate = TRUE;
m_dwTTDataRate = TOKBS(m_spData->m_ddTTTokenRate.LowPart);
}
else
m_bTTDataRate = FALSE;
// Peak data rate
if(m_spData->GetFlags(ATTR_FLAG_LOAD, ACS_PAF_TT_PEAKBANDWIDTH))
{
m_bTTPeakRate = TRUE;
m_dwTTPeakRate = TOKBS(m_spData->m_ddTTPeakBandWidth.LowPart);
}
else
m_bTTPeakRate = FALSE;
// flows
if(m_spData->GetFlags(ATTR_FLAG_LOAD, ACS_PAF_TT_FLOWS))
{
m_bTTFlows = TRUE;
m_dwTTFlows = m_spData->m_dwTTFlows;
}
else
m_bTTFlows = FALSE;
CACSPage::OnInitDialog();
GetDlgItem(IDC_EDIT_PF_DATARATE)->EnableWindow(m_bPFDataRate);
GetDlgItem(IDC_EDIT_PF_PEAKRATE)->EnableWindow(m_bPFPeakRate);
GetDlgItem(IDC_EDIT_PF_DURATION)->EnableWindow(m_bPFDuration);
GetDlgItem(IDC_EDIT_TT_DATARATE)->EnableWindow(m_bTTDataRate);
GetDlgItem(IDC_EDIT_TT_PEAKRATE)->EnableWindow(m_bTTPeakRate);
GetDlgItem(IDC_EDIT_TT_FLOWS)->EnableWindow(m_bTTFlows);
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CPgTraffic::OnSelchangeCombodirectioin()
{
// TODO: Add your control notification handler code here
SetModified();
}
void CPgTraffic::OnSelchangeComboservicelevel()
{
// TODO: Add your control notification handler code here
SetModified();
}
void CPgTraffic::OnChangeEditPfDatarate()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CACSPage::OnInitDialog()
// function to send the EM_SETEVENTMASK message to the control
// with the ENM_CHANGE flag ORed into the lParam mask.
// TODO: Add your control notification handler code here
SetModified();
}
void CPgTraffic::OnChangeEditPfDuration()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CACSPage::OnInitDialog()
// function to send the EM_SETEVENTMASK message to the control
// with the ENM_CHANGE flag ORed into the lParam mask.
// TODO: Add your control notification handler code here
SetModified();
}
void CPgTraffic::OnChangeEditPfPeakrate()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CACSPage::OnInitDialog()
// function to send the EM_SETEVENTMASK message to the control
// with the ENM_CHANGE flag ORed into the lParam mask.
// TODO: Add your control notification handler code here
SetModified();
}
void CPgTraffic::OnChangeEditTtDatarate()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CACSPage::OnInitDialog()
// function to send the EM_SETEVENTMASK message to the control
// with the ENM_CHANGE flag ORed into the lParam mask.
// TODO: Add your control notification handler code here
SetModified();
}
void CPgTraffic::OnChangeEditTtPeakrate()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CACSPage::OnInitDialog()
// function to send the EM_SETEVENTMASK message to the control
// with the ENM_CHANGE flag ORed into the lParam mask.
// TODO: Add your control notification handler code here
SetModified();
}
void CPgTraffic::OnChangeEditTtFlows()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CACSPage::OnInitDialog()
// function to send the EM_SETEVENTMASK message to the control
// with the ENM_CHANGE flag ORed into the lParam mask.
// TODO: Add your control notification handler code here
SetModified();
}
void CPgTraffic::OnCheckPfDatarate()
{
// TODO: Add your control notification handler code here
SetModified();
CButton* pButton = (CButton*)GetDlgItem(IDC_CHECK_PF_DATARATE);
GetDlgItem(IDC_EDIT_PF_DATARATE)->EnableWindow(pButton->GetCheck());
}
void CPgTraffic::OnCheckPfPeakrate()
{
// TODO: Add your control notification handler code here
SetModified();
CButton* pButton = (CButton*)GetDlgItem(IDC_CHECK_PF_PEAKRATE);
GetDlgItem(IDC_EDIT_PF_PEAKRATE)->EnableWindow(pButton->GetCheck());
}
void CPgTraffic::OnCheckPfDuration()
{
// TODO: Add your control notification handler code here
SetModified();
CButton* pButton = (CButton*)GetDlgItem(IDC_CHECK_PF_DURATION);
GetDlgItem(IDC_EDIT_PF_DURATION)->EnableWindow(pButton->GetCheck());
}
void CPgTraffic::OnCheckTtDatarate()
{
// TODO: Add your control notification handler code here
SetModified();
CButton* pButton = (CButton*)GetDlgItem(IDC_CHECK_TT_DATARATE);
GetDlgItem(IDC_EDIT_TT_DATARATE)->EnableWindow(pButton->GetCheck());
}
void CPgTraffic::OnCheckTtFlows()
{
// TODO: Add your control notification handler code here
SetModified();
CButton* pButton = (CButton*)GetDlgItem(IDC_CHECK_TT_FLOWS);
GetDlgItem(IDC_EDIT_TT_FLOWS)->EnableWindow(pButton->GetCheck());
}
void CPgTraffic::OnCheckTtPeakrate()
{
// TODO: Add your control notification handler code here
SetModified();
CButton* pButton = (CButton*)GetDlgItem(IDC_CHECK_TT_PEAKRATE);
GetDlgItem(IDC_EDIT_TT_PEAKRATE)->EnableWindow(pButton->GetCheck());
}