//---------------------------------------------------------------------------- // // 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 ); }