windows-nt/Source/XPSP1/NT/admin/snapin/dfsadmin/dfsgui/linkfilt.cpp
2020-09-26 16:20:57 +08:00

318 lines
7.1 KiB
C++

/*++
Module Name:
LinkFilt.cpp
Abstract:
This module contains the implementation for CFilterDfsLinks.
This class displays the Dfs link filter Dialog.
*/
#include "stdafx.h"
#include "LinkFilt.h"
#include "utils.h"
#include "dfshelp.h"
#include "netutils.h"
/////////////////////////////////////////////////////////////////////////////
// CAddToDfs
CFilterDfsLinks::CFilterDfsLinks() :
m_ulMaxLimit(0),
m_lLinkFilterType(FILTERDFSLINKS_TYPE_NO_FILTER)
{
}
CFilterDfsLinks::~CFilterDfsLinks()
{
}
HRESULT CFilterDfsLinks::put_EnumFilterType
(
FILTERDFSLINKS_TYPE i_lLinkFilterType
)
{
m_lLinkFilterType = i_lLinkFilterType;
return S_OK;
}
HRESULT CFilterDfsLinks::get_EnumFilterType
(
FILTERDFSLINKS_TYPE *o_plLinkFilterType
)
{
if (!o_plLinkFilterType)
return E_INVALIDARG;
*o_plLinkFilterType = m_lLinkFilterType;
return S_OK;
}
HRESULT CFilterDfsLinks::put_EnumFilter
(
BSTR i_bstrEnumFilter
)
{
m_bstrEnumFilter = i_bstrEnumFilter ? i_bstrEnumFilter : _T("");
if (!m_bstrEnumFilter)
return E_OUTOFMEMORY;
return S_OK;
}
HRESULT CFilterDfsLinks::get_EnumFilter
(
BSTR *o_pbstrEnumFilter
)
{
if (!o_pbstrEnumFilter)
return E_INVALIDARG;
*o_pbstrEnumFilter = SysAllocString(m_bstrEnumFilter);
if (!*o_pbstrEnumFilter)
return E_OUTOFMEMORY;
return S_OK;
}
HRESULT CFilterDfsLinks::put_MaxLimit
(
ULONG i_ulMaxLimit
)
{
m_ulMaxLimit = i_ulMaxLimit;
return S_OK;
}
HRESULT CFilterDfsLinks::get_MaxLimit
(
ULONG *o_pulMaxLimit
)
{
if (!o_pulMaxLimit)
return E_INVALIDARG;
*o_pulMaxLimit = m_ulMaxLimit;
return S_OK;
}
extern WNDPROC g_fnOldEditCtrlProc;
LRESULT CFilterDfsLinks::OnInitDialog
(
UINT uMsg,
WPARAM wParam,
LPARAM lParam,
BOOL& bHandled
)
{
CComBSTR bstrBeginWith, bstrContain;
HRESULT hr = LoadStringFromResource(IDS_FILTERDFSLINKS_BEGINWITH, &bstrBeginWith);
if (FAILED(hr))
return FALSE;
hr = LoadStringFromResource(IDS_FILTERDFSLINKS_CONTAIN, &bstrContain);
if (FAILED(hr))
return FALSE;
SetDlgItemText(IDC_FILTERDFSLINKS_FILTER, m_bstrEnumFilter);
TCHAR szMaxLimit[16];
_stprintf(szMaxLimit, _T("%u"), m_ulMaxLimit);
SetDlgItemText(IDC_FILTERDFSLINKS_MAXLIMIT, szMaxLimit);
SendDlgItemMessage(IDC_FILTERDFSLINKS_MAXLIMIT, EM_LIMITTEXT, 5, 0);
CheckRadioButton(
IDC_FILTERDFSLINKS_RADIO_NO,
IDC_FILTERDFSLINKS_RADIO_YES,
(m_lLinkFilterType == FILTERDFSLINKS_TYPE_NO_FILTER ?
IDC_FILTERDFSLINKS_RADIO_NO :
IDC_FILTERDFSLINKS_RADIO_YES));
SendDlgItemMessage(IDC_FILTERDFSLINKS_FILTER_TYPE, CB_INSERTSTRING, 0, (LPARAM)(BSTR)bstrBeginWith);
SendDlgItemMessage(IDC_FILTERDFSLINKS_FILTER_TYPE, CB_INSERTSTRING, 1, (LPARAM)(BSTR)bstrContain);
if (m_lLinkFilterType == FILTERDFSLINKS_TYPE_CONTAIN)
SendDlgItemMessage(IDC_FILTERDFSLINKS_FILTER_TYPE, CB_SETCURSEL, 1, 0);
else
SendDlgItemMessage(IDC_FILTERDFSLINKS_FILTER_TYPE, CB_SETCURSEL, 0, 0);
if (m_lLinkFilterType == FILTERDFSLINKS_TYPE_NO_FILTER)
{
// disable combo and edit box
::EnableWindow(GetDlgItem(IDC_FILTERDFSLINKS_FILTER_TYPE), FALSE);
::EnableWindow(GetDlgItem(IDC_FILTERDFSLINKS_FILTER), FALSE);
}
g_fnOldEditCtrlProc = reinterpret_cast<WNDPROC>(
::SetWindowLongPtr(
GetDlgItem(IDC_FILTERDFSLINKS_MAXLIMIT),
GWLP_WNDPROC,
reinterpret_cast<LONG_PTR>(NoPasteEditCtrlProc)));
return TRUE; // Let the system set the focus
}
LRESULT CFilterDfsLinks::OnRadioNo
(
WORD wNotifyCode,
WORD wID,
HWND hWndCtl,
BOOL& bHandled
)
{
::EnableWindow(GetDlgItem(IDC_FILTERDFSLINKS_FILTER_TYPE), FALSE);
::EnableWindow(GetDlgItem(IDC_FILTERDFSLINKS_FILTER_LABEL), FALSE);
::EnableWindow(GetDlgItem(IDC_FILTERDFSLINKS_FILTER), FALSE);
return TRUE;
}
LRESULT CFilterDfsLinks::OnRadioYes
(
WORD wNotifyCode,
WORD wID,
HWND hWndCtl,
BOOL& bHandled
)
{
::EnableWindow(GetDlgItem(IDC_FILTERDFSLINKS_FILTER_TYPE), TRUE);
::EnableWindow(GetDlgItem(IDC_FILTERDFSLINKS_FILTER_LABEL), TRUE);
::EnableWindow(GetDlgItem(IDC_FILTERDFSLINKS_FILTER), TRUE);
return TRUE;
}
/*++
This function is called when a user clicks the ? in the top right of a property sheet
and then clciks a control, or when they hit F1 in a control.
--*/
LRESULT CFilterDfsLinks::OnCtxHelp(
IN UINT i_uMsg,
IN WPARAM i_wParam,
IN LPARAM i_lParam,
IN OUT BOOL& io_bHandled
)
{
LPHELPINFO lphi = (LPHELPINFO) i_lParam;
if (!lphi || lphi->iContextType != HELPINFO_WINDOW || lphi->iCtrlId < 0)
return FALSE;
::WinHelp((HWND)(lphi->hItemHandle),
DFS_CTX_HELP_FILE,
HELP_WM_HELP,
(DWORD_PTR)(PVOID)g_aHelpIDs_IDD_FILTERDFSLINKS);
return TRUE;
}
/*++
This function handles "What's This" help when a user right clicks the control
--*/
LRESULT CFilterDfsLinks::OnCtxMenuHelp(
IN UINT i_uMsg,
IN WPARAM i_wParam,
IN LPARAM i_lParam,
IN OUT BOOL& io_bHandled
)
{
::WinHelp((HWND)i_wParam,
DFS_CTX_HELP_FILE,
HELP_CONTEXTMENU,
(DWORD_PTR)(PVOID)g_aHelpIDs_IDD_FILTERDFSLINKS);
return TRUE;
}
LRESULT CFilterDfsLinks::OnOK
(
WORD wNotifyCode,
WORD wID,
HWND hWndCtl,
BOOL& bHandled
)
{
BOOL bValidInput = FALSE;
int idControl = 0;
int idString = 0;
HRESULT hr = S_OK;
do {
DWORD dwTextLength = 0;
// Validate IDC_FILTERDFSLINKS_MAXLIMIT
idControl = IDC_FILTERDFSLINKS_MAXLIMIT;
CComBSTR bstrTemp;
hr = GetInputText(GetDlgItem(idControl), &bstrTemp, &dwTextLength);
if (FAILED(hr))
break;
if (0 == dwTextLength)
{
idString = IDS_MSG_EMPTY_LINKFILTMAX;
break;
}
m_ulMaxLimit = (ULONG)_wtoi64(bstrTemp);
if (IsDlgButtonChecked(IDC_FILTERDFSLINKS_RADIO_NO))
{
m_lLinkFilterType = FILTERDFSLINKS_TYPE_NO_FILTER;
m_bstrEnumFilter = _T("");
} else
{
// Validate IDC_FILTERDFSLINKS_FILTER_TYPE
m_lLinkFilterType = (0 == SendDlgItemMessage(IDC_FILTERDFSLINKS_FILTER_TYPE, CB_GETCURSEL, 0, 0))
? FILTERDFSLINKS_TYPE_BEGINWITH : FILTERDFSLINKS_TYPE_CONTAIN;
// Validate IDC_FILTERDFSLINKS_FILTER
idControl = IDC_FILTERDFSLINKS_FILTER;
m_bstrEnumFilter.Empty();
hr = GetInputText(GetDlgItem(idControl), &m_bstrEnumFilter, &dwTextLength);
if (FAILED(hr))
break;
if (0 == dwTextLength)
m_bstrEnumFilter = _T("");
}
bValidInput = TRUE;
} while (0);
if (FAILED(hr))
{
DisplayMessageBoxForHR(hr);
::SetFocus(GetDlgItem(idControl));
return FALSE;
} else if (bValidInput)
{
EndDialog(S_OK);
return TRUE;
} else
{
if (idString)
DisplayMessageBoxWithOK(idString);
::SetFocus(GetDlgItem(idControl));
return FALSE;
}
}
LRESULT CFilterDfsLinks::OnCancel
(
WORD wNotifyCode,
WORD wID,
HWND hWndCtl,
BOOL& bHandled
)
{
EndDialog(S_FALSE);
return TRUE;
}