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

269 lines
6.7 KiB
C++

/****************************************************************************************
* NAME: MatchCondition.cpp
*
* CLASS: CMatchCondition
*
* OVERVIEW
*
* Match type condition
*
* ex: MachineType MATCH <a..z*>
*
*
* 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;
}