////////////////////////////////////////////////////////////////////////////// /*++ Copyright (C) Microsoft Corporation, 1998 - 1999 Module Name: AddPolicyWizardPage2.cpp Abstract: Implementation file for the CNewRAPWiz_Condition class. We implement the class needed to handle the first property page for a Policy node. Revision History: mmaguire 12/15/97 - created byao 1/22/98 Modified for Network Access Policy --*/ ////////////////////////////////////////////////////////////////////////////// #include "Precompiled.h" #include "rapwz_cond.h" #include "NapUtil.h" #include "PolicyNode.h" #include "PoliciesNode.h" #include "Condition.h" #include "EnumCondition.h" #include "MatchCondition.h" #include "TodCondition.h" #include "NtGCond.h" #include "rasprof.h" #include "ChangeNotification.h" //+--------------------------------------------------------------------------- // // Function: CNewRAPWiz_Condition // // Class: CNewRAPWiz_Condition // // Synopsis: class constructor // // Arguments: CPolicyNode *pPolicyNode - policy node for this property page // CIASAttrList *pAttrList -- attribute list // TCHAR* pTitle = NULL - // // Returns: Nothing // // History: Created Header byao 2/16/98 4:31:52 PM // //+--------------------------------------------------------------------------- CNewRAPWiz_Condition::CNewRAPWiz_Condition( CRapWizardData* pWizData, LONG_PTR hNotificationHandle, CIASAttrList *pIASAttrList, TCHAR* pTitle, BOOL bOwnsNotificationHandle ) : CIASWizard97Page ( hNotificationHandle, pTitle, bOwnsNotificationHandle ), m_spWizData(pWizData) { TRACE_FUNCTION("CNewRAPWiz_Condition::CNewRAPWiz_Condition"); m_pIASAttrList = pIASAttrList; } //+--------------------------------------------------------------------------- // // Function: CNewRAPWiz_Condition // // Class: CNewRAPWiz_Condition // // Synopsis: class destructor // // Returns: Nothing // // History: Created Header byao 2/16/98 4:31:52 PM // //+--------------------------------------------------------------------------- CNewRAPWiz_Condition::~CNewRAPWiz_Condition() { TRACE_FUNCTION("CNewRAPWiz_Condition::~CNewRAPWiz_Condition"); CCondition* pCondition; // delete all the conditions in the list for (int iIndex=0; iIndex spUnknown; CComPtr spEnumVariant; long ulCount; ULONG ulCountReceived; fRet = GetSdoPointers(); if (!fRet) { ErrorTrace(ERROR_NAPMMC_POLICYPAGE1, "GetSdoPointers() failed, err = %x", GetLastError()); return fRet; } // // initialize the condition attribute list // hr = m_pIASAttrList->Init(m_spWizData->m_spDictionarySdo); if ( FAILED(hr) ) { // Inside Init() there're already error reporting ErrorTrace(ERROR_NAPMMC_POLICYPAGE1, "m_pIASAttrList->Init() failed, err = %x", hr); return FALSE; } if (m_ConditionList.GetSize() == 0) { //get the condition collection for this SDO m_spConditionCollectionSdo = NULL; hr = ::GetSdoInterfaceProperty( m_spWizData->m_spPolicySdo, PROPERTY_POLICY_CONDITIONS_COLLECTION, IID_ISdoCollection, (void **)&m_spConditionCollectionSdo); if ( FAILED(hr) ) { ErrorTrace(ERROR_NAPMMC_POLICYPAGE1, "Can't get condition collection Sdo, err = %x", hr); return FALSE; } // how many conditions do we have for this policy right now? m_spConditionCollectionSdo->get_Count( & ulCount ); DebugTrace(DEBUG_NAPMMC_POLICYPAGE1, "Number of conditions %d", ulCount); CComVariant varCond; CCondition *pCondition; if( ulCount > 0 ) { // // Get the enumerator for the conditions collection. // hr = m_spConditionCollectionSdo->get__NewEnum( (IUnknown **) & spUnknown ); if ( FAILED(hr) ) { ErrorTrace(ERROR_NAPMMC_POLICYPAGE1, "get__NewEnum() failed, err = %x", hr); ShowErrorDialog(m_hWnd, IDS_ERROR_SDO_ERROR_ENUMCOND, NULL, hr); return FALSE; } hr = spUnknown->QueryInterface( IID_IEnumVARIANT, (void **) &spEnumVariant ); if ( FAILED(hr) ) { ErrorTrace(ERROR_NAPMMC_POLICYPAGE1, "QueryInterface(IEnumVARIANT) failed, err = %x", hr); ShowErrorDialog(m_hWnd, IDS_ERROR_SDO_ERROR_QUERYINTERFACE, NULL, hr); return FALSE; } _ASSERTE( spEnumVariant != NULL ); spUnknown.Release(); // Get the first item. hr = spEnumVariant->Next( 1, &varCond, &ulCountReceived ); while( SUCCEEDED( hr ) && ulCountReceived == 1 ) { // Get an sdo pointer from the variant we received. _ASSERTE( V_VT(&varCond) == VT_DISPATCH ); _ASSERTE( V_DISPATCH(&varCond) != NULL ); CComPtr spConditionSdo; hr = varCond.pdispVal->QueryInterface( IID_ISdo, (void **) &spConditionSdo ); _ASSERTE( SUCCEEDED( hr ) ); // // get condition text // CComVariant varCondProp; ATL::CString strCondText, strExternCondText, strCondAttr; ATTRIBUTEID AttrId; CONDITIONTYPE CondType; // get condition text -- with AttributeMatch, TimeOfDay, NTMembership // prefix strings hr = spConditionSdo->GetProperty(PROPERTY_CONDITION_TEXT, &varCondProp); if ( FAILED(hr) ) { ErrorTrace(ERROR_NAPMMC_POLICYPAGE1, "Can't get condition text, err = %x", hr); ShowErrorDialog(m_hWnd, IDS_ERROR_SDO_ERROR_GET_CONDTEXT, NULL, hr ); return FALSE; } _ASSERTE( V_VT(&varCondProp) == VT_BSTR); strExternCondText = V_BSTR(&varCondProp); DebugTrace(DEBUG_NAPMMC_POLICYPAGE1, "ConditionText: %ws",strExternCondText); // we are done with this condition sdo spConditionSdo.Release(); varCondProp.Clear(); // now we need to strip off the unnecessary prefix string in // the condition text hr = StripCondTextPrefix( strExternCondText, strCondText, strCondAttr, &CondType ); if ( FAILED(hr) ) { ErrorTrace(ERROR_NAPMMC_POLICYPAGE1,"StripCondTextPrefix() failed, err = %x", hr); ShowErrorDialog(m_hWnd, IDS_ERROR_INVALID_COND_SYNTAX, m_spWizData->m_pPolicyNode->m_bstrDisplayName ); // go to the next condition varCond.Clear(); hr = spEnumVariant->Next( 1, &varCond, &ulCountReceived ); continue; } DebugTrace(DEBUG_NAPMMC_POLICYPAGE1, "ConditionText: %ws, CondAttr: %ws, CondType: %d", strCondText, strCondAttr, (int)CondType ); switch(CondType) { case IAS_TIMEOFDAY_CONDITION: AttrId = IAS_ATTRIBUTE_NP_TIME_OF_DAY; break; case IAS_NTGROUPS_CONDITION: AttrId = IAS_ATTRIBUTE_NTGROUPS; break; case IAS_MATCH_CONDITION: { BSTR bstrName = SysAllocString(strCondAttr); if ( bstrName == NULL ) { ShowErrorDialog(m_hWnd, IDS_ERROR_CANT_CREATE_CONDATTR, (LPTSTR)(LPCTSTR)strCondAttr, hr ); return FALSE; } hr = m_spWizData->m_spDictionarySdo->GetAttributeID(bstrName, &AttrId); if ( FAILED(hr) ) { ErrorTrace(ERROR_NAPMMC_POLICYPAGE1, "GetAttributeID() failed, err = %x", hr); ShowErrorDialog(m_hWnd, IDS_ERROR_SDO_ERROR_GETATTROD, bstrName, hr ); SysFreeString(bstrName); return FALSE; } SysFreeString(bstrName); } break; } // GetAt can throw exceptions. try { // // find the condition attribute ID in the attribute list // int nAttrIndex = m_pIASAttrList->Find(AttrId); if (nAttrIndex == -1) { // // the attribute is not even found in the attribute list // ErrorTrace(ERROR_NAPMMC_POLICYPAGE1, " Can't find this condattr in the list"); ShowErrorDialog(m_hWnd, IDS_ERROR_CANT_FIND_ATTR); return FALSE; } switch( AttrId ) { case IAS_ATTRIBUTE_NP_TIME_OF_DAY: // time of day condition pCondition = (CCondition*) new CTodCondition(m_pIASAttrList->GetAt(nAttrIndex), strCondText ); break; case IAS_ATTRIBUTE_NTGROUPS: // nt group condition pCondition = (CCondition*) new CNTGroupsCondition(m_pIASAttrList->GetAt(nAttrIndex), strCondText, m_hWnd, m_spWizData->m_pPolicyNode->m_pszServerAddress ); break; default: { CComPtr spAttributeInfo = m_pIASAttrList->GetAt(nAttrIndex); _ASSERTE(spAttributeInfo); ATTRIBUTESYNTAX as; hr = spAttributeInfo->get_AttributeSyntax( &as ); _ASSERTE( SUCCEEDED(hr) ); if( as == IAS_SYNTAX_ENUMERATOR ) { // enum-type condition CEnumCondition *pEnumCondition = new CEnumCondition(m_pIASAttrList->GetAt(nAttrIndex), strCondText ); pCondition = pEnumCondition; } else { // match condition pCondition = (CCondition*) new CMatchCondition(m_pIASAttrList->GetAt(nAttrIndex), strCondText ); } } break; } // switch // Add the newly created node to the list of Policys. m_ConditionList.Add(pCondition); // get the next condition varCond.Clear(); hr = spEnumVariant->Next( 1, &varCond, &ulCountReceived ); } catch(...) { ErrorTrace(ERROR_NAPMMC_POLICYPAGE1, "Exception thrown while populating condition list"); continue; } } // while } // if } hr = PopulateConditions(); if ( FAILED(hr) ) { ErrorTrace(ERROR_NAPMMC_POLICYPAGE1, "PopulateConditions() returns %x", hr); return FALSE; } SetModified(FALSE); return TRUE; // ISSUE: what do we need to be returning here? } ////////////////////////////////////////////////////////////////////////////// /*++ CNewRAPWiz_Condition::OnConditionAdd --*/ ////////////////////////////////////////////////////////////////////////////// LRESULT CNewRAPWiz_Condition::OnConditionAdd(UINT uMsg, WPARAM wParam, HWND hWnd, BOOL& bHandled) { TRACE_FUNCTION("CNewRAPWiz_Condition::OnConditionAdd"); HRESULT hr = S_OK; CCondition *pCondition; // create the dialog box to select a condition attribute CSelCondAttrDlg * pSelCondAttrDlg = new CSelCondAttrDlg(m_pIASAttrList); if (NULL == pSelCondAttrDlg) { hr = HRESULT_FROM_WIN32(GetLastError()); ErrorTrace(ERROR_NAPMMC_POLICYPAGE1, "Can't create the CSelCondAttrDlg, err = %x", hr); ShowErrorDialog(m_hWnd, IDS_ERROR_CANT_CREATE_OBJECT, NULL, hr); return hr; } // Put up the dialog. int iResult = pSelCondAttrDlg -> DoModal(); // The pSelCondAttrDlg->DoModal call returns TRUE if the user selected something. if( iResult && pSelCondAttrDlg->m_nSelectedCondAttr != -1) { // // The user selected something and chose OK -- create the condition object // IIASAttributeInfo* pSelectedAttr = m_pIASAttrList->GetAt(pSelCondAttrDlg->m_nSelectedCondAttr); ATTRIBUTEID id; pSelectedAttr->get_AttributeID( &id ); switch( id ) { case IAS_ATTRIBUTE_NP_TIME_OF_DAY: // time of day condition pCondition = (CCondition*) new CTodCondition(pSelectedAttr); break; case IAS_ATTRIBUTE_NTGROUPS : // nt group condition pCondition = (CCondition*) new CNTGroupsCondition( pSelectedAttr, m_hWnd, m_spWizData->m_pPolicyNode->m_pszServerAddress ); break; default: // // is this attribute an enumerator? // ATTRIBUTESYNTAX as; pSelectedAttr->get_AttributeSyntax( &as ); if ( as == IAS_SYNTAX_ENUMERATOR ) { // enum-type condition CEnumCondition *pEnumCondition = new CEnumCondition(pSelectedAttr); pCondition = pEnumCondition; } else { // match condition pCondition = (CCondition*) new CMatchCondition(pSelectedAttr); } break; } // switch if ( pCondition==NULL) { hr = E_OUTOFMEMORY; ShowErrorDialog(m_hWnd, IDS_ERROR_CANT_CREATE_COND, NULL, hr); goto failure; } // // now edit the condition // hr = pCondition->Edit(); if ( FAILED(hr) ) { ErrorTrace(ERROR_NAPMMC_POLICYPAGE1, "pCondition->Edit() returns %x", hr); return hr; } // if the condition text is empty, then do nothing if ( pCondition->m_strConditionText.GetLength() == 0) { delete pSelCondAttrDlg; delete pCondition; return S_OK; } // // now, update the UI: add the new condition to the listbox // if (m_ConditionList.GetSize()) { // before we do that, add an "AND" to the current last condition ATL::CString strDispCondText; SendDlgItemMessage( IDC_LIST_POLICYPAGE1_CONDITIONS, LB_DELETESTRING, m_ConditionList.GetSize()-1, 0L); strDispCondText = m_ConditionList[m_ConditionList.GetSize()-1]->GetDisplayText() + _T(" AND"); SendDlgItemMessage( IDC_LIST_POLICYPAGE1_CONDITIONS, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)strDispCondText); } SendDlgItemMessage(IDC_LIST_POLICYPAGE1_CONDITIONS, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)pCondition->GetDisplayText()); SendDlgItemMessage(IDC_LIST_POLICYPAGE1_CONDITIONS, LB_SETCURSEL, SendDlgItemMessage(IDC_LIST_POLICYPAGE1_CONDITIONS, LB_GETCOUNT, 0,0L)-1, (LPARAM)(LPCTSTR)pCondition->GetDisplayText()); ::EnableWindow(GetDlgItem(IDC_BUTTON_CONDITION_REMOVE), TRUE); ::EnableWindow(GetDlgItem(IDC_BUTTON_CONDITION_EDIT), TRUE); // // add this condition to the condition list // m_ConditionList.Add((CCondition*)pCondition); // set the dirty bit SetModified(TRUE); } // if // iResult delete pSelCondAttrDlg; AdjustHoritontalScroll(); return TRUE; // ISSUE: what do we need to be returning here? failure: if (pSelCondAttrDlg) { delete pSelCondAttrDlg; } if (pCondition) { delete pCondition; } return hr; } ////////////////////////////////////////////////////////////////////////////// /*++ CNewRAPWiz_Condition::OnWizardNext --*/ ////////////////////////////////////////////////////////////////////////////// BOOL CNewRAPWiz_Condition::OnWizardNext() { TRACE_FUNCTION("CNewRAPWiz_Condition::OnWizardNext"); HRESULT hr = S_OK; CPoliciesNode* pPoliciesNode = (CPoliciesNode*)m_spWizData->m_pPolicyNode->m_pParentNode; BOOL fRet = GetSdoPointers(); if (!fRet) { ErrorTrace(ERROR_NAPMMC_POLICYPAGE1, "GetSdoPointers() failed, err = %x", GetLastError()); return FALSE; } // // do we have any conditions for this policy? // We don't allow policy with no conditions // if ( ! m_ConditionList.GetSize() ) { ErrorTrace(DEBUG_NAPMMC_POLICYPAGE1, "The policy has no condition"); ShowErrorDialog(m_hWnd , IDS_ERROR_ZERO_CONDITION_POLICY , NULL ); return FALSE; } // Save the conditions to the SDO hr = WriteConditionListToSDO( m_ConditionList, m_spConditionCollectionSdo, m_hWnd ); if( FAILED( hr ) ) { // We output an error message in the function. return FALSE; } // reset the dirty bit SetModified(FALSE); return m_spWizData->GetNextPageId(((PROPSHEETPAGE*)(*this))->pszTemplate); } ////////////////////////////////////////////////////////////////////////////// /*++ CNewRAPWiz_Condition::OnQueryCancel --*/ ////////////////////////////////////////////////////////////////////////////// BOOL CNewRAPWiz_Condition::OnQueryCancel() { TRACE_FUNCTION("CNewRAPWiz_Condition::OnQueryCancel"); return TRUE; } //+--------------------------------------------------------------------------- // // Function: PopulateConditions // // Class: CNewRAPWiz_Condition // // Synopsis: populate the conditions for a particular policy // // Arguments: None // // Returns: HRESULT - S_OK: succeed // S_FALSE : if failed // // History: Created byao 2/2/98 4:01:26 PM // //+--------------------------------------------------------------------------- HRESULT CNewRAPWiz_Condition::PopulateConditions() { TRACE_FUNCTION("CNewRAPWiz_Condition::PopulateConditions"); SendDlgItemMessage( IDC_LIST_POLICYPAGE1_CONDITIONS, LB_RESETCONTENT, 0, 0L ); ATL::CString strDispCondText; for (int iIndex=0; iIndexGetDisplayText(); if ( iIndex != m_ConditionList.GetSize()-1 ) { // it's not the last condition, then we put an 'AND' at the // end of the condition text strDispCondText += " AND"; } // display it SendDlgItemMessage(IDC_LIST_POLICYPAGE1_CONDITIONS, LB_ADDSTRING, 0, (LPARAM)(LPCTSTR)strDispCondText); } if ( m_ConditionList.GetSize() == 0) { // no condition, then disable "Remove" and "Edit" ::EnableWindow(GetDlgItem(IDC_BUTTON_CONDITION_REMOVE), FALSE); ::EnableWindow(GetDlgItem(IDC_BUTTON_CONDITION_EDIT), FALSE); } else { SendDlgItemMessage(IDC_LIST_POLICYPAGE1_CONDITIONS, LB_SETCURSEL, 0, 0L); ::EnableWindow(GetDlgItem(IDC_BUTTON_CONDITION_EDIT), TRUE); ::EnableWindow(GetDlgItem(IDC_BUTTON_CONDITION_REMOVE), TRUE); } AdjustHoritontalScroll(); return S_OK; } //+--------------------------------------------------------------------------- // // Function: OnConditionList // // Class: CConditionPage1 // // Synopsis: message handler for the condition list box // // Arguments: UINT uNotifyCode - notification code // UINT uID - ID of the control // HWND hWnd - HANDLE of the window // BOOL &bHandled - whether the handler has processed the msg // // Returns: LRESULT - S_OK: succeeded // S_FALSE: otherwise // // History: Created byao 2/2/98 4:51:35 PM // //+--------------------------------------------------------------------------- LRESULT CNewRAPWiz_Condition::OnConditionList(UINT uNotifyCode, UINT uID, HWND hWnd, BOOL &bHandled) { TRACE_FUNCTION("CNewRAPWiz_Condition::OnConditionList"); if (uNotifyCode == LBN_DBLCLK) { // edit the condition OnConditionEdit(uNotifyCode, uID, hWnd, bHandled); } return S_OK; } //+--------------------------------------------------------------------------- // // Function: OnConditionEdit // // Class: CConditionPage1 // // Synopsis: message handler for the condition list box -- user pressed the Edit button // we need to edit a particular condition // // Arguments: UINT uNotifyCode - notification code // UINT uID - ID of the control // HWND hWnd - HANDLE of the window // BOOL &bHandled - whether the handler has processed the msg // // Returns: LRESULT - S_OK: succeeded // S_FALSE: otherwise // // History: Created byao 2/21/98 4:51:35 PM // //+--------------------------------------------------------------------------- LRESULT CNewRAPWiz_Condition::OnConditionEdit(UINT uNotifyCode, UINT uID, HWND hWnd, BOOL &bHandled) { TRACE_FUNCTION("CNewRAPWiz_Condition::OnConditionEdit"); LRESULT lRes, lCurSel; // // Has the user selected someone from the condition list? // lCurSel = SendDlgItemMessage(IDC_LIST_POLICYPAGE1_CONDITIONS, LB_GETCURSEL, 0, 0L); if (lCurSel == LB_ERR) { // no selection -- do nothing bHandled = TRUE; return S_OK; } // // Edit the condition // CCondition *pCondition = m_ConditionList[lCurSel]; HRESULT hr = pCondition->Edit(); // // change the displayed condition text // // is this the last condition? ATL::CString strDispCondText = m_ConditionList[lCurSel]->GetDisplayText(); if ( lCurSel != m_ConditionList.GetSize()-1 ) { // put an extra 'AND' at the end strDispCondText += _T(" AND"); } // replace it with new lRes = SendDlgItemMessage(IDC_LIST_POLICYPAGE1_CONDITIONS, LB_INSERTSTRING, lCurSel, (LPARAM)(LPCTSTR)strDispCondText); // delete the old text lRes = SendDlgItemMessage(IDC_LIST_POLICYPAGE1_CONDITIONS, LB_DELETESTRING, lCurSel+1, 0L); // set the dirty bit SetModified(TRUE); bHandled = TRUE; AdjustHoritontalScroll(); return hr; } //+--------------------------------------------------------------------------- // // Function: OnConditionRemove // // Class: CConditionPage1 // // Synopsis: message handler for the condition list box -- user pressed "Remove" // we need to remove this condition // // Arguments: UINT uNotifyCode - notification code // UINT uID - ID of the control // HWND hWnd - HANDLE of the window // BOOL &bHandled - whether the handler has processed the msg // // Returns: LRESULT - S_OK: succeeded // S_FALSE: otherwise // // History: Created byao 2/22/98 4:51:35 PM // //+--------------------------------------------------------------------------- LRESULT CNewRAPWiz_Condition::OnConditionRemove(UINT uMsg, WPARAM wParam, HWND hWnd, BOOL& bHandled) { TRACE_FUNCTION("CNewRAPWiz_Condition::OnConditionRemove"); LRESULT lCurSel; HRESULT hr; // // Has the user selected someone from the condition list? // lCurSel = SendDlgItemMessage(IDC_LIST_POLICYPAGE1_CONDITIONS, LB_GETCURSEL, 0, 0L); if (lCurSel == LB_ERR) { // // no selection -- do nothing // bHandled = TRUE; return S_OK; } // check whether this is the last one in the list. // if it is, we also need to delete the " AND" operator from // the next-to-last item if ( lCurSel!=0 && lCurSel == m_ConditionList.GetSize()-1 ) { // delete the old one with an " AND" hr = SendDlgItemMessage( IDC_LIST_POLICYPAGE1_CONDITIONS, LB_DELETESTRING, lCurSel-1, 0L ); // insert the one without 'AND" hr = SendDlgItemMessage( IDC_LIST_POLICYPAGE1_CONDITIONS, LB_INSERTSTRING, lCurSel-1, (LPARAM)(LPCTSTR)m_ConditionList[lCurSel-1]->GetDisplayText()); } // delete the condition CCondition *pCondition = m_ConditionList[lCurSel]; m_ConditionList.Remove(pCondition); delete pCondition; // delete the old text hr = SendDlgItemMessage( IDC_LIST_POLICYPAGE1_CONDITIONS, LB_DELETESTRING, lCurSel, 0L); bHandled = TRUE; // set the dirty bit SetModified(TRUE); if ( m_ConditionList.GetSize() == 0) { // no condition, then disable "Remove" and "Edit" ::EnableWindow(GetDlgItem(IDC_BUTTON_CONDITION_REMOVE), FALSE); ::EnableWindow(GetDlgItem(IDC_BUTTON_CONDITION_EDIT), FALSE); } else { // re-select another condition if ( lCurSel > 0 ) { lCurSel--; } SendDlgItemMessage(IDC_LIST_POLICYPAGE1_CONDITIONS, LB_SETCURSEL, lCurSel, 0L); } // // adjust the scroll bar // AdjustHoritontalScroll(); return hr; } //+--------------------------------------------------------------------------- // // Function: CNewRAPWiz_Condition::GetSdoPointers // // Synopsis: UnMarshall all passed in sdo pointers. These interface pointers // have to be unmarshalled first, because MMC PropertyPages run in a // separated thread // // Also get the condition collection sdo from the policy sdo // // Arguments: None // // Returns: TRUE; succeeded // FALSE: otherwise // // History: Created Header byao 2/22/98 1:35:39 AM // //+--------------------------------------------------------------------------- BOOL CNewRAPWiz_Condition::GetSdoPointers() { TRACE_FUNCTION("CNewRAPWiz_Condition::GetSdoPointers"); HRESULT hr; // Get the condition collection of this SDO. if ( m_spWizData->m_spPolicySdo ) { if ( m_spConditionCollectionSdo ) { m_spConditionCollectionSdo.Release(); m_spConditionCollectionSdo = NULL; } hr = ::GetSdoInterfaceProperty( m_spWizData->m_spPolicySdo, PROPERTY_POLICY_CONDITIONS_COLLECTION, IID_ISdoCollection, (void **) &m_spConditionCollectionSdo); if( FAILED( hr) || m_spConditionCollectionSdo == NULL ) { ShowErrorDialog(m_hWnd, IDS_ERROR_UNMARSHALL, NULL, hr ); return FALSE; } } return TRUE; } //+--------------------------------------------------------------------------- // // Function: CNewRAPWiz_Condition::StripCondTextPrefix // // Synopsis: strip off the prefix such as "AttributeMatch", "TimeOfDay", NtMemberShip" // from the condition text // // Arguments: // [in]CString strExternCondText -- original condition text // [out]CString strCondText -- stripped condition text // [out]CString strCondAttr -- condition attribute name // [out]CONDITIONTYPE* pCondType -- what type of condition? // // Returns: HRESULT - // // History: Created Header byao 2/27/98 3:59:38 PM // //+--------------------------------------------------------------------------- HRESULT CNewRAPWiz_Condition::StripCondTextPrefix( ATL::CString& strExternCondText, ATL::CString& strCondText, ATL::CString& strCondAttr, CONDITIONTYPE* pCondType ) { TRACE_FUNCTION("CNewRAPWiz_Condition::StripCondTextPrefix"); HRESULT hr = S_OK; // is it an empty string if ( strExternCondText.GetLength() == 0 ) { ErrorTrace(ERROR_NAPMMC_POLICYPAGE1,"Can't parse prefix: empty condition text"); return E_INVALIDARG; } // a temporary copy ATL::CString strTempStr = (LPCTSTR)strExternCondText; WCHAR *pwzCondText = (WCHAR*)(LPCTSTR)strTempStr; strCondAttr = _T(""); strCondText = _T(""); // condition text will look like : AttributeMatch("attr=") // strip off the "AttributeMatch(" prefix WCHAR *pwzBeginCond = wcschr(pwzCondText, _T('(')); WCHAR *pwzEndCond = wcsrchr(pwzCondText, _T(')')); if ( ( pwzBeginCond == NULL ) || ( pwzEndCond == NULL ) ) { ErrorTrace(ERROR_NAPMMC_POLICYPAGE1,"Can't parse prefix: no ( or ) found"); return E_INVALIDARG; } // // now we should decide what kind of condition this is: // *pwzBeginCond = _T('\0'); DebugTrace(DEBUG_NAPMMC_POLICYPAGE1, "ConditionType: %ws", pwzCondText); if ( _wcsicmp(pwzCondText, TOD_PREFIX) == 0 ) { *pCondType = IAS_TIMEOFDAY_CONDITION; } else if ( _wcsicmp(pwzCondText, NTG_PREFIX) == 0 ) { *pCondType = IAS_NTGROUPS_CONDITION; } else if ( _wcsicmp(pwzCondText, MATCH_PREFIX ) == 0 ) { *pCondType = IAS_MATCH_CONDITION; } else { return E_INVALIDARG; } // skip the '(' sign pwzBeginCond += 2 ; // skip the ')' sign *(pwzEndCond-1) = _T('\0'); // So right now the string between pwzBeginCond and pwzEndCond is the // real condition text strCondText = pwzBeginCond; if ( IAS_MATCH_CONDITION == *pCondType ) { // for match-type condition, we need to get the condition attribute name WCHAR *pwzEqualSign = wcschr(pwzBeginCond, _T('=')); if ( pwzEqualSign == NULL ) { ErrorTrace(ERROR_NAPMMC_POLICYPAGE1, "Can't parse : there's no = found"); return E_INVALIDARG; } *pwzEqualSign = _T('\0'); strCondAttr = pwzBeginCond; } else { strCondAttr = _T(""); } DebugTrace(DEBUG_NAPMMC_POLICYPAGE1, "Condition Attr: %ws", strCondAttr); return S_OK; } //+--------------------------------------------------------------------------- // // Function: AdjustHoritontalScroll // // Class: CConditionPage1 // // Synopsis: message handler for the condition list box // // History: Created byao 2/2/98 4:51:35 PM // //+--------------------------------------------------------------------------- void CNewRAPWiz_Condition::AdjustHoritontalScroll() { TRACE_FUNCTION("CNewRAPWiz_Condition::AdjustHorizontalScroll()"); // // According to the maximum length of all list box items, // set the horizontal scrolling range // HDC hDC = ::GetDC(GetDlgItem(IDC_LIST_POLICYPAGE1_CONDITIONS)); int iItemCount = m_ConditionList.GetSize(); int iMaxLength = 0; for (int iIndex=0; iIndexGetDisplayText(); SIZE szText; if ( GetTextExtentPoint32(hDC, (LPCTSTR)strCondText, strCondText.GetLength(), &szText) ) { DebugTrace(DEBUG_NAPMMC_POLICYPAGE1, "Condition: %ws, Length %d, PixelSize %d", (LPCTSTR)strCondText, strCondText.GetLength(), szText.cx ); if (iMaxLength < szText.cx ) { iMaxLength = szText.cx; } } DebugTrace(DEBUG_NAPMMC_POLICYPAGE1, "Maximum item length is %d", iMaxLength); } SendDlgItemMessage( IDC_LIST_POLICYPAGE1_CONDITIONS, LB_SETHORIZONTALEXTENT, iMaxLength, 0L); } ////////////////////////////////////////////////////////////////////////////// /*++ CNewRAPWiz_Condition::OnSetActive Return values: TRUE if the page can be made active FALSE if the page should be be skipped and the next page should be looked at. Remarks: If you want to change which pages are visited based on a user's choices in a previous page, return FALSE here as appropriate. --*/ ////////////////////////////////////////////////////////////////////////////// BOOL CNewRAPWiz_Condition::OnSetActive() { ATLTRACE(_T("# CNewRAPWiz_Condition::OnSetActive\n")); // MSDN docs say you need to use PostMessage here rather than SendMessage. ::PropSheet_SetWizButtons(GetParent(), PSWIZB_BACK | PSWIZB_NEXT ); return TRUE; }