//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1998 - 1999 // // File: pgpolicy.cpp // //-------------------------------------------------------------------------- // pgpolicy.cpp : implementation file // #include "stdafx.h" #include #include "helper.h" #include "acsadmin.h" #include "acsdata.h" #include "acshand.h" #include "pgpolicy.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif void CACSPolicyPageManager::SetPolicyData(CACSPolicyElement* pPolicy, CACSPolicyHandle* pHandle) { ASSERT(pPolicy && pHandle); m_spPolicy = pPolicy; m_pHandle = pHandle; if(pHandle) pHandle->AddRef(); } CACSPolicyPageManager::~CACSPolicyPageManager() { m_spPolicy.Release(); if(m_pHandle) m_pHandle->Release(); } BOOL CACSPolicyPageManager::OnApply() { if(CPageManager::OnApply()) { HRESULT hr = S_OK; ASSERT((CACSPolicyElement*)m_spPolicy); // check if data is valid ... // to verify cross page data UserPolicyType PolicyType = UNDEFINED; if ((m_nBranchFlag & BRANCH_FLAG_GLOBAL) != 0) // may need to alter the text { ASSERT(m_pGeneralPage); if(m_pGeneralPage->IfAnyAuth()) { PolicyType = GLOBAL_ANY_AUTHENTICATED; } else if (m_pGeneralPage->IfAnyUnauth()) { PolicyType = GLOBAL_ANY_UNAUTHENTICATED; } } UINT ErrorId = m_spPolicy->PreSaveVerifyData(GetFlags(), PolicyType); if(ErrorId != 0) // not valid { // Display error message, AfxMessageBox(ErrorId); // Return FALSE return FALSE; } // persist the data into DS hr = m_spPolicy->Save(GetFlags()); { CWaitCursor wc; Sleep(1000); } // modifies the state info on UI ( may change states of other conflicted ones m_spPolicy->InvalidateConflictState(); // inform container to check conflict if FAILED(hr) ReportError(hr, IDS_ERR_SAVESUBNETCONFIG, NULL); else { AfxMessageBox(IDS_WRN_POLICY_EFFECTIVE_FROM_NEXT_RSVP); m_pHandle->UpdateStrings(); m_pHandle->OnPropertyPageApply(); // Advise super class that the apply button has been activated. CPageManager::OnApply(); } ClearFlags(); MMCNotify(); return TRUE; } return FALSE; } ///////////////////////////////////////////////////////////////////////////// // CPgPolicyGeneral property page IMPLEMENT_DYNCREATE(CPgPolicyGeneral, CACSPage) ///////////////////////////////////////////////////////////////////////////// // CPgTraffic message handlers enum DirectionIndex { DIRECTION_SEND, DIRECTION_RECEIVE, DIRECTION_SENDRECEIVE }; enum ServiceTypeIndex { SERVICETYPE_ALL, SERVICETYPE_CONTROLLEDLOAD, SERVICETYPE_GUARANTEEDSERVICE, SERVICETYPE_DISABLED }; enum IdentityTypeIndex { IDENTITYTYPE_DEFAULT, IDENTITYTYPE_UNKNOWN, IDENTITYTYPE_USER, IDENTITYTYPE_OU }; CPgPolicyGeneral::CPgPolicyGeneral() : CACSPage(CPgPolicyGeneral::IDD) { DataInit(); } CPgPolicyGeneral::CPgPolicyGeneral(CACSPolicyElement* pData) : CACSPage(CPgPolicyGeneral::IDD) { ASSERT(pData); m_spData = pData; DataInit(); } void CPgPolicyGeneral::DataInit() { //{{AFX_DATA_INIT(CPgPolicyGeneral) m_strOU = _T(""); m_strUser = _T(""); m_nIdentityChoice = -1; //}}AFX_DATA_INIT } CPgPolicyGeneral::~CPgPolicyGeneral() { delete m_pDirection; delete m_pServiceType; m_aServiceTypes.DeleteAll(); m_aDirections.DeleteAll(); } void CPgPolicyGeneral::DoDataExchange(CDataExchange* pDX) { CACSPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPgPolicyGeneral) DDX_Control(pDX, IDC_POLICY_GEN_BROWSEUSER, m_buttonUser); DDX_Control(pDX, IDC_POLICY_GEN_BROWSEOU, m_buttonOU); DDX_Control(pDX, IDC_POLICY_GEN_EDIT_USER, m_editUser); DDX_Control(pDX, IDC_POLICY_GEN_EDIT_OU, m_editOU); DDX_Text(pDX, IDC_POLICY_GEN_EDIT_OU, m_strOU); DDX_Text(pDX, IDC_POLICY_GEN_EDIT_USER, m_strUser); DDX_Radio(pDX, IDC_POLICY_GEN_DEFAULTUSER, m_nIdentityChoice); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPgPolicyGeneral, CACSPage) //{{AFX_MSG_MAP(CPgPolicyGeneral) ON_BN_CLICKED(IDC_POLICY_GEN_BROWSEOU, OnBrowseOU) ON_BN_CLICKED(IDC_POLICY_GEN_BROWSEUSER, OnBrowseUser) ON_BN_CLICKED(IDC_POLICY_GEN_UNKNOWNUSER, OnUnknownuser) ON_BN_CLICKED(IDC_POLICY_GEN_DEFAULTUSER, OnDefaultuser) ON_BN_CLICKED(IDC_POLICY_GEN_RADIO_OU, OnRadioOu) ON_BN_CLICKED(IDC_POLICY_GEN_RADIO_USER, OnRadioUser) ON_EN_CHANGE(IDC_POLICY_GEN_EDIT_OU, OnChangeEditOu) ON_EN_CHANGE(IDC_POLICY_GEN_EDIT_USER, OnChangeEditUser) ON_CBN_SELCHANGE(IDC_POLICY_GEN_SERVICELEVEL, OnSelchangeServicelevel) ON_CBN_SELCHANGE(IDC_POLICY_GEN_DIRECTION, OnSelchangeDirection) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPgPolicyGeneral message handlers void CPgPolicyGeneral::OnBrowseOU() { TCHAR szRoot[MAX_PATH] = TEXT(""); TCHAR szBuffer[MAX_PATH] = TEXT("");; DSBROWSEINFO dsbi = { 0 }; CString strTemp; strTemp.LoadString(IDS_BROWSEOU_TITLE); // initialize the structure (its already NULL) dsbi.cbStruct = sizeof(dsbi); dsbi.hwndOwner = GetSafeHwnd(); dsbi.pszTitle = strTemp; dsbi.pszRoot = NULL; dsbi.pszPath = szBuffer; dsbi.cchPath = sizeof(szBuffer) / sizeof(TCHAR); dsbi.dwFlags = 0; dsbi.pfnCallback = NULL; dsbi.lParam = (LPARAM)0; dsbi.dwFlags |= DSBI_ENTIREDIRECTORY; UINT idResult = DsBrowseForContainer(&dsbi); if ( idResult != IDOK ) return; m_strOU = szBuffer; IADs* pADs = NULL; VARIANT v; VariantInit(&v); if(m_strOU.GetLength()) { m_strOU = _T(""); CHECK_HR(ADsOpenObject(szBuffer, NULL, NULL, ADS_SECURE_AUTHENTICATION | ADS_USE_SIGNING | ADS_USE_SEALING, IID_IADs, (void**)&pADs)); ASSERT(pADs); CHECK_HR(pADs->Get(L"distinguishedName", &v)); m_strOU = V_BSTR(&v); m_editOU.SetWindowText(m_strOU); } L_ERR: VariantClear(&v); if(pADs) { pADs->Release(); pADs = NULL; } } //+-------------------------------------------------------------------------- // // Function: InitObjectPickerForGroups // // Synopsis: Call IDsObjectPicker::Initialize with arguments that will // set it to allow the user to pick one or more groups. // // Arguments: [pDsObjectPicker] - object picker interface instance // // Returns: Result of calling IDsObjectPicker::Initialize. // // History: 10-14-1998 DavidMun Created // //--------------------------------------------------------------------------- HRESULT InitObjectPickerForGroups(IDsObjectPicker *pDsObjectPicker, BOOL fMultiselect) { // // Prepare to initialize the object picker. // Set up the array of scope initializer structures. // static const int SCOPE_INIT_COUNT = 1; DSOP_SCOPE_INIT_INFO aScopeInit[SCOPE_INIT_COUNT]; ZeroMemory(aScopeInit, sizeof(DSOP_SCOPE_INIT_INFO) * SCOPE_INIT_COUNT); // // Target computer scope. This adds a "Look In" entry for the // target computer. Computer scopes are always treated as // downlevel (i.e., they use the WinNT provider). // aScopeInit[0].cbSize = sizeof(DSOP_SCOPE_INIT_INFO); aScopeInit[0].flType = DSOP_SCOPE_TYPE_ENTERPRISE_DOMAIN | DSOP_SCOPE_TYPE_GLOBAL_CATALOG; aScopeInit[0].flScope = DSOP_SCOPE_FLAG_STARTING_SCOPE; aScopeInit[0].FilterFlags.flDownlevel = DSOP_DOWNLEVEL_FILTER_USERS; aScopeInit[0].FilterFlags.Uplevel.flBothModes = DSOP_FILTER_USERS; DSOP_INIT_INFO InitInfo; ZeroMemory(&InitInfo, sizeof(InitInfo)); InitInfo.cbSize = sizeof(InitInfo); // // The pwzTargetComputer member allows the object picker to be // retargetted to a different computer. It will behave as if it // were being run ON THAT COMPUTER. // InitInfo.pwzTargetComputer = NULL; // NULL == local machine InitInfo.cDsScopeInfos = SCOPE_INIT_COUNT; InitInfo.aDsScopeInfos = aScopeInit; InitInfo.flOptions = (fMultiselect) ? DSOP_FLAG_MULTISELECT : 0; LPCTSTR attrs[] = {_T("distinguishedName")}; InitInfo.cAttributesToFetch = 1; InitInfo.apwzAttributeNames = attrs; // // Note object picker makes its own copy of InitInfo. Also note // that Initialize may be called multiple times, last call wins. // HRESULT hr = pDsObjectPicker->Initialize(&InitInfo); if (FAILED(hr)) { ULONG i; for (i = 0; i < SCOPE_INIT_COUNT; i++) { if (FAILED(InitInfo.aDsScopeInfos[i].hr)) { printf("Initialization failed because of scope %u\n", i); } } } return hr; } #define BREAK_ON_FAIL_HRESULT(hr) \ if (FAILED(hr)) { printf("line %u err 0x%x\n", __LINE__, hr); break; } void CPgPolicyGeneral::OnBrowseUser() { HRESULT hr = S_OK; IDsObjectPicker * pDsObjectPicker = NULL; IDataObject * pdo = NULL; BOOL fSuccess = TRUE; hr = CoInitialize(NULL); if(FAILED(hr)) return ; do { // // Create an instance of the object picker. The implementation in // objsel.dll is apartment model. // hr = CoCreateInstance(CLSID_DsObjectPicker, NULL, CLSCTX_INPROC_SERVER, IID_IDsObjectPicker, (void **) &pDsObjectPicker); BREAK_ON_FAIL_HRESULT(hr); hr = InitObjectPickerForGroups(pDsObjectPicker, FALSE); // // Invoke the modal dialog. // hr = pDsObjectPicker->InvokeDialog(this->GetSafeHwnd(), &pdo); BREAK_ON_FAIL_HRESULT(hr); // // If the user hit Cancel, hr == S_FALSE // if (hr == S_FALSE) { Trace0("User canceled object picker dialog\n"); fSuccess = FALSE; break; } // // Process the user's selections // Assert(pdo); // ProcessSelectedObjects(pdo); { UINT g_cfDsObjectPicker = RegisterClipboardFormat(CFSTR_DSOP_DS_SELECTION_LIST); STGMEDIUM stgmedium = { TYMED_HGLOBAL, NULL, NULL }; FORMATETC formatetc = { (unsigned short)g_cfDsObjectPicker, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; bool fGotStgMedium = false; do { hr = pdo->GetData(&formatetc, &stgmedium); BREAK_ON_FAIL_HRESULT(hr); fGotStgMedium = true; PDS_SELECTION_LIST pDsSelList = (PDS_SELECTION_LIST) GlobalLock(stgmedium.hGlobal); // inteprete the selection ASSERT(pDsSelList->cItems == 1); ASSERT(pDsSelList->aDsSelection[0].pvarFetchedAttributes[0].vt == VT_BSTR); if(pDsSelList->aDsSelection[0].pvarFetchedAttributes[0].vt == VT_BSTR) { m_strUser = V_BSTR(&(pDsSelList->aDsSelection[0].pvarFetchedAttributes[0])); // update the edit field of the property page m_editUser.SetWindowText(m_strUser); } else { CString str; str.LoadString(IDS_ERR_DN); str.Format(str, pDsSelList->aDsSelection[0].pwzName); AfxMessageBox(str, MB_OK); } GlobalUnlock(stgmedium.hGlobal); } while (0); if (fGotStgMedium) { ReleaseStgMedium(&stgmedium); } } pdo->Release(); pdo = NULL; } while (0); if (pDsObjectPicker) { pDsObjectPicker->Release(); } CoUninitialize(); if (FAILED(hr)) fSuccess = FALSE; return; } void CPgPolicyGeneral::OnUnknownuser() { // TODO: Add your control notification handler code here SetModified(); EnableIdentityCtrls(1); } void CPgPolicyGeneral::OnDefaultuser() { // TODO: Add your control notification handler code here SetModified(); EnableIdentityCtrls(0); } void CPgPolicyGeneral::OnRadioOu() { // TODO: Add your control notification handler code here SetModified(); EnableIdentityCtrls(3); } void CPgPolicyGeneral::OnRadioUser() { // TODO: Add your control notification handler code here SetModified(); EnableIdentityCtrls(2); } void CPgPolicyGeneral::OnChangeEditOu() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CPropertyPage::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 CPgPolicyGeneral::OnChangeEditUser() { // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CPropertyPage::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 CPgPolicyGeneral::OnSelchangeServicelevel() { // TODO: Add your control notification handler code here SetModified(); } void CPgPolicyGeneral::OnSelchangeDirection() { // TODO: Add your control notification handler code here SetModified(); } BOOL CPgPolicyGeneral::OnKillActive( ) { // GURANTEEDSERVICE and SEND can not be a policy if(m_pServiceType->GetSelected() == SERVICETYPE_GUARANTEEDSERVICE && m_pDirection->GetSelected() == DIRECTION_SEND) { AfxMessageBox(IDS_NO_POLICY_FOR_SEND_AND_GUARANTEE, MB_OK, 0); return FALSE; } return CACSPage::OnKillActive(); } BOOL CPgPolicyGeneral::OnApply() { if(!GetModified()) return TRUE; // direction if(m_pDirection) { switch(m_pDirection->GetSelected()) { case DIRECTION_SEND: m_spData->m_dwDirection = ACS_DIRECTION_SEND; break; case DIRECTION_RECEIVE: m_spData->m_dwDirection = ACS_DIRECTION_RECEIVE; break; case DIRECTION_SENDRECEIVE: m_spData->m_dwDirection = ACS_DIRECTION_BOTH; break; default: // no valid value should come here ASSERT(0); } m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_DIRECTION, true); } 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_DISABLED: m_spData->m_dwServiceType = ACS_SERVICETYPE_DISABLED; break; case SERVICETYPE_CONTROLLEDLOAD: m_spData->m_dwServiceType = ACS_SERVICETYPE_CONTROLLEDLOAD; break; case SERVICETYPE_GUARANTEEDSERVICE: m_spData->m_dwServiceType = ACS_SERVICETYPE_GUARANTEEDSERVICE; break; case SERVICETYPE_ALL: m_spData->m_dwServiceType = ACS_SERVICETYPE_ALL; break; default: // no valid value should come here ASSERT(0); } m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_SERVICETYPE, true); } 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); } // GURANTEEDSERVICE and SEND can not be a policy if(m_spData->m_dwServiceType == ACS_SERVICETYPE_GUARANTEEDSERVICE && m_spData->m_dwDirection == ACS_DIRECTION_SEND) { AfxMessageBox(IDS_NO_POLICY_FOR_SEND_AND_GUARANTEE, MB_OK, 0); return FALSE; } // ACS_SERVICETYPE_CONTROLLEDLOAD and SEND can not be a policy if(m_spData->m_dwServiceType == ACS_SERVICETYPE_CONTROLLEDLOAD && m_spData->m_dwDirection == ACS_DIRECTION_SEND) { AfxMessageBox(IDS_NO_POLICY_FOR_SEND_AND_CONTROLLEDLOAD, MB_OK, 0); return FALSE; } // code for identity CString* pIdentity; if(m_spData->m_strArrayIdentityName.GetSize()) { pIdentity = m_spData->m_strArrayIdentityName[(INT_PTR)0]; } else { pIdentity = new CString(); m_spData->m_strArrayIdentityName.Add(pIdentity); } switch(m_nIdentityChoice) { case 0: // default user *pIdentity = ACS_IDENTITY_DEFAULT; break; case 1: // unknown user *pIdentity = ACS_IDENTITY_UNKNOWN; break; case 2: // user *pIdentity = ACS_IDENTITY_USER; if(m_strUser.GetLength() == 0) { GotoDlgCtrl(&m_editUser); AfxMessageBox(IDS_ERR_USER_DN); return FALSE; } *pIdentity += m_strUser; break; case 3: // OU *pIdentity = ACS_IDENTITY_OU; if(m_strOU.GetLength() == 0) { GotoDlgCtrl(&m_editOU); AfxMessageBox(IDS_ERR_OU_DN); return FALSE; } *pIdentity+= m_strOU; break; default: return FALSE; } m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_IDENTITYNAME, true); // check if conflict with other policies in the folder if(m_spData->IsConflictInContainer()) { if(AfxMessageBox(IDS_CONFLICTPOLICY, MB_OKCANCEL, 0) != IDOK) { return FALSE; } } DWORD dwAttrFlags = 0; dwAttrFlags |= (ACS_PAF_IDENTITYNAME | ACS_PAF_SERVICETYPE | ACS_PAF_DIRECTION); AddFlags(dwAttrFlags); // prepare flags for saving return CACSPage::OnApply(); } BOOL CPgPolicyGeneral::OnInitDialog() { CString* pStr = NULL; bool bModified = false; // direction // fillin the list box try{ 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(this, IDC_POLICY_GEN_DIRECTION, 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_CONTROLLEDLOAD); m_aServiceTypes.Add(pStr); pStr = new CString(); pStr->LoadString(IDS_GUARANTEEDSERVICE); m_aServiceTypes.Add(pStr); pStr = new CString(); pStr->LoadString(IDS_SERVICETYPE_DISABLED); m_aServiceTypes.Add(pStr); m_pServiceType = new CStrBox(this, IDC_POLICY_GEN_SERVICELEVEL, 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_DISABLED: current = SERVICETYPE_DISABLED; 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&){}; // Identity -- user / ou CString strIdentity; m_nIdentityChoice = m_spData->GetIdentityType(strIdentity); switch(m_nIdentityChoice){ case 0: // default case 1: // unknown break; case 2: // user m_strUser = strIdentity; break; case 3: // OU m_strOU = strIdentity; break; default: ASSERT(0); break; } CACSPage::OnInitDialog(); if(bModified) SetModified(); EnableIdentityCtrls(m_nIdentityChoice); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CPgPolicyGeneral::EnableIdentityCtrls(int nChoice) { switch(nChoice){ case 0: // default case 1: // unknown m_editUser.EnableWindow(FALSE); m_editOU.EnableWindow(FALSE); m_buttonUser.EnableWindow(FALSE); m_buttonOU.EnableWindow(FALSE); break; case 2: // user m_editUser.EnableWindow(TRUE); m_buttonUser.EnableWindow(TRUE); m_editOU.EnableWindow(FALSE); m_buttonOU.EnableWindow(FALSE); break; case 3: // OU m_editUser.EnableWindow(FALSE); m_buttonUser.EnableWindow(FALSE); m_editOU.EnableWindow(TRUE); m_buttonOU.EnableWindow(TRUE); break; default: m_editUser.EnableWindow(FALSE); m_buttonUser.EnableWindow(FALSE); m_editOU.EnableWindow(FALSE); m_buttonOU.EnableWindow(FALSE); } } ///////////////////////////////////////////////////////////////////////////// // CPgPolicyFlow property page IMPLEMENT_DYNCREATE(CPgPolicyFlow, CACSPage) CPgPolicyFlow::CPgPolicyFlow(CACSPolicyElement* pData) : CACSPage(CPgPolicyFlow::IDD) { ASSERT(pData); m_spData = pData; DataInit(); } CPgPolicyFlow::CPgPolicyFlow() : CACSPage(CPgPolicyFlow::IDD) { } void CPgPolicyFlow::DataInit() { //{{AFX_DATA_INIT(CPgPolicyFlow) m_uDuration = 0; m_uPeakRate = 0; m_nDataRateChoice = -1; m_nDurationChoice = -1; m_nPeakRateChoice = -1; m_uDataRate = 0; //}}AFX_DATA_INIT m_nBranchFlag = 0; m_pGeneralPage = NULL; } CPgPolicyFlow::~CPgPolicyFlow() { m_nBranchFlag = 0; m_pGeneralPage = NULL; } void CPgPolicyFlow::DoDataExchange(CDataExchange* pDX) { CACSPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPgPolicyFlow) DDX_Control(pDX, IDC_POLICY_FLOW_PEAKDATARATE_EDIT_LIMIT, m_editPeakRate); DDX_Control(pDX, IDC_POLICY_FLOW_DURATION_EDIT_LIMIT, m_editDuration); DDX_Control(pDX, IDC_POLICY_FLOW_DATARATE_EDIT_LIMIT, m_editDataRate); DDX_Radio(pDX, IDC_POLICY_FLOW_DATARATE_RES, m_nDataRateChoice); DDX_Radio(pDX, IDC_POLICY_FLOW_DURATION_RES, m_nDurationChoice); DDX_Radio(pDX, IDC_POLICY_FLOW_PEAKDATARATE_RES, m_nPeakRateChoice); DDX_Text(pDX, IDC_POLICY_FLOW_DURATION_EDIT_LIMIT, m_uDuration); if (m_nDurationChoice == 2) DDV_MinMaxUInt(pDX, m_uDuration, 0, 71582780); DDX_Text(pDX, IDC_POLICY_FLOW_PEAKDATARATE_EDIT_LIMIT, m_uPeakRate); if (m_nPeakRateChoice ==2 ) DDV_MinMaxUInt(pDX, m_uPeakRate, 0, 4194300); DDX_Text(pDX, IDC_POLICY_FLOW_DATARATE_EDIT_LIMIT, m_uDataRate); if (m_nDataRateChoice == 2) DDV_MinMaxUInt(pDX, m_uDataRate, 0, 4194300); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPgPolicyFlow, CACSPage) //{{AFX_MSG_MAP(CPgPolicyFlow) ON_BN_CLICKED(IDC_POLICY_FLOW_DATARATE_DEF, OnPolicyFlowDatarateDef) ON_EN_CHANGE(IDC_POLICY_FLOW_DATARATE_EDIT_LIMIT, OnChangePolicyFlowDatarateEditLimit) ON_BN_CLICKED(IDC_POLICY_FLOW_DATARATE_RADIO_LIMIT, OnPolicyFlowDatarateRadioLimit) ON_BN_CLICKED(IDC_POLICY_FLOW_DATARATE_RES, OnPolicyFlowDatarateRes) ON_BN_CLICKED(IDC_POLICY_FLOW_DURATION_DEF, OnPolicyFlowDurationDef) ON_EN_CHANGE(IDC_POLICY_FLOW_DURATION_EDIT_LIMIT, OnChangePolicyFlowDurationEditLimit) ON_BN_CLICKED(IDC_POLICY_FLOW_DURATION_RADIO_LIMIT, OnPolicyFlowDurationRadioLimit) ON_BN_CLICKED(IDC_POLICY_FLOW_DURATION_RES, OnPolicyFlowDurationRes) ON_BN_CLICKED(IDC_POLICY_FLOW_PEAKDATARATE_DEF, OnPolicyFlowPeakdatarateDef) ON_EN_CHANGE(IDC_POLICY_FLOW_PEAKDATARATE_EDIT_LIMIT, OnChangePolicyFlowPeakdatarateEditLimit) ON_BN_CLICKED(IDC_POLICY_FLOW_PEAKDATARATE_RADIO_LIMIT, OnPolicyFlowPeakdatarateRadioLimit) ON_BN_CLICKED(IDC_POLICY_FLOW_PEAKDATARATE_RES, OnPolicyFlowPeakdatarateRes) ON_WM_KILLFOCUS() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPgPolicyFlow message handlers BOOL CPgPolicyFlow::OnInitDialog() { //------------------ // per flow // data rate if(m_spData->GetFlags(ATTR_FLAG_LOAD, ACS_PAF_PF_TOKENRATE)) { if IS_LARGE_UNLIMIT(m_spData->m_ddPFTokenRate) m_nDataRateChoice = 0; else { m_nDataRateChoice = 2; // numbered limit m_uDataRate = TOKBS(m_spData->m_ddPFTokenRate.LowPart); } } else m_nDataRateChoice = 1; // default // Peak data rate if(m_spData->GetFlags(ATTR_FLAG_LOAD, ACS_PAF_PF_PEAKBANDWIDTH)) { if IS_LARGE_UNLIMIT(m_spData->m_ddPFPeakBandWidth) m_nPeakRateChoice = 0; else { m_nPeakRateChoice = 2; // numbered limit m_uPeakRate = TOKBS(m_spData->m_ddPFPeakBandWidth.LowPart); } } else m_nPeakRateChoice = 1; // default // duration if(m_spData->GetFlags(ATTR_FLAG_LOAD, ACS_PAF_PF_DURATION)) { if(m_spData->m_dwPFDuration == UNLIMIT) m_nDurationChoice = 0; else { m_nDurationChoice = 2; m_uDuration = SEC2MIN(m_spData->m_dwPFDuration); } } else m_nDurationChoice = 1; // ==== data exchange is done within here CACSPage::OnInitDialog(); if(m_nDataRateChoice != 2) m_editDataRate.EnableWindow(FALSE); if(m_nPeakRateChoice != 2) m_editPeakRate.EnableWindow(FALSE); if(m_nDurationChoice != 2) m_editDuration.EnableWindow(FALSE); GetDlgItem(IDC_POLICY_FLOW_DATARATE_DEF)->GetWindowText(m_strDataRateDefault); GetDlgItem(IDC_POLICY_FLOW_PEAKDATARATE_DEF)->GetWindowText(m_strPeakRateDefault); GetDlgItem(IDC_POLICY_FLOW_DURATION_DEF)->GetWindowText(m_strDurationDefault); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } BOOL CPgPolicyFlow::OnSetActive( ) { // change default button strings based on choice of user CString datarateStr = m_strDataRateDefault; CString peakrateStr = m_strPeakRateDefault; CString durationStr = m_strDurationDefault; if ((m_nBranchFlag & BRANCH_FLAG_GLOBAL) != 0) // may need to alter the text { CString tmp; ASSERT(m_pGeneralPage); if(m_pGeneralPage->IfAnyAuth()) { tmp.LoadString(IDS_A_DEF_DATARATE_SUF); datarateStr += tmp; tmp.LoadString(IDS_A_DEF_PEAKRATE_SUF); peakrateStr += tmp; tmp.LoadString(IDS_A_DEF_DURATION_SUF); durationStr += tmp; } else if (m_pGeneralPage->IfAnyUnauth()) { tmp.LoadString(IDS_U_DEF_DATARATE_SUF); datarateStr += tmp; tmp.LoadString(IDS_U_DEF_PEAKRATE_SUF); peakrateStr += tmp; tmp.LoadString(IDS_U_DEF_DURATION_SUF); durationStr += tmp; } } // test if the policy is for any authentication/unauthenticaion policy in enterprise level GetDlgItem(IDC_POLICY_FLOW_DATARATE_DEF)->SetWindowText(datarateStr); GetDlgItem(IDC_POLICY_FLOW_PEAKDATARATE_DEF)->SetWindowText(peakrateStr); GetDlgItem(IDC_POLICY_FLOW_DURATION_DEF)->SetWindowText(durationStr); return CACSPage::OnSetActive(); } BOOL CPgPolicyFlow::OnKillActive( ) { UINT cId = 0; UINT mId = 0; if(!UpdateData()) return FALSE; // Peak Rate should be >= data rate if(m_nPeakRateChoice ==2 && m_nDataRateChoice == 2 && m_uDataRate > m_uPeakRate) { cId = IDC_POLICY_FLOW_PEAKDATARATE_EDIT_LIMIT; mId = IDS_ERR_PEAKRATE_LESS_RATE; } if ((m_nBranchFlag & BRANCH_FLAG_GLOBAL) != 0) // need to check again default value { CString tmp; ASSERT(m_pGeneralPage); if(m_pGeneralPage->IfAnyAuth()) { // Peak Rate should be >= data rate if(m_nPeakRateChoice ==2 && m_nDataRateChoice == 1 && DEFAULT_AA_DATARATE > FROMKBS(m_uPeakRate)) { cId = IDC_POLICY_FLOW_PEAKDATARATE_EDIT_LIMIT; mId = IDS_ERR_PEAKRATE_LESS_RATE; } } else if (m_pGeneralPage->IfAnyUnauth()) { // Peak Rate should be >= data rate if(m_nPeakRateChoice ==2 && m_nDataRateChoice == 1 && DEFAULT_AU_DATARATE > FROMKBS(m_uPeakRate)) { cId = IDC_POLICY_FLOW_PEAKDATARATE_EDIT_LIMIT; mId = IDS_ERR_PEAKRATE_LESS_RATE; } } } // if there is anything wrong if(cId) { CWnd* pWnd = GetDlgItem(cId); ASSERT(pWnd); GotoDlgCtrl( pWnd ); AfxMessageBox(mId); return FALSE; } // check if any is set to Zero if(m_nDataRateChoice == 2 && m_uDataRate == 0) // date rate { cId = IDC_POLICY_FLOW_DATARATE_EDIT_LIMIT; mId = IDS_WRN_ZERO_POLICY_DATA; } else if(m_nPeakRateChoice ==2 && m_uPeakRate == 0) // peak data rate { cId = IDC_POLICY_FLOW_PEAKDATARATE_EDIT_LIMIT; mId = IDS_WRN_ZERO_POLICY_DATA; } else if(m_nDurationChoice == 2 && m_uDuration == 0) // duration { cId = IDC_POLICY_FLOW_DURATION_EDIT_LIMIT; mId = IDS_WRN_ZERO_POLICY_DATA; } if(cId) { if(IDNO == AfxMessageBox(mId, MB_YESNO)) { CWnd* pWnd = GetDlgItem(cId); ASSERT(pWnd); GotoDlgCtrl( pWnd ); return FALSE; } } return CACSPage::OnKillActive(); } // radio buttons here, 0 -- no limit (resouce limit ) , 1 -- default to general level, 2 -- user limit // BOOL CPgPolicyFlow::OnApply() { CString* pStr = NULL; // check if the values input on the page is valid UINT cId = 0; UINT mId = 0; if(!GetModified()) return TRUE; // Peak Rate should be >= data rate if(m_nPeakRateChoice ==2 && m_nDataRateChoice == 2 && m_uDataRate > m_uPeakRate) { cId = IDC_POLICY_FLOW_PEAKDATARATE_EDIT_LIMIT; mId = IDS_ERR_PEAKRATE_LESS_RATE; } // if there is anything wrong if(cId) { CWnd* pWnd = GetDlgItem(cId); ASSERT(pWnd); GotoDlgCtrl( pWnd ); AfxMessageBox(mId); return FALSE; } //------------------ // per flow // data rate switch(m_nDataRateChoice){ case 2: // limit m_spData->m_ddPFTokenRate.LowPart = FROMKBS(m_uDataRate); m_spData->m_ddPFTokenRate.HighPart = 0; break; case 1: // default break; case 0: // unlimit SET_LARGE_UNLIMIT(m_spData->m_ddPFTokenRate); break; default: ASSERT(0); }; m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_PF_TOKENRATE, (m_nDataRateChoice != 1)); // Peak data rate switch(m_nPeakRateChoice){ case 2: // limit m_spData->m_ddPFPeakBandWidth.LowPart = FROMKBS(m_uPeakRate); m_spData->m_ddPFPeakBandWidth.HighPart = 0; break; case 1: // default break; case 0: // unlimit SET_LARGE_UNLIMIT(m_spData->m_ddPFPeakBandWidth); break; default: ASSERT(0); }; m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_PF_PEAKBANDWIDTH, (m_nPeakRateChoice != 1)); // duration switch(m_nDurationChoice){ case 2: // limit m_spData->m_dwPFDuration = MIN2SEC(m_uDuration); break; case 1: // default break; case 0: // unlimit m_spData->m_dwPFDuration = UNLIMIT; break; default: ASSERT(0); }; m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_PF_DURATION, (m_nDurationChoice != 1)); DWORD dwAttrFlags = 0; dwAttrFlags |= (ACS_PAF_PF_TOKENRATE | ACS_PAF_PF_PEAKBANDWIDTH | ACS_PAF_PF_DURATION); AddFlags(dwAttrFlags); // prepare flags for saving return CACSPage::OnApply(); } void CPgPolicyFlow::OnPolicyFlowDatarateDef() { SetModified(); m_editDataRate.EnableWindow(FALSE); } void CPgPolicyFlow::OnChangePolicyFlowDatarateEditLimit() { // 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 CPgPolicyFlow::OnPolicyFlowDatarateRadioLimit() { // TODO: Add your control notification handler code here SetModified(); m_editDataRate.EnableWindow(TRUE); } void CPgPolicyFlow::OnPolicyFlowDatarateRes() { // TODO: Add your control notification handler code here SetModified(); m_editDataRate.EnableWindow(FALSE); } void CPgPolicyFlow::OnPolicyFlowDurationDef() { // TODO: Add your control notification handler code here m_editDuration.EnableWindow(FALSE); SetModified(); } void CPgPolicyFlow::OnChangePolicyFlowDurationEditLimit() { // 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 CPgPolicyFlow::OnPolicyFlowDurationRadioLimit() { // TODO: Add your control notification handler code here m_editDuration.EnableWindow(TRUE); SetModified(); } void CPgPolicyFlow::OnPolicyFlowDurationRes() { // TODO: Add your control notification handler code here m_editDuration.EnableWindow(FALSE); SetModified(); } void CPgPolicyFlow::OnPolicyFlowPeakdatarateDef() { // TODO: Add your control notification handler code here m_editPeakRate.EnableWindow(FALSE); SetModified(); } void CPgPolicyFlow::OnChangePolicyFlowPeakdatarateEditLimit() { // 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 CPgPolicyFlow::OnPolicyFlowPeakdatarateRadioLimit() { // TODO: Add your control notification handler code here m_editPeakRate.EnableWindow(TRUE); SetModified(); } void CPgPolicyFlow::OnPolicyFlowPeakdatarateRes() { // TODO: Add your control notification handler code here m_editPeakRate.EnableWindow(FALSE); SetModified(); } ///////////////////////////////////////////////////////////////////////////// // CPgPolicyAggregate dialog CPgPolicyAggregate::CPgPolicyAggregate(CACSPolicyElement* pData) : CACSPage(CPgPolicyAggregate::IDD) { ASSERT(pData); m_spData = pData; DataInit(); } CPgPolicyAggregate::CPgPolicyAggregate() : CACSPage(CPgPolicyAggregate::IDD) { DataInit(); } void CPgPolicyAggregate::DataInit() { //{{AFX_DATA_INIT(CPgPolicyAggregate) m_nDataRateChoice = -1; m_nFlowsChoice = -1; m_nPeakRateChoice = -1; m_uDataRate = 0; m_uFlows = 0; m_uPeakRate = 0; //}}AFX_DATA_INIT m_nBranchFlag = 0; m_pGeneralPage = NULL; } void CPgPolicyAggregate::DoDataExchange(CDataExchange* pDX) { CACSPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CPgPolicyAggregate) DDX_Control(pDX, IDC_POLICY_AGGR_PEAKDATARATE_EDIT_LIMIT, m_editPeakRate); DDX_Control(pDX, IDC_POLICY_AGGR_FLOWS_EDIT_LIMIT, m_editFlows); DDX_Control(pDX, IDC_POLICY_AGGR_DATARATE_EDIT_LIMIT, m_editDataRate); DDX_Radio(pDX, IDC_POLICY_AGGR_DATARATE_RES, m_nDataRateChoice); DDX_Radio(pDX, IDC_POLICY_AGGR_FLOWS_RES, m_nFlowsChoice); DDX_Radio(pDX, IDC_POLICY_AGGR_PEAKDATARATE_RES, m_nPeakRateChoice); DDX_Text(pDX, IDC_POLICY_AGGR_DATARATE_EDIT_LIMIT, m_uDataRate); if(m_nDataRateChoice == 2) DDV_MinMaxUInt(pDX, m_uDataRate, 0, DWORD_LIMIT/1024); DDX_Text(pDX, IDC_POLICY_AGGR_FLOWS_EDIT_LIMIT, m_uFlows); if(m_nFlowsChoice == 2) DDV_MinMaxUInt(pDX, m_uFlows, 0, DWORD_LIMIT); DDX_Text(pDX, IDC_POLICY_AGGR_PEAKDATARATE_EDIT_LIMIT, m_uPeakRate); if(m_nPeakRateChoice == 2) DDV_MinMaxUInt(pDX, m_uPeakRate, 0, DWORD_LIMIT/1024); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CPgPolicyAggregate, CACSPage) //{{AFX_MSG_MAP(CPgPolicyAggregate) ON_BN_CLICKED(IDC_POLICY_AGGR_DATARATE_DEF, OnPolicyAggrDatarateDef) ON_EN_CHANGE(IDC_POLICY_AGGR_DATARATE_EDIT_LIMIT, OnChangePolicyAggrDatarateEditLimit) ON_BN_CLICKED(IDC_POLICY_AGGR_DATARATE_RADIO_LIMIT, OnPolicyAggrDatarateRadioLimit) ON_BN_CLICKED(IDC_POLICY_AGGR_DATARATE_RES, OnPolicyAggrDatarateRes) ON_BN_CLICKED(IDC_POLICY_AGGR_FLOWS_DEF, OnPolicyAggrFlowsDef) ON_EN_CHANGE(IDC_POLICY_AGGR_FLOWS_EDIT_LIMIT, OnChangePolicyAggrFlowsEditLimit) ON_BN_CLICKED(IDC_POLICY_AGGR_FLOWS_RES, OnPolicyAggrFlowsRes) ON_BN_CLICKED(IDC_POLICY_AGGR_PEAKDATARATE_DEF, OnPolicyAggrPeakdatarateDef) ON_EN_CHANGE(IDC_POLICY_AGGR_PEAKDATARATE_EDIT_LIMIT, OnChangePolicyAggrPeakdatarateEditLimit) ON_BN_CLICKED(IDC_POLICY_AGGR_PEAKDATARATE_RADIO_LIMIT, OnPolicyAggrPeakdatarateRadioLimit) ON_BN_CLICKED(IDC_POLICY_AGGR_PEAKDATARATE_RES, OnPolicyAggrPeakdatarateRes) ON_BN_CLICKED(IDC_POLICY_AGGR_FLOWS_RADIO_LIMIT, OnPolicyAggrFlowsRadioLimit) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CPgPolicyAggregate message handlers ///////////////////////////////////////////////////////////////////////////// // CPgPolicyFlow message handlers BOOL CPgPolicyAggregate::OnInitDialog() { //------------------ // Total // data rate if(m_spData->GetFlags(ATTR_FLAG_LOAD, ACS_PAF_TT_TOKENRATE)) { if IS_LARGE_UNLIMIT(m_spData->m_ddTTTokenRate) m_nDataRateChoice = 0; else { m_nDataRateChoice = 2; // numbered limit m_uDataRate = TOKBS(m_spData->m_ddTTTokenRate.LowPart); } } else m_nDataRateChoice = 1; // default // Peak data rate if(m_spData->GetFlags(ATTR_FLAG_LOAD, ACS_PAF_TT_PEAKBANDWIDTH)) { if IS_LARGE_UNLIMIT(m_spData->m_ddTTPeakBandWidth) m_nPeakRateChoice = 0; else { m_nPeakRateChoice = 2; // numbered limit m_uPeakRate = TOKBS(m_spData->m_ddTTPeakBandWidth.LowPart); } } else m_nPeakRateChoice = 1; // default // flows if(m_spData->GetFlags(ATTR_FLAG_LOAD, ACS_PAF_TT_FLOWS)) { if(m_spData->m_dwTTFlows == UNLIMIT) m_nFlowsChoice = 0; else { m_nFlowsChoice = 2; m_uFlows = m_spData->m_dwTTFlows; } } else m_nFlowsChoice = 1; CACSPage::OnInitDialog(); if(m_nDataRateChoice != 2) m_editDataRate.EnableWindow(FALSE); if(m_nPeakRateChoice != 2) m_editPeakRate.EnableWindow(FALSE); if(m_nFlowsChoice != 2) m_editFlows.EnableWindow(FALSE); GetDlgItem(IDC_POLICY_AGGR_DATARATE_DEF)->GetWindowText(m_strDataRateDefault); GetDlgItem(IDC_POLICY_AGGR_PEAKDATARATE_DEF)->GetWindowText(m_strPeakRateDefault); GetDlgItem(IDC_POLICY_AGGR_FLOWS_DEF)->GetWindowText(m_strFlowsDefault); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } BOOL CPgPolicyAggregate::OnSetActive( ) { // change default button strings based on choice of user CString datarateStr = m_strDataRateDefault; CString peakrateStr = m_strPeakRateDefault; CString flowsStr = m_strFlowsDefault; if ((m_nBranchFlag & BRANCH_FLAG_GLOBAL) != 0) // may need to alter the text { CString tmp; ASSERT(m_pGeneralPage); if(m_pGeneralPage->IfAnyAuth()) { tmp.LoadString(IDS_A_DEF_DATARATE_SUF); datarateStr += tmp; tmp.LoadString(IDS_A_DEF_PEAKRATE_SUF); peakrateStr += tmp; tmp.LoadString(IDS_A_DEF_FLOWS_SUF); flowsStr += tmp; } else if (m_pGeneralPage->IfAnyUnauth()) { tmp.LoadString(IDS_U_DEF_DATARATE_SUF); datarateStr += tmp; tmp.LoadString(IDS_U_DEF_PEAKRATE_SUF); peakrateStr += tmp; tmp.LoadString(IDS_U_DEF_FLOWS_SUF); flowsStr += tmp; } } // test if the policy is for any authentication/unauthenticaion policy in enterprise level GetDlgItem(IDC_POLICY_AGGR_DATARATE_DEF)->SetWindowText(datarateStr); GetDlgItem(IDC_POLICY_AGGR_PEAKDATARATE_DEF)->SetWindowText(peakrateStr); GetDlgItem(IDC_POLICY_AGGR_FLOWS_DEF)->SetWindowText(flowsStr); return CACSPage::OnSetActive(); } BOOL CPgPolicyAggregate::OnKillActive( ) { // check if the values input on the page is valid UINT cId = 0; UINT mId = 0; if(!UpdateData(TRUE)) return FALSE; if(!GetModified()) return TRUE; // Peak Rate should be >= data rate if(m_nPeakRateChoice ==2 && m_nDataRateChoice == 2 && m_uDataRate > m_uPeakRate) { cId = IDC_POLICY_AGGR_PEAKDATARATE_EDIT_LIMIT; mId = IDS_ERR_TOTALPEAK_LESS_TOTALRATE; } if ((m_nBranchFlag & BRANCH_FLAG_GLOBAL) != 0) // need to check again default value { CString tmp; ASSERT(m_pGeneralPage); if(m_pGeneralPage->IfAnyAuth()) { // Peak Rate should be >= data rate if(m_nPeakRateChoice ==2 && m_nDataRateChoice == 1 && DEFAULT_AA_DATARATE > FROMKBS(m_uPeakRate)) { cId = IDC_POLICY_AGGR_PEAKDATARATE_EDIT_LIMIT; mId = IDS_ERR_TOTALPEAK_LESS_TOTALRATE; } } else if (m_pGeneralPage->IfAnyUnauth()) { // Peak Rate should be >= data rate if(m_nPeakRateChoice ==2 && m_nDataRateChoice == 1 && DEFAULT_AU_DATARATE > FROMKBS(m_uPeakRate)) { cId = IDC_POLICY_AGGR_PEAKDATARATE_EDIT_LIMIT; mId = IDS_ERR_TOTALPEAK_LESS_TOTALRATE; } } } // if there is anything wrong if(cId) { CWnd* pWnd = GetDlgItem(cId); ASSERT(pWnd); GotoDlgCtrl( pWnd ); AfxMessageBox(mId); return FALSE; } // check if any is set to Zero if(m_nDataRateChoice == 2 && m_uDataRate == 0) // date rate { cId = IDC_POLICY_AGGR_DATARATE_EDIT_LIMIT; mId = IDS_WRN_ZERO_POLICY_DATA; } else if(m_nPeakRateChoice ==2 && m_uPeakRate == 0) // peak data rate { cId = IDC_POLICY_AGGR_PEAKDATARATE_EDIT_LIMIT; mId = IDS_WRN_ZERO_POLICY_DATA; } else if(m_nFlowsChoice == 2 && m_uFlows == 0) // duration { cId = IDC_POLICY_AGGR_FLOWS_EDIT_LIMIT; mId = IDS_WRN_ZERO_POLICY_DATA; } if(cId) { if(IDNO == AfxMessageBox(mId, MB_YESNO)) { CWnd* pWnd = GetDlgItem(cId); ASSERT(pWnd); GotoDlgCtrl( pWnd ); return FALSE; } } return CACSPage::OnKillActive(); } // radio buttons here, 0 -- no limit (resouce limit ) , 1 -- default to general level, 2 -- user limit // BOOL CPgPolicyAggregate::OnApply() { CString* pStr = NULL; // check if the values input on the page is valid UINT cId = 0; UINT mId = 0; if(!GetModified()) return TRUE; // Peak Rate should be >= data rate if(m_nPeakRateChoice ==2 && m_nDataRateChoice == 2 && m_uDataRate > m_uPeakRate) { cId = IDC_POLICY_AGGR_PEAKDATARATE_EDIT_LIMIT; mId = IDS_ERR_TOTALPEAK_LESS_TOTALRATE; } // if there is anything wrong if(cId) { CWnd* pWnd = GetDlgItem(cId); ASSERT(pWnd); GotoDlgCtrl( pWnd ); AfxMessageBox(mId); return FALSE; } //------------------ // per flow // data rate switch(m_nDataRateChoice){ case 2: // limit m_spData->m_ddTTTokenRate.LowPart = FROMKBS(m_uDataRate); m_spData->m_ddTTTokenRate.HighPart = 0; break; case 1: // default break; case 0: // unlimit SET_LARGE_UNLIMIT(m_spData->m_ddTTTokenRate); break; default: ASSERT(0); }; m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_TT_TOKENRATE, (m_nDataRateChoice != 1)); // Peak data rate switch(m_nPeakRateChoice){ case 2: // limit m_spData->m_ddTTPeakBandWidth.LowPart = FROMKBS(m_uPeakRate); m_spData->m_ddTTPeakBandWidth.HighPart = 0; break; case 1: // default break; case 0: // unlimit SET_LARGE_UNLIMIT(m_spData->m_ddTTPeakBandWidth); break; default: ASSERT(0); }; m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_TT_PEAKBANDWIDTH, (m_nPeakRateChoice != 1)); // duration switch(m_nFlowsChoice){ case 2: // limit m_spData->m_dwTTFlows = m_uFlows; break; case 1: // default break; case 0: // unlimit m_spData->m_dwTTFlows = UNLIMIT; break; default: ASSERT(0); }; m_spData->SetFlags(ATTR_FLAG_SAVE, ACS_PAF_TT_FLOWS, (m_nFlowsChoice != 1)); DWORD dwAttrFlags = 0; dwAttrFlags |= (ACS_PAF_TT_TOKENRATE | ACS_PAF_TT_PEAKBANDWIDTH | ACS_PAF_TT_FLOWS); AddFlags(dwAttrFlags); // prepare flags for saving return CACSPage::OnApply(); } void CPgPolicyAggregate::OnPolicyAggrDatarateDef() { // TODO: Add your control notification handler code here SetModified(); m_editDataRate.EnableWindow(FALSE); } void CPgPolicyAggregate::OnChangePolicyAggrDatarateEditLimit() { // 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 CPgPolicyAggregate::OnPolicyAggrDatarateRadioLimit() { // TODO: Add your control notification handler code here SetModified(); m_editDataRate.EnableWindow(TRUE); } void CPgPolicyAggregate::OnPolicyAggrDatarateRes() { // TODO: Add your control notification handler code here SetModified(); m_editDataRate.EnableWindow(FALSE); } void CPgPolicyAggregate::OnPolicyAggrFlowsDef() { // TODO: Add your control notification handler code here SetModified(); m_editFlows.EnableWindow(FALSE); } void CPgPolicyAggregate::OnChangePolicyAggrFlowsEditLimit() { // 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 CPgPolicyAggregate::OnPolicyAggrFlowsRes() { // TODO: Add your control notification handler code here SetModified(); m_editFlows.EnableWindow(FALSE); } void CPgPolicyAggregate::OnPolicyAggrFlowsRadioLimit() { // TODO: Add your control notification handler code here SetModified(); m_editFlows.EnableWindow(TRUE); } void CPgPolicyAggregate::OnPolicyAggrPeakdatarateDef() { // TODO: Add your control notification handler code here SetModified(); m_editPeakRate.EnableWindow(FALSE); } void CPgPolicyAggregate::OnChangePolicyAggrPeakdatarateEditLimit() { // 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 CPgPolicyAggregate::OnPolicyAggrPeakdatarateRadioLimit() { // TODO: Add your control notification handler code here SetModified(); m_editPeakRate.EnableWindow(TRUE); } void CPgPolicyAggregate::OnPolicyAggrPeakdatarateRes() { // TODO: Add your control notification handler code here SetModified(); m_editPeakRate.EnableWindow(FALSE); } void CPgPolicyFlow::OnKillFocus(CWnd* pNewWnd) { CACSPage::OnKillFocus(pNewWnd); // TODO: Add your message handler code here }