|
|
//----------------------------------------------------------------------------
//
// Copyright (c) 1997-1999 Microsoft Corporation
// All rights reserved.
//
// File Name:
// tcpipip.c
//
// Description:
//
//----------------------------------------------------------------------------
#include "pch.h"
#include "resource.h"
#include "tcpip.h"
//----------------------------------------------------------------------------
//
// Function: ChangeIPDlgProc
//
// Purpose: Dialog procedure for allowing the user to add or edit an IP and Subnet Mask
//
// Arguments: standard Win32 dialog proc arguments
//
// Returns:
//
//----------------------------------------------------------------------------
INT_PTR CALLBACK ChangeIPDlgProc( IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam) {
BOOL bStatus = TRUE; HWND hIPEditBox = GetDlgItem( hwnd, IDC_IPADDR_ADV_CHANGEIP_IP ); HWND hSubnetEditBox = GetDlgItem( hwnd, IDC_IPADDR_ADV_CHANGEIP_SUB );
switch( uMsg ) {
case WM_INITDIALOG: {
SetWindowText( hIPEditBox, szIPString );
SetWindowText( hSubnetEditBox, szSubnetMask );
SetFocus( hIPEditBox );
bStatus = FALSE; // return FALSE, we set the keyboard focus
break;
}
case WM_COMMAND: {
int nButtonId = LOWORD( wParam );
switch ( nButtonId ) {
case IDOK: {
// return a 1 to show an IP was added
GetWindowText( hIPEditBox, szIPString, IPSTRINGLENGTH+1 );
GetWindowText( hSubnetEditBox, szSubnetMask, IPSTRINGLENGTH+1 );
EndDialog( hwnd, 1 );
break;
}
case IDCANCEL: {
// return a 0 to show no IP was added
EndDialog( hwnd, 0 );
break; }
}
}
default: bStatus = FALSE; break;
}
return bStatus;
}
//----------------------------------------------------------------------------
//
// Function: SetGatewayInitialValues
//
// Purpose: To set the initial contents of the Gateway list box
//
// Arguments: IN HWND hwnd - handle to the dialog
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID SetGatewayInitialValues( IN HWND hwnd ) {
INT i; INT nEntries; TCHAR *pString;
nEntries = GetNameListSize( &NetSettings.pCurrentAdapter->Tcpip_GatewayAddresses );
//
// Iterate over the Gateway namelist adding each one to the Gateway List box
//
for( i = 0; i < nEntries; i++ ) {
pString = GetNameListName( &NetSettings.pCurrentAdapter->Tcpip_GatewayAddresses, i );
SendDlgItemMessage( hwnd, IDC_IPADDR_GATE, LB_ADDSTRING, 0, (LPARAM) pString );
}
//
// select the first entry
//
SendDlgItemMessage( hwnd, IDC_IPADDR_GATE, LB_SETCURSEL, 0, 0 );
}
//----------------------------------------------------------------------------
//
// Function: InsertItemIntoTcpipListView
//
// Purpose: hListView is the handle to the list view the IPStruct is to be
// added to
// position designates the position in the list view the item is to
// be inserted in
//
// Arguments:
//
// Returns: TRUE if the insert succeeded,
// FALSE if it failed
//
//----------------------------------------------------------------------------
// ISSUE-2002/02/28-stelo- move this to tcpipcom.c because optional uses it too. Should also be
// renamed??
BOOL InsertItemIntoTcpipListView( HWND hListView, LPARAM lParam, UINT position ) {
LVITEM lvI;
lvI.mask = LVIF_TEXT | LVIF_PARAM;
lvI.iItem = position; lvI.iSubItem = 0; lvI.pszText = LPSTR_TEXTCALLBACK; lvI.cchTextMax = MAX_ITEMLEN; lvI.lParam = lParam;
//
// if ListView_InsertItem returns a non-negative value then it succeeded
//
if( ListView_InsertItem( hListView, &lvI ) >= 0 ) return( TRUE ) ;
// insertion failed
return( FALSE ) ;
}
//----------------------------------------------------------------------------
//
// Function: SetIPandSubnetMaskInitialValues
//
// Purpose:
//
// Arguments:
//
// Returns:
//
//----------------------------------------------------------------------------
VOID SetIPandSubnetMaskInitialValues( IN HWND hwnd ) {
INT i; INT nEntries; LPTSTR pszIPAddress; LPTSTR pszSubnetMask; HWND hTcpipListView;
hTcpipListView = GetDlgItem( hwnd, IDC_IPADDR_ADVIP );
if( NetSettings.pCurrentAdapter->bObtainIPAddressAutomatically == TRUE ) {
//
// allocate space for the IP struct
//
IPStruct = malloc( sizeof(IP_STRUCT) ); if (IPStruct == NULL) { TerminateTheWizard(IDS_ERROR_OUTOFMEMORY); } lstrcpyn( IPStruct->szIPString, StrDhcpEnabled, AS(IPStruct->szIPString) );
// force the subnet mask field to be blank
lstrcpyn( IPStruct->szSubnetMask, _T(""), AS(IPStruct->szSubnetMask) );
//
// use an IP_STRUCT to pass the data, the name is somewhat misleading
// because we are not passing in an IP address in this case
//
InsertItemIntoTcpipListView( hTcpipListView, (LPARAM) IPStruct, 0 );
//
// Grey-out the Add, Edit and Remove buttons since none of these are
// available to the user when DHCP is enabled
//
EnableWindow( GetDlgItem( hwnd, IDC_IPADDR_ADDIP ), FALSE ); EnableWindow( GetDlgItem( hwnd, IDC_IPADDR_EDITIP ), FALSE ); EnableWindow( GetDlgItem( hwnd, IDC_IPADDR_REMOVEIP ), FALSE );
} else {
nEntries = GetNameListSize( &NetSettings.pCurrentAdapter->Tcpip_IpAddresses );
if( nEntries == 0 ) {
//
// Grey-out the Edit and Remove buttons since these are not
// available when there are no items in the ListView
//
EnableWindow( GetDlgItem( hwnd, IDC_IPADDR_EDITIP ), FALSE ); EnableWindow( GetDlgItem( hwnd, IDC_IPADDR_REMOVEIP ), FALSE );
}
for( i = 0; i < nEntries; i = i++ ) {
// allocate space for the IP struct
IPStruct = malloc( sizeof(IP_STRUCT) ); if ( IPStruct == NULL ) { TerminateTheWizard( IDS_ERROR_OUTOFMEMORY ); }
pszIPAddress = GetNameListName( &NetSettings.pCurrentAdapter->Tcpip_IpAddresses, i );
lstrcpyn( IPStruct->szIPString, pszIPAddress, AS(IPStruct->szIPString) );
pszSubnetMask = GetNameListName( &NetSettings.pCurrentAdapter->Tcpip_SubnetMaskAddresses, i );
lstrcpyn( IPStruct->szSubnetMask, pszSubnetMask, AS(IPStruct->szSubnetMask) );
InsertItemIntoTcpipListView( hTcpipListView, (LPARAM) IPStruct, i );
}
}
}
//----------------------------------------------------------------------------
//
// Function: OnTcpipIpInitDialog
//
// Purpose: loads button bitmaps from resources and initializes the list view
//
// Arguments: IN HWND hwnd - handle to the dialog
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID OnTcpipIpInitDialog( IN HWND hwnd ) {
LV_COLUMN lvCol; // list view column structure
INT iIndex; INT iNewItem; INT nEntries; INT colWidth; RECT rect; HWND hGatewayEditButton; HWND hGatewayRemoveButton; HWND hTcpipListView;
//
// Load strings from resources
//
StrDhcpEnabled = MyLoadString( IDS_DHCP_ENABLED );
StrIpAddress = MyLoadString( IDS_IP_ADDRESS ); StrSubnetMask = MyLoadString( IDS_SUBNET_MASK );
hTcpipListView = GetDlgItem( hwnd, IDC_IPADDR_ADVIP );
//
// This will always be the first page of the property sheet
// displayed so load the up and down icons and store the handles
// in global variables
//
if ( ! g_hIconUpArrow && ! g_hIconDownArrow ) {
g_hIconUpArrow = (HICON)LoadImage(FixedGlobals.hInstance, MAKEINTRESOURCE(IDI_UP_ARROW), IMAGE_ICON, 16, 16, 0);
g_hIconDownArrow = (HICON)LoadImage(FixedGlobals.hInstance, MAKEINTRESOURCE(IDI_DOWN_ARROW), IMAGE_ICON, 16, 16, 0);
}
// Place up/down arrow icons on buttons
SendDlgItemMessage( hwnd, IDC_IPADDR_UP, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)g_hIconUpArrow );
SendDlgItemMessage( hwnd, IDC_IPADDR_DOWN, BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)g_hIconDownArrow );
// Calculate column width
GetClientRect( hTcpipListView, &rect );
colWidth = ( rect.right / cIPSettingsColumns );
for( iIndex = 0; iIndex < cIPSettingsColumns; iIndex++ ) {
ListView_SetColumnWidth( hTcpipListView, iIndex, colWidth );
}
// The mask specifies that the fmt, width and pszText members
// of the structure are valid
lvCol.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT ; lvCol.fmt = LVCFMT_LEFT; // left-align column
lvCol.cx = colWidth; // width of column in pixels
// Add the two columns and header text
for( iIndex = 0; iIndex < cIPSettingsColumns; iIndex++ ) {
// column header text
if ( iIndex == 0 ) // first column
lvCol.pszText = (LPTSTR) StrIpAddress; else lvCol.pszText = (LPTSTR) StrSubnetMask;
iNewItem = ListView_InsertColumn( hTcpipListView, iIndex, &lvCol );
}
// fill the IP and Subnet mask list box with the appropriate
// initial value(s)
SetIPandSubnetMaskInitialValues( hwnd );
// fill the gateway list box with the appropriate initial value(s)
SetGatewayInitialValues( hwnd );
hGatewayEditButton = GetDlgItem( hwnd, IDC_IPADDR_EDITGATE ); hGatewayRemoveButton = GetDlgItem( hwnd, IDC_IPADDR_REMOVEGATE );
SetButtons( GetDlgItem( hwnd, IDC_IPADDR_GATE ), hGatewayEditButton, hGatewayRemoveButton );
SetArrows( hwnd, IDC_IPADDR_GATE, IDC_IPADDR_UP, IDC_IPADDR_DOWN );
}
//----------------------------------------------------------------------------
//
// Function: OnTcpipIpApply
//
// Purpose: stores the contents on the TCP/IP advanced IP address page into
// the global variables
//
// Arguments: IN HWND hwnd - handle to the dialog
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID OnTcpipIpApply( IN HWND hwnd ) {
INT_PTR i; INT_PTR iCount; LV_ITEM lvI; TCHAR szIP[IPSTRINGLENGTH + 1];
//
// delete any old settings in the Namelists
//
ResetNameList( &NetSettings.pCurrentAdapter->Tcpip_IpAddresses );
ResetNameList( &NetSettings.pCurrentAdapter->Tcpip_SubnetMaskAddresses );
iCount = ListView_GetItemCount( GetDlgItem( hwnd, IDC_IPADDR_ADVIP ) );
for( i = 0; i < iCount; i++ ) {
memset( &lvI, 0, sizeof(LV_ITEM) );
lvI.iItem = (int)i; lvI.mask = LVIF_PARAM;
ListView_GetItem( GetDlgItem( hwnd, IDC_IPADDR_ADVIP ), &lvI );
IPStruct = (IP_STRUCT*) lvI.lParam;
// store the IP string into the Namelist
TcpipAddNameToNameList( &NetSettings.pCurrentAdapter->Tcpip_IpAddresses, IPStruct->szIPString);
// store the Subnet Mask string into the Namelist
TcpipAddNameToNameList( &NetSettings.pCurrentAdapter->Tcpip_SubnetMaskAddresses, IPStruct->szSubnetMask );
}
ResetNameList( &NetSettings.pCurrentAdapter->Tcpip_GatewayAddresses );
//
// pull the IP address out of the Gateway list box and put them in the
// Gateway Namelist
//
iCount = SendDlgItemMessage( hwnd, IDC_IPADDR_GATE, LB_GETCOUNT, 0, 0 );
for( i = 0; i < iCount; i++ ) {
//
// get the IP string from the list box
//
SendDlgItemMessage( hwnd, IDC_IPADDR_GATE, LB_GETTEXT, i, (LPARAM) szIP );
//
// store the IP string in to the Namelist
//
TcpipAddNameToNameList( &NetSettings.pCurrentAdapter->Tcpip_GatewayAddresses, szIP );
}
}
//----------------------------------------------------------------------------
//
// Function: TCPIP_IPSettingsPageProc
//
// Purpose: Required function for the property sheet page to function properly.
// The important thing is to give the return value of 1 to the
// message PSPCB_CREATE and 0 for PSPCB_RELEASE
//
// Arguments:
//
// Returns:
//
//----------------------------------------------------------------------------
UINT CALLBACK TCPIP_IPSettingsPageProc( HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp ) {
switch ( uMsg ) {
case PSPCB_CREATE : return 1 ; // needed for property sheet page to initialize correctly
case PSPCB_RELEASE : return 0;
default: return -1;
}
}
//----------------------------------------------------------------------------
//
// Function: TCPIP_IPSettingsDlgProc
//
// Purpose: Dialog procedure for the IP Settings page of the property sheet
// handles all the messages sent to this window
//
// Arguments:
//
// Returns:
//
//----------------------------------------------------------------------------
INT_PTR CALLBACK TCPIP_IPSettingsDlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) {
switch( uMsg ) {
case WM_INITDIALOG: {
OnTcpipIpInitDialog( hwndDlg );
return TRUE ;
}
case WM_DESTROY: {
// deallocate space for all items still in the List View
INT i; INT iCount; LV_ITEM lvI;
//
// iterate through the ListView getting each item and
// deallocating the space for it
//
iCount = ListView_GetItemCount( GetDlgItem( hwndDlg, IDC_IPADDR_ADVIP ) ); for( i = 0; i < iCount; i++ ) {
memset( &lvI, 0, sizeof(LV_ITEM) );
lvI.iItem = i; lvI.mask = LVIF_PARAM;
ListView_GetItem( GetDlgItem( hwndDlg, IDC_IPADDR_ADVIP ), &lvI );
free( (IP_STRUCT*) lvI.lParam );
}
return TRUE ;
}
case WM_COMMAND: {
WORD wNotifyCode = HIWORD( wParam ) ; WORD wButtonId = LOWORD( wParam ) ;
if( wNotifyCode == LBN_SELCHANGE ) {
SetArrows( hwndDlg, IDC_IPADDR_GATE, IDC_IPADDR_UP, IDC_IPADDR_DOWN );
}
switch ( wButtonId ) {
//
// IP Address Buttons
//
case IDC_IPADDR_ADDIP: {
// make the string blank since we will be adding a
// new IP address
szIPString[0] = _T('\0'); // and a new subnet mask
szSubnetMask[0] = _T('\0');
if( DialogBox( FixedGlobals.hInstance, (LPCTSTR) IDD_IPADDR_ADV_CHANGEIP, hwndDlg, ChangeIPDlgProc ) ) {
HWND hEditButton = GetDlgItem( hwndDlg, IDC_IPADDR_EDITIP );
HWND hRemoveButton = GetDlgItem( hwndDlg, IDC_IPADDR_REMOVEIP );
// allocate space for the IP struct
IPStruct = malloc( sizeof(IP_STRUCT) ); if (IPStruct == NULL) { TerminateTheWizard(IDS_ERROR_OUTOFMEMORY); }
// copy the strings that the user entered from the Dialog
// Box into the IP struct so it can be added to
// the list view
lstrcpyn( IPStruct->szIPString, szIPString, AS(IPStruct->szIPString) ); lstrcpyn( IPStruct->szSubnetMask, szSubnetMask, AS(IPStruct->szSubnetMask) );
InsertItemIntoTcpipListView( GetDlgItem( hwndDlg, IDC_IPADDR_ADVIP ), (LPARAM) IPStruct, 0 );
// an entry was just added so make sure the edit and remove buttons are enabled
EnableWindow( hEditButton, TRUE ); EnableWindow( hRemoveButton, TRUE );
}
return TRUE ;
}
case IDC_IPADDR_EDITIP: {
LV_ITEM lvI; BOOL bIsItemSelected = FALSE;
bIsItemSelected = GetSelectedItemFromListView( hwndDlg, IDC_IPADDR_ADVIP, &lvI );
if( bIsItemSelected ) { IPStruct = (IP_STRUCT*) lvI.lParam;
lstrcpyn( szIPString, IPStruct->szIPString, AS(szIPString) );
lstrcpyn( szSubnetMask, IPStruct->szSubnetMask, AS(szSubnetMask) );
if( DialogBox( FixedGlobals.hInstance, (LPCTSTR) IDD_IPADDR_ADV_CHANGEIP, hwndDlg, ChangeIPDlgProc ) ) {
lstrcpyn( IPStruct->szIPString, szIPString, AS(IPStruct->szIPString) ); lstrcpyn( IPStruct->szSubnetMask, szSubnetMask, AS(IPStruct->szSubnetMask) );
// delete the old item and insert the new one
ListView_DeleteItem( GetDlgItem( hwndDlg, IDC_IPADDR_ADVIP ), lvI.iItem );
InsertItemIntoTcpipListView( GetDlgItem( hwndDlg, IDC_IPADDR_ADVIP ), (LPARAM) IPStruct, lvI.iItem );
}
}
return TRUE ;
}
case IDC_IPADDR_REMOVEIP: {
LV_ITEM lvI; BOOL bIsItemSelected = FALSE;
bIsItemSelected = GetSelectedItemFromListView( hwndDlg, IDC_IPADDR_ADVIP, &lvI );
//
// if there is an item selected, then free its memory and
// delete the item from the ListView
//
if( bIsItemSelected ) {
free( (IP_STRUCT*) lvI.lParam );
ListView_DeleteItem( GetDlgItem( hwndDlg, IDC_IPADDR_ADVIP ), lvI.iItem );
}
return TRUE ;
}
//
// Gateway Buttons
//
case IDC_IPADDR_ADDGATE:
g_CurrentEditBox = GATEWAY_EDITBOX;
OnAddButtonPressed( hwndDlg, IDC_IPADDR_GATE, IDC_IPADDR_EDITGATE, IDC_IPADDR_REMOVEGATE, (LPCTSTR) IDD_IPADDR_ADV_CHANGEGATE, GenericIPDlgProc );
SetArrows( hwndDlg, IDC_IPADDR_GATE, IDC_IPADDR_UP, IDC_IPADDR_DOWN );
return TRUE ;
case IDC_IPADDR_EDITGATE:
g_CurrentEditBox = GATEWAY_EDITBOX;
OnEditButtonPressed( hwndDlg, IDC_IPADDR_GATE, (LPCTSTR) IDD_IPADDR_ADV_CHANGEGATE, GenericIPDlgProc );
SetArrows( hwndDlg, IDC_IPADDR_GATE, IDC_IPADDR_UP, IDC_IPADDR_DOWN );
return TRUE ;
case IDC_IPADDR_REMOVEGATE:
OnRemoveButtonPressed( hwndDlg, IDC_IPADDR_GATE, IDC_IPADDR_EDITGATE, IDC_IPADDR_REMOVEGATE );
SetArrows( hwndDlg, IDC_IPADDR_GATE, IDC_IPADDR_UP, IDC_IPADDR_DOWN );
return TRUE ;
case IDC_IPADDR_UP:
OnUpButtonPressed( hwndDlg, IDC_IPADDR_GATE );
SetArrows( hwndDlg, IDC_IPADDR_GATE, IDC_IPADDR_UP, IDC_IPADDR_DOWN );
return TRUE ;
case IDC_IPADDR_DOWN:
OnDownButtonPressed( hwndDlg, IDC_IPADDR_GATE );
SetArrows( hwndDlg, IDC_IPADDR_GATE, IDC_IPADDR_UP, IDC_IPADDR_DOWN );
return TRUE ;
} // end switch
return FALSE ;
}
case WM_NOTIFY: {
LPNMHDR pnmh = (LPNMHDR) lParam; LV_DISPINFO *pLvdi = (LV_DISPINFO *) lParam; IP_STRUCT *pListViewEntry = (IP_STRUCT *) (pLvdi->item.lParam);
if( wParam == IDC_IPADDR_ADVIP ) {
if( pLvdi->hdr.code == LVN_GETDISPINFO ) {
switch( pLvdi->item.iSubItem ) {
case 0: pLvdi->item.pszText = pListViewEntry->szIPString; break; case 1: pLvdi->item.pszText = pListViewEntry->szSubnetMask; break;
}
}
}
switch( pnmh->code ) {
case PSN_APPLY: {
//
// user clicked the OK button on the property sheet
//
OnTcpipIpApply( hwndDlg );
return TRUE ;
}
}
default : return FALSE ;
}
}
}
//
// ISSUE-2002/02/28-stelo- this function is for debugging purposes only, remove for final product
// it is meant to be called from the debugger to show what the contents of a
// namelist is
//
VOID DumpNameList( NAMELIST *pNameList ) {
#if DBG
INT i; INT nEntries; TCHAR *szNameListEntry;
nEntries = GetNameListSize( pNameList );
for(i = 0; i < nEntries; i++ ) {
szNameListEntry = GetNameListName( pNameList, i );
OutputDebugString( szNameListEntry );
}
#endif
}
|