//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1999 - 1999 // // File: enumcondition.cpp // //-------------------------------------------------------------------------- // EnumCondition.cpp: implementation of the CEnumCondition class. // ////////////////////////////////////////////////////////////////////// #include "precompiled.h" #include "EnumCondition.h" #include "EnumCondEdit.h" #include "iasdebug.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CEnumCondition::CEnumCondition(IIASAttributeInfo*pCondAttr) :CCondition(pCondAttr) { TRACE_FUNCTION("CEnumCondition::CEnumCondition"); // no parsing needed m_fParsed = TRUE; // m_pValueIdList = pCondAttr->GetValueIdList(); // m_pValueList = pCondAttr->GetValueList(); } CEnumCondition::CEnumCondition(IIASAttributeInfo *pCondAttr, ATL::CString& strConditionText) :CCondition(pCondAttr, strConditionText) { TRACE_FUNCTION("CEnumCondition::CEnumCondition"); // parsing needed m_fParsed = FALSE; // m_pValueIdList = pCondAttr->GetValueIdList(); // m_pValueList = pCondAttr->GetValueList(); } CEnumCondition::~CEnumCondition() { TRACE_FUNCTION("CEnumCondition::~CEnumCondition"); // for (int iIndex=0; iIndexget_AttributeName( &bstrName ); pEditor->m_strAttrName = bstrName; pEditor->m_spAttributeInfo = m_spAttributeInfo; pEditor->m_pSelectedList = &m_arrSelectedList; // preselected values if ( pEditor->DoModal() == IDOK) { // user clicked "OK" // get the list of valid value Ids for this attribute // _ASSERTE( m_pValueIdList->GetSize() == m_pValueList->GetSize() ); // // generate the condition text // m_strConditionText = (ATL::CString) bstrName + L"="; CComQIPtr< IIASEnumerableAttributeInfo, &IID_IIASEnumerableAttributeInfo > spEnumerableAttributeInfo( m_spAttributeInfo ); _ASSERTE( spEnumerableAttributeInfo ); for (LONG iIndex=0; iIndex < m_arrSelectedList.size(); iIndex++ ) { if ( iIndex > 0 ) m_strConditionText += L"|"; // get the Value Id (we use ID instead of value name in the condition text) LONG lSize; hr = spEnumerableAttributeInfo->get_CountEnumerateID( &lSize ); _ASSERTE( SUCCEEDED( hr ) ); for (LONG jIndex=0; jIndex < lSize; jIndex++) { CComBSTR bstrDescription; hr = spEnumerableAttributeInfo->get_EnumerateDescription( jIndex, &bstrDescription ); _ASSERTE( SUCCEEDED( hr ) ); if ( wcscmp( bstrDescription, m_arrSelectedList[iIndex]) == 0 ) { WCHAR wz[32]; LONG lID; hr = spEnumerableAttributeInfo->get_EnumerateID( jIndex, &lID ); _ASSERTE( SUCCEEDED( hr ) ); // add enclosing chars ^ and $ wsprintf(wz, _T("^%ld$"), lID); m_strConditionText += wz; break; } } } } // clean up if ( pEditor ) { delete pEditor; } return hr; } //+--------------------------------------------------------------------------- // // Function: CEnumCondition::GetDisplayText // // Synopsis: Get the displayable text format for this condition, // which should be like this: // // ServerType matches "type1|type2|type3" // // compared to the condition text: // // ServerType = type1|,type2|,type3 // // Arguments: None // // Returns: ATL::CString& - the displayable text // // History: Created Header byao 2/22/98 11:41:28 PM // //+--------------------------------------------------------------------------- ATL::CString CEnumCondition::GetDisplayText() { TRACE_FUNCTION("CEnumCondition::GetDisplayText"); HRESULT hr = S_OK; if ( !m_fParsed) { DebugTrace(DEBUG_NAPMMC_ENUMCONDITION, "Parsing %ws", (LPCTSTR)m_strConditionText); hr = ParseConditionText(); if ( FAILED(hr) ) { ErrorTrace(ERROR_NAPMMC_ENUMCONDITION, "Invalid condition text, err = %x", hr); ShowErrorDialog(NULL, IDS_ERROR_PARSE_CONDITION, (LPTSTR)(LPCTSTR)m_strConditionText, hr ); return ATL::CString(L""); } } ATL::CString strDispText; CComBSTR bstrName; hr = m_spAttributeInfo->get_AttributeName( &bstrName ); _ASSERTE( SUCCEEDED( hr ) ); strDispText = bstrName; { ATL::CString matches; matches.LoadString(IDS_TEXT_MATCHES); strDispText += matches; } strDispText += _T("\""); for (int iIndex=0; iIndex < m_arrSelectedList.size(); iIndex++ ) { // add the separator between multiple values if (iIndex > 0) strDispText += _T(" OR "); strDispText += m_arrSelectedList[iIndex]; } // the last " mark strDispText += _T("\""); return strDispText; } //+--------------------------------------------------------------------------- // // Function: CEnumCondition::ParseConditionText // // Synopsis: Parse the condition text, to get the regular expression. // // Arguments: None // // Returns: HRESULT - // // History: Created Header byao 2/22/98 11:58:38 PM // //+--------------------------------------------------------------------------- HRESULT CEnumCondition::ParseConditionText() { TRACE_FUNCTION("CEnumCondition::ParseConditionText"); _ASSERTE( !m_fParsed ); HRESULT hr = E_FAIL; if (m_fParsed) { // do nothing return S_OK; } if ( m_strConditionText.GetLength() == 0 ) { // no parsing needed m_fParsed = TRUE; DebugTrace(DEBUG_NAPMMC_ENUMCONDITION, "Null condition text"); return S_OK; } try { // // using (LPCTSTR) cast will force a deep copy // ATL::CString strTempStr = (LPCTSTR)m_strConditionText; // // parse strConditionText, return the regular expression only // // first, make a local copy of the condition text WCHAR *pwzCondText = (WCHAR*)(LPCTSTR)strTempStr; // look for the '=' in the condition text WCHAR *pwzStartPoint = NULL; WCHAR *pwzSeparator = NULL; ATL::CString *pStr; WCHAR *pwzEqualSign = wcschr(pwzCondText, _T('=')); DWORD dwValueId; int iIndex; // no '=' found -- something weird has happened if ( NULL == pwzEqualSign ) { hr = E_OUTOFMEMORY; throw; } // the right side of the equal sign is the list of all preselected values pwzStartPoint = pwzEqualSign +1; CComQIPtr< IIASEnumerableAttributeInfo, &IID_IIASEnumerableAttributeInfo > spEnumerableAttributeInfo( m_spAttributeInfo ); _ASSERTE( spEnumerableAttributeInfo ); while ( pwzStartPoint && *pwzStartPoint && (pwzSeparator = wcsstr(pwzStartPoint, _T("|") )) != NULL ) { // we found the separator, stored at pwzSeparator // copy it over to the first value *pwzSeparator = _T('\0'); pStr = new ATL::CString; if ( NULL == pStr ) { hr = E_UNEXPECTED; throw; } // string could be enclosed by ^ and $ for matching purpose // ^ if(*pwzStartPoint == L'^') { pwzStartPoint++; } // $ if (pwzSeparator > pwzStartPoint && *(pwzSeparator - 1) == L'$') *( pwzSeparator - 1 ) = _T('\0'); *pStr = pwzStartPoint; // copy the string, which is the value ID in string format // now we get the valud name for this dwValueId = _wtol((*pStr)); // valid value id, then search for the index of this value ID LONG lSize; hr = spEnumerableAttributeInfo->get_CountEnumerateID( &lSize ); _ASSERTE( SUCCEEDED( hr ) ); for (iIndex=0; iIndex < lSize; iIndex++ ) { LONG lID; hr = spEnumerableAttributeInfo->get_EnumerateID( iIndex, &lID ); _ASSERTE( SUCCEEDED( hr ) ); if ( lID == dwValueId ) { CComBSTR bstrDescription; hr = spEnumerableAttributeInfo->get_EnumerateDescription( iIndex, &bstrDescription ); _ASSERTE( SUCCEEDED( hr ) ); m_arrSelectedList.push_back(bstrDescription ); break; } } pwzStartPoint = pwzSeparator+1; } // copy the last one // todo: this is redundant code. remove later. // now we get the valud name for this // string could be enclosed by ^ and $ for matching purpose // ^ if(*pwzStartPoint == L'^') { pwzStartPoint++; } // $ pwzSeparator = pwzStartPoint + wcslen(pwzStartPoint); if (pwzSeparator > pwzStartPoint && *(pwzSeparator - 1) == L'$') *( pwzSeparator - 1 ) = _T('\0'); dwValueId = _wtol(pwzStartPoint); LONG lSize; hr = spEnumerableAttributeInfo->get_CountEnumerateID( &lSize ); _ASSERTE( SUCCEEDED( hr ) ); for (iIndex=0; iIndex < lSize; iIndex++ ) { LONG lID; hr = spEnumerableAttributeInfo->get_EnumerateID( iIndex, &lID ); _ASSERTE( SUCCEEDED( hr ) ); if ( lID == dwValueId ) { CComBSTR bstrDescription; hr = spEnumerableAttributeInfo->get_EnumerateDescription( iIndex, &bstrDescription ); _ASSERTE( SUCCEEDED( hr ) ); m_arrSelectedList.push_back(bstrDescription ); break; } } m_fParsed = TRUE; hr = S_OK; } catch(...) { // Do GetLastError for HRESULT? } return hr; }