440 lines
10 KiB
C++
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;
|
|
}
|