484 lines
12 KiB
C++
484 lines
12 KiB
C++
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1997.
|
||
|
//
|
||
|
// File: A L A N E P S H . C P P
|
||
|
//
|
||
|
// Contents: Dialog box handling for the ATM LAN Emulation configuration.
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
// Author: v-lcleet 08/10/1997
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#include "pch.h"
|
||
|
#pragma hdrstop
|
||
|
#include "alaneobj.h"
|
||
|
#include "alanepsh.h"
|
||
|
#include "alanehlp.h"
|
||
|
|
||
|
#include "ncatlui.h"
|
||
|
#include <stlalgor.h>
|
||
|
|
||
|
//
|
||
|
// CALanePsh
|
||
|
//
|
||
|
// Constructor/Destructor methods
|
||
|
//
|
||
|
CALanePsh::CALanePsh(CALaneCfg* palcfg, CALaneCfgAdapterInfo * pAdapterInfo,
|
||
|
const DWORD * adwHelpIDs)
|
||
|
{
|
||
|
AssertSz(palcfg, "We don't have a CALaneCfg*");
|
||
|
AssertSz(pAdapterInfo, "We don't have a CALaneCfgAdapterInfo *");
|
||
|
|
||
|
m_palcfg = palcfg;
|
||
|
m_pAdapterInfo = pAdapterInfo;
|
||
|
|
||
|
m_adwHelpIDs = adwHelpIDs;
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
CALanePsh::~CALanePsh(VOID)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
LRESULT CALanePsh::OnInitDialog(UINT uMsg, WPARAM wParam,
|
||
|
LPARAM lParam, BOOL& bHandled)
|
||
|
{
|
||
|
ATMLANE_ADAPTER_INFO_LIST::iterator iterLstAdapters;
|
||
|
m_fEditState = FALSE;
|
||
|
|
||
|
// Get the Add ELAN button text
|
||
|
WCHAR szAddElan[16] = {0};
|
||
|
GetDlgItemText(IDC_ELAN_ADD, szAddElan, celems(szAddElan));
|
||
|
szAddElan[lstrlenW(szAddElan) - 3]; // remove ampersand
|
||
|
|
||
|
m_strAddElan = szAddElan;
|
||
|
|
||
|
// get hwnd to the adapter and elan list
|
||
|
// m_hAdapterList = GetDlgItem(IDC_ADAPTER_LIST);
|
||
|
m_hElanList = GetDlgItem(IDC_ELAN_LIST);
|
||
|
|
||
|
// get hwnd to the three buttons
|
||
|
m_hbtnAdd = GetDlgItem(IDC_ELAN_ADD);
|
||
|
m_hbtnEdit = GetDlgItem(IDC_ELAN_EDIT);
|
||
|
m_hbtnRemove = GetDlgItem(IDC_ELAN_REMOVE);
|
||
|
|
||
|
// fill in adapter list
|
||
|
SendAdapterInfo();
|
||
|
|
||
|
// fill in elan list
|
||
|
SendElanInfo();
|
||
|
|
||
|
// set the state of the buttons
|
||
|
SetButtons();
|
||
|
|
||
|
SetChangedFlag();
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CALanePsh::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled)
|
||
|
{
|
||
|
ShowContextHelp(m_hWnd, HELP_CONTEXTMENU, m_adwHelpIDs);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CALanePsh::OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled)
|
||
|
{
|
||
|
LPHELPINFO lphi = reinterpret_cast<LPHELPINFO>(lParam);
|
||
|
Assert(lphi);
|
||
|
|
||
|
if (HELPINFO_WINDOW == lphi->iContextType)
|
||
|
{
|
||
|
ShowContextHelp(static_cast<HWND>(lphi->hItemHandle), HELP_WM_HELP,
|
||
|
m_adwHelpIDs);
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CALanePsh::OnKillActive(int idCtrl, LPNMHDR pnmh, BOOL& fHandled)
|
||
|
{
|
||
|
BOOL err = FALSE; // Allow page to lose active status
|
||
|
|
||
|
// Check duplicate Elan names on the same ATM adapter
|
||
|
int iDupElanName = CheckDupElanName();
|
||
|
|
||
|
if (iDupElanName >=0)
|
||
|
{
|
||
|
NcMsgBox(m_hWnd, IDS_MSFT_LANE_TEXT, IDS_DUPLICATE_ELANNAME,
|
||
|
MB_APPLMODAL | MB_ICONEXCLAMATION | MB_OK);
|
||
|
|
||
|
err = TRUE;
|
||
|
}
|
||
|
|
||
|
::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, err);
|
||
|
|
||
|
return err;
|
||
|
}
|
||
|
|
||
|
int CALanePsh::CheckDupElanName()
|
||
|
{
|
||
|
int ret = -1;
|
||
|
int idx = 0;
|
||
|
|
||
|
for(ELAN_INFO_LIST::iterator iterElan = m_pAdapterInfo->m_lstElans.begin();
|
||
|
iterElan != m_pAdapterInfo->m_lstElans.end();
|
||
|
iterElan++)
|
||
|
{
|
||
|
// skip deleted ones
|
||
|
if (!(*iterElan)->m_fDeleted)
|
||
|
{
|
||
|
ELAN_INFO_LIST::iterator iterElanComp = iterElan;
|
||
|
|
||
|
iterElanComp++;
|
||
|
while (iterElanComp != m_pAdapterInfo->m_lstElans.end())
|
||
|
{
|
||
|
if (!(*iterElanComp)->m_fDeleted)
|
||
|
{
|
||
|
if (!lstrcmpW( ((*iterElan)->SzGetElanName()),
|
||
|
((*iterElanComp)->SzGetElanName())))
|
||
|
{
|
||
|
// we find a duplicate name
|
||
|
ret = idx;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
iterElanComp++;
|
||
|
}
|
||
|
|
||
|
// duplicate name found
|
||
|
if (ret >=0 )
|
||
|
break;
|
||
|
|
||
|
// move next
|
||
|
idx ++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
LRESULT CALanePsh::OnAdd(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& bHandled)
|
||
|
{
|
||
|
CALaneCfgElanInfo * pElanInfo = NULL;
|
||
|
CElanPropertiesDialog * pDlgProp = NULL;
|
||
|
|
||
|
m_fEditState = FALSE;
|
||
|
|
||
|
// create a new ELAN info object
|
||
|
pElanInfo = new CALaneCfgElanInfo;
|
||
|
|
||
|
// create the dialog object, passing in the new ELAN info ptr
|
||
|
pDlgProp = new CElanPropertiesDialog(this, pElanInfo, g_aHelpIDs_IDD_ELAN_PROPERTIES);
|
||
|
|
||
|
if (pElanInfo && pDlgProp)
|
||
|
{
|
||
|
// see if user hit ADD
|
||
|
if (pDlgProp->DoModal() == IDOK)
|
||
|
{
|
||
|
// Push the Elan onto the the adapter's list
|
||
|
m_pAdapterInfo->m_lstElans.push_back(pElanInfo);
|
||
|
|
||
|
// Mark it so miniport gets created if user hits OK/APPLY
|
||
|
pElanInfo->m_fCreateMiniportOnPropertyApply = TRUE;
|
||
|
pElanInfo = NULL; // don't let cleanup delete it
|
||
|
|
||
|
// refresh the ELAN list
|
||
|
SendElanInfo();
|
||
|
|
||
|
// set the state of the buttons
|
||
|
SetButtons();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// release objects as needed
|
||
|
if (pElanInfo)
|
||
|
delete pElanInfo;
|
||
|
if (pDlgProp)
|
||
|
delete pDlgProp;
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CALanePsh::OnEdit(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& bHandled)
|
||
|
{
|
||
|
CALaneCfgElanInfo * pElanInfo;
|
||
|
int idx;
|
||
|
|
||
|
m_fEditState = TRUE;
|
||
|
|
||
|
// get index of current ELAN selection
|
||
|
idx = (int) ::SendMessage(m_hElanList, LB_GETCURSEL, 0, 0);
|
||
|
Assert(idx >= 0);
|
||
|
|
||
|
// get the ElanInfo pointer from the current selection
|
||
|
pElanInfo = (CALaneCfgElanInfo *)::SendMessage(m_hElanList,
|
||
|
LB_GETITEMDATA, idx, 0L);
|
||
|
|
||
|
// create the dialog, passing in the ELAN info ptr
|
||
|
CElanPropertiesDialog * pDlgProp = new CElanPropertiesDialog(this, pElanInfo,
|
||
|
g_aHelpIDs_IDD_ELAN_PROPERTIES);
|
||
|
|
||
|
if (pDlgProp->DoModal() == IDOK)
|
||
|
{
|
||
|
// refresh the ELAN list
|
||
|
SendElanInfo();
|
||
|
}
|
||
|
|
||
|
delete pDlgProp;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
LRESULT CALanePsh::OnRemove(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& bHandled)
|
||
|
{
|
||
|
CALaneCfgElanInfo * pElanInfo;
|
||
|
int idx;
|
||
|
|
||
|
// get index of current ELAN selection
|
||
|
idx = (int) ::SendMessage(m_hElanList, LB_GETCURSEL, 0, 0);
|
||
|
Assert(idx >= 0);
|
||
|
|
||
|
// get the ElanInfo pointer from the current selection
|
||
|
pElanInfo = (CALaneCfgElanInfo *)::SendMessage(m_hElanList,
|
||
|
LB_GETITEMDATA, idx, 0L);
|
||
|
|
||
|
// mark as deleted
|
||
|
pElanInfo->m_fDeleted = TRUE;
|
||
|
pElanInfo->m_fRemoveMiniportOnPropertyApply = TRUE;
|
||
|
|
||
|
// RAID 31445: ATM: AssertFail in \engine\remove.cpp line 180
|
||
|
// when add & remove ELAN w/o committing changes.
|
||
|
// mbend 20 May 2000
|
||
|
//
|
||
|
// Remove newly created adapters
|
||
|
if (pElanInfo->m_fCreateMiniportOnPropertyApply)
|
||
|
{
|
||
|
ELAN_INFO_LIST::iterator iter = find(
|
||
|
m_pAdapterInfo->m_lstElans.begin(),
|
||
|
m_pAdapterInfo->m_lstElans.end(),
|
||
|
pElanInfo);
|
||
|
|
||
|
Assert(m_pAdapterInfo->m_lstElans.end() != iter);
|
||
|
m_pAdapterInfo->m_lstElans.erase(iter);
|
||
|
|
||
|
delete pElanInfo;
|
||
|
}
|
||
|
|
||
|
// refresh the ELAN list
|
||
|
SendElanInfo();
|
||
|
|
||
|
// set the state of the buttons
|
||
|
SetButtons();
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void CALanePsh::SendAdapterInfo()
|
||
|
{
|
||
|
ATMLANE_ADAPTER_INFO_LIST::iterator iterLstAdapters;
|
||
|
CALaneCfgAdapterInfo * pAdapterInfo;
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
void CALanePsh::SendElanInfo()
|
||
|
{
|
||
|
ELAN_INFO_LIST::iterator iterLstElans;
|
||
|
CALaneCfgElanInfo * pElanInfo = NULL;
|
||
|
|
||
|
// pAdapterInfo = GetSelectedAdapter();
|
||
|
Assert (NULL != m_pAdapterInfo);
|
||
|
|
||
|
::SendMessage(m_hElanList, LB_RESETCONTENT, 0, 0L);
|
||
|
|
||
|
// loop thru the ELANs
|
||
|
for (iterLstElans = m_pAdapterInfo->m_lstElans.begin();
|
||
|
iterLstElans != m_pAdapterInfo->m_lstElans.end();
|
||
|
iterLstElans++)
|
||
|
{
|
||
|
int idx;
|
||
|
pElanInfo = *iterLstElans;
|
||
|
|
||
|
// only add to list if not deleted
|
||
|
|
||
|
if (!pElanInfo->m_fDeleted)
|
||
|
{
|
||
|
|
||
|
// set name to "unspecified" or actual specified name
|
||
|
if (0 == lstrlen(pElanInfo->SzGetElanName()))
|
||
|
{
|
||
|
idx = ::SendMessage(m_hElanList, LB_ADDSTRING, 0,
|
||
|
(LPARAM)(SzLoadIds(IDS_ALANECFG_UNSPECIFIEDNAME)));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
idx = ::SendMessage(m_hElanList, LB_ADDSTRING, 0,
|
||
|
(LPARAM)((PCWSTR)(pElanInfo->SzGetElanName())));
|
||
|
}
|
||
|
|
||
|
// store pointer to ElanInfo with text
|
||
|
if (idx != LB_ERR)
|
||
|
::SendMessage(m_hElanList, LB_SETITEMDATA, idx,
|
||
|
(LPARAM)(pElanInfo));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// select the first one
|
||
|
|
||
|
::SendMessage(m_hElanList, LB_SETCURSEL, 0, (LPARAM)0);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
CALaneCfgElanInfo *CALanePsh::GetSelectedElan()
|
||
|
{
|
||
|
int nCount;
|
||
|
int idx;
|
||
|
DWORD_PTR dw;
|
||
|
CALaneCfgElanInfo *pElanInfo = NULL;
|
||
|
|
||
|
nCount = (int) ::SendMessage(m_hElanList, LB_GETCOUNT, 0, 0);
|
||
|
if (nCount > 0)
|
||
|
{
|
||
|
idx = (int) ::SendMessage(m_hElanList, LB_GETCURSEL, 0, 0);
|
||
|
if (LB_ERR != idx)
|
||
|
{
|
||
|
dw = ::SendMessage(m_hElanList, LB_GETITEMDATA, idx, (LPARAM)0);
|
||
|
if (dw && ((DWORD_PTR)LB_ERR != dw))
|
||
|
{
|
||
|
pElanInfo = (CALaneCfgElanInfo *)dw;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return pElanInfo;
|
||
|
}
|
||
|
|
||
|
void CALanePsh::SetButtons()
|
||
|
{
|
||
|
int nCount;
|
||
|
|
||
|
// get count of Elans in list
|
||
|
nCount = (int) ::SendMessage(m_hElanList, LB_GETCOUNT, 0, 0);
|
||
|
|
||
|
if (!nCount)
|
||
|
{
|
||
|
// remove the default on the remove button, if any
|
||
|
::SendMessage(m_hbtnRemove, BM_SETSTYLE, (WPARAM)BS_PUSHBUTTON, TRUE );
|
||
|
|
||
|
// move focus to Add button
|
||
|
::SetFocus(m_hbtnAdd);
|
||
|
}
|
||
|
|
||
|
// enable/disable "Edit" and "Remove" buttons based existing Elans
|
||
|
::EnableWindow(m_hbtnEdit, !!nCount);
|
||
|
::EnableWindow(m_hbtnRemove, !!nCount);
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// CElanPropertiesDialog
|
||
|
//
|
||
|
|
||
|
CElanPropertiesDialog::CElanPropertiesDialog(CALanePsh * pCALanePsh,
|
||
|
CALaneCfgElanInfo *pElanInfo,
|
||
|
const DWORD * adwHelpIDs)
|
||
|
{
|
||
|
m_pParentDlg = pCALanePsh;
|
||
|
m_pElanInfo = pElanInfo;
|
||
|
|
||
|
m_adwHelpIDs = adwHelpIDs;
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
|
||
|
LRESULT CElanPropertiesDialog::OnInitDialog(UINT uMsg, WPARAM wParam,
|
||
|
LPARAM lParam, BOOL& fHandled)
|
||
|
{
|
||
|
// change the ok button to add if we are not editing
|
||
|
if (m_pParentDlg->m_fEditState == FALSE)
|
||
|
SetDlgItemText(IDOK, m_pParentDlg->m_strAddElan.c_str());
|
||
|
|
||
|
// Set the position of the pop up dialog to be right over the listbox
|
||
|
// on parent dialog
|
||
|
|
||
|
HWND hList = ::GetDlgItem(m_pParentDlg->m_hWnd, IDC_ELAN_LIST);
|
||
|
RECT rect;
|
||
|
|
||
|
::GetWindowRect(hList, &rect);
|
||
|
SetWindowPos(NULL, rect.left, rect.top, 0,0,
|
||
|
SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE);
|
||
|
|
||
|
// Save handle to the edit box
|
||
|
m_hElanName = GetDlgItem(IDC_ELAN_NAME);
|
||
|
|
||
|
// ELAN names have a 32 character limit
|
||
|
::SendMessage(m_hElanName, EM_SETLIMITTEXT, ELAN_NAME_LIMIT, 0);
|
||
|
|
||
|
// fill in the edit box with the current elan's name
|
||
|
::SetWindowText(m_hElanName, m_pElanInfo->SzGetElanName());
|
||
|
::SendMessage(m_hElanName, EM_SETSEL, 0, -1);
|
||
|
|
||
|
::SetFocus(m_hElanName);
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
LRESULT CElanPropertiesDialog::OnContextMenu(UINT uMsg, WPARAM wParam,
|
||
|
LPARAM lParam, BOOL& fHandled)
|
||
|
{
|
||
|
ShowContextHelp(m_hWnd, HELP_CONTEXTMENU, m_adwHelpIDs);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CElanPropertiesDialog::OnHelp(UINT uMsg, WPARAM wParam,
|
||
|
LPARAM lParam, BOOL& fHandled)
|
||
|
{
|
||
|
LPHELPINFO lphi = reinterpret_cast<LPHELPINFO>(lParam);
|
||
|
Assert(lphi);
|
||
|
|
||
|
if (HELPINFO_WINDOW == lphi->iContextType)
|
||
|
{
|
||
|
ShowContextHelp(static_cast<HWND>(lphi->hItemHandle), HELP_WM_HELP,
|
||
|
m_adwHelpIDs);
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CElanPropertiesDialog::OnOk(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& fHandled)
|
||
|
{
|
||
|
WCHAR szElan[ELAN_NAME_LIMIT + 1];
|
||
|
|
||
|
// Get the current name from the control and
|
||
|
// store in the elan info
|
||
|
::GetWindowText(m_hElanName, szElan, ELAN_NAME_LIMIT + 1);
|
||
|
|
||
|
m_pElanInfo->SetElanName(szElan);
|
||
|
EndDialog(IDOK);
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LRESULT CElanPropertiesDialog::OnCancel(WORD wNotifyCode, WORD wID,
|
||
|
HWND hWndCtl, BOOL& fHandled)
|
||
|
{
|
||
|
EndDialog(IDCANCEL);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|