mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
661 lines
16 KiB
661 lines
16 KiB
#include "pch.h"
|
|
#pragma hdrstop
|
|
|
|
#include "const.h"
|
|
#include "resource.h"
|
|
#include "button.h"
|
|
#include "odb.h"
|
|
#include "resource.h"
|
|
|
|
#include "ipctrl.h"
|
|
#include "tcpsht.h"
|
|
#include "tcphelp.h"
|
|
|
|
extern LPCTSTR lpszHelpFile;
|
|
|
|
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
|
|
{
|
|
unsigned long a = (unsigned long)lParam1;
|
|
unsigned long b = (unsigned long)lParam2;
|
|
|
|
if (a < b)
|
|
return -1;
|
|
|
|
return a != b;
|
|
}
|
|
|
|
|
|
CSecurityDialog::CSecurityDialog(CAdvancedDialog* pParent, ADAPTER_INFO* pAdapter, GLOBAL_INFO* pGlobal, CTcpSheet* pSheet, int nIndex)
|
|
{
|
|
ASSERT(pAdapter != NULL);
|
|
ASSERT(pGlobal != NULL);
|
|
ASSERT(nIndex != CB_ERR);
|
|
ASSERT(pSheet != NULL);
|
|
ASSERT(pParent != NULL);
|
|
|
|
m_pAdapterInfo = pAdapter;
|
|
m_pGlobalInfo = pGlobal;
|
|
m_nCurrentSelection = nIndex;
|
|
m_pSheet = pSheet;
|
|
m_pParent = pParent;
|
|
m_bModified = FALSE;
|
|
}
|
|
|
|
CSecurityDialog::~CSecurityDialog()
|
|
{
|
|
}
|
|
|
|
BOOL CSecurityDialog::OnInitDialog()
|
|
{
|
|
HWND hDlg = *this;
|
|
|
|
VERIFY(m_Tcp.Create(*this, IDC_SECURITY_TCP, LVS_NOSORTHEADER |
|
|
LVS_REPORT |
|
|
LVS_SINGLESEL |
|
|
LVS_SHOWSELALWAYS));
|
|
|
|
VERIFY(m_Udp.Create(*this, IDC_SECURITY_UDP, LVS_NOSORTHEADER |
|
|
LVS_REPORT |
|
|
LVS_SINGLESEL |
|
|
LVS_SHOWSELALWAYS));
|
|
|
|
VERIFY(m_Ip.Create(*this, IDC_SECURITY_IP, LVS_NOSORTHEADER |
|
|
LVS_REPORT |
|
|
LVS_SINGLESEL |
|
|
LVS_SHOWSELALWAYS));
|
|
|
|
// Label columns in the listviews
|
|
String textA, textB, textC;
|
|
textA.LoadString(hTcpCfgInstance, IDS_SECURITY_TCP_LABEL);
|
|
textB.LoadString(hTcpCfgInstance, IDS_SECURITY_UDP_LABEL);
|
|
textC.LoadString(hTcpCfgInstance, IDS_SECURITY_IP_LABEL);
|
|
|
|
m_Tcp.InsertColumn(0, textA);
|
|
m_Udp.InsertColumn(0, textB);
|
|
m_Ip.InsertColumn(0, textC);
|
|
|
|
// Set HWNDs and make the line control visible
|
|
m_hCardCombo = GetDlgItem(hDlg, IDC_SECURITY_CARD);
|
|
|
|
InitDialog();
|
|
SetButtons();
|
|
SetInfo();
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CSecurityDialog::InitDialog()
|
|
{
|
|
BOOL bResult = TRUE;
|
|
ASSERT(m_pGlobalInfo != NULL);
|
|
ASSERT(IsWindow(m_hCardCombo));
|
|
|
|
int numCards = m_pGlobalInfo->nNumCard;
|
|
|
|
ASSERT(m_pSheet != NULL);
|
|
|
|
// copy local version of the adapter info.
|
|
for (int i=0; i < numCards; i++)
|
|
m_pAdapterInfo[i] = m_pParent->m_pAdapterInfo[i];
|
|
|
|
if (m_hCardCombo)
|
|
{
|
|
// add the cards to the list and select the first one
|
|
for (int i = 0; i < numCards; i++)
|
|
SendMessage(m_hCardCombo, CB_ADDSTRING, 0, (LPARAM)((LPCTSTR)m_pAdapterInfo[i].nlsTitle));
|
|
|
|
if (i)
|
|
{
|
|
ASSERT(m_nCurrentSelection != -1);
|
|
ASSERT(m_nCurrentSelection >=0 && m_nCurrentSelection < numCards);
|
|
|
|
// select the same card as the IP Address page
|
|
if (m_nCurrentSelection != -1)
|
|
SendMessage(m_hCardCombo, CB_SETCURSEL, m_nCurrentSelection, 0);
|
|
|
|
SetFocus(m_hCardCombo);
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CSecurityDialog::OnCommand(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
BOOL bResult = TRUE;
|
|
WORD notifyCode = HIWORD(wParam);
|
|
WORD nID = LOWORD(wParam);
|
|
|
|
if (!notifyCode)
|
|
{
|
|
switch(wParam)
|
|
{
|
|
case IDOK:
|
|
OnOk();
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
OnCancel();
|
|
break;
|
|
|
|
case IDC_SECURITY_FILTER_IP:
|
|
case IDC_SECURITY_FILTER_IP_SEL:
|
|
m_bModified = TRUE;
|
|
EnableGroup(wParam, !IsDlgButtonChecked(*this, IDC_SECURITY_FILTER_IP));
|
|
SetButtons();
|
|
break;
|
|
|
|
case IDC_SECURITY_FILTER_TCP:
|
|
case IDC_SECURITY_FILTER_TCP_SEL:
|
|
m_bModified = TRUE;
|
|
EnableGroup(wParam, !IsDlgButtonChecked(*this, IDC_SECURITY_FILTER_TCP));
|
|
SetButtons();
|
|
break;
|
|
|
|
case IDC_SECURITY_FILTER_UDP:
|
|
case IDC_SECURITY_FILTER_UDP_SEL:
|
|
m_bModified = TRUE;
|
|
EnableGroup(wParam, !IsDlgButtonChecked(*this, IDC_SECURITY_FILTER_UDP));
|
|
SetButtons();
|
|
break;
|
|
|
|
case IDC_SECURITY_TCP_ADD:
|
|
case IDC_SECURITY_UDP_ADD:
|
|
case IDC_SECURITY_IP_ADD:
|
|
OnAdd(nID);
|
|
break;
|
|
|
|
case IDC_SECURITY_TCP_REMOVE:
|
|
case IDC_SECURITY_UDP_REMOVE:
|
|
case IDC_SECURITY_IP_REMOVE:
|
|
OnRemove(nID);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
else // notify code
|
|
{
|
|
switch(notifyCode)
|
|
{
|
|
case CBN_SELCHANGE:
|
|
if (nID == IDC_SECURITY_CARD)
|
|
OnAdapterCard();
|
|
break;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
void CSecurityDialog::OnCancel()
|
|
{
|
|
m_bModified = FALSE;
|
|
CDialog::OnCancel();
|
|
}
|
|
|
|
void CSecurityDialog::OnOk()
|
|
{
|
|
UpdateInfo();
|
|
CDialog::OnOk();
|
|
}
|
|
|
|
void CSecurityDialog::UpdateInfo()
|
|
{
|
|
HWND hDlg = *this;
|
|
|
|
ASSERT(m_oldCard.QueryTextLength() != 0);
|
|
ASSERT(IsWindow(m_hCardCombo));
|
|
|
|
// get all the data from the listviews and save it in the adapter
|
|
if (m_hCardCombo)
|
|
{
|
|
int i = SendMessage(m_hCardCombo, CB_FINDSTRINGEXACT, (WPARAM)-1,
|
|
(LPARAM)((LPCTSTR)m_oldCard));
|
|
|
|
if (i == CB_ERR)
|
|
return;
|
|
|
|
ASSERT(m_oldCard.strcmp(m_pAdapterInfo[i].nlsTitle) == 0);
|
|
|
|
|
|
m_pAdapterInfo[i].m_strListTcp.Clear();
|
|
m_pAdapterInfo[i].m_strListUdp.Clear();
|
|
m_pAdapterInfo[i].m_strListIp.Clear();
|
|
|
|
CListView* list[3];
|
|
STRLIST* pstrList[3];
|
|
int id[3] = {IDC_SECURITY_FILTER_TCP, IDC_SECURITY_FILTER_UDP, IDC_SECURITY_FILTER_IP};
|
|
|
|
// Initialize values
|
|
list[0] = &m_Tcp; list[1] = &m_Udp; list[2] = &m_Ip;
|
|
pstrList[0] = &m_pAdapterInfo[i].m_strListTcp;
|
|
pstrList[1] = &m_pAdapterInfo[i].m_strListUdp;
|
|
pstrList[2] = &m_pAdapterInfo[i].m_strListIp;
|
|
|
|
for (int x=0; x < 3; x++)
|
|
{
|
|
int nlvCount = list[x]->GetItemCount();
|
|
NLS_STR * Port;
|
|
|
|
// "" (Empty String) == All ports
|
|
// "0" == No ports
|
|
// "x y z" == ports x, y, x
|
|
|
|
// if the All Filter button is checked, use Empty String
|
|
if (IsDlgButtonChecked(hDlg, id[x]))
|
|
{
|
|
Port = new NLS_STR(_T("0"));
|
|
pstrList[x]->Append(Port);
|
|
continue;
|
|
}
|
|
|
|
if (nlvCount == 0)
|
|
{
|
|
Port = new NLS_STR(_T(""));
|
|
pstrList[x]->Append(Port);
|
|
continue;
|
|
}
|
|
|
|
LV_ITEM lvi;
|
|
lvi.mask = LVIF_PARAM;
|
|
lvi.iSubItem = 0;
|
|
|
|
for (int j=0; j< nlvCount; j++)
|
|
{
|
|
TCHAR buf[16];
|
|
|
|
lvi.iItem = j;
|
|
ListView_GetItem(*list[x], &lvi);
|
|
|
|
ASSERT(lvi.lParam != 0);
|
|
_itow((int)lvi.lParam, buf, 10);
|
|
Port = new NLS_STR(buf);
|
|
pstrList[x]->Append(Port);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
void CSecurityDialog::SetInfo()
|
|
{
|
|
HWND hDlg = *this;
|
|
int id[3] = {IDC_SECURITY_FILTER_TCP, IDC_SECURITY_FILTER_UDP, IDC_SECURITY_FILTER_IP};
|
|
int id_sel[3] = {IDC_SECURITY_FILTER_TCP_SEL, IDC_SECURITY_FILTER_UDP_SEL, IDC_SECURITY_FILTER_IP_SEL};
|
|
CListView* list[3];
|
|
STRLIST* pstrList[3];
|
|
|
|
list[0] = &m_Tcp;
|
|
list[1] = &m_Udp;
|
|
list[2] = &m_Ip;
|
|
|
|
// Find which adapter we are changing to and update the listbox controls
|
|
m_Tcp.DeleteAllItems();
|
|
m_Udp.DeleteAllItems();
|
|
m_Ip.DeleteAllItems();
|
|
|
|
if (m_hCardCombo)
|
|
{
|
|
TCHAR adapter[256];
|
|
|
|
int i = GetCurrentAdapterIndex();
|
|
|
|
if (i == -1)
|
|
return;
|
|
|
|
// save of the adapter so we can later update it's IP list after the combo selection has changed
|
|
GetWindowText(m_hCardCombo, adapter, _countof(adapter));
|
|
m_oldCard = adapter;
|
|
|
|
pstrList[0] = &m_pAdapterInfo[i].m_strListTcp;
|
|
pstrList[1] = &m_pAdapterInfo[i].m_strListUdp;
|
|
pstrList[2] = &m_pAdapterInfo[i].m_strListIp;
|
|
int item;
|
|
|
|
for (int x = 0; x < 3; x++)
|
|
{
|
|
ITER_STRLIST itr(*pstrList[x]);
|
|
|
|
item=0;
|
|
NLS_STR * pstr;
|
|
|
|
pstr = itr.Next();
|
|
|
|
ASSERT(pstr != NULL);
|
|
|
|
while (pstr != NULL)
|
|
{
|
|
if (pstr->strcmp(_T("0")) == 0)
|
|
{
|
|
EnableGroup(id[x], FALSE);
|
|
CheckRadioButton(hDlg, id[x], id_sel[x], id[x]);
|
|
break;
|
|
}
|
|
|
|
EnableGroup(id[x], TRUE);
|
|
CheckRadioButton(hDlg, id[x], id_sel[x], id_sel[x]);
|
|
|
|
if (pstr->strcmp(_T("")) == 0)
|
|
break;
|
|
|
|
LPTSTR p;
|
|
unsigned long num = _tcstoul(pstr->QueryPch(), &p, 10);
|
|
|
|
list[x]->InsertItem(item, 0, *pstr, (void*)num);
|
|
list[x]->SetItemState(item, (LVIS_SELECTED | LVIS_FOCUSED), (LVIS_SELECTED | LVIS_FOCUSED));
|
|
++item;
|
|
pstr = itr.Next();
|
|
}
|
|
ListView_SortItems(*list[x], CompareFunc, 0);
|
|
}
|
|
|
|
// Update the RemoveButtons
|
|
SetButtons();
|
|
}
|
|
}
|
|
|
|
void CSecurityDialog::EnableGroup(int nID, BOOL state)
|
|
{
|
|
int add;
|
|
int remove;
|
|
int list;
|
|
|
|
switch (nID)
|
|
{
|
|
case IDC_SECURITY_FILTER_TCP:
|
|
case IDC_SECURITY_FILTER_TCP_SEL:
|
|
add = IDC_SECURITY_TCP_ADD;
|
|
remove = IDC_SECURITY_TCP_REMOVE;
|
|
list = IDC_SECURITY_TCP;
|
|
break;
|
|
|
|
case IDC_SECURITY_FILTER_UDP:
|
|
case IDC_SECURITY_FILTER_UDP_SEL:
|
|
add = IDC_SECURITY_UDP_ADD;
|
|
remove = IDC_SECURITY_UDP_REMOVE;
|
|
list = IDC_SECURITY_UDP;
|
|
break;
|
|
|
|
case IDC_SECURITY_FILTER_IP:
|
|
case IDC_SECURITY_FILTER_IP_SEL:
|
|
add = IDC_SECURITY_IP_ADD;
|
|
remove = IDC_SECURITY_IP_REMOVE;
|
|
list = IDC_SECURITY_IP;
|
|
break;
|
|
|
|
default:
|
|
ASSERT(FALSE);
|
|
break;
|
|
}
|
|
|
|
HWND hDlg = *this;
|
|
EnableWindow(GetDlgItem(hDlg, add), state);
|
|
EnableWindow(GetDlgItem(hDlg, remove), state);
|
|
EnableWindow(GetDlgItem(hDlg, list), state);
|
|
}
|
|
|
|
BOOL CSecurityDialog::OnKillFocus(HWND hWnd)
|
|
{
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
void CSecurityDialog::SetButtons()
|
|
{
|
|
HWND hDlg = *this;
|
|
|
|
// look at each listbox and update the remove button
|
|
EnableWindow(GetDlgItem(hDlg, IDC_SECURITY_TCP_REMOVE), (m_Tcp.GetItemCount() && !IsDlgButtonChecked(hDlg, IDC_SECURITY_FILTER_TCP)));
|
|
EnableWindow(GetDlgItem(hDlg, IDC_SECURITY_UDP_REMOVE), (m_Udp.GetItemCount() && !IsDlgButtonChecked(hDlg, IDC_SECURITY_FILTER_UDP)));
|
|
EnableWindow(GetDlgItem(hDlg, IDC_SECURITY_IP_REMOVE), (m_Ip.GetItemCount() && !IsDlgButtonChecked(hDlg, IDC_SECURITY_FILTER_IP)));
|
|
}
|
|
|
|
void CSecurityDialog::OnAdapterCard()
|
|
{
|
|
// save the current adapters information
|
|
UpdateInfo();
|
|
|
|
// Load in the new adapters info and set the remove button states
|
|
SetInfo();
|
|
SetButtons();
|
|
}
|
|
|
|
BOOL CSecurityDialog::OnAdd(int ID)
|
|
{
|
|
CAddSecurity dlg(this, ID);
|
|
|
|
dlg.Create(*this, hTcpCfgInstance, IDD_SECURITY_ADD, lpszHelpFile, (DWORD*)&a129HelpIDs[0]);
|
|
|
|
if (dlg.DoModal() == IDOK)
|
|
m_bModified = TRUE;
|
|
|
|
SetButtons();
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CSecurityDialog::OnRemove(int ID)
|
|
{
|
|
CListView* list;
|
|
HWND hAdd;
|
|
|
|
switch (ID)
|
|
{
|
|
case IDC_SECURITY_TCP_REMOVE:
|
|
list = &m_Tcp;
|
|
hAdd = GetDlgItem(*this, IDC_SECURITY_TCP_ADD);
|
|
break;
|
|
|
|
case IDC_SECURITY_UDP_REMOVE:
|
|
list = &m_Udp;
|
|
hAdd = GetDlgItem(*this, IDC_SECURITY_UDP_ADD);
|
|
break;
|
|
|
|
case IDC_SECURITY_IP_REMOVE:
|
|
list = &m_Ip;
|
|
hAdd = GetDlgItem(*this, IDC_SECURITY_IP_ADD);
|
|
break;
|
|
|
|
default:
|
|
ASSERT(FALSE);
|
|
break;
|
|
}
|
|
|
|
// see if an item is selected
|
|
int i = list->GetNextItem(-1, LVNI_SELECTED);
|
|
|
|
if (i == -1)
|
|
{
|
|
m_pSheet->MessageBox(IDS_SECURITY_ITEM_NOT_SELECTED);
|
|
return TRUE;
|
|
}
|
|
|
|
// remove the item and make item 0 selected
|
|
list->DeleteItem(i);
|
|
i = list->GetItemCount();
|
|
|
|
m_bModified = TRUE;
|
|
if (i)
|
|
{
|
|
list->SetItemState(0, LVIS_SELECTED, LVIS_SELECTED);
|
|
}
|
|
else // Force focus to the Add button
|
|
{
|
|
VERIFY(IsWindow(SetFocus(hAdd)));
|
|
}
|
|
|
|
SetButtons();
|
|
return TRUE;
|
|
}
|
|
|
|
int CSecurityDialog::GetCurrentAdapterIndex()
|
|
{
|
|
TCHAR adapter[256];
|
|
int i;
|
|
|
|
ASSERT(m_hCardCombo);
|
|
ASSERT(m_pSheet != NULL);
|
|
|
|
GetWindowText(m_hCardCombo, adapter, _countof(adapter));
|
|
i = SendMessage(m_hCardCombo, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)adapter);
|
|
|
|
ASSERT(i != CB_ERR);
|
|
ASSERT(m_pSheet->m_pAdapterInfo[i].nlsTitle.strcmp(adapter) == 0);
|
|
|
|
return ((i != CB_ERR) ? i : -1);
|
|
}
|
|
|
|
CAddSecurity::CAddSecurity(CSecurityDialog* pParent, int ID)
|
|
{
|
|
ASSERT(pParent != NULL);
|
|
ASSERT(ID != 0);
|
|
|
|
m_pParent = pParent;
|
|
m_nID = ID;
|
|
m_Rel = NULL;
|
|
}
|
|
|
|
CAddSecurity::~CAddSecurity()
|
|
{
|
|
}
|
|
|
|
BOOL CAddSecurity::OnInitDialog()
|
|
{
|
|
String text;
|
|
int nTextID;
|
|
|
|
ASSERT(m_pParent != NULL);
|
|
|
|
// Position the dialog
|
|
RECT rect;
|
|
switch (m_nID)
|
|
{
|
|
case IDC_SECURITY_TCP_ADD:
|
|
m_Rel = &m_pParent->m_Tcp;
|
|
nTextID = IDS_SECURITY_TCP_TEXT;
|
|
break;
|
|
|
|
case IDC_SECURITY_UDP_ADD:
|
|
m_Rel = &m_pParent->m_Udp;
|
|
nTextID = IDS_SECURITY_UDP_TEXT;
|
|
break;
|
|
|
|
case IDC_SECURITY_IP_ADD:
|
|
m_Rel = &m_pParent->m_Ip;
|
|
nTextID = IDS_SECURITY_IP_TEXT;
|
|
break;
|
|
|
|
default:
|
|
ASSERT(FALSE);
|
|
break;
|
|
}
|
|
|
|
ASSERT(IsWindow(*m_Rel));
|
|
HWND hDlg = *this;
|
|
|
|
if (IsWindow(*m_Rel))
|
|
{
|
|
GetWindowRect(*m_Rel, &rect);
|
|
SetWindowPos(hDlg, NULL, rect.left, rect.top-8, 0,0,
|
|
SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE);
|
|
}
|
|
|
|
// Set the static text and limit the edit control to 5 characters
|
|
text.LoadString(hTcpCfgInstance, nTextID);
|
|
SetDlgItemText(hDlg, IDC_SECURITY_TEXT, text);
|
|
SendDlgItemMessage(hDlg, IDC_SECURITY_ADD_EDIT, EM_SETLIMITTEXT, SECURITY_ADD_LIMIT, 0);
|
|
EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CAddSecurity::OnCommand(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
BOOL bResult = TRUE;
|
|
WORD notifyCode = HIWORD(wParam);
|
|
WORD nID = LOWORD(wParam);
|
|
|
|
if (!notifyCode)
|
|
{
|
|
switch(wParam)
|
|
{
|
|
case IDOK:
|
|
OnOk();
|
|
break;
|
|
|
|
case IDCANCEL:
|
|
OnCancel();
|
|
break;
|
|
|
|
default:
|
|
CDialog::OnCommand(wParam, lParam);
|
|
break;
|
|
}
|
|
}
|
|
else // notify code
|
|
{
|
|
switch(notifyCode)
|
|
{
|
|
case EN_CHANGE:
|
|
EnableWindow(GetDlgItem(*this, IDOK), Edit_LineLength((HWND)lParam, -1));
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
return bResult;
|
|
}
|
|
|
|
void CAddSecurity::OnOk()
|
|
{
|
|
data[0] = 0;
|
|
GetWindowText(GetDlgItem(*this, IDC_SECURITY_ADD_EDIT), data, SECURITY_ADD_LIMIT+1);
|
|
|
|
// Validate the number
|
|
LPCTSTR lpszDec = _T("0123456789");
|
|
if (_tcsspn(data, lpszDec) != _tcslen(data))
|
|
{
|
|
(m_pParent->m_pSheet)->MessageBox(IDS_SECURITY_INVALID_DIGIT);
|
|
return ;
|
|
}
|
|
|
|
ASSERT(IsWindow(*m_Rel));
|
|
|
|
// check the range of the number
|
|
LPTSTR pStr;
|
|
unsigned long num = _tcstoul(data, &pStr, 10);
|
|
unsigned long maxNum = 65535;
|
|
int nID = IDS_SECURITY_RANGE_WORD;
|
|
|
|
if (m_Rel == &m_pParent->m_Ip)
|
|
{
|
|
maxNum = 255;
|
|
nID = IDS_SECURITY_RANGE_BYTE;
|
|
}
|
|
|
|
if (num < 1 || num > maxNum)
|
|
{
|
|
(m_pParent->m_pSheet)->MessageBox(nID);
|
|
return ;
|
|
}
|
|
|
|
// See if the item is in the list
|
|
LV_FINDINFO info;
|
|
info.flags = LVFI_PARAM;
|
|
info.lParam = num;
|
|
int i = ListView_FindItem(*m_Rel, -1, &info);
|
|
|
|
if (i != -1)
|
|
{
|
|
(m_pParent->m_pSheet)->MessageBox(IDS_SECURITY_ITEM_IN_LIST);
|
|
return ;
|
|
}
|
|
|
|
i = m_Rel->InsertItem(m_Rel->GetItemCount(), 0, data, (void*)num);
|
|
ListView_SortItems(*m_Rel, CompareFunc, 0);
|
|
|
|
if (i != -1)
|
|
m_Rel->SetItemState(i, (LVIS_SELECTED | LVIS_FOCUSED), (LVIS_SELECTED | LVIS_FOCUSED));
|
|
|
|
CDialog::OnOk();
|
|
}
|
|
|