|
|
//----------------------------------------------------------------------------
//
// Copyright (c) 1997-1999 Microsoft Corporation
// All rights reserved.
//
// File Name:
// tcpipcom.c
//
// Description: Functions common to all the Advanced TCP/IP pages
//
//----------------------------------------------------------------------------
#include "pch.h"
#include "resource.h"
#include "tcpip.h"
//----------------------------------------------------------------------------
//
// Function: TcpipNameListInsertIdx
//
// Purpose: Whenever a TCP/IP item needs to inserted into a specific position
// in a list this function needs to be called. It checks for a duplicate.
// If one exists, it removes it and then does the insertion. Subnet masks
// should not use this function because duplicates are allowed for them.
//
// Arguments:
// IN OUT NAMELIST* TcpipNameList - namelist to add to
// IN TCHAR* pString - string to add (input)
// IN UINT idx - 0-based index on where to do the insertion
//
// Returns: if a duplicate was removed the index where the duplicate was,
// -1 if there was no duplicate
//
//----------------------------------------------------------------------------
INT TcpipNameListInsertIdx( IN OUT NAMELIST* TcpipNameList, IN TCHAR* pString, IN UINT idx ) {
INT iFound = -1;
iFound = FindNameInNameList( TcpipNameList, pString );
//
// if it is already in the list, then remove it
//
if( iFound != NOT_FOUND ) {
RemoveNameFromNameListIdx( TcpipNameList, iFound );
}
AddNameToNameListIdx( TcpipNameList, pString, idx );
return( iFound );
}
//----------------------------------------------------------------------------
//
// Function: TcpipAddNameToNameList
//
// Purpose: Whenever a TCP/IP item needs to inserted at the end of a list
// this function needs to be called. It checks for a duplicate. If one
// exists, it removes it and then does the insertion. Subnet masks should
// not use this function because duplicates are allowed for them.
//
// Arguments:
// IN OUT NAMELIST* TcpipNameList - namelist to add to
// IN TCHAR* pString - string to add (input)
//
// Returns: if a duplicate was removed the index where the duplicate was,
// -1 if there was no duplicate
//
//----------------------------------------------------------------------------
INT TcpipAddNameToNameList( IN OUT NAMELIST* TcpipNameList, IN TCHAR* pString ) {
return( TcpipNameListInsertIdx( TcpipNameList, pString, TcpipNameList->nEntries ) );
}
//----------------------------------------------------------------------------
//
// Function: OnAddButtonPressed
//
// Purpose: Generic procedure called whenever a user clicks the Add button on
// any of the property pages
//
// this function displays the appropriate dialog box, gets the data
// from the user and then inserts the data into the list box
//
// Arguments:
// IN HWND hwnd - handle to the dialog
// IN WORD ListBoxControlID - the list box to add the entry to
// IN WORD EditButtonControlID - the edit button associated with the
// list box
// IN WORD RemoveButtonControlID - the remove button associated with the
// list box
// IN LPCTSTR Dialog - the dialog control ID as a string
// IN DLGPROC DialogProc - the dialog procedure for the add button behavior
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID OnAddButtonPressed( IN HWND hwnd, IN WORD ListBoxControlID, IN WORD EditButtonControlID, IN WORD RemoveButtonControlID, IN LPCTSTR Dialog, IN DLGPROC DialogProc ) {
//
// make the string blank since we will be adding a new IP address
//
szIPString[0] = _T('\0');
if( DialogBox( FixedGlobals.hInstance, Dialog, hwnd, DialogProc ) ) {
HWND hListBox = GetDlgItem( hwnd, ListBoxControlID ); HWND hEditButton = GetDlgItem( hwnd, EditButtonControlID ); HWND hRemoveButton = GetDlgItem( hwnd, RemoveButtonControlID );
//
// Add the string to the list box and make it the current selection
//
SendMessage( hListBox, LB_ADDSTRING, 0, (LPARAM) szIPString );
SendMessage( hListBox, LB_SELECTSTRING, -1, (LPARAM) szIPString );
//
// an entry was just added so make sure the edit and remove buttons
// are enabled
//
EnableWindow( hEditButton, TRUE ); EnableWindow( hRemoveButton, TRUE );
}
}
//----------------------------------------------------------------------------
//
// Function: OnEditButtonPressed
//
// Purpose: Generic procedure called whenever a user clicks the Edit button
// on any of the property pages
//
// this function displays the appropriate dialog box, gets the data
// from the user and then deletes the old string and reinserts the
// new string into the list box
//
// Arguments:
// IN HWND hwnd - handle to the dialog
// IN WORD ListBoxControlID - the list box to in which to edit the entry
// IN LPCTSTR Dialog - the dialog control ID as a string
// IN DLGPROC DialogProc - the dialog procedure for the edit button
// behavior
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID OnEditButtonPressed( IN HWND hwnd, IN WORD ListBoxControlID, IN LPCTSTR Dialog, IN DLGPROC DialogProc ) {
INT_PTR iIndex; HWND hListBox = GetDlgItem( hwnd, ListBoxControlID );
iIndex = SendMessage( hListBox, LB_GETCURSEL, 0, 0 );
SendMessage( hListBox, LB_GETTEXT, iIndex, (LPARAM)szIPString );
if( DialogBox( FixedGlobals.hInstance, Dialog, hwnd, DialogProc ) ) { //
// Remove the old one and insert the new one
//
SendMessage( hListBox, LB_DELETESTRING, iIndex, 0 );
SendMessage( hListBox, LB_INSERTSTRING, iIndex, (LPARAM) szIPString );
SendMessage( hListBox, LB_SETCURSEL, iIndex, 0 );
}
}
//----------------------------------------------------------------------------
//
// Function: OnRemoveButtonPressed
//
// Purpose: Generic procedure called whenever a user clicks the Remove button
// on any of the property pages
//
// this function determines which entry is currently selected in the
// list box and deletes that item
//
// Arguments:
// IN HWND hwnd - handle to the dialog
// IN WORD ListBoxControlID - the list box to remove the entry from
// IN WORD EditButtonControlID - the edit button associated with the
// list box
// IN WORD RemoveButtonControlID - the remove button associated with the
// list box
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID OnRemoveButtonPressed( IN HWND hwnd, IN WORD ListBoxControlID, IN WORD EditButtonControlID, IN WORD RemoveButtonControlID ) { INT_PTR iIndex; INT_PTR iCount;
HWND hListBox = GetDlgItem( hwnd, ListBoxControlID ); HWND hEditButton = GetDlgItem( hwnd, EditButtonControlID ); HWND hRemoveButton = GetDlgItem( hwnd, RemoveButtonControlID );
//
// Remove the item from the list box by finding the index of the currently
// selected item and deleting
//
iIndex = SendMessage( hListBox, LB_GETCURSEL, 0, 0 );
SendMessage( hListBox, LB_DELETESTRING, iIndex, 0 );
//
// if there are no more items in the list box then grey-out the edit and remove buttons
//
iCount = SendMessage( hListBox, LB_GETCOUNT, 0, 0 );
if( iCount == 0 ) {
EnableWindow( hEditButton, FALSE );
EnableWindow( hRemoveButton, FALSE );
} else // else select the first item
{
SendMessage( hListBox, LB_SETCURSEL, 0, 0 );
}
}
//----------------------------------------------------------------------------
//
// Function: GenericIPDlgProc
//
// Purpose: Generic Dialog Procedure called to handle a dialog box where a
// user can enter an IP address and then press OK or Cancel
// - the switch at the beginning determines which Dialog Box to
// display so every dialog box that calls this function will need
// a case inside this switch statement
//
// Arguments: standard Win32 dialog proc arguments
//
// Returns: standard Win32 dialog proc return value
//
//----------------------------------------------------------------------------
INT_PTR CALLBACK GenericIPDlgProc( IN HWND hwnd, IN UINT uMsg, IN WPARAM wParam, IN LPARAM lParam ) {
HWND hEditbox; BOOL bStatus = TRUE;
//
// Determine which dialog box to display
//
switch( g_CurrentEditBox ) {
case GATEWAY_EDITBOX:
hEditbox = GetDlgItem( hwnd, IDC_IPADDR_ADV_CHANGE_GATEWAY );
break;
case DNS_SERVER_EDITBOX:
hEditbox = GetDlgItem( hwnd, IDC_DNS_CHANGE_SERVER );
break;
case DNS_SUFFIX_EDITBOX:
hEditbox = GetDlgItem( hwnd, IDC_DNS_CHANGE_SUFFIX );
break;
case WINS_EDITBOX:
hEditbox = GetDlgItem( hwnd, IDC_WINS_CHANGE_SERVER );
break;
}
switch( uMsg ) {
case WM_INITDIALOG: {
SetWindowText( hEditbox, szIPString );
SetFocus( hEditbox );
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( hEditbox, szIPString, MAX_IP_LENGTH + 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: SetButtons
//
// Purpose: Sets the windows states for the Edit and Remove buttons
//
// Arguments: IN HWND hListBox - the list box the edit and remove buttons are
// associated with
// IN HWND hEditButton - handle to the Edit button
// IN HWND hRemoveButton - handle to the Remove button
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID SetButtons( IN HWND hListBox, IN HWND hEditButton, IN HWND hRemoveButton ) { INT_PTR iCount;
iCount = SendMessage( hListBox, LB_GETCOUNT, 0, 0 );
if( iCount > 0 ) {
EnableWindow( hEditButton, TRUE );
EnableWindow( hRemoveButton, TRUE );
} else {
EnableWindow( hEditButton, FALSE );
EnableWindow( hRemoveButton, FALSE );
}
}
//----------------------------------------------------------------------------
//
// Function: AddValuesToListBox
//
// Purpose: Uses the contents of a Namelist to populate a list box, then
// selects the first entry.
//
// Arguments: IN HWND hListBox - list box the data is to be added to
// IN NAMELIST* pNameList - namelist to extract the data from
// IN INT iPosition - position in the list to start taking names
// from
//
// Returns: VOID
//
//----------------------------------------------------------------------------
VOID AddValuesToListBox( IN HWND hListBox, IN NAMELIST* pNameList, IN INT iPosition ) {
INT i; INT nEntries; LPTSTR pszIPAddressString;
nEntries = GetNameListSize( pNameList );
for( i = iPosition; i < nEntries; i++ ) {
pszIPAddressString = GetNameListName( pNameList, i );
SendMessage( hListBox, LB_INSERTSTRING, i, (LPARAM) pszIPAddressString );
}
//
// select the first entry
//
SendMessage( hListBox, LB_SETCURSEL, 0, 0 );
}
//----------------------------------------------------------------------------
//
// Function: TCPIPProp_PropertySheetProc
//
// Purpose: Standard Property Sheet dialog proc.
//
//----------------------------------------------------------------------------
int CALLBACK TCPIPProp_PropertySheetProc( HWND hwndDlg, UINT uMsg, LPARAM lParam ) {
switch (uMsg) { case PSCB_INITIALIZED : // Process PSCB_INITIALIZED
break ;
case PSCB_PRECREATE : // Process PSCB_PRECREATE
break ;
default : // Unknown message
break ; }
return( 0 );
}
//----------------------------------------------------------------------------
//
// Function: Create_TCPIPProp_PropertySheet
//
// Purpose: Sets up settings for the entire property sheet and each
// individual page. Lastly, calls the PropertySheet function to
// display the property sheet, the return value of this function is
// what is passed back as the return value
//
// Arguments: HWND hwndParent - handle to the dialog that will be spawning
// the property sheet
//
// Returns: BOOL - the return value from the property sheet
//
//----------------------------------------------------------------------------
BOOL Create_TCPIPProp_PropertySheet( HWND hwndParent ) {
INT i;
// Initialize property sheet HEADER data
ZeroMemory( &TCPIPProp_pshead, sizeof( PROPSHEETHEADER ) );
TCPIPProp_pshead.dwSize = sizeof( PROPSHEETHEADER ); TCPIPProp_pshead.dwFlags = PSH_PROPSHEETPAGE | PSH_USECALLBACK | PSH_USEHICON | PSH_NOAPPLYNOW; TCPIPProp_pshead.hwndParent = hwndParent; TCPIPProp_pshead.hInstance = FixedGlobals.hInstance; TCPIPProp_pshead.pszCaption = g_StrAdvancedTcpipSettings; TCPIPProp_pshead.nPages = cTCPIPPropertyPages; TCPIPProp_pshead.nStartPage = 0; TCPIPProp_pshead.ppsp = TCPIPProp_pspage; TCPIPProp_pshead.pfnCallback = TCPIPProp_PropertySheetProc;
// Zero out property PAGE data
ZeroMemory( &TCPIPProp_pspage, cTCPIPPropertyPages * sizeof(PROPSHEETPAGE) );
for( i = 0; i < cTCPIPPropertyPages; i++ ) {
TCPIPProp_pspage[i].dwSize = sizeof(PROPSHEETPAGE); TCPIPProp_pspage[i].dwFlags = PSP_USECALLBACK; TCPIPProp_pspage[i].hInstance = FixedGlobals.hInstance;
}
// PAGE 1 -- IP settings page
TCPIPProp_pspage[0].pszTemplate = MAKEINTRESOURCE (IDD_IPADDR_ADV); TCPIPProp_pspage[0].pfnDlgProc = TCPIP_IPSettingsDlgProc; TCPIPProp_pspage[0].pfnCallback = TCPIP_IPSettingsPageProc;
// PAGE 2 -- DNS page
TCPIPProp_pspage[1].pszTemplate = MAKEINTRESOURCE (IDD_TCP_DNS); TCPIPProp_pspage[1].pfnDlgProc = TCPIP_DNSDlgProc; TCPIPProp_pspage[1].pfnCallback = TCPIP_DNSPageProc;
// PAGE 3 -- WINS page
TCPIPProp_pspage[2].pszTemplate = MAKEINTRESOURCE (IDD_TCP_WINS); TCPIPProp_pspage[2].pfnDlgProc = TCPIP_WINSDlgProc; TCPIPProp_pspage[2].pfnCallback = TCPIP_WINSPageProc;
/*
// ISSUE-2002/02/28-stelo- There are currently no unattend settings for IPSEC or TCP/IP
// filter so do not display this page of the property sheet.
// PAGE 4 -- Options page
TCPIPProp_pspage[3].pszTemplate = MAKEINTRESOURCE (IDD_TCP_OPTIONS); TCPIPProp_pspage[3].pfnDlgProc = TCPIP_OptionsDlgProc; TCPIPProp_pspage[3].pfnCallback = TCPIP_OptionsPageProc; */
// --------- Create & display property sheet ---------
if( PropertySheet( &TCPIPProp_pshead ) ) return( TRUE ); // pass back return value from PropertySheet
else return( FALSE );
}
|