/**************************************************************************************** * NAME: MatchCondition.cpp * * CLASS: CMatchCondition * * OVERVIEW * * Match type condition * * ex: MachineType MATCH * * * Copyright (C) Microsoft Corporation, 1998 - 1999 . All Rights Reserved. * * History: * 1/28/98 Created by Byao (using ATL wizard) * *****************************************************************************************/ #include "precompiled.h" #include "MatchCondition.h" #include "MatchCondEdit.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CMatchCondition::CMatchCondition(IIASAttributeInfo* pCondAttr) :CCondition(pCondAttr) { TRACE_FUNCTION("CMatchCondition::CMatchCondition()"); // we don't need to do the parsing since there's no condition text m_fParsed = TRUE; } CMatchCondition::CMatchCondition(IIASAttributeInfo* pCondAttr, ATL::CString& strConditionText ) :CCondition(pCondAttr, strConditionText) { TRACE_FUNCTION("CMatchCondition::CMatchCondition()"); // // we need initialization later // m_fParsed = FALSE; } CMatchCondition::~CMatchCondition() { TRACE_FUNCTION("CMatchCondition::~CMatchCondition()"); } //+--------------------------------------------------------------------------- // // Function: Edit // // Class: CMatchCondition // // Synopsis: edit the match-typed condition // // Arguments: None // // Returns: HRESULT - // // History: Created Header byao 2/20/98 12:42:59 AM // //+--------------------------------------------------------------------------- HRESULT CMatchCondition::Edit() { TRACE_FUNCTION("CMatchCondition::Edit()"); HRESULT hr = S_OK; if ( !m_fParsed ) { // we need to parse this condition text first DebugTrace(DEBUG_NAPMMC_MATCHCOND, "Need to parse condition %ws", (LPCTSTR)m_strConditionText); hr = ParseConditionText(); if ( FAILED(hr) ) { ErrorTrace(ERROR_NAPMMC_MATCHCOND, "Invalid Condition %ws, err=%x", (LPCTSTR)m_strConditionText, hr); ShowErrorDialog(NULL, IDS_ERROR_PARSE_CONDITION, (LPTSTR)(LPCTSTR)m_strConditionText, hr ); return hr; } DebugTrace(DEBUG_NAPMMC_MATCHCOND, "Parsing Succeeded!"); } // now we create a new condition editor object DebugTrace(DEBUG_NAPMMC_MATCHCOND, "Calling new CMatchCondEditor ..."); CMatchCondEditor *pEditor = new CMatchCondEditor(); if (!pEditor) { hr = HRESULT_FROM_WIN32(GetLastError()); ErrorTrace(ERROR_NAPMMC_MATCHCOND, "Can't new a CMatchCondEditor object: err %x", hr); return hr; } pEditor->m_strRegExp = m_strRegExp; CComBSTR bstrName; hr = m_spAttributeInfo->get_AttributeName( &bstrName ); _ASSERTE( SUCCEEDED( hr ) ); pEditor->m_strAttrName = bstrName; DebugTrace(DEBUG_NAPMMC_MATCHCOND, "Start Match condition editor for %ws, %ws", (LPCTSTR)pEditor->m_strAttrName, (LPCTSTR)pEditor->m_strRegExp ); if ( pEditor->DoModal() == IDOK) { // user clicked "OK" -- get the regular expression m_strRegExp = pEditor->m_strRegExp; // // fix up the condition text for SDO // // Escape any magic characters. ::CString raw(m_strRegExp); raw.Replace(L"\"", L"\"\""); m_strConditionText = bstrName; m_strConditionText += L"=" ; m_strConditionText += raw; hr = S_OK; } DebugTrace(DEBUG_NAPMMC_MATCHCOND, "New condition: %ws", (LPCTSTR)m_strConditionText); // clean up if ( pEditor ) { delete pEditor; } return hr; } //+--------------------------------------------------------------------------- // // Function: CMatchCondition::GetDisplayText // // Synopsis: Get the displayable text format for this condition, // which should be like this: // // DialinProperty.NASIPAddress matches "220.23" // // compared to the condition text: // // DialinProperty.NASIPAddress = 220.23 // // Arguments: None // // Returns: ATL::CString& - the displayable text // // History: Created Header byao 2/22/98 11:41:28 PM // //+--------------------------------------------------------------------------- ATL::CString CMatchCondition::GetDisplayText() { TRACE_FUNCTION("CMatchCondition::GetDisplayText()"); HRESULT hr = S_OK; if ( !m_fParsed) { // we need to parse this condition text first DebugTrace(DEBUG_NAPMMC_MATCHCOND, "Need to parse condition %ws", (LPCTSTR)m_strConditionText); hr = ParseConditionText(); if ( FAILED(hr) ) { ErrorTrace(ERROR_NAPMMC_MATCHCOND, "Invalid Condition %ws, err=%x", (LPCTSTR)m_strConditionText, hr); ShowErrorDialog(NULL, IDS_ERROR_PARSE_CONDITION, (LPTSTR)(LPCTSTR)m_strConditionText, hr ); return ATL::CString(_T(" ")); } } // generate the displayable condition text ATL::CString strDispText; CComBSTR bstrName; hr = m_spAttributeInfo->get_AttributeName( &bstrName ); _ASSERTE( SUCCEEDED( hr ) ); strDispText = bstrName; // ISSUE: The word "matches" below is hardcoded and it shouldn't be. { ATL::CString matches; matches.LoadString(IDS_TEXT_MATCHES); strDispText += matches; } strDispText += L"\""; strDispText += m_strRegExp; strDispText += L"\" "; DebugTrace(DEBUG_NAPMMC_MATCHCOND, "Returning displayable text: %ws", (LPCTSTR)strDispText); return strDispText; } //+--------------------------------------------------------------------------- // // Function: CMatchCondition::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 CMatchCondition::ParseConditionText() { TRACE_FUNCTION("CMatchCondition::ParseConditionText()"); _ASSERTE( !m_fParsed ); HRESULT hr = S_OK; if (m_fParsed) { DebugTrace(DEBUG_NAPMMC_MATCHCOND,"Weird ... parsed flag already set!"); // do nothing return S_OK; } // // parse strConditionText, return the regular expression only // WCHAR *pwzCondText = (LPTSTR) ((LPCTSTR)m_strConditionText); // look for the '=' in the condition text WCHAR *pwzEqualSign = wcschr(pwzCondText, L'='); // no '=' found -- something weird has happened if ( pwzEqualSign == NULL ) { ErrorTrace(ERROR_NAPMMC_MATCHCOND, "Can't find '=' in the regular expression!"); return E_UNEXPECTED; } // The right side of the equal sign is the regular expression. ::CString raw = pwzEqualSign + 1; // Remove any escape sequences. raw.Replace(L"\"\"", L"\""); m_strRegExp = raw; DebugTrace(DEBUG_NAPMMC_MATCHCOND, "Regular expression: %ws", (LPCTSTR)m_strRegExp); m_fParsed = TRUE; return S_OK; }