1272 lines
23 KiB
C++
1272 lines
23 KiB
C++
/*++
|
|
|
|
Copyright (c) 1994-1998 Microsoft Corporation
|
|
|
|
Module Name :
|
|
|
|
mmmdlg.cpp
|
|
|
|
Abstract:
|
|
|
|
Multi-multi-multi dialog editor
|
|
|
|
Author:
|
|
|
|
Ronald Meijer (ronaldm)
|
|
|
|
Project:
|
|
|
|
Internet Services Manager
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
//
|
|
// Include Files
|
|
//
|
|
#include "stdafx.h"
|
|
#include "common.h"
|
|
#include "inetmgrapp.h"
|
|
#include "mmmdlg.h"
|
|
#include "inetprop.h"
|
|
#include "w3sht.h"
|
|
|
|
#ifdef _DEBUG
|
|
#define new DEBUG_NEW
|
|
#undef THIS_FILE
|
|
static char THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
//
|
|
// Registry key name for this dialog
|
|
//
|
|
const TCHAR g_szRegKeyIP[] = _T("MMMIpBindings");
|
|
const TCHAR g_szRegKeySSL[] = _T("MMMSSLBindings");
|
|
|
|
//
|
|
// IP Bindings Listbox Column Definitions
|
|
//
|
|
static const ODL_COLUMN_DEF g_aIPColumns[] =
|
|
{
|
|
// ===============================================
|
|
// Weight Label
|
|
// ===============================================
|
|
{ 6, IDS_MMM_IP_ADDRESS, },
|
|
{ 3, IDS_MMM_TCP_PORT, },
|
|
{ 10, IDS_MMM_DOMAIN_NAME, },
|
|
};
|
|
|
|
//
|
|
// SSL Bindings Listbox Column Definitions
|
|
//
|
|
static const ODL_COLUMN_DEF g_aSSLColumns[] =
|
|
{
|
|
// ===============================================
|
|
// Weight Label
|
|
// ===============================================
|
|
{ 2, IDS_MMM_IP_ADDRESS, },
|
|
{ 1, IDS_MMM_SSL_PORT, },
|
|
};
|
|
|
|
#define NUM_COLUMNS(cols) (sizeof(cols) / sizeof(cols[0]))
|
|
|
|
IMPLEMENT_DYNAMIC(CMMMListBox, CRMCListBox);
|
|
|
|
//
|
|
// Bitmap indices
|
|
//
|
|
enum
|
|
{
|
|
BMPID_BINDING,
|
|
|
|
//
|
|
// Don't move this one
|
|
//
|
|
BMPID_TOTAL
|
|
};
|
|
|
|
|
|
const int CMMMListBox::nBitmaps = BMPID_TOTAL;
|
|
|
|
|
|
CMMMListBox::CMMMListBox(
|
|
IN LPCTSTR lpszRegKey,
|
|
IN int cColumns,
|
|
IN const ODL_COLUMN_DEF * pColumns
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Constructor
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
N/A
|
|
|
|
--*/
|
|
: CHeaderListBox(HLS_STRETCH, lpszRegKey),
|
|
m_cColumns(cColumns),
|
|
m_pColumns(pColumns)
|
|
{
|
|
VERIFY(m_strDefaultIP.LoadString(IDS_DEFAULT));
|
|
VERIFY(m_strNoPort.LoadString(IDS_MMM_NA));
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CMMMListBox::DrawItemEx(
|
|
IN CRMCListBoxDrawStruct & ds
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Draw item in the listbox
|
|
|
|
Arguments:
|
|
|
|
CRMCListBoxDrawStruct & ds : Draw item structure
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
CString & strBinding = *(CString *)ds.m_ItemData;
|
|
|
|
TRACEEOLID(strBinding);
|
|
|
|
UINT nPort;
|
|
LPCTSTR lp;
|
|
CString strHostHeader;
|
|
CString strPort;
|
|
CString strIP;
|
|
CIPAddress iaIpAddress;
|
|
|
|
CInstanceProps::CrackBinding(
|
|
strBinding,
|
|
iaIpAddress,
|
|
nPort,
|
|
strHostHeader
|
|
);
|
|
|
|
//
|
|
// Display Granted/Denied with appropriate bitmap
|
|
//
|
|
DrawBitmap(ds, 0, BMPID_BINDING);
|
|
|
|
if (iaIpAddress.IsZeroValue())
|
|
{
|
|
lp = m_strDefaultIP;
|
|
}
|
|
else
|
|
{
|
|
lp = iaIpAddress.QueryIPAddress(strIP);
|
|
}
|
|
|
|
ColumnText(ds, 0, TRUE, lp);
|
|
|
|
if (nPort > 0)
|
|
{
|
|
strPort.Format(_T("%u"), nPort);
|
|
lp = strPort;
|
|
}
|
|
else
|
|
{
|
|
lp = m_strNoPort;
|
|
}
|
|
|
|
ColumnText(ds, 1, FALSE, lp);
|
|
ColumnText(ds, 2, FALSE, strHostHeader);
|
|
}
|
|
|
|
|
|
|
|
/* virtual */
|
|
BOOL
|
|
CMMMListBox::Initialize()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initialize the listbox. Insert the columns as requested, and lay
|
|
them out appropriately
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
TRUE for succesful initialisation, FALSE otherwise
|
|
|
|
--*/
|
|
{
|
|
if (!CHeaderListBox::Initialize())
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Build all columns
|
|
//
|
|
HINSTANCE hInst = AfxGetResourceHandle();
|
|
for (int nCol = 0; nCol < m_cColumns; ++nCol)
|
|
{
|
|
InsertColumn(nCol, m_pColumns[nCol].nWeight, m_pColumns[nCol].nLabelID, hInst);
|
|
}
|
|
|
|
//
|
|
// Try to set the widths from the stored registry value,
|
|
// otherwise distribute according to column weights specified
|
|
//
|
|
// if (!SetWidthsFromReg())
|
|
// {
|
|
DistributeColumns();
|
|
// }
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
void AFXAPI
|
|
DDXV_UINT(
|
|
IN CDataExchange * pDX,
|
|
IN UINT nID,
|
|
IN OUT UINT & uValue,
|
|
IN UINT uMin,
|
|
IN UINT uMax,
|
|
IN UINT nEmptyErrorMsg OPTIONAL
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
DDX/DDV Function that uses a space to denote a 0 value
|
|
|
|
Arguments:
|
|
|
|
CDataExchange * pDX : Data exchange object
|
|
UINT nID : Resource ID
|
|
OUT UINT & uValue : Value
|
|
UINT uMin : Minimum value
|
|
UINT uMax : Maximum value
|
|
UINT nEmptyErrorMsg : Error message ID for empty unit, or 0 if empty OK
|
|
|
|
Return Value:
|
|
|
|
None.
|
|
|
|
--*/
|
|
{
|
|
ASSERT(uMin <= uMax);
|
|
|
|
CWnd * pWnd = CWnd::FromHandle(pDX->PrepareEditCtrl(nID));
|
|
ASSERT(pWnd != NULL);
|
|
|
|
if (pDX->m_bSaveAndValidate)
|
|
{
|
|
if (pWnd->GetWindowTextLength() > 0)
|
|
{
|
|
DDX_Text(pDX, nID, uValue);
|
|
DDV_MinMaxUInt(pDX, uValue, uMin, uMax);
|
|
}
|
|
else
|
|
{
|
|
uValue = 0;
|
|
if (nEmptyErrorMsg)
|
|
{
|
|
::AfxMessageBox(nEmptyErrorMsg);
|
|
pDX->Fail();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (uValue != 0)
|
|
{
|
|
DDX_Text(pDX, nID, uValue);
|
|
}
|
|
else
|
|
{
|
|
pWnd->SetWindowText(_T(""));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
IsBindingUnique(
|
|
IN CString & strBinding,
|
|
IN CStringList & strlBindings,
|
|
IN int iCurrent OPTIONAL
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Helper function to determine if a binding is unique.
|
|
|
|
Arguments:
|
|
|
|
CString & strBinding : Binding string
|
|
CStringList & strlBindings : List of bindings
|
|
int iCurrent : Index of "current" item.
|
|
Not used for uniqueness checking.
|
|
|
|
Return Value:
|
|
|
|
TRUE if the binding is unique, FALSE otherwise.
|
|
|
|
--*/
|
|
{
|
|
int iItem = 0;
|
|
|
|
for(POSITION pos = strlBindings.GetHeadPosition(); pos != NULL; /**/ )
|
|
{
|
|
CString & str = strlBindings.GetNext(pos);
|
|
if (iItem != iCurrent && &str != &strBinding && str == strBinding)
|
|
{
|
|
//
|
|
// Not unique!
|
|
//
|
|
return FALSE;
|
|
}
|
|
|
|
++iItem;
|
|
}
|
|
|
|
//
|
|
// Unique
|
|
//
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
//
|
|
// Multi-multi-multi editing dialog
|
|
//
|
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
|
|
|
|
CMMMEditDlg::CMMMEditDlg(
|
|
IN CString & strServerName,
|
|
IN CStringList & strlBindings,
|
|
IN CStringList & strlOtherBindings,
|
|
IN OUT CString & entry,
|
|
IN BOOL fIPBinding,
|
|
IN CWnd * pParent OPTIONAL
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Constructor
|
|
|
|
Arguments:
|
|
|
|
CString & strServerName : Server name
|
|
CStringList & strlBindings : bindings
|
|
CStringList & strlOtherBindings : "other" bindings list
|
|
CString & entry : Entry being edited
|
|
BOOL fIPBinding : TRUE for IP, FALSE for SSL
|
|
CWnd * pParent : Optional parent window
|
|
|
|
Return Value:
|
|
|
|
N/A
|
|
|
|
--*/
|
|
: CDialog(CMMMEditDlg::IDD, pParent),
|
|
m_strServerName(strServerName),
|
|
m_strlBindings(strlBindings),
|
|
m_strlOtherBindings(strlOtherBindings),
|
|
m_entry(entry),
|
|
m_fIPBinding(fIPBinding),
|
|
m_nIpAddressSel(-1)
|
|
{
|
|
|
|
#if 0 // Keep class wizard happy
|
|
|
|
//{{AFX_DATA_INIT(CMMMEditDlg)
|
|
m_nIpAddressSel = -1;
|
|
//}}AFX_DATA_INIT
|
|
|
|
#endif // 0
|
|
|
|
CInstanceProps::CrackBinding(
|
|
m_entry,
|
|
m_iaIpAddress,
|
|
m_nPort,
|
|
m_strDomainName
|
|
);
|
|
}
|
|
|
|
void
|
|
CMMMEditDlg::DoDataExchange(
|
|
IN CDataExchange * pDX
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initialise/Store control data
|
|
|
|
Arguments:
|
|
|
|
CDataExchange * pDX - DDX/DDV control structure
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CMMMEditDlg)
|
|
DDX_Text(pDX, IDC_EDIT_DOMAIN_NAME, m_strDomainName);
|
|
DDV_MaxChars(pDX, m_strDomainName, MAX_PATH);
|
|
DDX_Control(pDX, IDC_COMBO_IP_ADDRESSES, m_combo_IpAddresses);
|
|
DDX_Control(pDX, IDC_STATIC_PORT, m_static_Port);
|
|
//}}AFX_DATA_MAP
|
|
|
|
DDXV_UINT(pDX, IDC_EDIT_PORT, m_nPort, 1, 65535);
|
|
|
|
DDX_CBIndex(pDX, IDC_COMBO_IP_ADDRESSES, m_nIpAddressSel);
|
|
|
|
if (pDX->m_bSaveAndValidate && !FetchIpAddressFromCombo(
|
|
m_combo_IpAddresses, m_oblIpAddresses, m_iaIpAddress))
|
|
{
|
|
pDX->Fail();
|
|
}
|
|
|
|
// Currently IIS support in domain names only A-Z,a-z,0-9,.-
|
|
if (pDX->m_bSaveAndValidate)
|
|
{
|
|
LPCTSTR p = m_strDomainName;
|
|
while (p != NULL && *p != 0)
|
|
{
|
|
TCHAR c = towupper(*p);
|
|
if ( (c >= _T('A') && c <= _T('Z'))
|
|
|| (c >= _T('0') && c <= _T('9'))
|
|
|| (c == _T('.') || c == _T('-'))
|
|
)
|
|
{
|
|
p++;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
AfxMessageBox(IDS_WARNING_DOMAIN_NAME);
|
|
pDX->PrepareEditCtrl(IDC_EDIT_DOMAIN_NAME);
|
|
pDX->Fail();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// Message Map
|
|
//
|
|
BEGIN_MESSAGE_MAP(CMMMEditDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CMMMEditDlg)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
//
|
|
// Message Handlers
|
|
//
|
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
BOOL
|
|
CMMMEditDlg::OnInitDialog()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
WM_INITDIALOG handler. Initialize the dialog.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
TRUE if focus is to be set automatically, FALSE if the focus
|
|
is already set.
|
|
|
|
--*/
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
BeginWaitCursor();
|
|
PopulateComboWithKnownIpAddresses(
|
|
m_strServerName,
|
|
m_combo_IpAddresses,
|
|
m_iaIpAddress,
|
|
m_oblIpAddresses,
|
|
m_nIpAddressSel
|
|
);
|
|
EndWaitCursor();
|
|
|
|
//
|
|
// Configure dialog for either SSL or IP binding editing
|
|
//
|
|
CString str;
|
|
VERIFY(str.LoadString(m_fIPBinding
|
|
? IDS_EDIT_MMM_TITLE
|
|
: IDS_EDIT_SSL_MMM_TITLE));
|
|
SetWindowText(str);
|
|
|
|
VERIFY(str.LoadString(m_fIPBinding
|
|
? IDS_TCP_PORT
|
|
: IDS_SSL_PORT));
|
|
m_static_Port.SetWindowText(str);
|
|
|
|
ActivateControl(*GetDlgItem(IDC_STATIC_HEADER_NAME), m_fIPBinding);
|
|
ActivateControl(*GetDlgItem(IDC_EDIT_DOMAIN_NAME), m_fIPBinding);
|
|
#if 0
|
|
CHARFORMAT cf;
|
|
ZeroMemory(&cf, sizeof(cf));
|
|
cf.cbSize = sizeof(cf);
|
|
cf.dwMask = CFM_FACE;
|
|
cf.bPitchAndFamily = FIXED_PITCH | FF_DONTCARE;
|
|
lstrcpyn((LPTSTR)cf.szFaceName, _T("Courier"), LF_FACESIZE);
|
|
|
|
SendDlgItemMessage(IDC_EDIT_DOMAIN_NAME, EM_SETCHARFORMAT, SCF_ALL, (LPARAM)&cf);
|
|
#endif
|
|
DWORD event = (DWORD)SendDlgItemMessage(IDC_EDIT_DOMAIN_NAME, EM_GETEVENTMASK, 0, 0);
|
|
event |= ENM_CHANGE;
|
|
SendDlgItemMessage(IDC_EDIT_DOMAIN_NAME, EM_SETEVENTMASK, 0, (LPARAM)event);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CMMMEditDlg::OnOK()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
OK button handler. Verify values are acceptable, and change
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
if (!UpdateData(TRUE))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (m_nPort == 0)
|
|
{
|
|
::AfxMessageBox(IDS_NO_PORT);
|
|
return;
|
|
}
|
|
|
|
CString strOldBinding(m_entry);
|
|
CInstanceProps::BuildBinding(m_entry, m_iaIpAddress, m_nPort, m_strDomainName);
|
|
|
|
//
|
|
// Ensure the ip/address doesn't exist in the "other" binding list
|
|
//
|
|
if (CInstanceProps::IsPortInUse(m_strlOtherBindings, m_iaIpAddress, m_nPort))
|
|
{
|
|
//
|
|
// Restore the old binding
|
|
//
|
|
m_entry = strOldBinding;
|
|
::AfxMessageBox(m_fIPBinding
|
|
? IDS_ERR_PORT_IN_USE_SSL
|
|
: IDS_ERR_PORT_IN_USE_TCP);
|
|
return;
|
|
}
|
|
|
|
|
|
if (!IsBindingUnique(m_entry, m_strlBindings))
|
|
{
|
|
//
|
|
// Restore the old binding
|
|
//
|
|
m_entry = strOldBinding;
|
|
::AfxMessageBox(IDS_ERR_BINDING);
|
|
return;
|
|
}
|
|
|
|
CDialog::OnOK();
|
|
}
|
|
|
|
//
|
|
// Multi-multi-multi list dialog
|
|
//
|
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
CMMMDlg::CMMMDlg(
|
|
IN LPCTSTR lpServerName,
|
|
IN DWORD dwInstance,
|
|
IN CComAuthInfo * pAuthInfo,
|
|
IN LPCTSTR lpMetaPath,
|
|
IN OUT CStringList & strlBindings,
|
|
IN OUT CStringList & strlSecureBindings,
|
|
IN CWnd * pParent OPTIONAL
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Constructor
|
|
|
|
Arguments:
|
|
|
|
CStringList & strlBindings : Service bindings
|
|
CStringList & strlSecureBindings : SSL port bindings
|
|
CWnd * pParent : Optional parent window
|
|
|
|
Return Value:
|
|
|
|
N/A
|
|
|
|
--*/
|
|
: CDialog(CMMMDlg::IDD, pParent),
|
|
m_ListBoxRes(
|
|
IDB_BINDINGS,
|
|
CMMMListBox::nBitmaps
|
|
),
|
|
m_list_Bindings(g_szRegKeyIP, NUM_COLUMNS(g_aIPColumns), g_aIPColumns),
|
|
m_list_SSLBindings(g_szRegKeySSL, NUM_COLUMNS(g_aSSLColumns), g_aSSLColumns),
|
|
m_strlBindings(),
|
|
m_strlSecureBindings(),
|
|
m_strServerName(lpServerName),
|
|
m_strMetaPath(lpMetaPath),
|
|
m_pAuthInfo(pAuthInfo),
|
|
m_fDirty(FALSE)
|
|
{
|
|
//{{AFX_DATA_INIT(CMMMDlg)
|
|
//}}AFX_DATA_INIT
|
|
|
|
m_fCertInstalled = ::IsCertInstalledOnServer(m_pAuthInfo, lpMetaPath),
|
|
m_strlBindings.AddTail(&strlBindings);
|
|
m_strlSecureBindings.AddTail(&strlSecureBindings);
|
|
m_list_Bindings.AttachResources(&m_ListBoxRes);
|
|
m_list_SSLBindings.AttachResources(&m_ListBoxRes);
|
|
}
|
|
|
|
|
|
void
|
|
CMMMDlg::DoDataExchange(
|
|
IN CDataExchange * pDX
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initialise/Store control data
|
|
|
|
Arguments:
|
|
|
|
CDataExchange * pDX - DDX/DDV control structure
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
CDialog::DoDataExchange(pDX);
|
|
//{{AFX_DATA_MAP(CMMMDlg)
|
|
DDX_Control(pDX, IDC_BUTTON_ADD, m_button_Add);
|
|
DDX_Control(pDX, IDC_BUTTON_REMOVE, m_button_Remove);
|
|
DDX_Control(pDX, IDC_BUTTON_EDIT, m_button_Edit);
|
|
DDX_Control(pDX, IDC_BUTTON_ADD_SSL, m_button_AddSSL);
|
|
DDX_Control(pDX, IDC_BUTTON_REMOVE_SSL, m_button_RemoveSSL);
|
|
DDX_Control(pDX, IDC_BUTTON_EDIT_SSL, m_button_EditSSL);
|
|
DDX_Control(pDX, IDOK, m_button_OK);
|
|
//}}AFX_DATA_MAP
|
|
|
|
DDX_Control(pDX, IDC_LIST_MMM, m_list_Bindings);
|
|
DDX_Control(pDX, IDC_LIST_SSL_MMM, m_list_SSLBindings);
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
CMMMDlg::OnItemChanged()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Mark that the dialog as dirty
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
TRUE if the remove button is enabled
|
|
|
|
--*/
|
|
{
|
|
m_fDirty = TRUE;
|
|
|
|
return SetControlStates();
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
CMMMDlg::SetControlStates()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Set the enabled state of the controls depending on the current
|
|
values in the dialog
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
TRUE if the remove button is enabled
|
|
|
|
--*/
|
|
{
|
|
BOOL fSel = m_list_Bindings.GetSelCount() > 0;
|
|
|
|
m_button_Remove.EnableWindow(fSel);
|
|
m_button_Edit.EnableWindow(m_list_Bindings.GetSelCount() == 1);
|
|
m_button_RemoveSSL.EnableWindow(m_list_SSLBindings.GetSelCount() > 0);
|
|
m_button_EditSSL.EnableWindow(m_list_SSLBindings.GetSelCount() == 1);
|
|
|
|
m_button_OK.EnableWindow(m_fDirty && m_list_Bindings.GetCount() > 0);
|
|
|
|
return fSel;
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CMMMDlg::AddBindings(
|
|
IN CMMMListBox & list,
|
|
IN CStringList & strlBindings
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Add bindings information to the specified listbox
|
|
|
|
Arguments:
|
|
|
|
CMMMListBox & list : MMM Listbox (SSL or IP)
|
|
CStringList & strlBindings : SSL or IP bindings
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
for (POSITION pos = strlBindings.GetHeadPosition(); pos != NULL; /**/)
|
|
{
|
|
CString & strBinding = strlBindings.GetNext(pos);
|
|
list.AddItem(strBinding);
|
|
}
|
|
}
|
|
|
|
|
|
//
|
|
// Message Map
|
|
//
|
|
BEGIN_MESSAGE_MAP(CMMMDlg, CDialog)
|
|
//{{AFX_MSG_MAP(CMMMDlg)
|
|
ON_BN_CLICKED(IDC_BUTTON_ADD, OnButtonAdd)
|
|
ON_BN_CLICKED(IDC_BUTTON_EDIT, OnButtonEdit)
|
|
ON_BN_CLICKED(IDC_BUTTON_REMOVE, OnButtonRemove)
|
|
ON_BN_CLICKED(IDC_BUTTON_ADD_SSL, OnButtonAddSsl)
|
|
ON_BN_CLICKED(IDC_BUTTON_EDIT_SSL, OnButtonEditSsl)
|
|
ON_BN_CLICKED(IDC_BUTTON_REMOVE_SSL, OnButtonRemoveSsl)
|
|
ON_LBN_DBLCLK(IDC_LIST_MMM, OnDblclkListMmm)
|
|
ON_LBN_DBLCLK(IDC_LIST_SSL_MMM, OnDblclkListSslMmm)
|
|
ON_LBN_SELCHANGE(IDC_LIST_MMM, OnSelchangeListMmm)
|
|
ON_LBN_SELCHANGE(IDC_LIST_SSL_MMM, OnSelchangeListSslMmm)
|
|
//}}AFX_MSG_MAP
|
|
END_MESSAGE_MAP()
|
|
|
|
//
|
|
// Message Handlers
|
|
//
|
|
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
|
|
|
|
void
|
|
CMMMDlg::OnButtonAdd()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Add button handler
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
//
|
|
// Add entry
|
|
//
|
|
CString strEntry;
|
|
|
|
CMMMEditDlg dlg(
|
|
m_strServerName,
|
|
m_strlBindings,
|
|
m_strlSecureBindings,
|
|
strEntry,
|
|
TRUE, /* IP binding */
|
|
this
|
|
);
|
|
|
|
if (dlg.DoModal() == IDOK)
|
|
{
|
|
POSITION pos = m_strlBindings.AddTail(strEntry);
|
|
int nSel = m_list_Bindings.AddItem(m_strlBindings.GetAt(pos));
|
|
m_list_Bindings.SetCurSel(nSel);
|
|
OnItemChanged();
|
|
}
|
|
}
|
|
|
|
void
|
|
CMMMDlg::OnButtonEdit()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Edit button handler
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
//
|
|
// Edit entry
|
|
//
|
|
int nCurSel = m_list_Bindings.GetCurSel();
|
|
if (nCurSel != LB_ERR)
|
|
{
|
|
CString & strEntry = m_list_Bindings.GetItem(nCurSel);
|
|
CMMMEditDlg dlg(
|
|
m_strServerName,
|
|
m_strlBindings,
|
|
m_strlSecureBindings,
|
|
strEntry,
|
|
TRUE, /* IP binding */
|
|
this
|
|
);
|
|
|
|
if (dlg.DoModal() == IDOK)
|
|
{
|
|
m_list_Bindings.InvalidateSelection(nCurSel);
|
|
OnItemChanged();
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
CMMMDlg::OnButtonRemove()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Remove button handler
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
int nCurSel = m_list_Bindings.GetCurSel();
|
|
int nSel = 0;
|
|
int cChanges = 0;
|
|
while (nSel < m_list_Bindings.GetCount())
|
|
{
|
|
//
|
|
// Remove Selected entry
|
|
//
|
|
if (m_list_Bindings.GetSel(nSel))
|
|
{
|
|
m_strlBindings.RemoveAt(m_strlBindings.FindIndex(nSel));
|
|
m_list_Bindings.DeleteString(nSel);
|
|
++cChanges;
|
|
continue;
|
|
}
|
|
|
|
++nSel;
|
|
}
|
|
|
|
if (cChanges)
|
|
{
|
|
m_list_Bindings.SetCurSel(nCurSel);
|
|
if (!OnItemChanged())
|
|
{
|
|
m_button_Add.SetFocus();
|
|
}
|
|
}
|
|
/*
|
|
//
|
|
// Remove Selected entry
|
|
//
|
|
int nCurSel = m_list_Bindings.GetCurSel();
|
|
if (nCurSel != LB_ERR)
|
|
{
|
|
m_strlBindings.RemoveAt(m_strlBindings.FindIndex(nCurSel));
|
|
m_list_Bindings.DeleteString(nCurSel);
|
|
if (nCurSel >= m_list_Bindings.GetCount())
|
|
{
|
|
--nCurSel;
|
|
}
|
|
m_list_Bindings.SetCurSel(nCurSel);
|
|
|
|
if (!OnItemChanged())
|
|
{
|
|
m_button_Add.SetFocus();
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
|
|
|
|
void
|
|
CMMMDlg::OnDblclkListMmm()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Double click notification handler
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
OnButtonEdit();
|
|
}
|
|
|
|
|
|
void
|
|
CMMMDlg::OnSelchangeListMmm()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
selection change notification handler
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
SetControlStates();
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CMMMDlg::OnButtonAddSsl()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
'Add SSL' button handler
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
//
|
|
// Add entry
|
|
//
|
|
CString strEntry;
|
|
|
|
CMMMEditDlg dlg(
|
|
m_strServerName,
|
|
m_strlSecureBindings,
|
|
m_strlBindings,
|
|
strEntry,
|
|
FALSE, /* SSL binding */
|
|
this
|
|
);
|
|
|
|
if (dlg.DoModal() == IDOK)
|
|
{
|
|
POSITION pos = m_strlSecureBindings.AddTail(strEntry);
|
|
int nSel = m_list_SSLBindings.AddItem(m_strlSecureBindings.GetAt(pos));
|
|
m_list_SSLBindings.SetCurSel(nSel);
|
|
OnItemChanged();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CMMMDlg::OnButtonEditSsl()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
'Edit SSL' button handler
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
//
|
|
// Edit entry
|
|
//
|
|
int nCurSel = m_list_SSLBindings.GetCurSel();
|
|
if (nCurSel != LB_ERR)
|
|
{
|
|
CString & strEntry = m_list_SSLBindings.GetItem(nCurSel);
|
|
CMMMEditDlg dlg(
|
|
m_strServerName,
|
|
m_strlSecureBindings,
|
|
m_strlBindings,
|
|
strEntry,
|
|
FALSE, /* SSL binding */
|
|
this
|
|
);
|
|
|
|
if (dlg.DoModal() == IDOK)
|
|
{
|
|
m_list_SSLBindings.InvalidateSelection(nCurSel);
|
|
OnItemChanged();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CMMMDlg::OnButtonRemoveSsl()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
'Remove SSL' button handler
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
int nCurSel = m_list_SSLBindings.GetCurSel();
|
|
int nSel = 0;
|
|
int cChanges = 0;
|
|
while (nSel < m_list_SSLBindings.GetCount())
|
|
{
|
|
//
|
|
// Remove Selected entry
|
|
//
|
|
if (m_list_SSLBindings.GetSel(nSel))
|
|
{
|
|
m_strlSecureBindings.RemoveAt(m_strlSecureBindings.FindIndex(nSel));
|
|
m_list_SSLBindings.DeleteString(nSel);
|
|
++cChanges;
|
|
continue;
|
|
}
|
|
|
|
++nSel;
|
|
}
|
|
|
|
if (cChanges)
|
|
{
|
|
m_list_SSLBindings.SetCurSel(nCurSel);
|
|
OnItemChanged();
|
|
if (m_list_SSLBindings.GetSelCount() == 0)
|
|
{
|
|
//
|
|
// Remove will be disabled
|
|
//
|
|
m_button_AddSSL.SetFocus();
|
|
}
|
|
}
|
|
|
|
/*
|
|
//
|
|
// Remove Selected entry
|
|
//
|
|
int nCurSel = m_list_SSLBindings.GetCurSel();
|
|
if (nCurSel != LB_ERR)
|
|
{
|
|
m_strlSecureBindings.RemoveAt(m_strlSecureBindings.FindIndex(nCurSel));
|
|
m_list_SSLBindings.DeleteString(nCurSel);
|
|
if (nCurSel >= m_list_SSLBindings.GetCount())
|
|
{
|
|
--nCurSel;
|
|
}
|
|
m_list_SSLBindings.SetCurSel(nCurSel);
|
|
|
|
OnItemChanged();
|
|
if (m_list_SSLBindings.GetCurSel() == LB_ERR)
|
|
{
|
|
//
|
|
// Remove will be disabled
|
|
//
|
|
m_button_AddSSL.SetFocus();
|
|
}
|
|
}
|
|
*/
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CMMMDlg::OnDblclkListSslMmm()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
SSL List 'double click' handler
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
OnButtonEditSsl();
|
|
}
|
|
|
|
|
|
|
|
void
|
|
CMMMDlg::OnSelchangeListSslMmm()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
SSL List 'selection change' handler
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
{
|
|
SetControlStates();
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
CMMMDlg::OnInitDialog()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
WM_INITDIALOG handler. Initialize the dialog.
|
|
|
|
Arguments:
|
|
|
|
None.
|
|
|
|
Return Value:
|
|
|
|
TRUE if focus is to be set automatically, FALSE if the focus
|
|
is already set.
|
|
|
|
--*/
|
|
{
|
|
CDialog::OnInitDialog();
|
|
|
|
m_list_Bindings.Initialize();
|
|
m_list_SSLBindings.Initialize();
|
|
|
|
AddBindings(m_list_Bindings, m_strlBindings);
|
|
AddBindings(m_list_SSLBindings, m_strlSecureBindings);
|
|
|
|
//
|
|
// No certificates, no SSL
|
|
//
|
|
GetDlgItem(IDC_GROUP_SSL)->EnableWindow(m_fCertInstalled);
|
|
m_list_SSLBindings.EnableWindow(m_fCertInstalled);
|
|
m_button_AddSSL.EnableWindow(m_fCertInstalled);
|
|
m_button_RemoveSSL.EnableWindow(m_fCertInstalled);
|
|
m_button_EditSSL.EnableWindow(m_fCertInstalled);
|
|
|
|
SetControlStates();
|
|
|
|
return TRUE;
|
|
}
|