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

440 lines
10 KiB
C++

//+-------------------------------------------------------------------------
//
// 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; iIndex<m_arrSelectedList.GetSize(); iIndex++)
// {
// LPTSTR pszValue = m_arrSelectedList[iIndex];
// if ( pszValue )
// {
// delete[] pszValue;
// }
// }
// m_arrSelectedList.RemoveAll();
}
//+---------------------------------------------------------------------------
//
// Function: Edit
//
// Class: CEnumCondition
//
// Synopsis: edit the enumerated-typed condition
//
// Arguments: None
//
// Returns: HRESULT -
//
// History: Created Header byao 2/20/98 12:42:59 AM
//
//+---------------------------------------------------------------------------
HRESULT CEnumCondition::Edit()
{
TRACE_FUNCTION("CEnumCondition::Edit");
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 hr;
}
}
CEnumConditionEditor *pEditor = new CEnumConditionEditor();
if (!pEditor)
{
hr = HRESULT_FROM_WIN32(GetLastError());
ErrorTrace(ERROR_NAPMMC_ENUMCONDITION, "Can't create CEnumConditionEditor, err = %x", hr);
ShowErrorDialog(NULL
, IDS_ERROR_CANT_EDIT_CONDITION
, NULL
, hr
);
return hr;
}
//
// set the editor parameter
//
CComBSTR bstrName;
hr = m_spAttributeInfo->get_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;
}