2100 lines
58 KiB
C++
2100 lines
58 KiB
C++
// nwlnkipx.cpp : Implementation of CNwlnkIPX
|
|
|
|
#include "pch.h"
|
|
#pragma hdrstop
|
|
#include "nwlnkipx.h"
|
|
#include "ncatlui.h"
|
|
#include "ncui.h"
|
|
|
|
extern const WCHAR c_szNetCfgHelpFile[];
|
|
extern const WCHAR c_sz8Zeros[];
|
|
|
|
static const FRAME_TYPE aFDDI_Frames[] = {{IDS_AUTO, AUTO},
|
|
{IDS_FDDI, F802_2},
|
|
{IDS_FDDI_SNAP, SNAP},
|
|
{IDS_FDDI_802_3, F802_3},
|
|
{0,0}
|
|
};
|
|
static const FRAME_TYPE aTOKEN_Frames[] = {{IDS_AUTO, AUTO},
|
|
{IDS_TK, F802_2},
|
|
{IDS_802_5, SNAP},
|
|
{0,0}
|
|
};
|
|
static const FRAME_TYPE aARCNET_Frames[] = {
|
|
{IDS_AUTO, AUTO},
|
|
{IDS_ARCNET, ARCNET},
|
|
{0,0}
|
|
};
|
|
static const FRAME_TYPE aEthernet_Frames[] = {
|
|
{IDS_AUTO, AUTO},
|
|
{IDS_ETHERNET, ETHERNET},
|
|
{IDS_802_2, F802_2},
|
|
{IDS_802_3, F802_3},
|
|
{IDS_SNAP, SNAP},
|
|
{0,0}
|
|
};
|
|
|
|
static const MEDIA_TYPE MediaMap[] = {{FDDI_MEDIA, aFDDI_Frames},
|
|
{TOKEN_MEDIA, aTOKEN_Frames},
|
|
{ARCNET_MEDIA, aARCNET_Frames},
|
|
{ETHERNET_MEDIA, aEthernet_Frames}
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: EditSubclassProc
|
|
//
|
|
// Purpose: Subclass proc for network number edit controls. The
|
|
// subclassing forces only correct input
|
|
//
|
|
// Parameters: none
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
// Author: scottbri 28-Apr-1997
|
|
//
|
|
STDAPI EditSubclassProc( HWND hwnd, UINT wMsg, WPARAM wParam, LPARAM lParam )
|
|
{
|
|
WNDPROC pIpxEditProc = (WNDPROC)GetWindowLongPtr(hwnd, GWLP_USERDATA);
|
|
|
|
// Allow copy/paste keys (CTRL)
|
|
if ((!(GetKeyState(VK_CONTROL) & 0x8000)) &&
|
|
(wMsg == WM_CHAR))
|
|
{
|
|
// Check for invalid hex characters
|
|
if (!(((WCHAR)wParam >= L'0' && (WCHAR)wParam <= L'9') ||
|
|
((WCHAR)wParam >= L'a' && (WCHAR)wParam <= L'f') ||
|
|
((WCHAR)wParam >= L'A' && (WCHAR)wParam <= L'F') ||
|
|
((WCHAR)wParam == VK_BACK)))
|
|
{
|
|
// Not allowed
|
|
MessageBeep(MB_ICONEXCLAMATION);
|
|
return 0L;
|
|
}
|
|
}
|
|
|
|
return CallWindowProc( pIpxEditProc, hwnd, wMsg, wParam, lParam );
|
|
}
|
|
|
|
LRESULT CommonIPXOnContextMenu(HWND hWnd, const DWORD * padwHelpIDs)
|
|
{
|
|
Assert(padwHelpIDs);
|
|
|
|
WinHelp(hWnd,
|
|
c_szNetCfgHelpFile,
|
|
HELP_CONTEXTMENU,
|
|
(ULONG_PTR)padwHelpIDs);
|
|
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CommonIPXOnHelp(LPARAM lParam, const DWORD * padwHelpIDs)
|
|
{
|
|
LPHELPINFO lphi = reinterpret_cast<LPHELPINFO>(lParam);
|
|
Assert(lphi);
|
|
Assert(padwHelpIDs);
|
|
|
|
if (HELPINFO_WINDOW == lphi->iContextType)
|
|
{
|
|
if (padwHelpIDs != NULL)
|
|
{
|
|
WinHelp(static_cast<HWND>(lphi->hItemHandle),
|
|
c_szNetCfgHelpFile,
|
|
HELP_WM_HELP,
|
|
(ULONG_PTR)padwHelpIDs);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxConfigDlg::CIpxConfigDlg
|
|
//
|
|
// Purpose: ctor for the CIpxConfigDlg class
|
|
//
|
|
// Parameters: none
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
// Author: scottbri 28-Apr-1997
|
|
//
|
|
CIpxConfigDlg::CIpxConfigDlg(CNwlnkIPX *pmsc, CIpxEnviroment * pIpxEnviroment,
|
|
CIpxAdapterInfo * pAI)
|
|
{
|
|
// Note these parameters are on loan, do not free them...
|
|
Assert(NULL != pmsc);
|
|
Assert(NULL != pIpxEnviroment);
|
|
m_pmsc = pmsc;
|
|
m_pIpxEnviroment = pIpxEnviroment;
|
|
ZeroMemory(&m_WrkstaDlgInfo, sizeof(m_WrkstaDlgInfo));
|
|
m_pAICurrent = pAI;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxConfigDlg::OnInitDialog
|
|
//
|
|
// Purpose: Called when this dialog is first brought up.
|
|
//
|
|
// Parameters:
|
|
// uMsg [in]
|
|
// wParam [in] See the ATL documentation for params.
|
|
// lParam [in]
|
|
// bHandled [in]
|
|
//
|
|
// Returns: See the ATL documentation for return results.
|
|
//
|
|
// Author: scottbri 11-Apr-1997
|
|
//
|
|
// Notes:
|
|
//
|
|
LRESULT CIpxConfigDlg::OnInitDialog(UINT uMsg, WPARAM wParam,
|
|
LPARAM lParam, BOOL& bHandled)
|
|
{
|
|
UINT nIdx;
|
|
int aIds[] = {IDS_IPXPP_TEXT_1, IDS_IPXPP_TEXT_2};
|
|
tstring strText;
|
|
WCHAR szBuf[12];
|
|
HWND hwndEdit = GetDlgItem(EDT_IPXPP_NETWORKNUMBER);
|
|
HWND hwndEditINN = GetDlgItem(EDT_IPXAS_INTERNAL);
|
|
|
|
// Build the property page's informative text block
|
|
for (nIdx=0; nIdx < celems(aIds); nIdx++)
|
|
strText += SzLoadIds(aIds[nIdx]);
|
|
|
|
::SetWindowText(GetDlgItem(IDC_IPXPP_TEXT), strText.c_str());
|
|
|
|
// Subclass the network number edit control
|
|
::SetWindowLongPtr(hwndEdit, GWLP_USERDATA, ::GetWindowLongPtr(hwndEdit, GWLP_WNDPROC));
|
|
::SetWindowLongPtr(hwndEdit, GWLP_WNDPROC, (LONG_PTR)EditSubclassProc);
|
|
::SetWindowLongPtr(hwndEditINN, GWLP_USERDATA, (LONG_PTR) ::GetWindowLongPtr(hwndEditINN, GWLP_WNDPROC));
|
|
::SetWindowLongPtr(hwndEditINN, GWLP_WNDPROC, (LONG_PTR)EditSubclassProc);
|
|
|
|
// Limit the text in the network # edit control
|
|
::SendMessage(hwndEdit, EM_LIMITTEXT, MAX_NETNUM_SIZE, 0L);
|
|
::SendMessage(hwndEditINN, EM_LIMITTEXT, MAX_NETNUM_SIZE, 0L);
|
|
|
|
// Populate the Inernal Network Number edit control
|
|
HexSzFromDw(szBuf, m_pIpxEnviroment->DwVirtualNetworkNumber());
|
|
::SetWindowText(hwndEditINN,szBuf);
|
|
|
|
// If no adapter cards are present inform the user
|
|
// and disable the UI.
|
|
Assert(NULL != m_pIpxEnviroment);
|
|
if (NULL == m_pAICurrent)
|
|
{
|
|
int aIdc[] = {CMB_IPXPP_FRAMETYPE,
|
|
EDT_IPXPP_NETWORKNUMBER,
|
|
IDC_STATIC_NETNUM,
|
|
IDC_STATIC_FRAMETYPE,
|
|
GB_IPXPP_ADAPTER,
|
|
IDC_IPXPP_ADAPTER_TEXT };
|
|
|
|
// Disable the dialog controls
|
|
for (nIdx = 0; nIdx<celems(aIdc); nIdx++)
|
|
::ShowWindow(GetDlgItem(aIdc[nIdx]), SW_HIDE);
|
|
}
|
|
else
|
|
{
|
|
Assert(m_pAICurrent);
|
|
Assert(!m_pAICurrent->FDeletePending());
|
|
Assert(!m_pAICurrent->FDisabled());
|
|
Assert(!m_pAICurrent->FHidden());
|
|
|
|
// Move the Adapter Info to the dialog's internal form
|
|
m_WrkstaDlgInfo.pAI = m_pAICurrent;
|
|
m_WrkstaDlgInfo.dwMediaType = m_pAICurrent->DwMediaType();
|
|
m_WrkstaDlgInfo.dwFrameType = m_pAICurrent->DwFrameType();
|
|
m_WrkstaDlgInfo.dwNetworkNumber = m_pAICurrent->DwNetworkNumber();
|
|
|
|
// Adjust the UI to reflect the currently selected adapter
|
|
AdapterChanged();
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxConfigDlg::OnOk
|
|
//
|
|
// Purpose: Called when the OK button is pressed.
|
|
//
|
|
// Parameters:
|
|
// idCtrl [in]
|
|
// pnmh [in] See the ATL documentation for params.
|
|
// bHandled [in]
|
|
//
|
|
// Returns: See the ATL documentation for return results.
|
|
//
|
|
// Author: scottbri 11-Apr-1997
|
|
//
|
|
// Notes:
|
|
//
|
|
LRESULT CIpxConfigDlg::OnOk(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
HWND hwndEdit = GetDlgItem(EDT_IPXAS_INTERNAL);
|
|
WCHAR szBuf[12];
|
|
|
|
::GetWindowText(hwndEdit,szBuf,sizeof(szBuf)/sizeof(WCHAR));
|
|
if (0 == lstrlenW(szBuf))
|
|
{
|
|
NcMsgBox(m_hWnd, IDS_MANUAL_FRAME_DETECT, IDS_INCORRECT_NETNUM, MB_OK | MB_ICONEXCLAMATION);
|
|
::SetFocus(hwndEdit);
|
|
::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
|
|
return TRUE;
|
|
}
|
|
|
|
// Update the virtual network number
|
|
m_pIpxEnviroment->SetVirtualNetworkNumber(DwFromSz(szBuf, 16));
|
|
|
|
if (NULL != m_pAICurrent)
|
|
{
|
|
m_pAICurrent->SetDirty(TRUE);
|
|
|
|
// Force update of the currently selection items in our internal data
|
|
// structure. This handles the case case of someone changing only
|
|
// network num, and nothing else on the page.
|
|
FrameTypeChanged();
|
|
|
|
// Apply the internal data to original adapter info
|
|
UpdateLstPtstring(m_WrkstaDlgInfo.pAI->m_lstpstrFrmType,
|
|
m_WrkstaDlgInfo.dwFrameType);
|
|
|
|
UpdateLstPtstring(m_WrkstaDlgInfo.pAI->m_lstpstrNetworkNum,
|
|
m_WrkstaDlgInfo.dwNetworkNumber);
|
|
}
|
|
|
|
TraceError("CIpxConfigDlg::OnOk", hr);
|
|
return LresFromHr(hr);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxConfigDlg::OnContextMenu
|
|
//
|
|
// Purpose: Context sensitive help support.
|
|
//
|
|
// Author: jeffspr 13 Apr 1999
|
|
//
|
|
// Notes:
|
|
//
|
|
LRESULT CIpxConfigDlg::OnContextMenu(UINT uMsg, WPARAM wParam,
|
|
LPARAM lParam, BOOL& fHandled)
|
|
{
|
|
return ::CommonIPXOnContextMenu(m_hWnd, g_aHelpIDs_DLG_IPX_CONFIG);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxConfigDlg::OnHelp
|
|
//
|
|
// Purpose: Context sensitive help support.
|
|
//
|
|
// Author: jeffspr 13 Apr 1999
|
|
//
|
|
// Notes:
|
|
//
|
|
LRESULT CIpxConfigDlg::OnHelp(UINT uMsg, WPARAM wParam,
|
|
LPARAM lParam, BOOL& fHandled)
|
|
{
|
|
return ::CommonIPXOnHelp(lParam, g_aHelpIDs_DLG_IPX_CONFIG);
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxConfigDlg::GetFrameType
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Parameters:
|
|
//
|
|
// Returns:
|
|
//
|
|
// Author: scottbri 25-Apr-1997
|
|
//
|
|
const FRAME_TYPE *CIpxConfigDlg::GetFrameType(DWORD dwMediaType)
|
|
{
|
|
// Locate the media type
|
|
for (int i=0; i<celems(MediaMap); i++)
|
|
if (MediaMap[i].dwMediaType == dwMediaType)
|
|
return MediaMap[i].aFrameType;
|
|
|
|
return aEthernet_Frames;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxConfigDlg::UpdateNetworkNumber
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Parameters:
|
|
//
|
|
// Returns:
|
|
//
|
|
// Author: scottbri 28-Apr-1997
|
|
//
|
|
// Notes:
|
|
//
|
|
void CIpxConfigDlg::UpdateNetworkNumber(DWORD dwNetworkNumber,
|
|
DWORD dwFrameType)
|
|
{
|
|
HWND hwndEdit = GetDlgItem(EDT_IPXPP_NETWORKNUMBER);
|
|
|
|
if (dwFrameType != AUTO)
|
|
{
|
|
WCHAR szBuf[12];
|
|
HexSzFromDw(szBuf, dwNetworkNumber);
|
|
::SetWindowText(hwndEdit, szBuf);
|
|
::EnableWindow(hwndEdit, TRUE);
|
|
::EnableWindow(GetDlgItem(IDC_STATIC_NETNUM), TRUE);
|
|
}
|
|
else
|
|
{
|
|
::SetWindowText(hwndEdit, L"");
|
|
::EnableWindow(hwndEdit, FALSE);
|
|
::EnableWindow(GetDlgItem(IDC_STATIC_NETNUM), FALSE);
|
|
}
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxConfigDlg::AdapterChanged
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Parameters:
|
|
//
|
|
// Returns:
|
|
//
|
|
// Author: scottbri 28-Apr-1997
|
|
//
|
|
void CIpxConfigDlg::AdapterChanged()
|
|
{
|
|
DWORD dwFrameType;
|
|
HWND hwndFrame = GetDlgItem(CMB_IPXPP_FRAMETYPE);
|
|
HWND hwndEdit = GetDlgItem(EDT_IPXPP_NETWORKNUMBER);
|
|
int nIdxLoop;
|
|
int nIdx;
|
|
|
|
const FRAME_TYPE * pft;
|
|
|
|
if ((NULL == hwndFrame) || (NULL == m_pAICurrent))
|
|
return;
|
|
|
|
// Locate the Correct Frame Type info for this adapter's media type
|
|
pft = GetFrameType(m_WrkstaDlgInfo.dwMediaType);
|
|
Assert(NULL != pft);
|
|
|
|
// Populate the Frame Type Combo
|
|
::SendMessage(hwndFrame, CB_RESETCONTENT, 0, 0L);
|
|
for (nIdxLoop=0;
|
|
pft[nIdxLoop].nFrameIds != 0;
|
|
nIdxLoop++)
|
|
{
|
|
// Add the Frame Type's descriptive string
|
|
nIdx = ::SendMessage(hwndFrame, CB_ADDSTRING, 0,
|
|
(LPARAM)(PCWSTR)SzLoadIds(pft[nIdxLoop].nFrameIds));
|
|
if (CB_ERR == nIdx)
|
|
break;
|
|
|
|
// Add the Frame Type for convenient access later
|
|
::SendMessage(hwndFrame, CB_SETITEMDATA, nIdx,
|
|
pft[nIdxLoop].dwFrameType);
|
|
}
|
|
|
|
// Update the network number based on the frame type
|
|
UpdateNetworkNumber(m_WrkstaDlgInfo.dwNetworkNumber,
|
|
m_WrkstaDlgInfo.dwFrameType);
|
|
|
|
switch (m_WrkstaDlgInfo.dwFrameType)
|
|
{
|
|
case ETHERNET:
|
|
nIdx = IDS_ETHERNET;
|
|
break;
|
|
|
|
case F802_2:
|
|
switch (m_WrkstaDlgInfo.dwMediaType)
|
|
{
|
|
case TOKEN_MEDIA:
|
|
nIdx = IDS_TK;
|
|
break;
|
|
|
|
case FDDI_MEDIA:
|
|
nIdx = IDS_FDDI;
|
|
break;
|
|
|
|
default:
|
|
nIdx = IDS_802_2;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case F802_3:
|
|
switch (m_WrkstaDlgInfo.dwMediaType)
|
|
{
|
|
case FDDI_MEDIA:
|
|
nIdx = IDS_FDDI_802_3;
|
|
break;
|
|
|
|
default:
|
|
nIdx = IDS_802_3;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case SNAP:
|
|
switch (m_WrkstaDlgInfo.dwMediaType)
|
|
{
|
|
case TOKEN_MEDIA:
|
|
nIdx = IDS_802_5;
|
|
break;
|
|
|
|
case FDDI_MEDIA:
|
|
nIdx = IDS_FDDI_SNAP;
|
|
break;
|
|
|
|
default:
|
|
nIdx = IDS_SNAP;
|
|
break;
|
|
}
|
|
break;
|
|
|
|
case ARCNET:
|
|
nIdx = IDS_ARCNET;
|
|
break;
|
|
|
|
case AUTO:
|
|
// Fall through...
|
|
default:
|
|
nIdx = IDS_AUTO;
|
|
break;
|
|
}
|
|
|
|
// Set the frame type in the combo box
|
|
::SendMessage(hwndFrame, CB_SETCURSEL,
|
|
::SendMessage(hwndFrame, CB_FINDSTRINGEXACT,
|
|
0, ((LPARAM)(PCWSTR)SzLoadIds(nIdx))), 0);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxConfigDlg::FrameTypeChanged
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Parameters:
|
|
//
|
|
// Returns:
|
|
//
|
|
// Author: scottbri 28-Apr-1997
|
|
//
|
|
void CIpxConfigDlg::FrameTypeChanged()
|
|
{
|
|
HWND hwndFrame = GetDlgItem(CMB_IPXPP_FRAMETYPE);
|
|
int nIdx;
|
|
|
|
if (NULL == m_pAICurrent)
|
|
return;
|
|
|
|
// Locate the currently selected frame type
|
|
nIdx = ::SendMessage(hwndFrame, CB_GETCURSEL, 0, 0L);
|
|
if (CB_ERR == nIdx)
|
|
return;
|
|
|
|
// Update the currently selected frame type
|
|
m_WrkstaDlgInfo.dwFrameType = ::SendMessage(hwndFrame, CB_GETITEMDATA, nIdx, 0L);
|
|
|
|
SetNetworkNumber(&m_WrkstaDlgInfo.dwNetworkNumber);
|
|
|
|
UpdateNetworkNumber(m_WrkstaDlgInfo.dwNetworkNumber,
|
|
m_WrkstaDlgInfo.dwFrameType);
|
|
}
|
|
|
|
void CIpxConfigDlg::SetNetworkNumber(DWORD *pdw)
|
|
{
|
|
WCHAR szBuf[30];
|
|
WCHAR szBuf2[30];
|
|
szBuf[0] = NULL;
|
|
|
|
HWND hwndEdit = GetDlgItem(EDT_IPXPP_NETWORKNUMBER);
|
|
if (NULL == hwndEdit)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Get the new number and normalize it...
|
|
::GetWindowText(hwndEdit, szBuf, sizeof(szBuf)/sizeof(WCHAR));
|
|
*pdw = DwFromSz(szBuf, 16);
|
|
|
|
HexSzFromDw(szBuf2, *pdw);
|
|
|
|
// Update the edit control if a parsing produced a net change
|
|
if (lstrcmpW(szBuf,szBuf2) != 0)
|
|
{
|
|
::SetWindowText(hwndEdit, szBuf2);
|
|
}
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxConfigDlg::HandleNetworkNumber
|
|
//
|
|
// Purpose: Called when the network number edit control gets a message.
|
|
//
|
|
// Parameters: See the ATL documentation for params.
|
|
//
|
|
// Returns: See the ATL documentation for return results.
|
|
//
|
|
// Author: scottbri 13-Aug-1997
|
|
//
|
|
// Notes:
|
|
//
|
|
LRESULT
|
|
CIpxConfigDlg::HandleNetworkNumber(
|
|
WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
if (EN_CHANGE == wNotifyCode)
|
|
{
|
|
SetChangedFlag();
|
|
}
|
|
|
|
if ((wNotifyCode != EN_KILLFOCUS) || (NULL == m_pAICurrent))
|
|
return 0L;
|
|
|
|
SetNetworkNumber(&m_WrkstaDlgInfo.dwNetworkNumber);
|
|
|
|
return 0L;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxConfigDlg::HandleFrameCombo
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Parameters:
|
|
//
|
|
// Returns:
|
|
//
|
|
// Author: scottbri 28-Apr-1997
|
|
//
|
|
LRESULT CIpxConfigDlg::HandleFrameCombo(WORD wNotifyCode, WORD wID,
|
|
HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
Assert(CMB_IPXPP_FRAMETYPE == wID);
|
|
|
|
if (CBN_SELENDOK != wNotifyCode)
|
|
{
|
|
bHandled = FALSE;
|
|
return 0L;
|
|
}
|
|
|
|
FrameTypeChanged();
|
|
SetChangedFlag();
|
|
|
|
bHandled = TRUE;
|
|
|
|
return 0L;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::CIpxASConfigDlg
|
|
//
|
|
// Purpose: ctor for the CIpxASConfigDlg class
|
|
//
|
|
// Parameters: none
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
// Author: scottbri 28-Apr-1997
|
|
//
|
|
CIpxASConfigDlg::CIpxASConfigDlg(CNwlnkIPX *pmsc,
|
|
CIpxEnviroment * pIpxEnviroment,
|
|
CIpxAdapterInfo * pAI)
|
|
{
|
|
// Note these parameters are on loan, do not free them...
|
|
Assert(NULL != pmsc);
|
|
Assert(NULL != pIpxEnviroment);
|
|
m_pmsc = pmsc;
|
|
m_pIpxEnviroment = pIpxEnviroment;
|
|
m_pAICurrent = pAI;
|
|
m_nRadioBttn = 0;
|
|
m_dwMediaType = ETHERNET_MEDIA;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::~CIpxASConfigDlg
|
|
//
|
|
// Purpose: dtor for the CIpxASConfigDlg class
|
|
//
|
|
// Parameters: none
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
// Author: scottbri 28-Apr-1997
|
|
//
|
|
CIpxASConfigDlg::~CIpxASConfigDlg()
|
|
{
|
|
DeleteColString(&m_lstpstrFrmType);
|
|
DeleteColString(&m_lstpstrNetworkNum);
|
|
m_pmsc = NULL;
|
|
m_pIpxEnviroment = NULL;
|
|
m_pAICurrent = NULL;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::FIsNetNumberInUse
|
|
//
|
|
// Purpose: Compare a network number to those already in use.
|
|
// Returning TRUE if the network number is already present.
|
|
//
|
|
// Parameters: dwFrameType - Frame Type as a DWORD
|
|
// pszNetNum - Network number as a hex string
|
|
//
|
|
// Returns: BOOL, TRUE if the network number is already present, FALSE otherwise
|
|
//
|
|
// Author: scottbri 29-Apr-1997
|
|
//
|
|
BOOL CIpxASConfigDlg::FIsNetNumberInUse(DWORD dwFrameType, PCWSTR pszNetNum)
|
|
{
|
|
DWORD dwNetNum = DwFromSz(pszNetNum, 16);
|
|
|
|
if (0 == dwNetNum)
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
list<tstring *>::iterator iterFrmType = m_lstpstrFrmType.begin();
|
|
list<tstring *>::iterator iterNetworkNum = m_lstpstrNetworkNum.begin();
|
|
|
|
while (iterFrmType != m_lstpstrFrmType.end() &&
|
|
iterNetworkNum != m_lstpstrNetworkNum.end())
|
|
{
|
|
tstring *pstr1 = *iterFrmType;
|
|
tstring *pstr2 = *iterNetworkNum;
|
|
if ((DwFromSz(pstr1->c_str(), 16) == dwFrameType) &&
|
|
(DwFromSz(pstr2->c_str(),16) == dwNetNum))
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
iterFrmType++;
|
|
iterNetworkNum++;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::OnInitDialog
|
|
//
|
|
// Purpose: Called when this dialog is first brought up.
|
|
//
|
|
// Parameters:
|
|
// uMsg [in]
|
|
// wParam [in] See the ATL documentation for params.
|
|
// lParam [in]
|
|
// bHandled [in]
|
|
//
|
|
// Returns: See the ATL documentation for return results.
|
|
//
|
|
// Author: scottbri 11-Apr-1997
|
|
//
|
|
// Notes:
|
|
//
|
|
LRESULT CIpxASConfigDlg::OnInitDialog(UINT uMsg, WPARAM wParam,
|
|
LPARAM lParam, BOOL& bHandled)
|
|
{
|
|
// Initialize the listview column headings
|
|
int aIds[] = {IDS_IPXAS_FRAME_TYPE,IDS_IPXAS_NETWORK_NUM};
|
|
HWND hwndTmp;
|
|
int iCol;
|
|
LV_COLUMN lvc;
|
|
RECT rc;
|
|
WCHAR szBuf[12];
|
|
|
|
m_hwndLV = GetDlgItem(LVC_IPXAS_DEST);
|
|
::GetClientRect(m_hwndLV, &rc);
|
|
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
|
|
lvc.fmt = LVCFMT_LEFT;
|
|
lvc.cx = (rc.right - rc.left) / 2;
|
|
|
|
UINT nIdx;
|
|
int aIds2[] = {IDS_IPXPP_TEXT_1, IDS_IPXPP_TEXT_2};
|
|
tstring strText;
|
|
|
|
// Build the property page's informative text block
|
|
for (nIdx=0; nIdx < celems(aIds2); nIdx++)
|
|
{
|
|
strText += SzLoadIds(aIds2[nIdx]);
|
|
}
|
|
|
|
::SetWindowText(GetDlgItem(IDC_IPXPP_TEXT), strText.c_str());
|
|
|
|
// Add columns
|
|
for (iCol = 0; iCol < celems(aIds); iCol++)
|
|
{
|
|
lvc.iSubItem = iCol;
|
|
lvc.pszText = (PWSTR)SzLoadIds(aIds[iCol]);
|
|
if (ListView_InsertColumn(m_hwndLV, iCol, &lvc) == -1)
|
|
return FALSE;
|
|
}
|
|
|
|
// Initialize the Internal Network Number Edit Control
|
|
HexSzFromDw(szBuf, m_pIpxEnviroment->DwVirtualNetworkNumber());
|
|
hwndTmp = GetDlgItem(EDT_IPXAS_INTERNAL);
|
|
::SetWindowText(hwndTmp,szBuf);
|
|
|
|
// Subclass the edit control to allow only network number's
|
|
::SetWindowLongPtr(hwndTmp, GWLP_USERDATA, ::GetWindowLongPtr(hwndTmp, GWLP_WNDPROC));
|
|
::SetWindowLongPtr(hwndTmp, GWLP_WNDPROC, (LONG_PTR)EditSubclassProc);
|
|
|
|
// Limit the text in the network # edit control
|
|
::SendMessage(hwndTmp, EM_LIMITTEXT, MAX_NETNUM_SIZE, 0L);
|
|
|
|
// Initialize the rest of the Server's General page
|
|
InitGeneralPage();
|
|
UpdateButtons();
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::UpdateButtons
|
|
//
|
|
// Purpose: Update the button settings on the server's IPX general page
|
|
//
|
|
// Parameters: none
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
// Author: scottbri 28-Apr-1997
|
|
//
|
|
void CIpxASConfigDlg::UpdateButtons()
|
|
{
|
|
INT nCount = ListView_GetItemCount(m_hwndLV);
|
|
HWND hwndEdit = GetDlgItem(BTN_IPXAS_EDIT);
|
|
HWND hwndRemove = GetDlgItem(BTN_IPXAS_REMOVE);
|
|
HWND hwndAdd = GetDlgItem(BTN_IPXAS_ADD);
|
|
BOOL fEnableAdd = FALSE;
|
|
BOOL fEnableEditRemove = TRUE;
|
|
|
|
Assert(NULL != m_hwndLV);
|
|
if ((0 == nCount) || !IsDlgButtonChecked(BTN_IPXAS_MANUAL))
|
|
{
|
|
fEnableEditRemove = FALSE;
|
|
}
|
|
|
|
::EnableWindow(hwndRemove, fEnableEditRemove);
|
|
::EnableWindow(hwndEdit, fEnableEditRemove);
|
|
|
|
if (NULL != m_pAICurrent)
|
|
{
|
|
fEnableAdd = !(nCount >= DetermineMaxNumFrames());
|
|
}
|
|
|
|
if (!IsDlgButtonChecked(BTN_IPXAS_MANUAL))
|
|
{
|
|
fEnableAdd = FALSE;
|
|
}
|
|
|
|
::EnableWindow(hwndAdd, fEnableAdd);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::DetermineMaxNumFrames
|
|
//
|
|
// Purpose: Return the max number of frames allowed for a give adapter
|
|
// based on that adapters media type.
|
|
//
|
|
// Parameters: none
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
// Author: scottbri 28-Apr-1997
|
|
//
|
|
int CIpxASConfigDlg::DetermineMaxNumFrames()
|
|
{
|
|
int n;
|
|
|
|
if (NULL == m_pAICurrent)
|
|
return 0;
|
|
|
|
switch(m_dwMediaType)
|
|
{
|
|
case FDDI_MEDIA:
|
|
n = 3;
|
|
break;
|
|
|
|
case TOKEN_MEDIA:
|
|
n = 2;
|
|
break;
|
|
|
|
case ARCNET_MEDIA:
|
|
n = 1;
|
|
break;
|
|
|
|
default:
|
|
n = 4;
|
|
break;
|
|
}
|
|
|
|
return n;
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::InitGeneralPage
|
|
//
|
|
// Purpose: Initialize the Server's IPX general page
|
|
//
|
|
// Parameters: none
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
// Author: scottbri 28-Apr-1997
|
|
//
|
|
void CIpxASConfigDlg::InitGeneralPage()
|
|
{
|
|
// Populate the adapter list
|
|
int nIdx;
|
|
|
|
// Copy the adapter list info to a local structure
|
|
// to allow user manipulation
|
|
if (NULL != m_pAICurrent)
|
|
{
|
|
Assert(!m_pAICurrent->FDeletePending());
|
|
Assert(!m_pAICurrent->FDisabled());
|
|
Assert(!m_pAICurrent->FHidden());
|
|
|
|
// Move the Adapter Info to the dialog's internal form
|
|
m_dwMediaType = m_pAICurrent->DwMediaType();
|
|
|
|
// Frame Type lists contain one of two possible values
|
|
// 1) One AUTO entry
|
|
// 2) One or more non-AUTO frame types
|
|
//
|
|
// If the first is not AUTO, then copy the frame and network number
|
|
// pairs. Otherwise, leave the local lists empty
|
|
DWORD dw = DwFromLstPtstring(m_pAICurrent->m_lstpstrFrmType, c_dwPktTypeDefault, 16);
|
|
if (AUTO != dw)
|
|
{
|
|
list<tstring*>::iterator iterFrmType;
|
|
list<tstring*>::iterator iterNetworkNum;
|
|
m_nRadioBttn = BTN_IPXAS_MANUAL;
|
|
|
|
// Make an internal copy of the adapter's frame type and
|
|
// Network number information
|
|
for (iterFrmType = m_pAICurrent->m_lstpstrFrmType.begin(),
|
|
iterNetworkNum = m_pAICurrent->m_lstpstrNetworkNum.begin();
|
|
iterFrmType != m_pAICurrent->m_lstpstrFrmType.end(),
|
|
iterNetworkNum != m_pAICurrent->m_lstpstrNetworkNum.end();
|
|
iterFrmType++, iterNetworkNum++)
|
|
{
|
|
// Copy the Frame Type
|
|
tstring *pstr1 = *iterFrmType;
|
|
m_lstpstrFrmType.push_back(new tstring(pstr1->c_str()));
|
|
|
|
// Copy the Network number
|
|
tstring *pstr2 = *iterNetworkNum;
|
|
m_lstpstrNetworkNum.push_back(new tstring(pstr2->c_str()));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_nRadioBttn = BTN_IPXAS_AUTO;
|
|
}
|
|
|
|
// Update the UI to reflect the currently selected adapter
|
|
UpdateRadioButtons();
|
|
HrUpdateListView();
|
|
UpdateButtons();
|
|
}
|
|
else
|
|
{
|
|
// No adapters installed, disable the dialog sensibly
|
|
//
|
|
::EnableWindow(GetDlgItem(BTN_IPXAS_MANUAL), FALSE);
|
|
::EnableWindow(GetDlgItem(BTN_IPXAS_ADD), FALSE);
|
|
}
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::HrAddItemToList
|
|
//
|
|
// Purpose: Add a row to the list view
|
|
//
|
|
// Parameters: idsFrameName - ie ARCNET, Ethernet II, etc
|
|
// pszNetNum - Network number as a hex string
|
|
//
|
|
// Returns: HRESULT, S_OK if everything was added correctly
|
|
//
|
|
// Author: scottbri 29-Apr-1997
|
|
//
|
|
HRESULT CIpxASConfigDlg::HrAddItemToList(int idsFrameName, PCWSTR pszNetNum)
|
|
{
|
|
int nIdx;
|
|
LV_ITEM lvi;
|
|
int nCount = ListView_GetItemCount(m_hwndLV);
|
|
|
|
// Add the item info to the list view
|
|
lvi.mask = LVIF_TEXT | LVIF_PARAM;
|
|
lvi.iItem = nCount;
|
|
lvi.iSubItem = 0;
|
|
lvi.state = 0;
|
|
lvi.stateMask = 0;
|
|
lvi.pszText = (PWSTR)SzLoadIds(idsFrameName);
|
|
lvi.cchTextMax = lstrlenW(lvi.pszText);
|
|
lvi.iImage = 0;
|
|
lvi.lParam = idsFrameName;
|
|
nIdx = ListView_InsertItem(m_hwndLV, &lvi);
|
|
if (-1 == nIdx)
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
Assert(lvi.iItem == nIdx);
|
|
lvi.mask = LVIF_TEXT;
|
|
lvi.iSubItem = 1;
|
|
lvi.pszText = (PWSTR)pszNetNum;
|
|
lvi.cchTextMax = lstrlenW(lvi.pszText);
|
|
if (FALSE == ListView_SetItem(m_hwndLV, &lvi))
|
|
{
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::HrUpdateListView
|
|
//
|
|
// Purpose: Update the contents of the listview
|
|
//
|
|
// Parameters: none
|
|
//
|
|
// Returns: HRESULT, S_OK if everything was added correctly
|
|
//
|
|
// Author: scottbri 29-Apr-1997
|
|
//
|
|
HRESULT CIpxASConfigDlg::HrUpdateListView()
|
|
{
|
|
HRESULT hr = S_OK;
|
|
Assert(NULL != m_pAICurrent);
|
|
int nSize = m_lstpstrFrmType.size();
|
|
|
|
if (0 == nSize)
|
|
return S_OK;
|
|
|
|
// The list view is expected to be empty when this function is called
|
|
Assert(0 == ListView_GetItemCount(m_hwndLV));
|
|
|
|
// For efficency tell the list view how many items we're adding
|
|
ListView_SetItemCount(m_hwndLV, nSize);
|
|
|
|
// Enumerate the frame type/network number pairs use that data to
|
|
// populate the list view
|
|
list<tstring *>::iterator iterFrmType = m_lstpstrFrmType.begin();
|
|
list<tstring *>::iterator iterNetworkNum = m_lstpstrNetworkNum.begin();
|
|
|
|
while (iterFrmType != m_lstpstrFrmType.end() &&
|
|
iterNetworkNum != m_lstpstrNetworkNum.end())
|
|
{
|
|
tstring *pstr1 = *iterFrmType;
|
|
tstring *pstr2 = *iterNetworkNum;
|
|
DWORD dwFrameType = DwFromSz(pstr1->c_str(), 16);
|
|
|
|
if (F802_2 == dwFrameType)
|
|
{
|
|
switch (m_dwMediaType)
|
|
{
|
|
case TOKEN_MEDIA:
|
|
hr = HrAddItemToList(IDS_TK, pstr2->c_str());
|
|
break;
|
|
|
|
case FDDI_MEDIA:
|
|
hr = HrAddItemToList(IDS_FDDI, pstr2->c_str());
|
|
break;
|
|
|
|
case ARCNET_MEDIA:
|
|
hr = HrAddItemToList(IDS_ARCNET, pstr2->c_str());
|
|
break;
|
|
|
|
default:
|
|
hr = HrAddItemToList(IDS_802_2, pstr2->c_str());
|
|
break;
|
|
}
|
|
}
|
|
else if (ETHERNET == dwFrameType)
|
|
{
|
|
hr = HrAddItemToList(IDS_ETHERNET, pstr2->c_str());
|
|
}
|
|
else if (F802_3 == dwFrameType)
|
|
{
|
|
switch (m_dwMediaType)
|
|
{
|
|
case FDDI_MEDIA:
|
|
hr = HrAddItemToList(IDS_FDDI_802_3, pstr2->c_str());
|
|
break;
|
|
|
|
default:
|
|
hr = HrAddItemToList(IDS_802_3, pstr2->c_str());
|
|
break;
|
|
}
|
|
}
|
|
else if (SNAP == dwFrameType)
|
|
{
|
|
switch (m_dwMediaType)
|
|
{
|
|
case TOKEN_MEDIA:
|
|
hr = HrAddItemToList(IDS_802_5, pstr2->c_str());
|
|
break;
|
|
|
|
case FDDI_MEDIA:
|
|
hr = HrAddItemToList(IDS_SNAP, pstr2->c_str());
|
|
break;
|
|
|
|
default:
|
|
hr = HrAddItemToList(IDS_SNAP, pstr2->c_str());
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Assert(ARCNET == dwFrameType);
|
|
hr = HrAddItemToList(IDS_ARCNET, pstr2->c_str());
|
|
}
|
|
|
|
// Was the network number already present in the list?
|
|
if (S_FALSE == hr)
|
|
{
|
|
// Remove the duplicate network number and frame
|
|
// Note that this usage of erase correctly advances both iterators
|
|
delete pstr1;
|
|
delete pstr2;
|
|
iterFrmType = m_lstpstrFrmType.erase(iterFrmType);
|
|
iterNetworkNum = m_lstpstrNetworkNum.erase(iterNetworkNum);
|
|
hr = S_OK; // Normalize return
|
|
}
|
|
else if (FAILED(hr))
|
|
{
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
Assert(SUCCEEDED(hr));
|
|
// Advance the iterators
|
|
iterFrmType++;
|
|
iterNetworkNum++;
|
|
}
|
|
}
|
|
|
|
// Select the first item in the list
|
|
ListView_SetItemState(m_hwndLV, 0, LVIS_SELECTED, LVIS_SELECTED);
|
|
|
|
return hr;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::HandleRadioButton
|
|
//
|
|
// Purpose: React to changes to the dialog's radio buttons
|
|
//
|
|
// Parameters: Std ATL handler params
|
|
//
|
|
// Returns: LRESULT
|
|
//
|
|
// Author: scottbri 21-Aug-1997
|
|
//
|
|
LRESULT CIpxASConfigDlg::HandleRadioButton(WORD wNotifyCode, WORD wID,
|
|
HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
bHandled = FALSE;
|
|
|
|
if ((wNotifyCode != BN_CLICKED) || (NULL == m_pAICurrent))
|
|
return 0;
|
|
|
|
SetChangedFlag();
|
|
|
|
Assert((BTN_IPXAS_AUTO==wID) || (BTN_IPXAS_MANUAL==wID));
|
|
m_nRadioBttn = wID;
|
|
UpdateButtons();
|
|
|
|
bHandled = TRUE;
|
|
return 0;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::UpdateRadioButtons
|
|
//
|
|
// Purpose: Update the radio button settings based on the selected adapter
|
|
//
|
|
// Parameters: none
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
// Author: scottbri 29-Apr-1997
|
|
//
|
|
void CIpxASConfigDlg::UpdateRadioButtons()
|
|
{
|
|
DWORD dw;
|
|
|
|
if (NULL == m_pAICurrent)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (0 == m_nRadioBttn)
|
|
{
|
|
m_nRadioBttn = BTN_IPXAS_AUTO;
|
|
}
|
|
|
|
CheckRadioButton(BTN_IPXAS_AUTO, BTN_IPXAS_MANUAL, m_nRadioBttn);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::OnOk
|
|
//
|
|
// Purpose: Called when the OK button is pressed.
|
|
//
|
|
// Parameters:
|
|
// idCtrl [in]
|
|
// pnmh [in] See the ATL documentation for params.
|
|
// bHandled [in]
|
|
//
|
|
// Returns: See the ATL documentation for return results.
|
|
//
|
|
// Author: scottbri 11-Apr-1997
|
|
//
|
|
// Notes:
|
|
//
|
|
LRESULT CIpxASConfigDlg::OnOk(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
WCHAR szBuf[12];
|
|
HWND hwndEdit = GetDlgItem(EDT_IPXAS_INTERNAL);
|
|
|
|
::GetWindowText(hwndEdit,szBuf,sizeof(szBuf)/sizeof(WCHAR));
|
|
if (0 == lstrlenW(szBuf))
|
|
{
|
|
NcMsgBox(m_hWnd, IDS_MANUAL_FRAME_DETECT, IDS_INCORRECT_NETNUM, MB_OK | MB_ICONEXCLAMATION);
|
|
::SetFocus(hwndEdit);
|
|
::SetWindowLongPtr(m_hWnd, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
|
|
return TRUE;
|
|
}
|
|
|
|
// Update the virtual network number
|
|
m_pIpxEnviroment->SetVirtualNetworkNumber(DwFromSz(szBuf, 16));
|
|
|
|
// Rewrite the local versions of the frame type and Network Numbers
|
|
if (NULL != m_pAICurrent)
|
|
{
|
|
m_pAICurrent->SetDirty(TRUE);
|
|
|
|
// First empty the respective destination lists...
|
|
Assert(NULL != m_pAICurrent);
|
|
DeleteColString(&m_pAICurrent->m_lstpstrFrmType);
|
|
DeleteColString(&m_pAICurrent->m_lstpstrNetworkNum);
|
|
|
|
// When the listbox is empty we're in AUTO mode
|
|
if (0 == ListView_GetItemCount(m_hwndLV))
|
|
{
|
|
m_nRadioBttn = BTN_IPXAS_AUTO;
|
|
CheckRadioButton(BTN_IPXAS_AUTO, BTN_IPXAS_MANUAL, m_nRadioBttn);
|
|
}
|
|
|
|
// Only transfer the Frame Type/Network Number information if manual
|
|
// frame type detection was requested.
|
|
if (BTN_IPXAS_MANUAL == m_nRadioBttn)
|
|
{
|
|
// Then create new destination lists from the local data
|
|
list<tstring *>::iterator iterFrmType = m_lstpstrFrmType.begin();
|
|
list<tstring *>::iterator iterNetworkNum = m_lstpstrNetworkNum.begin();
|
|
|
|
for (;iterFrmType != m_lstpstrFrmType.end(),
|
|
iterNetworkNum != m_lstpstrNetworkNum.end();
|
|
iterFrmType++,
|
|
iterNetworkNum++)
|
|
{
|
|
tstring *pstr1 = *iterFrmType;
|
|
tstring *pstr2 = *iterNetworkNum;
|
|
m_pAICurrent->m_lstpstrFrmType.push_back(new tstring(pstr1->c_str()));
|
|
m_pAICurrent->m_lstpstrNetworkNum.push_back(new tstring(pstr2->c_str()));
|
|
}
|
|
}
|
|
|
|
Assert(m_pAICurrent->m_lstpstrFrmType.size() == m_pAICurrent->m_lstpstrNetworkNum.size());
|
|
|
|
// If the destination lists end up empty, supply default values
|
|
if (0 == m_pAICurrent->m_lstpstrFrmType.size())
|
|
{
|
|
WCHAR szBuf[12];
|
|
HexSzFromDw(szBuf, c_dwPktTypeDefault);
|
|
|
|
m_pAICurrent->m_lstpstrFrmType.push_back(new tstring(szBuf));
|
|
m_pAICurrent->m_lstpstrNetworkNum.push_back(new tstring(c_sz8Zeros));
|
|
}
|
|
}
|
|
|
|
TraceError("CIpxASConfigDlg::OnOk", hr);
|
|
return LresFromHr(hr);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::OnContextMenu
|
|
//
|
|
// Purpose: Context sensitive help support.
|
|
//
|
|
// Author: jeffspr 13 Apr 1999
|
|
//
|
|
// Notes:
|
|
//
|
|
LRESULT CIpxASConfigDlg::OnContextMenu(UINT uMsg, WPARAM wParam,
|
|
LPARAM lParam, BOOL& fHandled)
|
|
{
|
|
return CommonIPXOnContextMenu(m_hWnd, g_aHelpIDs_DLG_IPXAS_CONFIG);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::OnHelp
|
|
//
|
|
// Purpose: Context sensitive help support.
|
|
//
|
|
// Author: jeffspr 13 Apr 1999
|
|
//
|
|
// Notes:
|
|
//
|
|
LRESULT CIpxASConfigDlg::OnHelp(UINT uMsg, WPARAM wParam,
|
|
LPARAM lParam, BOOL& fHandled)
|
|
{
|
|
return ::CommonIPXOnHelp(lParam, g_aHelpIDs_DLG_IPXAS_CONFIG);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::OnAdd
|
|
//
|
|
// Purpose: Called when the Add button is pressed. Used to add additional
|
|
// frame type/network number pairs
|
|
//
|
|
// Parameters:
|
|
// wNotifyCode [in]
|
|
// wID [in]
|
|
// pnmh [in] See the ATL documentation for params.
|
|
// bHandled [in]
|
|
//
|
|
// Returns: See the ATL documentation for return results.
|
|
//
|
|
// Author: scottbri 29-Apr-1997
|
|
//
|
|
LRESULT CIpxASConfigDlg::OnAdd(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
CASAddDialog * pdlg;
|
|
|
|
if (NULL == m_pAICurrent)
|
|
return 0;
|
|
|
|
SetChangedFlag();
|
|
|
|
// Bring up the dialog
|
|
pdlg = new CASAddDialog(this, m_hwndLV, m_dwMediaType,
|
|
c_dwPktTypeDefault, c_sz8Zeros);
|
|
|
|
if (pdlg == NULL)
|
|
{
|
|
return(ERROR_NOT_ENOUGH_MEMORY);
|
|
}
|
|
|
|
if (pdlg->DoModal(m_hWnd) == IDOK)
|
|
{
|
|
// Update the internal structures and the dialog with the returned values
|
|
if (S_OK == HrAddItemToList(pdlg->IdsGetFrameType(), pdlg->SzGetNetworkNumber()))
|
|
{
|
|
// Validated above, so add to the internal list
|
|
WCHAR szBuf[12];
|
|
HexSzFromDw(szBuf,pdlg->DwGetFrameType());
|
|
m_lstpstrFrmType.push_back(new tstring(szBuf));
|
|
m_lstpstrNetworkNum.push_back(new tstring(pdlg->SzGetNetworkNumber()));
|
|
|
|
// Select the new item
|
|
int nCount = ListView_GetItemCount(m_hwndLV);
|
|
Assert(0 < nCount);
|
|
ListView_SetItemState(m_hwndLV, nCount-1, LVIS_SELECTED, LVIS_SELECTED);
|
|
|
|
// Update the state of the Add, Edit, and Remove buttons
|
|
HWND hwndFocus = GetFocus();
|
|
UpdateButtons();
|
|
if (!::IsWindowEnabled(hwndFocus))
|
|
{
|
|
::SetFocus(GetDlgItem(BTN_IPXAS_EDIT));
|
|
}
|
|
}
|
|
}
|
|
|
|
delete pdlg;
|
|
|
|
return 0;
|
|
}
|
|
|
|
LRESULT CIpxASConfigDlg::HandleInternalNetworkNumber(
|
|
WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
if (EN_CHANGE == wNotifyCode)
|
|
{
|
|
SetChangedFlag();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::OnEdit
|
|
//
|
|
// Purpose: Called when the Edit button is pressed. Used to edit a
|
|
// Frame Type/Network number pair
|
|
//
|
|
// Parameters:
|
|
// wNotifyCode [in]
|
|
// wID [in]
|
|
// pnmh [in] See the ATL documentation for params.
|
|
// bHandled [in]
|
|
//
|
|
// Returns: See the ATL documentation for return results.
|
|
//
|
|
// Author: scottbri 29-Apr-1997
|
|
//
|
|
LRESULT CIpxASConfigDlg::OnEdit(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
int nIdx = 0;
|
|
int nIdxSelected;
|
|
|
|
// Locate the selected row in the listview
|
|
if (FALSE == FGetSelectedRowIdx(&nIdxSelected))
|
|
return 0;
|
|
|
|
if (NULL == m_pAICurrent)
|
|
return 0;
|
|
|
|
SetChangedFlag();
|
|
|
|
// Enumerate the internal data to locate the frame type/network number for
|
|
// the selection
|
|
list<tstring *>::iterator iterFrmType = m_lstpstrFrmType.begin();
|
|
list<tstring *>::iterator iterNetworkNum = m_lstpstrNetworkNum.begin();
|
|
while ((iterFrmType != m_lstpstrFrmType.end()) &&
|
|
(iterNetworkNum != m_lstpstrNetworkNum.end()))
|
|
{
|
|
if (nIdx == nIdxSelected)
|
|
{
|
|
tstring *pstr1 = *iterNetworkNum;
|
|
tstring *pstr2 = *iterFrmType;
|
|
|
|
// Create the dialog
|
|
CASEditDialog * pdlg = new CASEditDialog(this, m_hwndLV,
|
|
DwFromSz(pstr2->c_str(), 16),
|
|
pstr1->c_str());
|
|
if (pdlg->DoModal(m_hWnd) == IDOK)
|
|
{
|
|
LV_ITEM lvi;
|
|
|
|
// Apply the dialog changes to the ListView Control
|
|
ZeroMemory(&lvi, sizeof(lvi));
|
|
lvi.mask = LVIF_TEXT;
|
|
lvi.iItem = nIdxSelected;
|
|
lvi.iSubItem = 1;
|
|
lvi.pszText = (PWSTR)pdlg->SzGetNetworkNumber();
|
|
ListView_SetItem(m_hwndLV, &lvi);
|
|
|
|
// Apply the changes to the local data
|
|
*(*iterNetworkNum) = pdlg->SzGetNetworkNumber();
|
|
}
|
|
|
|
delete pdlg;
|
|
break;
|
|
}
|
|
|
|
nIdx++;
|
|
iterFrmType++;
|
|
iterNetworkNum++;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::FGetSelectedRowIdx
|
|
//
|
|
// Purpose: Returns the index of the selected row in the listview, if it exists
|
|
//
|
|
// Parameters: pnIdx [out] - The selected row's zero based index
|
|
//
|
|
// Returns: BOOL, TRUE if a selected row exists, FALSE otherwise
|
|
//
|
|
BOOL CIpxASConfigDlg::FGetSelectedRowIdx(int *pnIdx)
|
|
{
|
|
int nCount = ListView_GetItemCount(m_hwndLV);
|
|
int nIdx;
|
|
LV_ITEM lvi;
|
|
|
|
lvi.mask = LVIF_STATE;
|
|
lvi.iSubItem = 0;
|
|
lvi.stateMask = LVIS_SELECTED;
|
|
|
|
// Determine the selected pair
|
|
for (nIdx = 0; nIdx < nCount; nIdx++)
|
|
{
|
|
lvi.iItem = nIdx;
|
|
if ((TRUE == ListView_GetItem(m_hwndLV, &lvi)) &&
|
|
(lvi.state & LVIS_SELECTED))
|
|
{
|
|
// Located the selected Item
|
|
*pnIdx = nIdx;
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
*pnIdx = 0;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASConfigDlg::OnRemove
|
|
//
|
|
// Purpose: Called when the Remove button is pressed. Used to remove a
|
|
// Frame Type/Network Number pair.
|
|
//
|
|
// Parameters:
|
|
// wNotifyCode [in]
|
|
// wID [in]
|
|
// pnmh [in] See the ATL documentation for params.
|
|
// bHandled [in]
|
|
//
|
|
// Returns: See the ATL documentation for return results.
|
|
//
|
|
// Author: scottbri 29-Apr-1997
|
|
//
|
|
LRESULT
|
|
CIpxASConfigDlg::OnRemove(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
int nCount;
|
|
int nIdx = 0;
|
|
int nIdxSelected;
|
|
#ifdef DBG
|
|
BOOL fFound = FALSE;
|
|
#endif
|
|
|
|
// Locate the selected row in the listview
|
|
if (FALSE == FGetSelectedRowIdx(&nIdxSelected))
|
|
return 0;
|
|
|
|
if (NULL == m_pAICurrent)
|
|
return 0;
|
|
|
|
SetChangedFlag();
|
|
|
|
// Remove the row from the internal local representation and listview
|
|
list<tstring *>::iterator iterFrmType = m_lstpstrFrmType.begin();
|
|
list<tstring *>::iterator iterNetworkNum = m_lstpstrNetworkNum.begin();
|
|
while ((iterFrmType != m_lstpstrFrmType.end()) &&
|
|
(iterNetworkNum != m_lstpstrNetworkNum.end()))
|
|
{
|
|
if (nIdx == nIdxSelected)
|
|
{
|
|
#ifdef DBG
|
|
fFound = TRUE;
|
|
#endif
|
|
// Remove and free the Frame Type piece
|
|
tstring *pstr = *iterFrmType;
|
|
m_lstpstrFrmType.erase(iterFrmType);
|
|
delete pstr;
|
|
|
|
// Remove and free the Network Number piece
|
|
pstr = *iterNetworkNum;
|
|
m_lstpstrNetworkNum.erase(iterNetworkNum);
|
|
delete pstr;
|
|
|
|
// We're done...
|
|
break;
|
|
}
|
|
|
|
nIdx++;
|
|
iterFrmType++;
|
|
iterNetworkNum++;
|
|
}
|
|
|
|
#ifdef DBG
|
|
Assert(TRUE == fFound);
|
|
#endif
|
|
|
|
// Remove the frame type/network number pair from the list view
|
|
ListView_DeleteItem(m_hwndLV, nIdxSelected);
|
|
|
|
nCount = ListView_GetItemCount(m_hwndLV);
|
|
if (nCount <= nIdxSelected)
|
|
{
|
|
nIdxSelected = nCount - 1;
|
|
}
|
|
if (0 <= nIdxSelected)
|
|
{
|
|
ListView_SetItemState(m_hwndLV, nIdxSelected, LVIS_SELECTED, LVIS_SELECTED);
|
|
}
|
|
|
|
// Update the state of the Add, Edit, and Remove buttons
|
|
HWND hwndFocus = GetFocus();
|
|
UpdateButtons();
|
|
if (!::IsWindowEnabled(hwndFocus))
|
|
{
|
|
::SetFocus(GetDlgItem(BTN_IPXAS_ADD));
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#ifdef INCLUDE_RIP_ROUTING
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASInternalDlg::CIpxASInternalDlg
|
|
//
|
|
// Purpose: ctor for the CIpxASInternalDlg class
|
|
//
|
|
// Parameters: none
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
// Author: scottbri 29-Apr-1997
|
|
//
|
|
CIpxASInternalDlg::CIpxASInternalDlg(CNwlnkIPX *pmsc,
|
|
CIpxEnviroment * pIpxEnviroment)
|
|
{
|
|
// Note these parameters are on loan, do not free them...
|
|
Assert(NULL != pmsc);
|
|
Assert(NULL != pIpxEnviroment);
|
|
m_pmsc = pmsc;
|
|
m_pIpxEnviroment = pIpxEnviroment;
|
|
|
|
m_dwRipValue = 0;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASInternalDlg::OnInitDialog
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Parameters:
|
|
// wNotifyCode [in]
|
|
// wID [in]
|
|
// pnmh [in] See the ATL documentation for params.
|
|
// bHandled [in]
|
|
//
|
|
// Returns: See the ATL documentation for return results.
|
|
//
|
|
LRESULT
|
|
CIpxASInternalDlg::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled)
|
|
{
|
|
::EnableWindow(GetDlgItem(BTN_IPXAS_RIP), m_pIpxEnviroment->FRipEnabled());
|
|
CheckDlgButton(BTN_IPXAS_RIP, m_pIpxEnviroment->FRipEnabled());
|
|
return 0;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASInternalDlg::OnRip
|
|
//
|
|
// Purpose: Handle changes to the Rip check box on the routing page
|
|
//
|
|
// Parameters:
|
|
// wNotifyCode [in]
|
|
// wID [in]
|
|
// pnmh [in] See the ATL documentation for params.
|
|
// bHandled [in]
|
|
//
|
|
// Returns: See the ATL documentation for return results.
|
|
//
|
|
LRESULT
|
|
CIpxASInternalDlg::OnRip(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
if (BN_CLICKED != wNotifyCode)
|
|
{
|
|
bHandled = FALSE;
|
|
return 0L;
|
|
}
|
|
|
|
if (!m_pIpxEnviroment->FRipInstalled())
|
|
{
|
|
// Don't allow the user to check this box, if rip isn't installed
|
|
if (IsDlgButtonChecked(BTN_IPXAS_RIP))
|
|
CheckDlgButton(BTN_IPXAS_RIP, FALSE);
|
|
|
|
// Tell the user they must install RIP first
|
|
//$ REVIEW - Post Beta 1, this should trigger Rip Installation
|
|
NcMsgBox(m_hWnd, IDS_ROUTING, IDS_INSTALL_RIP,
|
|
MB_OK | MB_ICONEXCLAMATION);
|
|
}
|
|
else
|
|
{
|
|
m_dwRipValue = 0;
|
|
|
|
// Ask the user if they want type 20 broadcast enabled
|
|
if (!m_pIpxEnviroment->FRipInstalled())
|
|
{
|
|
if (IDYES == NcMsgBox(m_hWnd, IDS_ROUTING, IDS_NETBIOS_BROADCAST,
|
|
MB_YESNO | MB_ICONQUESTION))
|
|
m_dwRipValue = 1;
|
|
}
|
|
}
|
|
|
|
return 0L;
|
|
}
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASInternalDlg::OnOk
|
|
//
|
|
// Purpose: Called when the OK button is pressed.
|
|
//
|
|
// Parameters:
|
|
// idCtrl [in]
|
|
// pnmh [in] See the ATL documentation for params.
|
|
// bHandled [in]
|
|
//
|
|
// Returns: See the ATL documentation for return results.
|
|
//
|
|
// Author: scottbri 29-Apr-1997
|
|
//
|
|
LRESULT CIpxASInternalDlg::OnOk(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
// Was the RIP checkbox changed?
|
|
if (IsDlgButtonChecked(BTN_IPXAS_RIP) != m_pIpxEnviroment->FRipEnabled())
|
|
{
|
|
m_pIpxEnviroment->ChangeRipEnabling(IsDlgButtonChecked(BTN_IPXAS_RIP),
|
|
m_dwRipValue);
|
|
}
|
|
|
|
TraceError("CIpxASInternalDlg::OnOk", hr);
|
|
return LresFromHr(hr);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASInternalDlg::OnContextMenu
|
|
//
|
|
// Purpose: Context sensitive help support.
|
|
//
|
|
// Author: jeffspr 13 Apr 1999
|
|
//
|
|
// Notes:
|
|
//
|
|
LRESULT CIpxASInternalDlg::OnContextMenu(UINT uMsg, WPARAM wParam,
|
|
LPARAM lParam, BOOL& fHandled)
|
|
{
|
|
return ::CommonIPXOnContextMenu(m_hWnd, g_aHelpIDs_DLG_IPXAS_INTERNAL);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CIpxASInternalDlg::OnHelp
|
|
//
|
|
// Purpose: Context sensitive help support.
|
|
//
|
|
// Author: jeffspr 13 Apr 1999
|
|
//
|
|
// Notes:
|
|
//
|
|
LRESULT CIpxASInternalDlg::OnHelp(UINT uMsg, WPARAM wParam,
|
|
LPARAM lParam, BOOL& fHandled)
|
|
{
|
|
return ::CommonIPXOnHelp(lParam, g_aHelpIDs_DLG_IPXAS_INTERNAL);
|
|
}
|
|
|
|
#endif // INCLUDE_RIP_ROUTING
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: CenterChildOverListView
|
|
//
|
|
// Purpose: Center the specified top level window over the listview
|
|
// control of the parent dialog
|
|
//
|
|
// Parameters: hwnd - Dialog to center
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
void CenterChildOverListView(HWND hwnd, HWND hwndLV)
|
|
{
|
|
RECT rc;
|
|
::GetWindowRect(hwndLV, &rc);
|
|
::SetWindowPos(hwnd, NULL, rc.left, rc.top, 0, 0,
|
|
SWP_NOZORDER|SWP_NOSIZE|SWP_NOACTIVATE);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CASAddDialog::CASAddDialog
|
|
//
|
|
// Purpose: ctor for the CASAddDialog class
|
|
//
|
|
// Parameters: dwMediaType -
|
|
// dwFrameType -
|
|
// szNetworkNumber -
|
|
//
|
|
// Returns: nothing
|
|
//
|
|
CASAddDialog::CASAddDialog(CIpxASConfigDlg * pASCD, HWND hwndLV,
|
|
DWORD dwMediaType, DWORD dwFrameType,
|
|
PCWSTR pszNetworkNum) :
|
|
m_strNetworkNumber(pszNetworkNum)
|
|
{
|
|
m_pASCD = pASCD; // Borrowed pointer
|
|
m_hwndLV = hwndLV;
|
|
m_dwMediaType = dwMediaType;
|
|
m_dwFrameType = dwFrameType;
|
|
m_idsFrameType = 0; // Out param
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CASAddDialog::OnInitDialog
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Parameters:
|
|
// wNotifyCode [in]
|
|
// wID [in]
|
|
// pnmh [in] See the ATL documentation for params.
|
|
// bHandled [in]
|
|
//
|
|
// Returns: See the ATL documentation for return results.
|
|
//
|
|
LRESULT
|
|
CASAddDialog::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled)
|
|
{
|
|
Assert(NULL != m_hwndLV);
|
|
HWND hwndCBM = GetDlgItem(CMB_IPXAS_DEST);
|
|
HWND hwndEdit = GetDlgItem(EDT_IPXAS_NETNUM);
|
|
|
|
// Search for the set of frames matching this adapter's media type
|
|
|
|
for (int idxMM=0; idxMM < celems(MediaMap); idxMM++)
|
|
{
|
|
if (m_dwMediaType == MediaMap[idxMM].dwMediaType)
|
|
{
|
|
const FRAME_TYPE *ft = MediaMap[idxMM].aFrameType;
|
|
|
|
// For each frame type not already in use, present in the server's
|
|
// general page ListView, add the available combo box
|
|
|
|
for (int idxFT=0; 0 != ft[idxFT].nFrameIds; idxFT++)
|
|
{
|
|
LV_FINDINFO lvfi;
|
|
lvfi.flags = LVFI_STRING;
|
|
lvfi.psz = SzLoadIds(ft[idxFT].nFrameIds);
|
|
|
|
if ((IDS_AUTO != ft[idxFT].nFrameIds) &&
|
|
(-1 == ListView_FindItem(m_hwndLV, -1, &lvfi)))
|
|
{
|
|
int idx = ::SendMessage(hwndCBM, CB_ADDSTRING, 0,
|
|
(LPARAM)SzLoadIds(ft[idxFT].nFrameIds));
|
|
if (CB_ERR != idx)
|
|
{
|
|
// Store the IDS we used for future reference
|
|
::SendMessage(hwndCBM, CB_SETITEMDATA, idx, ft[idxFT].nFrameIds);
|
|
}
|
|
}
|
|
}
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Select the first item in the combo box
|
|
Assert(0 != ::SendMessage(hwndCBM, CB_GETCOUNT, 0, 0L));
|
|
::SendMessage(hwndCBM, CB_SETCURSEL, 0, 0L);
|
|
|
|
// Subclass the network number edit control
|
|
::SetWindowLongPtr(hwndEdit, GWLP_USERDATA,
|
|
::GetWindowLongPtr(hwndEdit, GWLP_WNDPROC));
|
|
::SetWindowLongPtr(hwndEdit, GWLP_WNDPROC, (LONG_PTR)EditSubclassProc);
|
|
|
|
// Limit the text in the network # edit control
|
|
::SendMessage(hwndEdit, EM_LIMITTEXT, MAX_NETNUM_SIZE, 0L);
|
|
|
|
// Initialize the network controls contents
|
|
::SetWindowText(hwndEdit, m_strNetworkNumber.c_str());
|
|
|
|
// Center window of parent's listview window
|
|
CenterChildOverListView(m_hWnd, m_hwndLV);
|
|
|
|
return 0;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CASAddDialog::OnOk
|
|
//
|
|
// Purpose:
|
|
//
|
|
// Parameters:
|
|
// wNotifyCode [in]
|
|
// wID [in]
|
|
// pnmh [in] See the ATL documentation for params.
|
|
// bHandled [in]
|
|
//
|
|
// Returns: See the ATL documentation for return results.
|
|
//
|
|
LRESULT
|
|
CASAddDialog::OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled)
|
|
{
|
|
HWND hwndCBM = GetDlgItem(CMB_IPXAS_DEST);
|
|
WCHAR szBuf[12];
|
|
|
|
// Retrieve the network number
|
|
::GetWindowText(GetDlgItem(EDT_IPXAS_NETNUM), szBuf, sizeof(szBuf)/sizeof(WCHAR));
|
|
if (lstrlenW(szBuf))
|
|
{
|
|
// Normalize value (String -> Number -> Formated String)
|
|
DWORD dw = DwFromSz(szBuf, 16);
|
|
HexSzFromDw(szBuf, dw);
|
|
}
|
|
else
|
|
{
|
|
// Tell the user they must enter a number
|
|
NcMsgBox(m_hWnd, IDS_MANUAL_FRAME_DETECT, IDS_INCORRECT_NETNUM,
|
|
MB_OK | MB_ICONEXCLAMATION);
|
|
return 0L;
|
|
}
|
|
|
|
// Retrieve the selection form the combo box
|
|
int idx = ::SendMessage(hwndCBM, CB_GETCURSEL, 0, 0L);
|
|
if (CB_ERR != idx)
|
|
{
|
|
UINT idsFrameType = ::SendMessage(hwndCBM, CB_GETITEMDATA, idx, 0L);
|
|
Assert(CB_ERR != idsFrameType);
|
|
|
|
// Look up the Frame IDS to retreive the actual frame type
|
|
for (int idxMM=0; idxMM < celems(MediaMap); idxMM++)
|
|
{
|
|
if (MediaMap[idxMM].dwMediaType != m_dwMediaType)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
const FRAME_TYPE *ft = MediaMap[idxMM].aFrameType;
|
|
|
|
for (int idxFT=0; 0 != ft[idxFT].nFrameIds; idxFT++)
|
|
{
|
|
if (ft[idxFT].nFrameIds != idsFrameType)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
// Ensure the frame type/netnum is not in use elsewhere
|
|
if (m_pASCD->FIsNetNumberInUse(ft[idxFT].dwFrameType, szBuf))
|
|
{
|
|
// Warn the user that the network number specified
|
|
// was already in use.
|
|
NcMsgBox(m_hWnd, IDS_GENERAL, IDS_NETNUM_INUSE,
|
|
MB_OK | MB_ICONEXCLAMATION);
|
|
goto Done;
|
|
}
|
|
|
|
m_strNetworkNumber = szBuf;
|
|
|
|
// Return the stashed Frame IDS
|
|
m_idsFrameType = idsFrameType;
|
|
|
|
// Return the selected frame type
|
|
m_dwFrameType = ft[idxFT].dwFrameType;
|
|
EndDialog(IDOK);
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
Done:
|
|
return 0;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CASAddDlg::OnContextMenu
|
|
//
|
|
// Purpose: Context sensitive help support.
|
|
//
|
|
// Author: jeffspr 13 Apr 1999
|
|
//
|
|
// Notes:
|
|
//
|
|
LRESULT CASAddDialog::OnContextMenu(UINT uMsg, WPARAM wParam,
|
|
LPARAM lParam, BOOL& fHandled)
|
|
{
|
|
return ::CommonIPXOnContextMenu(m_hWnd, g_aHelpIDs_DLG_IPXAS_FRAME_ADD);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CASAddDlg::OnHelp
|
|
//
|
|
// Purpose: Context sensitive help support.
|
|
//
|
|
// Author: jeffspr 13 Apr 1999
|
|
//
|
|
// Notes:
|
|
//
|
|
LRESULT CASAddDialog::OnHelp(UINT uMsg, WPARAM wParam,
|
|
LPARAM lParam, BOOL& fHandled)
|
|
{
|
|
return ::CommonIPXOnHelp(lParam, g_aHelpIDs_DLG_IPXAS_FRAME_ADD);
|
|
}
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CASEditDialog::OnInitDialog
|
|
//
|
|
// Purpose: Initialize the contents of the Edit Network Number dialog
|
|
//
|
|
// Parameters:
|
|
// wNotifyCode [in]
|
|
// wID [in]
|
|
// pnmh [in] See the ATL documentation for params.
|
|
// bHandled [in]
|
|
//
|
|
// Returns: See the ATL documentation for return results.
|
|
//
|
|
LRESULT
|
|
CASEditDialog::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled)
|
|
{
|
|
HWND hwndEdit = GetDlgItem(EDT_IPXAS_NETNUM);
|
|
|
|
// Set the initial contents of the network number edit control
|
|
::SetWindowText(hwndEdit, SzGetNetworkNumber());
|
|
|
|
// Subclass the network number edit control
|
|
::SetWindowLongPtr(hwndEdit, GWLP_USERDATA,
|
|
::GetWindowLongPtr(hwndEdit, GWLP_WNDPROC));
|
|
::SetWindowLongPtr(hwndEdit, GWLP_WNDPROC, (LONG_PTR)EditSubclassProc);
|
|
|
|
// Limit the text in the network # edit control
|
|
::SendMessage(hwndEdit, EM_LIMITTEXT, MAX_NETNUM_SIZE, 0L);
|
|
|
|
// Center the dialog over the listview of the parent
|
|
CenterChildOverListView(m_hWnd, m_hwndLV);
|
|
|
|
return 0L;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CASEditDialog::OnOk
|
|
//
|
|
// Purpose: Process the Apply request for the Edit Network Number dialog
|
|
//
|
|
// Parameters:
|
|
// wNotifyCode [in]
|
|
// wID [in]
|
|
// pnmh [in] See the ATL documentation for params.
|
|
// bHandled [in]
|
|
//
|
|
// Returns: See the ATL documentation for return results.
|
|
//
|
|
LRESULT
|
|
CASEditDialog::OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled)
|
|
{
|
|
DWORD dw;
|
|
WCHAR szBuf[12];
|
|
HWND hwndEdit = GetDlgItem(EDT_IPXAS_NETNUM);
|
|
|
|
::GetWindowText(hwndEdit, szBuf, sizeof(szBuf)/sizeof(WCHAR));
|
|
if (0 == lstrlenW(szBuf))
|
|
{
|
|
// Tell the user they must enter a number
|
|
NcMsgBox(m_hWnd, IDS_MANUAL_FRAME_DETECT, IDS_INCORRECT_NETNUM,
|
|
MB_OK | MB_ICONEXCLAMATION);
|
|
return 0L;
|
|
}
|
|
|
|
// Normalize the return value
|
|
dw = DwFromSz(szBuf, 16);
|
|
HexSzFromDw(szBuf, dw);
|
|
|
|
// If the network number was changed, verify it's uniqueness
|
|
if ((0 != lstrcmpW(szBuf, m_strNetworkNumber.c_str())) &&
|
|
m_pASCD->FIsNetNumberInUse(m_dwFrameType, szBuf))
|
|
{
|
|
// Warn the user that the network number specified
|
|
// was already in use.
|
|
NcMsgBox(m_hWnd, IDS_GENERAL, IDS_NETNUM_INUSE,
|
|
MB_OK | MB_ICONEXCLAMATION);
|
|
return 0L;
|
|
}
|
|
|
|
// Persist the return value
|
|
m_strNetworkNumber = szBuf;
|
|
|
|
EndDialog(IDOK);
|
|
return 0L;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CASEditDlg::OnContextMenu
|
|
//
|
|
// Purpose: Context sensitive help support.
|
|
//
|
|
// Author: jeffspr 13 Apr 1999
|
|
//
|
|
// Notes:
|
|
//
|
|
LRESULT CASEditDialog::OnContextMenu(UINT uMsg, WPARAM wParam,
|
|
LPARAM lParam, BOOL& fHandled)
|
|
{
|
|
return ::CommonIPXOnContextMenu(m_hWnd, g_aHelpIDs_DLG_IPXAS_FRAME_EDIT);
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CASEditDlg::OnHelp
|
|
//
|
|
// Purpose: Context sensitive help support.
|
|
//
|
|
// Author: jeffspr 13 Apr 1999
|
|
//
|
|
// Notes:
|
|
//
|
|
LRESULT CASEditDialog::OnHelp(UINT uMsg, WPARAM wParam,
|
|
LPARAM lParam, BOOL& fHandled)
|
|
{
|
|
return ::CommonIPXOnHelp(lParam, g_aHelpIDs_DLG_IPXAS_FRAME_EDIT);
|
|
}
|
|
|
|
|
|
|