348 lines
9 KiB
C++
348 lines
9 KiB
C++
/****************************************************************************************
|
|
* NAME: SelCondAttr.h
|
|
*
|
|
* CLASS: CSelCondAttrDlg
|
|
*
|
|
* OVERVIEW
|
|
*
|
|
* Internet Authentication Server: NAP Rule Editing Dialog
|
|
* This dialog box is used to display all condition types that users
|
|
* can choose from when adding a rule
|
|
*
|
|
* Copyright (C) Microsoft Corporation, 1998 - 2001 . All Rights Reserved.
|
|
*
|
|
* History:
|
|
* 1/28/98 Created by Byao (using ATL wizard)
|
|
*
|
|
*****************************************************************************************/
|
|
#include "precompiled.h"
|
|
|
|
#include "TimeOfDay.h"
|
|
#include "selcondattr.h"
|
|
#include "iasdebug.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CSelCondAttrDlg
|
|
|
|
CSelCondAttrDlg::CSelCondAttrDlg(CIASAttrList* pAttrList, LONG attrFilter)
|
|
:m_pAttrList(pAttrList), m_filter(attrFilter)
|
|
{
|
|
TRACE_FUNCTION("CSelCondAttrDlg::CSelCondAttrDlg");
|
|
|
|
//
|
|
// index of the condition attribute that has been selected
|
|
// This value is initialized to -1 == INVALID_VALUE
|
|
//
|
|
// The caller of this dialog box will need to know this index
|
|
// in order to get the correct condition attribute object
|
|
// in pCondAttrList
|
|
//
|
|
m_nSelectedCondAttr = -1;
|
|
}
|
|
|
|
|
|
CSelCondAttrDlg::~CSelCondAttrDlg()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: OnInitDialog
|
|
//
|
|
// Class: CSelCondAttrDlg
|
|
//
|
|
// Synopsis: init the dialog
|
|
//
|
|
// Arguments: UINT uMsg -
|
|
// WPARAM wParam -
|
|
// LPARAM lParam -
|
|
// BOOL& bHandled -
|
|
//
|
|
// Returns: LRESULT -
|
|
//
|
|
// History: Created Header 2/16/98 8:44:35 PM
|
|
//
|
|
//+---------------------------------------------------------------------------
|
|
LRESULT CSelCondAttrDlg::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
|
{
|
|
TRACE_FUNCTION("CSelCondAttrDlg::OnInitDialog");
|
|
|
|
m_hWndAttrList = GetDlgItem(IDC_LIST_COND_SELATTR);
|
|
|
|
//
|
|
// first, set the list box to 2 columns
|
|
//
|
|
LVCOLUMN lvc;
|
|
int iCol;
|
|
WCHAR achColumnHeader[256];
|
|
HINSTANCE hInst;
|
|
|
|
// initialize the LVCOLUMN structure
|
|
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
|
|
lvc.fmt = LVCFMT_LEFT;
|
|
|
|
lvc.cx = 120;
|
|
lvc.pszText = achColumnHeader;
|
|
|
|
// first column header: name
|
|
hInst = _Module.GetModuleInstance();
|
|
|
|
::LoadStringW(hInst, IDS_RULE_SELATTR_FIRSTCOLUMN, achColumnHeader, sizeof(achColumnHeader)/sizeof(achColumnHeader[0]));
|
|
lvc.iSubItem = 0;
|
|
ListView_InsertColumn(m_hWndAttrList, 0, &lvc);
|
|
|
|
lvc.cx = 400;
|
|
lvc.pszText = achColumnHeader;
|
|
|
|
// second columns: description
|
|
|
|
::LoadStringW(hInst, IDS_RULE_SELATTR_SECONDCOLUMN, achColumnHeader, sizeof(achColumnHeader)/sizeof(achColumnHeader[0]));
|
|
lvc.iSubItem = 1;
|
|
ListView_InsertColumn(m_hWndAttrList, 1, &lvc);
|
|
|
|
//
|
|
// populate the list control with bogus data
|
|
//
|
|
if (!PopulateCondAttrs())
|
|
{
|
|
ErrorTrace(ERROR_NAPMMC_SELATTRDLG, "PopulateRuleAttrs() failed");
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
// Make sure the Add button is not enabled initially.
|
|
// We will enable it when the user selects something.
|
|
::EnableWindow(GetDlgItem(IDC_BUTTON_ADD_CONDITION), FALSE);
|
|
|
|
|
|
return 1; // Let the system set the focus
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: OnListViewDbclk
|
|
//
|
|
// Class: CSelCondAttrDlg
|
|
//
|
|
// Synopsis: handle the case where the user has changed a selection
|
|
// enable/disable OK, CANCEL button accordingly
|
|
//
|
|
// Arguments: int idCtrl - ID of the list control
|
|
// LPNMHDR pnmh - notification message
|
|
// BOOL& bHandled - handled or not?
|
|
//
|
|
// Returns: LRESULT -
|
|
//
|
|
// History: Created Header byao 2/19/98 11:15:30 PM
|
|
//
|
|
//+---------------------------------------------------------------------------
|
|
LRESULT CSelCondAttrDlg::OnListViewDbclk(int idCtrl,
|
|
LPNMHDR pnmh,
|
|
BOOL& bHandled)
|
|
{
|
|
TRACE_FUNCTION("CSelCondAttrDlg::OnListViewDbclk");
|
|
|
|
return OnOK((WORD)idCtrl, IDC_BUTTON_ADD_CONDITION, m_hWndAttrList, bHandled); // the same as ok;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: OnOK
|
|
//
|
|
// Class: CSelCondAttrDlg
|
|
//
|
|
// Synopsis: The user has clicked OK; We will decide whether we need to
|
|
// put up another dialogbox depending on whether he has actually
|
|
// selected a condition type
|
|
//
|
|
// Arguments: WORD wNotifyCode -
|
|
// WORD wID -
|
|
// HWND hWndCtl -
|
|
// BOOL& bHandled -
|
|
//
|
|
// Returns: LRESULT -
|
|
// S_FALSE: failed
|
|
// S_OK: succeeded
|
|
//
|
|
// History: Created byao 1/30/98 5:54:55 PM
|
|
//
|
|
//+---------------------------------------------------------------------------
|
|
LRESULT CSelCondAttrDlg::OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
TRACE_FUNCTION("CSelCondAttrDlg::OnOK");
|
|
|
|
//
|
|
// Has the user chosen any condition type yet?
|
|
//
|
|
LVITEM lvi;
|
|
|
|
// Find out what's selected.
|
|
// MAM: This is not what we want here: int iIndex = ListView_GetSelectionMark(m_hWndAttrList);
|
|
int iIndex = ListView_GetNextItem(m_hWndAttrList, -1, LVNI_SELECTED);
|
|
DebugTrace(DEBUG_NAPMMC_SELATTRDLG, "Selected item: %d", iIndex);
|
|
|
|
if (iIndex != -1)
|
|
{
|
|
// The index inside the attribute list is stored as the lParam of this item.
|
|
|
|
lvi.iItem = iIndex;
|
|
lvi.iSubItem = 0;
|
|
lvi.mask = LVIF_PARAM;
|
|
|
|
ListView_GetItem(m_hWndAttrList, &lvi);
|
|
|
|
DebugTrace(DEBUG_NAPMMC_SELATTRDLG, "The actual index in the list is %ld", lvi.lParam);
|
|
m_nSelectedCondAttr = lvi.lParam;
|
|
|
|
|
|
//
|
|
// Close the condition selection dialog box -- only if something was selected.
|
|
//
|
|
// TRUE will be the return value of the DoModal call on this dialog.
|
|
EndDialog(TRUE);
|
|
|
|
|
|
}
|
|
|
|
// ISSUE: This function wants an LRESULT, not and HRESULT
|
|
// -- not sure of importance of return code here.
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
LRESULT CSelCondAttrDlg::OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
TRACE_FUNCTION("+NAPMMC+:# CSelCondAttrDlg::OnCancel\n");
|
|
|
|
// FALSE will be the return value of the DoModal call on this dialog.
|
|
EndDialog(FALSE);
|
|
return 0;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: PopulateCondAttrs
|
|
//
|
|
// Class: CSelCondAttrDlg
|
|
//
|
|
// Synopsis: populate the condition types in the list control
|
|
//
|
|
// Arguments: None
|
|
//
|
|
// Returns: BOOL -
|
|
// TRUE: if succeed
|
|
// FALSE: otherwise
|
|
//
|
|
// History: Created byao 1/30/98 3:10:35 PM
|
|
//
|
|
//+---------------------------------------------------------------------------
|
|
|
|
BOOL CSelCondAttrDlg::PopulateCondAttrs()
|
|
{
|
|
TRACE_FUNCTION("CSelCondAttrDlg::PopulateCondAttrs");
|
|
|
|
_ASSERTE( m_pAttrList != NULL );
|
|
|
|
int iIndex;
|
|
WCHAR wzText[MAX_PATH];
|
|
|
|
LVITEM lvi;
|
|
|
|
lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE;
|
|
lvi.state = 0;
|
|
lvi.stateMask = 0;
|
|
lvi.iSubItem = 0;
|
|
|
|
//
|
|
// insert the item
|
|
//
|
|
int jRow = 0;
|
|
for (iIndex=0; iIndex < (int) m_pAttrList->size(); iIndex++)
|
|
{
|
|
lvi.iItem = jRow;
|
|
|
|
CComPtr<IIASAttributeInfo> spAttributeInfo = m_pAttrList->GetAt(iIndex);
|
|
_ASSERTE( spAttributeInfo );
|
|
|
|
LONG lRestriction;
|
|
spAttributeInfo->get_AttributeRestriction( &lRestriction );
|
|
|
|
if ( lRestriction & m_filter )
|
|
{
|
|
// DebugTrace(DEBUG_NAPMMC_SELATTRDLG, "Inserting %ws", (LPCTSTR)m_pAttrList->GetAt(iIndex)->m_pszName);
|
|
|
|
// set the item data to the index of this attribute
|
|
// Since only a subset of the attribute can be used in the condition
|
|
// we store the actual index to the attribute list as the item data
|
|
lvi.lParam = iIndex;
|
|
|
|
// name
|
|
CComBSTR bstrName;
|
|
spAttributeInfo->get_AttributeName( &bstrName );
|
|
lvi.pszText = bstrName;
|
|
int iRowIndex = ListView_InsertItem(m_hWndAttrList, &lvi);
|
|
|
|
if(iRowIndex != -1)
|
|
{
|
|
// description
|
|
CComBSTR bstrDescription;
|
|
spAttributeInfo->get_AttributeDescription( &bstrDescription );
|
|
ListView_SetItemText(m_hWndAttrList, iRowIndex, 1, bstrDescription);
|
|
}
|
|
jRow++; // go to the next Row
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: OnListViewItemChanged
|
|
//
|
|
// Class: CSelCondAttrDlg
|
|
//
|
|
// Synopsis: handle the case where the user has changed a selection
|
|
// enable/disable OK, CANCEL button accordingly
|
|
//
|
|
// Arguments: int idCtrl - ID of the list control
|
|
// LPNMHDR pnmh - notification message
|
|
// BOOL& bHandled - handled or not?
|
|
//
|
|
// Returns: LRESULT -
|
|
//
|
|
// History: Created Header byao 2/19/98 11:15:30 PM
|
|
//
|
|
//+---------------------------------------------------------------------------
|
|
LRESULT CSelCondAttrDlg::OnListViewItemChanged(int idCtrl,
|
|
LPNMHDR pnmh,
|
|
BOOL& bHandled)
|
|
{
|
|
TRACE_FUNCTION("CSelCondAttrDlg::OnListViewItemChanged");
|
|
|
|
// Find out what's selected.
|
|
// MAM: This is not what we want here: int iCurSel = ListView_GetSelectionMark(m_hWndAttrList);
|
|
int iCurSel = ListView_GetNextItem(m_hWndAttrList, -1, LVNI_SELECTED);
|
|
|
|
|
|
if (-1 == iCurSel)
|
|
{
|
|
// The user selected nothing, let's disable the ok button.
|
|
::EnableWindow(GetDlgItem(IDC_BUTTON_ADD_CONDITION), FALSE);
|
|
}
|
|
else
|
|
{
|
|
// Yes, enable the ok button.
|
|
::EnableWindow(GetDlgItem(IDC_BUTTON_ADD_CONDITION), TRUE);
|
|
}
|
|
|
|
bHandled = FALSE;
|
|
return 0;
|
|
}
|