/* Copyright (c) 1995, Microsoft Corporation, all rights reserved ** ** ifw.c ** Remote Access Common Dialog APIs ** Add Interface wizard ** ** 02/11/97 Abolade Gbadegesin (based on entryw.c, by Steve Cobb). */ #include "rasdlgp.h" #include "entry.h" #include //got in for inet_addr // // Definitions for flags tracked by the interface wizard. // See the dwFlags member of AIINFO. // #define AI_F_HasPhysDevs 0x1 // router has phys ports available #define AI_F_HasTunlDevs 0x2 // router has tunnel ports available #define AI_F_HasPptpDevs 0x4 // router has Pptp ports available #define AI_F_HasL2tpDevs 0x8 // router has L2tp ports available #define AI_F_HasPPPoEDevs 0x10 // router has PPPoE ports available //for whistler bug 345068 349087 /*---------------------------------------------------------------------------- ** Local datatypes **---------------------------------------------------------------------------- */ #define EMPTY_IPADDRESS L"0.0.0.0" #define SROUTEINFO struct tagSROUTEINFO SROUTEINFO { TCHAR * pszDestIP; TCHAR * pszNetworkMask; TCHAR * pszMetric; }; #define SROUTEINFOLIST struct tagSROUTEINFOLIST SROUTEINFOLIST { SROUTEINFOLIST * pNext; SROUTEINFO RouteInfo; }; /* Add Interface wizard context block. All property pages refer to the single ** context block associated with the sheet. */ #define AIINFO struct tagAIINFO AIINFO { /* Common input arguments. */ EINFO* pArgs; /* Wizard and page handles. 'hwndFirstPage' is the handle of the first ** property page initialized. This is the page that allocates and frees ** the context block. */ HWND hwndDlg; HWND hwndFirstPage; HWND hwndRb; //Add for DOD wizard 345068 349087 HWND hwndRw; HWND hwndIn; HWND hwndSr; HWND hwndSs; HWND hwndRn; HWND hwndRp; HWND hwndRc; HWND hwndRa; HWND hwndNs; HWND hwndDo; HWND hwndDi; HWND hwndRf; HWND hwndVd; /* Interface Name page. */ HWND hwndEbInterfaceName; /* Modem/Adapter page. */ HWND hwndLv; /* Connection type page */ HWND hwndRbTypePhys; HWND hwndRbTypeTunl; HWND hwndRbBroadband; //Add for DOD wizard /* Phone number page. */ HWND hwndStNumber; HWND hwndEbNumber; //Share by VpnDestination, PhoneNumber, PPPoE HWND hwndPbAlternates; /* Login script page. */ HWND hwndCbRunScript; HWND hwndLbScripts; HWND hwndCbTerminal; HWND hwndPbEdit; HWND hwndPbBrowse; /* IP address page. */ HWND hwndCcIp; /* Name server page. */ HWND hwndCcDns; HWND hwndCcWins; /* Vpn type page */ HWND hwndVtRbAutomatic; HWND hwndVtRbPptp; HWND hwndVtRbL2tp; /* Dial-out credentials page. */ HWND hwndDoEbUserName; HWND hwndDoEbDomain; HWND hwndDoEbPassword; HWND hwndDoEbConfirm; /* Dial-in credentials page. */ HWND hwndDiEbUserName; HWND hwndDiEbDomain; HWND hwndDiEbPassword; HWND hwndDiEbConfirm; /* Router welcome page */ HWND hwndRwStWelcome; /* Router finish page */ HWND hwndRfStFinish; /* Static Route Page */ HWND hwndLvStaticRoutes; /* Static Route Add Dialog */ HWND hwndDest; HWND hwndNetMask; HWND hwndMetric; /* The phone number stash. This allows user to change the port to another ** link without losing the phone number he typed. Initialized to empty in ** AiInit and saved to entry in AiFinish. */ DTLLIST* pListPhoneNumbers; BOOL fPromoteHuntNumbers; /* Checkbox options chosen by user. */ BOOL fIp; BOOL fIpx; BOOL fClearPwOk; BOOL fNotNt; /*For connection type page, For whistler bug 349807 */ DWORD dwCtDeviceNum; /* Set true when there is only one meaningful choice of device. */ BOOL fSkipMa; /* Set true if the selected device is a modem or null modem. */ BOOL fModem; /* The NP_* mask of protocols configured for RAS. */ DWORD dwfConfiguredProtocols; /* Set true if IP is configured for RAS. */ BOOL fIpConfigured; //IPX is not supported on IA64 // BOOL fIpxConfigured; /* Set to true of Add Interface wizard is skipped. */ BOOL fSkipWizard; // After dial scripting helper context block, and a flag indicating if the // block has been initialized. // SUINFO suinfo; BOOL fSuInfoInitialized; // Handle to a bold font for use with start and finish wizard pages HFONT hBoldFont; // Flags that track the configuration of the machine that the // wizard is currently focused on. See AI_F_* DWORD dwFlags; // Set to the vpn type when one is configured. DWORD dwVpnStrategy; // Index of the selected device on the RN page // DWORD dwSelectedDeviceIndex; // List of all static routes // SROUTEINFOLIST * pRouteInfoListHead; }; /*---------------------------------------------------------------------------- ** Local prototypes (alphabetically) **---------------------------------------------------------------------------- */ int CALLBACK AiCallbackFunc( IN HWND hwndDlg, IN UINT unMsg, IN LPARAM lparam ); VOID AiCancel( IN HWND hwndPage ); AIINFO* AiContext( IN HWND hwndPage ); VOID AiExit( IN AIINFO* pInfo, IN DWORD dwError ); VOID AiExitInit( IN HWND hwndDlg ); BOOL AiFinish( IN HWND hwndPage ); AIINFO* AiInit( IN HWND hwndFirstPage, IN EINFO* pArgs ); VOID AiTerm( IN HWND hwndPage ); INT_PTR CALLBACK RbDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL RbInit( IN HWND hwndPage ); BOOL RbKillActive( IN AIINFO* pInfo ); BOOL RbSetActive( IN AIINFO* pInfo ); INT_PTR CALLBACK CtDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL CtInit( IN HWND hwndPage ); BOOL CtKillActive( IN AIINFO* pInfo ); BOOL CtSetActive( IN AIINFO* pInfo ); INT_PTR CALLBACK DiDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL DiInit( IN HWND hwndPage ); BOOL DiKillActive( IN AIINFO* pInfo ); BOOL DiNext( IN AIINFO* pInfo ); BOOL DiSetActive( IN AIINFO* pInfo ); INT_PTR CALLBACK DoDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL DoCommand( IN AIINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ); BOOL DoInit( IN HWND hwndPage ); BOOL DoKillActive( IN AIINFO* pInfo ); BOOL DoNext( IN AIINFO* pInfo ); BOOL DoSetActive( IN AIINFO* pInfo ); DWORD GetPhysicDeviceOtherThanLPT1( IN AIINFO * pInfo ); BOOL InCommand( IN AIINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ); INT_PTR CALLBACK InDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL InInit( IN HWND hwndPage); BOOL InKillActive( IN AIINFO* pInfo ); BOOL InSetActive( IN AIINFO* pInfo ); INT_PTR CALLBACK NsDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL NsInit( IN HWND hwndPage ); BOOL NsKillActive( IN AIINFO* pInfo ); BOOL NsSetActive( IN AIINFO* pInfo ); INT_PTR CALLBACK RaDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL RaInit( IN HWND hwndPage ); BOOL RaKillActive( IN AIINFO* pInfo ); BOOL RaSetActive( IN AIINFO* pInfo ); BOOL RcCommand( IN AIINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ); INT_PTR CALLBACK RcDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL RcInit( IN HWND hwndPage ); BOOL RcKillActive( IN AIINFO* pInfo ); BOOL RcSetActive( IN AIINFO* pInfo ); BOOL RfCommand( IN AIINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ); INT_PTR CALLBACK RfDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL RfInit( IN HWND hwndPage ); BOOL RfKillActive( IN AIINFO* pInfo ); BOOL RfSetActive( IN AIINFO* pInfo ); INT_PTR CALLBACK RnDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL RnInit( IN HWND hwndPage ); LVXDRAWINFO* RnLvCallback( IN HWND hwndLv, IN DWORD dwItem ); VOID RnLvItemChanged( IN AIINFO* pInfo ); BOOL RnLvRefresh( IN AIINFO* pInfo); BOOL RnSetActive( IN AIINFO* pInfo ); VOID RpAlternates( IN AIINFO* pInfo ); BOOL RpCommand( IN AIINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ); INT_PTR CALLBACK RpDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL RpInit( IN HWND hwndPage ); BOOL RpKillActive( IN AIINFO* pInfo ); VOID RpPhoneNumberToStash( IN AIINFO* pInfo ); BOOL RpSetActive( IN AIINFO* pInfo ); INT_PTR CALLBACK RwDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL RwInit( IN HWND hwndPage, IN OUT EINFO* pArgs ); BOOL RwKillActive( IN AIINFO* pInfo ); BOOL RwSetActive( IN AIINFO* pInfo ); BOOL SrCommand( IN AIINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ); VOID SrLvItemChanged( IN AIINFO* pInfo ); INT_PTR CALLBACK SrDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL SrInit( IN HWND hwndPage ); BOOL SrKillActive( IN AIINFO* pInfo ); BOOL SrSetActive( IN AIINFO* pInfo ); BOOL SsCommand( IN AIINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ); INT_PTR CALLBACK SsDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL SsInit( IN HWND hwndPage ); BOOL SsKillActive( IN AIINFO* pInfo ); BOOL SsSetActive( IN AIINFO* pInfo ); INT_PTR CALLBACK VdDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL VdInit( IN HWND hwndPage ); BOOL VdKillActive( IN AIINFO* pInfo ); BOOL VdSetActive( IN AIINFO* pInfo ); INT_PTR CALLBACK VtDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ); BOOL VtInit( IN HWND hwndPage ); BOOL VtKillActive( IN AIINFO* pInfo ); BOOL VtSetActive( IN AIINFO* pInfo ); /* Demand dial wizard page definitions. */ struct DD_WIZ_PAGE_INFO { DLGPROC pfnDlgProc; INT nPageId; INT nSidTitle; INT nSidSubtitle; DWORD dwFlags; }; static const struct DD_WIZ_PAGE_INFO c_aDdWizInfo [] = { { RwDlgProc, PID_RW_RouterWelcome, 0, 0, PSP_HIDEHEADER}, { InDlgProc, PID_IN_InterfaceName, SID_IN_Title, SID_IN_Subtitle, 0}, { CtDlgProc, PID_CT_RouterConnectionType, SID_CT_Title, SID_CT_Subtitle, 0}, { VtDlgProc, PID_VT_RouterVpnType, SID_VT_Title, SID_VT_Subtitle, 0}, { RnDlgProc, PID_RN_RouterModemAdapter, SID_RN_Title, SID_RN_Subtitle, 0}, { RbDlgProc, PID_BS_BroadbandService, SID_BS_Title, SID_BS_Subtitle, 0}, { RpDlgProc, PID_RP_RouterPhoneNumber, SID_RP_Title, SID_RP_Subtitle, 0}, { VdDlgProc, PID_VD_RouterVpnDestination, SID_VD_Title, SID_VD_Subtitle, 0}, { SsDlgProc, PID_SS_ServerSettings, SID_SS_Title, SID_SS_Subtitle, 0}, { SrDlgProc, PID_SR_StaticRoute, SID_SR_Title, SID_SR_SubTitle, 0}, { RaDlgProc, PID_RA_RouterIpAddress, SID_RA_Title, SID_RA_Subtitle, 0}, { NsDlgProc, PID_NS_RouterNameServers, SID_NS_Title, SID_NS_Subtitle, 0}, { RcDlgProc, PID_RC_RouterScripting, SID_RC_Title, SID_RC_Subtitle, 0}, { DiDlgProc, PID_DI_RouterDialIn, SID_DI_Title, SID_DI_Subtitle, 0}, { DoDlgProc, PID_DO_RouterDialOut, SID_DO_Title, SID_DO_Subtitle, 0}, { RfDlgProc, PID_RF_RouterFinish, 0, 0, PSP_HIDEHEADER}, }; #define c_cDdWizPages (sizeof (c_aDdWizInfo) / sizeof(c_aDdWizInfo[0])) /*---------------------------------------------------------------------------- ** Add Interface wizard entry point **---------------------------------------------------------------------------- */ VOID AiWizard( IN OUT EINFO* pEinfo ) /* Runs the Phonebook entry property sheet. 'PEinfo' is an input block ** with only caller's API arguments filled in. */ { DWORD dwErr, i; PROPSHEETHEADER header; PROPSHEETPAGE apage[ c_cDdWizPages ]; PROPSHEETPAGE* ppage; TRACE("AiWizard"); ZeroMemory( &header, sizeof(header) ); // Prepare the header // header.dwSize = sizeof(PROPSHEETHEADER); header.hwndParent = pEinfo->pApiArgs->hwndOwner; header.hInstance = g_hinstDll; header.nPages = c_cDdWizPages; header.pszbmHeader = MAKEINTRESOURCE( BID_WizardHeader ); header.ppsp = apage; header.pfnCallback = AiCallbackFunc; header.dwFlags = ( PSH_WIZARD | PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER | PSH_STRETCHWATERMARK | PSH_USECALLBACK | PSH_PROPSHEETPAGE ); // Prepare the array of pages // ZeroMemory( apage, sizeof(apage) ); for (i = 0; i < c_cDdWizPages; i++) { // Initialize page data // ppage = &apage[i]; ppage->dwSize = sizeof(PROPSHEETPAGE); ppage->hInstance = g_hinstDll; ppage->pszTemplate = MAKEINTRESOURCE(c_aDdWizInfo[i].nPageId); ppage->pfnDlgProc = c_aDdWizInfo[i].pfnDlgProc; ppage->lParam = (LPARAM )pEinfo; ppage->dwFlags = c_aDdWizInfo[i].dwFlags; // Initialize title and subtitle information. // if (c_aDdWizInfo[i].nSidTitle) { ppage->dwFlags |= PSP_USEHEADERTITLE; ppage->pszHeaderTitle = PszLoadString( g_hinstDll, c_aDdWizInfo[i].nSidTitle ); } if (c_aDdWizInfo[i].nSidSubtitle) { ppage->dwFlags |= PSP_USEHEADERSUBTITLE; ppage->pszHeaderSubTitle = PszLoadString( g_hinstDll, c_aDdWizInfo[i].nSidSubtitle ); } } if (PropertySheet( &header ) == -1) { TRACE("PropertySheet failed"); ErrorDlg( pEinfo->pApiArgs->hwndOwner, SID_OP_LoadDlg, ERROR_UNKNOWN, NULL ); } } /*---------------------------------------------------------------------------- ** Add Interface wizard ** Listed alphabetically **---------------------------------------------------------------------------- */ int CALLBACK AiCallbackFunc( IN HWND hwndDlg, IN UINT unMsg, IN LPARAM lparam ) /* A standard Win32 commctrl PropSheetProc. See MSDN documentation. ** ** Returns 0 always. */ { TRACE2("AiCallbackFunc(m=%d,l=%08x)",unMsg,lparam); if (unMsg == PSCB_PRECREATE) { DLGTEMPLATE* pDlg = (DLGTEMPLATE* )lparam; pDlg->style &= ~(DS_CONTEXTHELP); } return 0; } VOID AiCancel( IN HWND hwndPage ) /* Cancel was pressed. 'HwndPage' is the handle of a wizard page. */ { TRACE("AiCancel"); } AIINFO* AiContext( IN HWND hwndPage ) /* Retrieve the property sheet context from a wizard page handle. */ { return (AIINFO* )GetProp( GetParent( hwndPage ), g_contextId ); } VOID AiExit( IN AIINFO* pInfo, IN DWORD dwError ) /* Forces an exit from the dialog, reporting 'dwError' to the caller. ** 'PInfo' is the dialog context. ** ** Note: This cannot be called during initialization of the first page. ** See AiExitInit. */ { TRACE("AiExit"); pInfo->pArgs->pApiArgs->dwError = dwError; PropSheet_PressButton( pInfo->hwndDlg, PSBTN_CANCEL ); } VOID AiExitInit( IN HWND hwndDlg ) /* Utility to report errors within AiInit and other first page ** initialization. 'HwndDlg' is the dialog window. */ { SetOffDesktop( hwndDlg, SOD_MoveOff, NULL ); SetOffDesktop( hwndDlg, SOD_Free, NULL ); PostMessage( hwndDlg, WM_COMMAND, MAKEWPARAM( IDCANCEL , BN_CLICKED ), (LPARAM )GetDlgItem( hwndDlg, IDCANCEL ) ); } BOOL AiFinish( IN HWND hwndPage ) /* Saves the contents of the wizard. 'HwndPage is the handle of a ** property page. Pops up any errors that occur. 'FPropertySheet' ** indicates the user chose to edit the property sheet directly. ** ** Returns true is page can be dismissed, false otherwise. */ { const TCHAR* pszIp0 = TEXT("0.0.0.0"); AIINFO* pInfo; PBENTRY* pEntry; TRACE("AiFinish"); pInfo = AiContext( hwndPage ); ASSERT(pInfo); if (pInfo == NULL) { return ERROR_CAN_NOT_COMPLETE; } pEntry = pInfo->pArgs->pEntry; ASSERT(pEntry); // Update the entry type to match the selected port(s), which are assumed // to have been moved to the head of the list. This does not happen // automatically because "all types" is used initially. // { DTLNODE* pNode; PBLINK* pLink; pNode = DtlGetFirstNode( pEntry->pdtllistLinks ); ASSERT( pNode ); pLink = (PBLINK* )DtlGetData( pNode ); ChangeEntryType( pEntry, pLink->pbport.dwType ); } // Replace phone number settings of all enabled links (or the shared link, // if applicable) from the stashed phone number list. // { DTLLIST* pList; DTLNODE* pNodeL; PBLINK* pLink; ASSERT( pInfo->pListPhoneNumbers ); if (pEntry->fSharedPhoneNumbers) { pLink = (PBLINK* )DtlGetData( pInfo->pArgs->pSharedNode ); ASSERT( pLink ); CopyPszListToPhoneList( pLink, pInfo->pListPhoneNumbers ); } else { for (pNodeL = DtlGetFirstNode( pEntry->pdtllistLinks ); pNodeL; pNodeL = DtlGetNextNode( pNodeL )) { pLink = (PBLINK* )DtlGetData( pNodeL ); ASSERT( pLink ); if (pLink->fEnabled) { CopyPszListToPhoneList( pLink, pInfo->pListPhoneNumbers ); } } } } /* Update some settings based on user selections. */ if (pInfo->fClearPwOk) { pEntry->dwTypicalAuth = TA_Unsecure; } else { pEntry->dwTypicalAuth = TA_Secure; } pEntry->dwAuthRestrictions = AuthRestrictionsFromTypicalAuth(pEntry->dwTypicalAuth); if ( !pInfo->fSkipWizard && !pInfo->fIp) pEntry->dwfExcludedProtocols |= NP_Ip; if ( !pInfo->fSkipWizard && !pInfo->fIpx) pEntry->dwfExcludedProtocols |= NP_Ipx; if (pEntry->pszIpAddress && lstrcmp( pEntry->pszIpAddress, pszIp0 ) != 0) { pEntry->dwIpAddressSource = ASRC_RequireSpecific; } if ((pEntry->pszIpDnsAddress && lstrcmp( pEntry->pszIpDnsAddress, pszIp0 ) != 0) || (pEntry->pszIpWinsAddress && lstrcmp( pEntry->pszIpWinsAddress, pszIp0 ) != 0)) { pEntry->dwIpNameSource = ASRC_RequireSpecific; } if ( pEntry->dwType == RASET_Vpn ) { pEntry->dwVpnStrategy = pInfo->dwVpnStrategy; } // pmay: 234964 // Default the idle disconnect to five minutes // pEntry->lIdleDisconnectSeconds = 5 * 60; // pmay: 389632 // // Default DD connections to not register their names (CreateEntryNode // defaults this value to primary+inform) // pEntry->dwIpDnsFlags = 0; // Whistler bug: // // By default, DD connections should share file+print, nor be msclient, // nor permit NBT over tcp. // pEntry->fShareMsFilePrint = FALSE; pEntry->fBindMsNetClient = FALSE; EnableOrDisableNetComponent( pEntry, TEXT("ms_server"), FALSE); EnableOrDisableNetComponent( pEntry, TEXT("ms_msclient"), FALSE); pEntry->dwIpNbtFlags = 0; /* It's a valid new entry and caller has not chosen to edit properties ** directly, so mark the entry for commitment. */ if (!pInfo->pArgs->fChainPropertySheet) pInfo->pArgs->fCommit = TRUE; /* ** Assign the Router list pointer to ** Internal Args... */ { INTERNALARGS *pIArgs = (INTERNALARGS *) pInfo->pArgs->pApiArgs->reserved; pIArgs->pvSRouteInfo = (VOID *) ( pInfo->pRouteInfoListHead ); } return TRUE; } AIINFO* AiInit( IN HWND hwndFirstPage, IN EINFO* pArgs ) /* Wizard level initialization. 'HwndPage' is the handle of the first ** page. 'PArgs' is the common entry input argument block. ** ** Returns address of the context block if successful, NULL otherwise. If ** NULL is returned, an appropriate message has been displayed, and the ** wizard has been cancelled. */ { DWORD dwErr; DWORD dwOp; AIINFO* pInfo; HWND hwndDlg; BOOL bNt4; TRACE("AiInit"); hwndDlg = GetParent( hwndFirstPage ); /* Allocate the context information block. Initialize it enough so that ** it can be destroyed properly, and associate the context with the ** window. */ { pInfo = Malloc( sizeof(*pInfo) ); if (!pInfo) { TRACE("Context NOT allocated"); ErrorDlg( hwndDlg, SID_OP_LoadDlg, ERROR_NOT_ENOUGH_MEMORY, NULL ); pArgs->pApiArgs->dwError = ERROR_NOT_ENOUGH_MEMORY; AiExitInit( hwndDlg ); return NULL; } ZeroMemory( pInfo, sizeof(AIINFO) ); pInfo->pArgs = pArgs; pInfo->hwndDlg = hwndDlg; pInfo->hwndFirstPage = hwndFirstPage; if (!SetProp( hwndDlg, g_contextId, pInfo )) { TRACE("Context NOT set"); ErrorDlg( hwndDlg, SID_OP_LoadDlg, ERROR_UNKNOWN, NULL ); pArgs->pApiArgs->dwError = ERROR_UNKNOWN; Free( pInfo ); AiExitInit( hwndDlg ); return NULL; } TRACE("Context set"); } /* Position the dialog per caller's instructions. */ PositionDlg( hwndDlg, pArgs->pApiArgs->dwFlags & RASDDFLAG_PositionDlg, pArgs->pApiArgs->xDlg, pArgs->pApiArgs->yDlg ); // Do here instead of LibMain because otherwise it leaks resources into // WinLogon according to ShaunCo. // { InitCommonControls(); IpAddrInit( g_hinstDll, SID_PopupTitle, SID_BadIpAddrRange ); } /* Initialize these meta-flags that are not actually stored. */ pInfo->fNotNt = FALSE; pInfo->fSkipMa = FALSE; pInfo->fModem = FALSE; pInfo->pArgs->fPadSelected = FALSE; { INTERNALARGS *pIArgs = (INTERNALARGS *) pArgs->pApiArgs->reserved; pInfo->dwfConfiguredProtocols = g_pGetInstalledProtocolsEx( (pIArgs) ? pIArgs->hConnection : NULL, TRUE, FALSE, TRUE); } pInfo->fIpConfigured = (pInfo->dwfConfiguredProtocols & NP_Ip); //for whistler bug 213901 .Net server 605988, remove IPX // pInfo->fIpxConfigured = FALSE; // Set up common phone number list storage. // { pInfo->pListPhoneNumbers = DtlCreateList( 0 ); if (!pInfo->pListPhoneNumbers) { ErrorDlg( hwndDlg, SID_OP_LoadDlg, ERROR_NOT_ENOUGH_MEMORY, NULL ); pArgs->pApiArgs->dwError = ERROR_NOT_ENOUGH_MEMORY; AiExitInit( hwndDlg ); return NULL; } } // Load links for all port types. // EuChangeEntryType( pArgs, (DWORD )-1 ); // Convert the PBPHONE phone list for the first link to a TAPI-disabled // PSZ stash list of phone numbers. The stash list is edited rather than // the list in the entry so user can change active links without losing // the phone number he entered. // { DTLNODE* pNode; PBLINK* pLink; ASSERT( pInfo->pListPhoneNumbers ); pNode = DtlGetFirstNode( pArgs->pEntry->pdtllistLinks ); ASSERT( pNode ); pLink = (PBLINK* )DtlGetData( pNode ); ASSERT( pLink ); for (pNode = DtlGetFirstNode( pLink->pdtllistPhones ); pNode; pNode = DtlGetNextNode( pNode )) { PBPHONE* pPhone; DTLNODE* pNodeP; pPhone = (PBPHONE* )DtlGetData( pNode ); ASSERT( pPhone ); pNodeP = CreatePszNode( pPhone->pszPhoneNumber ); if (pNodeP) { DtlAddNodeLast( pInfo->pListPhoneNumbers, pNodeP ); } } } // Get the bold font for the start and finish pages // GetBoldWindowFont(hwndFirstPage, TRUE, &(pInfo->hBoldFont)); // Initlialize the flags for this wizard based on the // ports loaded in. // { DTLNODE* pNode; PBLINK* pLink; for (pNode = DtlGetFirstNode( pArgs->pEntry->pdtllistLinks ); pNode; pNode = DtlGetNextNode( pNode )) { pLink = (PBLINK* )DtlGetData( pNode ); ASSERT( pLink ); if ( pLink->pbport.dwType == RASET_Vpn ) { pInfo->dwFlags |= AI_F_HasTunlDevs; } // pmay: 233287 // Do not count bogus devices as physical devices. // else if (! (pLink->pbport.dwFlags & PBP_F_BogusDevice)) { pInfo->dwFlags |= AI_F_HasPhysDevs; } if ( pLink->pbport.dwFlags & PBP_F_PptpDevice ) { pInfo->dwFlags |= AI_F_HasPptpDevs; } else if ( pLink->pbport.dwFlags & PBP_F_L2tpDevice ) { pInfo->dwFlags |= AI_F_HasL2tpDevs; } //For whistler bug 345068 349087 // if ( pLink->pbport.dwFlags & PBP_F_PPPoEDevice ) { pInfo->dwFlags |= AI_F_HasPPPoEDevs; } } } // //Set the static route list pointer to null // pInfo->pRouteInfoListHead = NULL; return pInfo; } VOID AiTerm( IN HWND hwndPage ) /* Wizard level termination. Releases the context block. 'HwndPage' is ** the handle of a property page. */ { AIINFO* pInfo; TRACE("AiTerm"); pInfo = AiContext( hwndPage ); if (pInfo) { if (pInfo->hBoldFont) { DeleteObject(pInfo->hBoldFont); } if (pInfo->pListPhoneNumbers) { DtlDestroyList( pInfo->pListPhoneNumbers, DestroyPszNode ); } if (pInfo->fSuInfoInitialized) { SuFree( &pInfo->suinfo ); } Free( pInfo ); TRACE("Context freed"); } RemoveProp( GetParent( hwndPage ), g_contextId ); } /*---------------------------------------------------------------------------- ** AI Info Utiltity functions aroudn route info structure. **---------------------------------------------------------------------------- */ DWORD AIInfoSRouteGetNode(SROUTEINFOLIST ** pNode ) { DWORD dwRetCode = NO_ERROR; TRACE("AIInfoSRouteGetNode"); *pNode = Malloc( sizeof(SROUTEINFOLIST) ); if ( !*pNode ) { dwRetCode = GetLastError(); goto done; } ZeroMemory(*pNode, sizeof(SROUTEINFOLIST) ); done: return dwRetCode; } DWORD AIInfoSRouteSetDestIP(SROUTEINFOLIST * pNode, LPTSTR lpszDestIP ) { DWORD dwRetCode = NO_ERROR; TRACE("AIInfoSRouteSetDestIP"); if ( !lpszDestIP || !pNode ) { dwRetCode = ERROR_INVALID_PARAMETER; goto done; } if ( pNode->RouteInfo.pszDestIP ) Free(pNode->RouteInfo.pszDestIP ); pNode->RouteInfo.pszDestIP = Malloc( ( lstrlen(lpszDestIP) * sizeof(TCHAR) )+ sizeof(TCHAR) ); if ( !pNode->RouteInfo.pszDestIP ) { dwRetCode = GetLastError(); goto done; } lstrcpy ( pNode->RouteInfo.pszDestIP, lpszDestIP ); done: return dwRetCode; } DWORD AIInfoSRouteSetNetworkMask (SROUTEINFOLIST * pNode, LPTSTR lpszNetMask ) { DWORD dwRetCode = NO_ERROR; TRACE("AIInfoSRouteSetNetworkMask"); if ( !lpszNetMask || !pNode ) { dwRetCode = ERROR_INVALID_PARAMETER; goto done; } if ( pNode->RouteInfo.pszNetworkMask ) Free(pNode->RouteInfo.pszNetworkMask ); pNode->RouteInfo.pszNetworkMask = Malloc( ( lstrlen(lpszNetMask) * sizeof(TCHAR) ) + sizeof(TCHAR) ); if ( !pNode->RouteInfo.pszNetworkMask ) { dwRetCode = GetLastError(); goto done; } lstrcpy ( pNode->RouteInfo.pszNetworkMask, lpszNetMask ); done: return dwRetCode; } DWORD AIInfoSRouteSetMetric (SROUTEINFOLIST * pNode, LPTSTR lpszMetric ) { DWORD dwRetCode = NO_ERROR; TRACE("AIInfoSRouteSetMetric"); if ( !lpszMetric || !pNode ) { dwRetCode = ERROR_INVALID_PARAMETER; goto done; } if ( pNode->RouteInfo.pszMetric ) Free(pNode->RouteInfo.pszMetric ); pNode->RouteInfo.pszMetric = Malloc( ( lstrlen(lpszMetric) * sizeof(TCHAR)) + sizeof(TCHAR) ); if ( !pNode->RouteInfo.pszMetric ) { dwRetCode = GetLastError(); goto done; } lstrcpy ( pNode->RouteInfo.pszMetric, lpszMetric ); done: return dwRetCode; } DWORD AIInfoAddNewSRouteNode( SROUTEINFOLIST ** ppList, SROUTEINFOLIST * pNewNode ) { DWORD dwRetCode = NO_ERROR; // //Add Node at the head of the list // if ( NULL == *ppList ) { *ppList = pNewNode; } else { pNewNode->pNext = *ppList; *ppList = pNewNode; } return dwRetCode; } DWORD AIInfoRemoveSRouteNode ( AIINFO * pInfo, SROUTEINFOLIST * pNode ) { DWORD dwRetCode = NO_ERROR; SROUTEINFOLIST * pCurNode = pInfo->pRouteInfoListHead; SROUTEINFOLIST * pPrevNode = NULL; // //Iterate the list and remove node. // while ( pCurNode ) { if ( pCurNode == pNode ) { // //This is the node to delete // if ( pPrevNode == NULL) { // //This is the head node being deleted // pInfo->pRouteInfoListHead = pCurNode->pNext; } else { pPrevNode->pNext = pCurNode->pNext; } } pPrevNode = pCurNode; pCurNode = pCurNode->pNext; } Free( pNode->RouteInfo.pszDestIP ); Free( pNode->RouteInfo.pszNetworkMask ); Free( pNode->RouteInfo.pszMetric ); Free(pNode); return dwRetCode; } DWORD AIInfoSRouteCreateEntry(AIINFO * pInfo, LPTSTR pszDest, LPTSTR pszNetMask, LPTSTR pszMetric ) { DWORD dwRetCode = NO_ERROR; SROUTEINFOLIST * pNode = NULL; dwRetCode = AIInfoSRouteGetNode (&pNode ); if ( pNode ) { AIInfoSRouteSetDestIP(pNode, pszDest ); AIInfoSRouteSetNetworkMask (pNode, pszNetMask ); AIInfoSRouteSetMetric (pNode, pszMetric ); AIInfoAddNewSRouteNode( & ( pInfo->pRouteInfoListHead ), pNode ); } return dwRetCode; } SROUTEINFOLIST * AiInfoSRouteGetFirstNode(AIINFO * pInfo) { return ( pInfo->pRouteInfoListHead); } SROUTEINFOLIST * AiInfoSRouteGetNextNode(SROUTEINFOLIST * pNode) { return pNode->pNext; } BOOL AIInfoSRouteIsRouteinList ( AIINFO * pInfo, LPCTSTR pszDest, LPCTSTR pszMask, LPCTSTR pszMetric ) { BOOL fRet = FALSE; SROUTEINFOLIST * pNode = pInfo->pRouteInfoListHead; while ( pNode ) { if ( !lstrcmp(pNode->RouteInfo.pszDestIP, pszDest ) && !lstrcmp(pNode->RouteInfo.pszNetworkMask, pszMask ) && !lstrcmp(pNode->RouteInfo.pszMetric, pszMetric) ) { fRet = TRUE; break; } pNode = pNode->pNext; } return fRet; } DWORD inet_addrw( LPCWSTR szAddressW ) { CHAR szAddressA[16]; wcstombs(szAddressA, szAddressW, 16); return inet_addr(szAddressA); } // Add Broadband service name page for router wizard // For whistler 345068 349087 gangz // This broadband serice page is shared by AiWizard(ifw.c) and AeWizard(in entryw.c) // /*---------------------------------------------------------------------------- ** Broadband service dialog procedure ** Listed alphabetically following dialog proc **---------------------------------------------------------------------------- */ INT_PTR CALLBACK RbDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) // DialogProc callback for the broadband service page of the wizard. // Parameters and return value are as described for // standard windows 'DialogProc's. // { switch (unMsg) { case WM_INITDIALOG: return RbInit( hwnd ); case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AIINFO* pInfo; BOOL fDisplay; TRACE("RbSetActive"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if ( NULL == pInfo ) { break; } fDisplay = RbSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; } case PSN_KILLACTIVE: { AIINFO* pInfo; BOOL fInvalid; TRACE("RbKillActive"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if ( NULL == pInfo ) { break; } fInvalid = RbKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } } return FALSE; } BOOL RbInit( IN HWND hwndPage ) // Called on WM_INITDIALOG. 'hwndPage' is the handle of the property // page. // // Return false if focus was set, true otherwise. // { AIINFO* pInfo; TRACE("RbInit"); pInfo = AiContext( hwndPage ); if (!pInfo) { return TRUE; } // Initialize page-specific context information. // pInfo->hwndRb = hwndPage; pInfo->hwndEbNumber = GetDlgItem( hwndPage, CID_BS_EB_ServiceName ); ASSERT(pInfo->hwndEbNumber); Edit_LimitText( pInfo->hwndEbNumber, RAS_MaxPhoneNumber ); SetWindowText( pInfo->hwndEbNumber, FirstPszFromList( pInfo->pListPhoneNumbers ) ); return FALSE; } //For whistler bug 349807 //The RbXXX, VdXXX, RpXXX three sets of functions share the same pInfo->hwndEbNumber //to store phone number/Vpn destionation/PPPPoE service name // BOOL RbKillActive( IN AIINFO* pInfo ) // Called when PSN_KILLACTIVE is received. 'PInfo' is the wizard context. // // Returns true if the page is invalid, false is it can be dismissed. // { // If we're focused on an nt4 box, then this page is // invalid (pptp was the only type) if ( pInfo->pArgs->fNt4Router ) { return FALSE; } // If we have no PPPoE devices, then this page is invalid else if ( ! (pInfo->dwFlags & AI_F_HasPPPoEDevs) ) { return FALSE; } // If the connection type is not broadband, skip this page since the // destination will be gotten from the phone number/VPN page. if ( pInfo->pArgs->pEntry->dwType != RASET_Broadband ) { return FALSE; } RpPhoneNumberToStash(pInfo); return FALSE; } BOOL RbSetActive( IN AIINFO* pInfo ) // Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context. // // Returns true to display the page, false to skip it. // { BOOL fDisplayPage; PBENTRY* pEntry; TRACE("RbSetActive"); ASSERT(pInfo); pEntry = pInfo->pArgs->pEntry; if ( pInfo->pArgs->fNt4Router ) { return FALSE; } // If we have no PPPoE devices, then this page is invalid // if ( ! (pInfo->dwFlags & AI_F_HasPPPoEDevs) ) { return FALSE; } if (RASET_Broadband != pEntry->dwType) { return FALSE; } else { PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT ); fDisplayPage = TRUE; } pInfo->hwndEbNumber = GetDlgItem( pInfo->hwndRb, CID_BS_EB_ServiceName ); ASSERT(pInfo->hwndEbNumber); Edit_LimitText( pInfo->hwndEbNumber, RAS_MaxPhoneNumber ); SetWindowText( pInfo->hwndEbNumber, FirstPszFromList( pInfo->pListPhoneNumbers ) ); return fDisplayPage; } /*---------------------------------------------------------------------------- ** Connection type property page ** Listed alphabetically following dialog proc **---------------------------------------------------------------------------- */ INT_PTR CALLBACK CtDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) /* DialogProc callback for the vpn type page of the wizard. ** Parameters and return value are as described for standard windows ** 'DialogProc's. */ { switch (unMsg) { case WM_INITDIALOG: return CtInit( hwnd ); case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AIINFO* pInfo; BOOL fDisplay; TRACE("CtSETACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fDisplay = CtSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; } case PSN_KILLACTIVE: { AIINFO* pInfo; BOOL fInvalid; TRACE("CtKILLACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fInvalid = CtKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } } return FALSE; } BOOL CtInit( IN HWND hwndPage ) /* Called on WM_INITDIALOG. 'hwndPage' is the handle of the property ** page. ** ** Return false if focus was set, true otherwise. */ { AIINFO * pInfo; DWORD dwPhysicDeviceOtherThanLPT1 = 0; // Get the context pInfo = AiContext( hwndPage ); ASSERT ( pInfo ); if (pInfo == NULL) { return FALSE; } // Initialize the checks pInfo->hwndRbTypePhys = GetDlgItem( hwndPage, CID_CT_RB_Physical ); ASSERT(pInfo->hwndRbTypePhys); pInfo->hwndRbTypeTunl = GetDlgItem( hwndPage, CID_CT_RB_Virtual ); ASSERT(pInfo->hwndRbTypeTunl); //for whistler 345068 349087 gangz // pInfo->hwndRbBroadband = GetDlgItem( hwndPage, CID_CT_RB_Broadband ); ASSERT(pInfo->hwndRbBroadband); // pmay: 233287 //for whistler 345068 349087 gangz // Likewise, if there are only one devices available among // phys devices, tunel devices and broadband devices , then force the // user to configure dd interface with that device. // //If no valid device availabe, stop the wizard // pInfo->dwCtDeviceNum = 0; // Get the number of Physic Devices other that LPT1 because DoD interfaces // just do not use LPT1 // if (pInfo->dwFlags &AI_F_HasPhysDevs ) { dwPhysicDeviceOtherThanLPT1 = GetPhysicDeviceOtherThanLPT1( pInfo ); if( 0 < dwPhysicDeviceOtherThanLPT1 ) { pInfo->dwCtDeviceNum++; } } if (pInfo->dwFlags & AI_F_HasTunlDevs ) { pInfo->dwCtDeviceNum++; } if (pInfo->dwFlags & AI_F_HasPPPoEDevs) { pInfo->dwCtDeviceNum++; } if ( 0 == pInfo->dwCtDeviceNum ) { ErrorDlg( pInfo->hwndDlg, SID_NoDevices, ERROR_UNKNOWN, NULL); AiExit ( pInfo, ERROR_DEVICE_NOT_AVAILABLE ); return TRUE; } if ( 1 == pInfo->dwCtDeviceNum ) { if ( ( pInfo->dwFlags & AI_F_HasPhysDevs ) && ( 0 < dwPhysicDeviceOtherThanLPT1 ) ) { EuChangeEntryType( pInfo->pArgs, RASET_P_NonVpnTypes); } else if (pInfo->dwFlags & AI_F_HasTunlDevs) { EuChangeEntryType( pInfo->pArgs, RASET_Vpn); } else if (pInfo->dwFlags & AI_F_HasPPPoEDevs) { EuChangeEntryType( pInfo->pArgs, RASET_Broadband); } else { ErrorDlg( pInfo->hwndDlg, SID_NoDevices, ERROR_UNKNOWN, NULL); AiExit ( pInfo, ERROR_DEVICE_NOT_AVAILABLE ); return TRUE; } } //Set radio buttons // if( pInfo->hwndRbTypePhys ) { Button_SetCheck(pInfo->hwndRbTypePhys, FALSE); } if( pInfo->hwndRbTypeTunl ) { Button_SetCheck(pInfo->hwndRbTypeTunl, FALSE); } if( pInfo->hwndRbBroadband ) { Button_SetCheck(pInfo->hwndRbBroadband, FALSE); } //Enable/Disable buttons // if( pInfo->hwndRbTypePhys ) { if ( !(pInfo->dwFlags & AI_F_HasPhysDevs) || 0 == dwPhysicDeviceOtherThanLPT1 ) { EnableWindow(pInfo->hwndRbTypePhys, FALSE); } else { EnableWindow(pInfo->hwndRbTypePhys, TRUE ); } } if( pInfo->hwndRbTypeTunl ) { if ( !(pInfo->dwFlags & AI_F_HasTunlDevs) ) { EnableWindow(pInfo->hwndRbTypeTunl, FALSE); } else { EnableWindow(pInfo->hwndRbTypeTunl, TRUE ); } } if( pInfo->hwndRbBroadband ) { if ( !(pInfo->dwFlags & AI_F_HasPPPoEDevs) ) { EnableWindow(pInfo->hwndRbBroadband, FALSE); } else { EnableWindow(pInfo->hwndRbBroadband, TRUE ); } } if ( pInfo->hwndRbTypePhys && IsWindowEnabled( pInfo->hwndRbTypePhys ) ) { Button_SetCheck(pInfo->hwndRbTypePhys, TRUE); } else if( pInfo->hwndRbTypeTunl && IsWindowEnabled( pInfo->hwndRbTypeTunl ) ) { Button_SetCheck(pInfo->hwndRbTypeTunl, TRUE); } else { if( pInfo->hwndRbBroadband ) { Button_SetCheck(pInfo->hwndRbBroadband, TRUE); } } return FALSE; } BOOL CtKillActive( IN AIINFO* pInfo ) /* Called when PSN_KILLACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true if the page is invalid, false is it can be dismissed. */ { BOOL bPhys, bTunnel; // Change the entry type based on the type // selected from this page //For whistler 345068 349087 gangz // bPhys = Button_GetCheck( pInfo->hwndRbTypePhys ); bTunnel = Button_GetCheck( pInfo->hwndRbTypeTunl ); if(bPhys) { EuChangeEntryType( pInfo->pArgs, RASET_P_NonVpnTypes); } else if(bTunnel) { EuChangeEntryType( pInfo->pArgs, RASET_Vpn); } else { EuChangeEntryType( pInfo->pArgs, RASET_Broadband); } return FALSE; } DWORD GetPhysicDeviceOtherThanLPT1( IN AIINFO * pInfo ) { DTLNODE* pNode = NULL; PBLINK* pLink = NULL; DWORD dwItem = 0; do { if( NULL == pInfo || NULL == pInfo->pArgs || NULL == pInfo->pArgs->pEntry || NULL == pInfo->pArgs->pEntry->pdtllistLinks ) { break; } for (pNode = DtlGetFirstNode( pInfo->pArgs->pEntry->pdtllistLinks ); pNode; pNode = DtlGetNextNode( pNode )) { PBDEVICETYPE pbType ; pLink = (PBLINK* )DtlGetData( pNode ); ASSERT(pLink); // For whistler bug 448251 // for whistler DCR 524304 gangz // Filter out LPT1, because the DoD only happens in a NAT or NAT/VPN // which won't use this LPT1 port pbType = pLink->pbport.pbdevicetype; if ( PBDT_Modem == pbType || PBDT_Pad == pbType || PBDT_Switch == pbType || PBDT_Isdn == pbType || PBDT_Atm == pbType || PBDT_FrameRelay == pbType ) { dwItem ++; } }// End of for loop } while(FALSE); return dwItem; } BOOL CtSetActive( IN AIINFO* pInfo ) /* Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true to display the page, false to skip it. */ { // If we're focused on an nt4 box, then this page is // invalid (type of connection is inferred from the // device that gets selected.) if ( pInfo->pArgs->fNt4Router ) { return FALSE; } // Only allow this page to display if there are at least two of // physical, tunnel and broadband devices configured. Otherwise, // it makes no sense to allow the user to choose which // type he/she wants. if ( 2 <= pInfo->dwCtDeviceNum ) { PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT ); return TRUE; } return FALSE; } /*---------------------------------------------------------------------------- ** Dial-In Credentials property page ** Listed alphabetically following dialog proc **---------------------------------------------------------------------------- */ INT_PTR CALLBACK DiDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) /* DialogProc callback for the Dial-in Credentials page of the wizard. ** Parameters and return values are as described for standard windows ** 'DialogProc's. */ { switch (unMsg) { case WM_INITDIALOG: { return DiInit( hwnd ); } case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AIINFO* pInfo; BOOL fDisplay; TRACE("DiSETACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fDisplay = DiSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; } case PSN_KILLACTIVE: { AIINFO* pInfo; BOOL fInvalid; TRACE("DiKILLACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fInvalid = DiKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } case PSN_WIZNEXT: { AIINFO* pInfo; BOOL fInvalid; TRACE("DoNEXT"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fInvalid = DiNext( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fInvalid) ? -1 : 0 ); return TRUE; } } break; } } return FALSE; } BOOL DiInit( IN HWND hwndPage ) /* Called on WM_INITDIALOG. 'hwndPage' is the handle of the property ** page. 'PArgs' is the arguments from the PropertySheet caller. ** ** Return false if focus was set, true otherwise. */ { AIINFO* pInfo; TRACE("DiInit"); pInfo = AiContext( hwndPage ); if (!pInfo) return TRUE; /* Initialize page-specific context information. */ pInfo->hwndDi = hwndPage; pInfo->hwndDiEbUserName = GetDlgItem( hwndPage, CID_DI_EB_UserName ); Edit_LimitText( pInfo->hwndDiEbUserName, UNLEN ); pInfo->hwndDiEbPassword = GetDlgItem( hwndPage, CID_DI_EB_Password ); Edit_LimitText( pInfo->hwndDiEbPassword, PWLEN ); pInfo->hwndDiEbConfirm = GetDlgItem( hwndPage, CID_DI_EB_Confirm ); Edit_LimitText( pInfo->hwndDiEbConfirm, PWLEN ); // pmay: 222622: Since we only configure local users, we removed // the domain field from the dial in credentials page. return FALSE; } BOOL DiKillActive( IN AIINFO* pInfo ) /* Called when PSN_KILLACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true if the page is invalid, false is it can be dismissed. */ { return FALSE; } BOOL DiNext( IN AIINFO* pInfo ) /* Called when PSN_WIZNEXT is received. 'PInfo' is the wizard context. ** ** Returns true if the page is invalid, false is it can be dismissed. */ { TCHAR* psz; /* Whistler bug 254385 encode password when not being used */ psz = GetText(pInfo->hwndDiEbPassword); EncodePassword(psz); if (psz) { TCHAR* psz2; psz2 = GetText(pInfo->hwndDiEbConfirm); if(NULL != psz2) { /* Whistler bug 254385 encode password when not being used */ DecodePassword(psz); if (lstrcmp(psz, psz2)) { ZeroMemory(psz, (lstrlen(psz) + 1) * sizeof(TCHAR)); ZeroMemory(psz2, (lstrlen(psz2) + 1) * sizeof(TCHAR)); Free(psz); Free(psz2); MsgDlg(pInfo->hwndDlg, SID_PasswordMismatch, NULL); SetFocus(pInfo->hwndDiEbPassword); return TRUE; } EncodePassword(psz); ZeroMemory(psz2, (lstrlen(psz2) + 1) * sizeof(TCHAR)); Free(psz2); } /* Whistler bug 254385 encode password when not being used ** Whistler bug 275526 NetVBL BVT Break: Routing BVT broken */ if (pInfo->pArgs->pszRouterDialInPassword) { ZeroMemory( pInfo->pArgs->pszRouterDialInPassword, (lstrlen(pInfo->pArgs->pszRouterDialInPassword) + 1) * sizeof(TCHAR)); } Free0(pInfo->pArgs->pszRouterDialInPassword); pInfo->pArgs->pszRouterDialInPassword = psz; } return FALSE; } BOOL DiSetActive( IN AIINFO* pInfo ) /* Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true to display the page, false to skip it. */ { /* The dialog is only displayed if the user is adding a dial-in account. */ if (!pInfo->pArgs->fAddUser) return FALSE; /* Display the interface name in the disabled edit-box */ SetWindowText( pInfo->hwndDiEbUserName, pInfo->pArgs->pEntry->pszEntryName ); PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT ); return TRUE; } /*---------------------------------------------------------------------------- ** Dial-Out Credentials property page ** Listed alphabetically following dialog proc **---------------------------------------------------------------------------- */ INT_PTR CALLBACK DoDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) /* DialogProc callback for the Dial-Out Credentials page of the wizard. ** Parameters and return values are as described for standard windows ** 'DialogProc's. */ { switch (unMsg) { case WM_INITDIALOG: { return DoInit( hwnd ); } case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AIINFO* pInfo; BOOL fDisplay; TRACE("DoSETACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fDisplay = DoSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; } case PSN_KILLACTIVE: { AIINFO* pInfo; BOOL fInvalid; TRACE("DoKILLACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fInvalid = DoKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } case PSN_WIZNEXT: { AIINFO* pInfo; BOOL fInvalid; TRACE("DoNEXT"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fInvalid = DoNext( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fInvalid) ? -1 : 0 ); return TRUE; } } break; } // For whistler DCR bug 524304 gangz case WM_COMMAND: { AIINFO* pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } return DoCommand( pInfo, HIWORD( wparam ), LOWORD( wparam ), (HWND )lparam ); } } return FALSE; } BOOL DoCommand( IN AIINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ) /* Called on WM_COMMAND. 'pInfo' is the dialog context. 'WNotification' ** is the notification code of the command. 'wId' is the control/menu ** identifier of the command. 'HwndCtrl' is the control window handle of ** the command. ** ** Returns true if processed message, false otherwise. */ { //TRACE3("DoCommand(n=%d,i=%d,c=$%x)", // (DWORD)wNotification,(DWORD)wId,(ULONG_PTR )hwndCtrl); TCHAR* psz = NULL; switch( wId ) { case CID_DO_EB_UserName: { if( EN_CHANGE == wNotification ) { if( pInfo->hwndDoEbUserName ) { if( 0 < GetWindowTextLength(pInfo->hwndDoEbUserName) ) { PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT ); } else { PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK ); } } } break; } } return FALSE; } BOOL DoInit( IN HWND hwndPage ) /* Called on WM_INITDIALOG. 'hwndPage' is the handle of the property ** page. 'PArgs' is the arguments from the PropertySheet caller. ** ** Return false if focus was set, true otherwise. */ { AIINFO* pInfo; TRACE("DoInit"); pInfo = AiContext( hwndPage ); if (!pInfo) return TRUE; /* Initialize page-specific context information. */ pInfo->hwndDo = hwndPage; pInfo->hwndDoEbUserName = GetDlgItem( hwndPage, CID_DO_EB_UserName ); Edit_LimitText( pInfo->hwndDoEbUserName, UNLEN ); pInfo->hwndDoEbDomain = GetDlgItem( hwndPage, CID_DO_EB_Domain ); Edit_LimitText( pInfo->hwndDoEbDomain, DNLEN ); pInfo->hwndDoEbPassword = GetDlgItem( hwndPage, CID_DO_EB_Password ); Edit_LimitText( pInfo->hwndDoEbPassword, PWLEN ); pInfo->hwndDoEbConfirm = GetDlgItem( hwndPage, CID_DO_EB_Confirm ); Edit_LimitText( pInfo->hwndDoEbConfirm, PWLEN ); /* Use the target router name as the default "User name", */ if (pInfo->pArgs->pszRouter) { if (pInfo->pArgs->pszRouter[0] == TEXT('\\') && pInfo->pArgs->pszRouter[1] == TEXT('\\')) SetWindowText(pInfo->hwndDoEbUserName, pInfo->pArgs->pszRouter+2); else SetWindowText(pInfo->hwndDoEbUserName, pInfo->pArgs->pszRouter); } return FALSE; } BOOL DoKillActive( IN AIINFO* pInfo ) /* Called when PSN_KILLACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true if the page is invalid, false is it can be dismissed. */ { // for whistler DCR 524304 gangz PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT ); return FALSE; } BOOL DoNext( IN AIINFO* pInfo ) /* Called when PSN_WIZNEXT is received. 'PInfo' is the wizard context. ** ** Returns true if the page is invalid, false is it can be dismissed. */ { TCHAR* psz; psz = GetText(pInfo->hwndDoEbUserName); if (psz) { if (!lstrlen(psz)) { Free(psz); MsgDlg(pInfo->hwndDlg, SID_DialOutUserName, NULL); SetFocus(pInfo->hwndDoEbUserName); return TRUE; } Free0(pInfo->pArgs->pszRouterUserName); pInfo->pArgs->pszRouterUserName = psz; } psz = GetText(pInfo->hwndDoEbDomain); if (psz) { Free0(pInfo->pArgs->pszRouterDomain); pInfo->pArgs->pszRouterDomain = psz; } /* Whistler bug 254385 encode password when not being used */ psz = GetText(pInfo->hwndDoEbPassword); EncodePassword(psz); if (psz) { TCHAR* psz2; psz2 = GetText(pInfo->hwndDoEbConfirm); if(NULL != psz2) { /* Whistler bug 254385 encode password when not being used */ DecodePassword(psz); if (lstrcmp(psz, psz2)) { ZeroMemory(psz, (lstrlen(psz) + 1) * sizeof(TCHAR)); ZeroMemory(psz2, (lstrlen(psz2) + 1) * sizeof(TCHAR)); Free(psz); Free(psz2); MsgDlg(pInfo->hwndDlg, SID_PasswordMismatch, NULL); SetFocus(pInfo->hwndDoEbPassword); return TRUE; } EncodePassword(psz); ZeroMemory(psz2, (lstrlen(psz2) + 1) * sizeof(TCHAR)); Free(psz2); } /* Whistler bug 254385 encode password when not being used ** Whistler bug 275526 NetVBL BVT Break: Routing BVT broken */ if (pInfo->pArgs->pszRouterPassword) { ZeroMemory( pInfo->pArgs->pszRouterPassword, (lstrlen(pInfo->pArgs->pszRouterPassword) + 1) * sizeof(TCHAR)); } Free0(pInfo->pArgs->pszRouterPassword); pInfo->pArgs->pszRouterPassword = psz; } return FALSE; } BOOL DoSetActive( IN AIINFO* pInfo ) /* Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true to display the page, false to skip it. */ { #if 0 TCHAR* psz; /* Fill in the interface name in the explanatory text. */ psz = PszFromId( g_hinstDll, SID_RouterDialOut ); if (psz) { MSGARGS msgargs; ZeroMemory( &msgargs, sizeof(msgargs) ); msgargs.apszArgs[ 0 ] = pInfo->pArgs->pEntry->pszEntryName; msgargs.fStringOutput = TRUE; msgargs.pszString = psz; MsgDlgUtil( NULL, 0, &msgargs, g_hinstDll, 0 ); if (msgargs.pszOutput) { SetDlgItemText( pInfo->hwndDo, CID_DO_ST_Explain, msgargs.pszOutput ); Free( msgargs.pszOutput ); } Free( psz ); } #endif // For whistler DCR bug 524304 gangz // won't enable Next button until user input a user name // if( pInfo->hwndDoEbUserName && pInfo->hwndDlg ) { if( 0 < GetWindowTextLength(pInfo->hwndDoEbUserName) ) { PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT ); } else { PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK ); } } return TRUE; } /*---------------------------------------------------------------------------- ** Interface Name property page ** Listed alphabetically following dialog proc **---------------------------------------------------------------------------- */ INT_PTR CALLBACK InDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) /* DialogProc callback for the Interface Name page of the wizard. ** Parameters and return values are as described for standard windows ** 'DialogProc's. */ { switch (unMsg) { case WM_INITDIALOG: { return InInit( hwnd ); } case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_RESET: { TRACE("InRESET"); AiCancel( hwnd ); SetWindowLong( hwnd, DWLP_MSGRESULT, FALSE ); return TRUE; } case PSN_SETACTIVE: { AIINFO* pInfo; BOOL fDisplay; TRACE("InSETACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fDisplay = InSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; } case PSN_KILLACTIVE: { AIINFO* pInfo; BOOL fInvalid; TRACE("InKILLACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fInvalid = InKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } case PSN_WIZFINISH: { AIINFO* pInfo; TRACE("InWIZFINISH"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } /* You'd think pressing Finish would trigger a KILLACTIVE ** event, but it doesn't, so we do it ourselves. */ InKillActive( pInfo ); /* Set "no wizard" user preference, per user's check. */ pInfo->pArgs->pUser->fNewEntryWizard = FALSE; pInfo->pArgs->pUser->fDirty = TRUE; g_pSetUserPreferences( NULL, pInfo->pArgs->pUser, pInfo->pArgs->fNoUser ? UPM_Logon : UPM_Normal ); pInfo->pArgs->fPadSelected = FALSE; pInfo->pArgs->fChainPropertySheet = TRUE; AiFinish( hwnd ); SetWindowLong( hwnd, DWLP_MSGRESULT, 0 ); return TRUE; } } break; } case WM_COMMAND: { AIINFO* pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } return InCommand( pInfo, HIWORD( wparam ), LOWORD( wparam ), (HWND )lparam ); } case WM_DESTROY: { AiTerm( hwnd ); break; } } return FALSE; } BOOL InCommand( IN AIINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ) /* Called on WM_COMMAND. 'PInfo' is the dialog context. 'WNotification' ** is the notification code of the command. 'wId' is the control/menu ** identifier of the command. 'HwndCtrl' is the control window handle of ** the command. ** ** Returns true if processed message, false otherwise. */ { //TRACE3("InCommand(n=%d,i=%d,c=$%x)", // (DWORD)wNotification,(DWORD)wId,(ULONG_PTR )hwndCtrl); return FALSE; } BOOL InInit( IN HWND hwndPage) /* Called on WM_INITDIALOG. 'hwndPage' is the handle of the property ** page. 'PArgs' is the arguments from the PropertySheet caller. ** ** Return false if focus was set, true otherwise. */ { DWORD dwErr; AIINFO* pInfo; PBENTRY* pEntry; TRACE("InInit"); // Get the context of this page pInfo = AiContext( hwndPage ); ASSERT ( pInfo ); if (pInfo == NULL) { return FALSE; } // Set up the interface name stuff // pInfo->hwndEbInterfaceName = GetDlgItem( hwndPage, CID_IN_EB_InterfaceName ); ASSERT(pInfo->hwndEbInterfaceName); pEntry = pInfo->pArgs->pEntry; if (!pEntry->pszEntryName) { /* No entry name, so think up a default. */ dwErr = GetDefaultEntryName( pInfo->pArgs->pFile, pEntry->dwType, pInfo->pArgs->fRouter, &pEntry->pszEntryName ); if (dwErr != 0) { ErrorDlg( pInfo->hwndDlg, SID_OP_LoadPage, dwErr, NULL ); AiExit( pInfo, dwErr ); return TRUE; } } Edit_LimitText( pInfo->hwndEbInterfaceName, RAS_MaxEntryName ); SetWindowText( pInfo->hwndEbInterfaceName, pEntry->pszEntryName ); /* Initialize page-specific context information. */ pInfo->hwndIn = hwndPage; return TRUE; } BOOL InKillActive( IN AIINFO* pInfo ) /* Called when PSN_KILLACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true if the page is invalid, false is it can be dismissed. */ { TCHAR* psz; psz = GetText( pInfo->hwndEbInterfaceName ); if (psz) { /* Update the entry name from the editbox. */ Free0( pInfo->pArgs->pEntry->pszEntryName ); pInfo->pArgs->pEntry->pszEntryName = psz; /* Validate the entry name. */ if (!EuValidateName( pInfo->hwndDlg, pInfo->pArgs )) { SetFocus( pInfo->hwndEbInterfaceName ); Edit_SetSel( pInfo->hwndEbInterfaceName, 0, -1 ); return TRUE; } } return FALSE; } BOOL InSetActive( IN AIINFO* pInfo ) /* Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true to display the page, false to skip it. */ { TCHAR* psz; // for whistler DCR 524304 gangz PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT ); return TRUE; } /*---------------------------------------------------------------------------- ** Name Servers property page ** Listed alphabetically following dialog proc **---------------------------------------------------------------------------- */ INT_PTR CALLBACK NsDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) /* DialogProc callback for the Name Servers page of the wizard. ** Parameters and return values are as described for standard windows ** 'DialogProc's. */ { switch (unMsg) { case WM_INITDIALOG: { return NsInit( hwnd ); } case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AIINFO* pInfo; BOOL fDisplay; TRACE("NsSETACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fDisplay = NsSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; } case PSN_KILLACTIVE: { AIINFO* pInfo; BOOL fInvalid; TRACE("NsKILLACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fInvalid = NsKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } } return FALSE; } BOOL NsInit( IN HWND hwndPage ) /* Called on WM_INITDIALOG. 'hwndPage' is the handle of the property ** page. 'PArgs' is the arguments from the PropertySheet caller. ** ** Return false if focus was set, true otherwise. */ { AIINFO* pInfo; TRACE("NsInit"); pInfo = AiContext( hwndPage ); if (!pInfo) return TRUE; /* Initialize page-specific context information. */ pInfo->hwndNs = hwndPage; pInfo->hwndCcDns = GetDlgItem( hwndPage, CID_NS_CC_Dns ); ASSERT(pInfo->hwndCcDns); pInfo->hwndCcWins = GetDlgItem( hwndPage, CID_NS_CC_Wins ); ASSERT(pInfo->hwndCcWins); /* Set the IP address fields. */ SetWindowText( pInfo->hwndCcDns, pInfo->pArgs->pEntry->pszIpDnsAddress ); SetWindowText( pInfo->hwndCcWins, pInfo->pArgs->pEntry->pszIpWinsAddress ); return FALSE; } BOOL NsKillActive( IN AIINFO* pInfo ) /* Called when PSN_KILLACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true if the page is invalid, false is it can be dismissed. */ { TCHAR* psz; PBENTRY* pEntry = pInfo->pArgs->pEntry; psz = GetText( pInfo->hwndCcDns ); if (psz) { Free0( pEntry->pszIpDnsAddress ); pEntry->pszIpDnsAddress = psz; } psz = GetText( pInfo->hwndCcWins ); if (psz) { Free0( pEntry->pszIpWinsAddress ); pEntry->pszIpWinsAddress = psz; } return FALSE; } BOOL NsSetActive( IN AIINFO* pInfo ) /* Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true to display the page, false to skip it. */ { PBENTRY* pEntry; pEntry = pInfo->pArgs->pEntry; // In NT5, we always skip this page return FALSE; if (!pInfo->fNotNt || !pInfo->fIpConfigured) { return FALSE; } PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT ); return TRUE; } /*---------------------------------------------------------------------------- ** IP Address property page ** Listed alphabetically following dialog proc **---------------------------------------------------------------------------- */ INT_PTR CALLBACK RaDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) /* DialogProc callback for the IP Address page of the wizard. Parameters ** and return value are as described for standard windows 'DialogProc's. */ { #if 0 TRACE4("RaDlgProc(h=$%x,m=$%x,w=$%x,l=$%x)", (DWORD)hwnd,(DWORD)unMsg,(DWORD)wparam,(DWORD)lparam); #endif switch (unMsg) { case WM_INITDIALOG: return RaInit( hwnd ); case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AIINFO* pInfo; BOOL fDisplay; TRACE("RaSETACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fDisplay = RaSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; } case PSN_KILLACTIVE: { AIINFO* pInfo; BOOL fInvalid; TRACE("RaKILLACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fInvalid = RaKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } } return FALSE; } BOOL RaInit( IN HWND hwndPage ) /* Called on WM_INITDIALOG. 'hwndPage' is the handle of the property ** page. ** ** Return false if focus was set, true otherwise. */ { AIINFO* pInfo; TRACE("RaInit"); pInfo = AiContext( hwndPage ); if (!pInfo) return TRUE; /* Initialize page-specific context information. */ pInfo->hwndRa = hwndPage; pInfo->hwndCcIp = GetDlgItem( hwndPage, CID_RA_CC_Ip ); ASSERT(pInfo->hwndCcIp); /* Set the IP address field to '0.0.0.0'. */ SetWindowText( pInfo->hwndCcIp, pInfo->pArgs->pEntry->pszIpAddress ); return FALSE; } BOOL RaKillActive( IN AIINFO* pInfo ) /* Called when PSN_KILLACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true if the page is invalid, false is it can be dismissed. */ { TCHAR* psz; psz = GetText( pInfo->hwndCcIp ); if (psz) { PBENTRY* pEntry = pInfo->pArgs->pEntry; Free0( pEntry->pszIpAddress ); pEntry->pszIpAddress = psz; } return FALSE; } BOOL RaSetActive( IN AIINFO* pInfo ) /* Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true to display the page, false to skip it. */ { PBENTRY* pEntry; pEntry = pInfo->pArgs->pEntry; // In NT5, we always skip this page return FALSE; if (!pInfo->fNotNt || !pInfo->fIpConfigured) { return FALSE; } PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT ); return TRUE; } /*---------------------------------------------------------------------------- ** Logon Script property page ** Listed alphabetically following dialog proc **---------------------------------------------------------------------------- */ INT_PTR CALLBACK RcDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) /* DialogProc callback for the Logon Script page of the wizard. ** Parameters and return value are as described for standard windows ** 'DialogProc's. */ { #if 0 TRACE4("RcDlgProc(h=$%x,m=$%x,w=$%x,l=$%x)", (DWORD)hwnd,(DWORD)unMsg,(DWORD)wparam,(DWORD)lparam); #endif switch (unMsg) { case WM_INITDIALOG: return RcInit( hwnd ); case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AIINFO* pInfo; BOOL fDisplay; TRACE("RcSETACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fDisplay = RcSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; } case PSN_KILLACTIVE: { AIINFO* pInfo; BOOL fInvalid; TRACE("RcKILLACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fInvalid = RcKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } case WM_COMMAND: { AIINFO* pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } return RcCommand( pInfo, HIWORD( wparam ), LOWORD( wparam ), (HWND )lparam ); } } return FALSE; } BOOL RcCommand( IN AIINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ) /* Called on WM_COMMAND. 'PInfo' is the dialog context. 'WNotification' ** is the notification code of the command. 'wId' is the control/menu ** identifier of the command. 'HwndCtrl' is the control window handle of ** the command. ** ** Returns true if processed message, false otherwise. */ { TRACE3("RcCommand(n=%d,i=%d,c=$%x)", (DWORD)wNotification,(DWORD)wId,(ULONG_PTR )hwndCtrl); switch (wId) { case CID_RC_CB_RunScript: { if (SuScriptsCbHandler( &pInfo->suinfo, wNotification )) { return TRUE; } break; } case CID_RC_PB_Edit: { if (SuEditPbHandler( &pInfo->suinfo, wNotification )) { return TRUE; } break; } case CID_RC_PB_Browse: { if (SuBrowsePbHandler( &pInfo->suinfo, wNotification )) { return TRUE; } break; } } return FALSE; } BOOL RcInit( IN HWND hwndPage ) /* Called on WM_INITDIALOG. 'hwndPage' is the handle of the property ** page. ** ** Return false if focus was set, true otherwise. */ { AIINFO* pInfo; PBENTRY* pEntry; TRACE("RcInit"); pInfo = AiContext( hwndPage ); if (!pInfo) return TRUE; /* Initialize page-specific context information. */ pInfo->hwndRc = hwndPage; pInfo->hwndCbTerminal = GetDlgItem( hwndPage, CID_RC_CB_Terminal ); ASSERT( pInfo->hwndCbTerminal ); pInfo->hwndCbRunScript = GetDlgItem( hwndPage, CID_RC_CB_RunScript ); ASSERT( pInfo->hwndCbRunScript ); pInfo->hwndLbScripts = GetDlgItem( hwndPage, CID_RC_LB_Scripts ); ASSERT( pInfo->hwndLbScripts ); pInfo->hwndPbEdit = GetDlgItem( hwndPage, CID_RC_PB_Edit ); ASSERT( pInfo->hwndPbEdit ); pInfo->hwndPbBrowse = GetDlgItem( hwndPage, CID_RC_PB_Browse ); ASSERT( pInfo->hwndPbBrowse ); pEntry = pInfo->pArgs->pEntry; pInfo->suinfo.hConnection = ((INTERNALARGS *) pInfo->pArgs->pApiArgs->reserved)->hConnection; // We don't allow the script window for dd interfaces // ShowWindow(pInfo->hwndCbTerminal, SW_HIDE); // Set up the after-dial scripting controls. // SuInit( &pInfo->suinfo, pInfo->hwndCbRunScript, pInfo->hwndCbTerminal, pInfo->hwndLbScripts, pInfo->hwndPbEdit, pInfo->hwndPbBrowse, SU_F_DisableTerminal); pInfo->fSuInfoInitialized = TRUE; SuSetInfo( &pInfo->suinfo, pEntry->fScriptAfter, pEntry->fScriptAfterTerminal, pEntry->pszScriptAfter ); return FALSE; } BOOL RcKillActive( IN AIINFO* pInfo ) /* Called when PSN_KILLACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true if the page is invalid, false is it can be dismissed. */ { PBENTRY* pEntry; pEntry = pInfo->pArgs->pEntry; Free0( pEntry->pszScriptAfter ); SuGetInfo( &pInfo->suinfo, &pEntry->fScriptAfter, &pEntry->fScriptAfterTerminal, &pEntry->pszScriptAfter ); return FALSE; } BOOL RcSetActive( IN AIINFO* pInfo ) /* Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true to display the page, false to skip it. */ { HWND hwndRb; if (!pInfo->fNotNt || !pInfo->fModem) return FALSE; PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT ); return TRUE; } /*---------------------------------------------------------------------------- ** Finish property page ** Listed alphabetically following dialog proc **---------------------------------------------------------------------------- */ INT_PTR CALLBACK RfDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) /* DialogProc callback for the Finish page of the wizard. ** Parameters and return value are as described for standard windows ** 'DialogProc's. */ { #if 0 TRACE4("RfDlgProc(h=$%x,m=$%x,w=$%x,l=$%x)", (DWORD)hwnd,(DWORD)unMsg,(DWORD)wparam,(DWORD)lparam); #endif switch (unMsg) { case WM_INITDIALOG: return RfInit( hwnd ); case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AIINFO* pInfo; BOOL fDisplay; TRACE("RfSETACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fDisplay = RfSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; } case PSN_KILLACTIVE: { AIINFO* pInfo; BOOL fInvalid; TRACE("RfKILLACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fInvalid = RfKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } case PSN_WIZFINISH: { TRACE("RfWIZFINISH"); AiFinish( hwnd ); SetWindowLong( hwnd, DWLP_MSGRESULT, 0 ); return TRUE; } } break; } case WM_COMMAND: { AIINFO* pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } return RfCommand( pInfo, HIWORD( wparam ), LOWORD( wparam ), (HWND )lparam ); } } return FALSE; } BOOL RfCommand( IN AIINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ) /* Called on WM_COMMAND. 'PInfo' is the dialog context. 'WNotification' ** is the notification code of the command. 'wId' is the control/menu ** identifier of the command. 'HwndCtrl' is the control window handle of ** the command. ** ** Returns true if processed message, false otherwise. */ { TRACE3("RfCommand(n=%d,i=%d,c=$%x)", (DWORD)wNotification,(DWORD)wId,(ULONG_PTR )hwndCtrl); #if 0 switch (wId) { case CID_RF_PB_Properties: { pInfo->pArgs->fChainPropertySheet = TRUE; PropSheet_PressButton( pInfo->hwndDlg, PSBTN_FINISH ); return TRUE; } } #endif return FALSE; } BOOL RfInit( IN HWND hwndPage ) /* Called on WM_INITDIALOG. 'hwndPage' is the handle of the property ** page. ** ** Return false if focus was set, true otherwise. */ { AIINFO* pInfo; PBENTRY* pEntry; DWORD dwErr; TRACE("RfInit"); pInfo = AiContext( hwndPage ); if (!pInfo) return TRUE; /* Initialize page-specific context information. */ pInfo->hwndRf = hwndPage; // Set up a bold font if we can. // pInfo->hwndRfStFinish = GetDlgItem( hwndPage, CID_RF_ST_Explain ); if (pInfo->hBoldFont && pInfo->hwndRfStFinish) { SendMessage( pInfo->hwndRfStFinish, WM_SETFONT, (WPARAM)pInfo->hBoldFont, MAKELPARAM(TRUE, 0)); } /* Create and display the wizard bitmap. */ CreateWizardBitmap( hwndPage, TRUE ); return FALSE; } BOOL RfSetActive( IN AIINFO* pInfo ) /* Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true to display the page, false to skip it. */ { PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_FINISH ); return TRUE; } BOOL RfKillActive( IN AIINFO* pInfo ) { /* Called when PSN_KILLACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true if the page is invalid, false is it can be dismissed. */ return FALSE; } /*---------------------------------------------------------------------------- ** Modem/Adapter property page ** Listed alphabetically following dialog proc **---------------------------------------------------------------------------- */ INT_PTR CALLBACK RnDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) /* DialogProc callback for the Modem/Adapter page of the wizard. ** Parameters and return value are as described for standard windows ** 'DialogProc's. */ { #if 0 TRACE4("RnDlgProc(h=$%x,m=$%x,w=$%x,l=$%x)", (DWORD)hwnd,(DWORD)unMsg,(DWORD)wparam,(DWORD)lparam); #endif if (ListView_OwnerHandler( hwnd, unMsg, wparam, lparam, RnLvCallback )) { return TRUE; } switch (unMsg) { case WM_INITDIALOG: return RnInit( hwnd ); case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AIINFO* pInfo; BOOL fDisplay; TRACE("RnSETACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); fDisplay = RnSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; } case LVN_ITEMCHANGED: { AIINFO* pInfo; pInfo = AiContext( hwnd ); ASSERT(pInfo); RnLvItemChanged( pInfo ); return TRUE; } } break; } } return FALSE; } BOOL RnInit( IN HWND hwndPage ) /* Called on WM_INITDIALOG. 'hwndPage' is the handle of the property ** page. ** ** Return false if focus was set, true otherwise. */ { DWORD dwErr; AIINFO* pInfo; TRACE("RnInit"); pInfo = AiContext( hwndPage ); if (!pInfo) return TRUE; /* Initialize page-specific context information. */ pInfo->hwndRn = hwndPage; pInfo->hwndLv = GetDlgItem( hwndPage, CID_RN_LV_Devices ); ASSERT(pInfo->hwndLv); /* Add the modem and adapter images. */ ListView_SetDeviceImageList( pInfo->hwndLv, g_hinstDll ); /* Add a single column exactly wide enough to fully display the ** widest member of the list. */ { LV_COLUMN col; ZeroMemory( &col, sizeof(col) ); col.mask = LVCF_FMT; col.fmt = LVCFMT_LEFT; ListView_InsertColumn( pInfo->hwndLv, 0, &col ); ListView_SetColumnWidth( pInfo->hwndLv, 0, LVSCW_AUTOSIZE_USEHEADER ); } /* Don't bother with this page if there's only one device, not counting ** the bogus "uninstalled" standard modem that's added by EuInit so ** entries can be edited when there are no ports. */ if (!pInfo->pArgs->fNoPortsConfigured && ListView_GetItemCount( pInfo->hwndLv ) == 1) { pInfo->fSkipMa = TRUE; } return FALSE; } LVXDRAWINFO* RnLvCallback( IN HWND hwndLv, IN DWORD dwItem ) /* Enhanced list view callback to report drawing information. 'HwndLv' is ** the handle of the list view control. 'DwItem' is the index of the item ** being drawn. ** ** Returns the address of the column information. */ { /* Use "wide selection bar" feature and the other recommended options. ** ** Fields are 'nCols', 'dxIndent', 'dwFlags', 'adwFlags[]'. */ static LVXDRAWINFO info = { 1, 0, LVXDI_DxFill, { 0, 0 } }; return &info; } VOID RnLvItemChanged( IN AIINFO* pInfo ) /* Called when the combobox selection changes. 'PInfo' is the wizard ** context. */ { INT iSel; DTLNODE* pNode; DTLLIST* pList; TRACE("RnLvItemChanged"); pList = pInfo->pArgs->pEntry->pdtllistLinks; ASSERT(pList); pNode = (DTLNODE* )ListView_GetSelectedParamPtr( pInfo->hwndLv ); pInfo->dwSelectedDeviceIndex = (DWORD) ListView_GetNextItem( pInfo->hwndLv, -1, LVNI_SELECTED ); if (pNode) { PBLINK* pLink; /* Single device selected. Enable it, move it to the head of the list ** of links, and disable all the other links. */ pLink = (PBLINK* )DtlGetData( pNode ); pLink->fEnabled = TRUE; pInfo->fModem = (pLink->pbport.pbdevicetype == PBDT_Modem || pLink->pbport.pbdevicetype == PBDT_Null); /* If the device selected is an X25 PAD, we will drop the user into ** the phonebook entry-dialog after this wizard, so that the X25 ** address can be entered there. */ pInfo->pArgs->fPadSelected = (pLink->pbport.pbdevicetype == PBDT_Pad); DtlRemoveNode( pList, pNode ); DtlAddNodeFirst( pList, pNode ); for (pNode = DtlGetNextNode( pNode ); pNode; pNode = DtlGetNextNode( pNode )) { //For whstler 522872 PBLINK* pLinkTmp = (PBLINK* )DtlGetData( pNode ); ASSERT(pLinkTmp); pLinkTmp->fEnabled = FALSE; } } else { DTLNODE* pNextNode; DTLNODE* pAfterNode; pInfo->fModem = FALSE; /* ISDN multi-link selected. Enable the ISDN multi-link nodes, move ** them to the head of the list, and disable all the other links. */ pAfterNode = NULL; for (pNode = DtlGetFirstNode( pList ); pNode; pNode = pNextNode) { PBLINK* pLink = (PBLINK* )DtlGetData( pNode ); ASSERT(pLink); pNextNode = DtlGetNextNode( pNode ); if (pLink->pbport.pbdevicetype == PBDT_Isdn && !pLink->fProprietaryIsdn) { pLink->fEnabled = TRUE; DtlRemoveNode( pList, pNode ); if (pAfterNode) DtlAddNodeAfter( pList, pAfterNode, pNode ); else DtlAddNodeFirst( pList, pNode ); pAfterNode = pNode; } else { pLink->fEnabled = FALSE; } } } } BOOL RnLvRefresh( IN AIINFO* pInfo) { DWORD dwErr = NO_ERROR; TCHAR* psz; DTLNODE* pNode; DWORD cMultilinkableIsdn; INT iItem; ListView_DeleteAllItems( pInfo->hwndLv ); iItem = 1; cMultilinkableIsdn = 0; for (pNode = DtlGetFirstNode( pInfo->pArgs->pEntry->pdtllistLinks ); pNode; pNode = DtlGetNextNode( pNode )) { PBLINK* pLink; pLink = (PBLINK* )DtlGetData( pNode ); ASSERT(pLink); // For whistler bug 448251 // for whistler DCR 524304 gangz // Filter out LPT1, because the DoD only happens in a NAT or NAT/VPN // which won't use this LPT1 port if ( PBDT_PPPoE == pLink->pbport.pbdevicetype || PBDT_Parallel == pLink->pbport.pbdevicetype ) { continue; } if (pLink->pbport.pbdevicetype == PBDT_Isdn && !pLink->fProprietaryIsdn) { ++cMultilinkableIsdn; } psz = DisplayPszFromDeviceAndPort( pLink->pbport.pszDevice, pLink->pbport.pszPort ); if (psz) { PBLINK* pLinkTmp = NULL; LV_ITEM item; pLinkTmp = (PBLINK* )DtlGetData( pNode ); ZeroMemory( &item, sizeof(item) ); item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; item.iItem = iItem++; item.pszText = psz; // I noticed that the device bitmaps were // inconsistent with connections, so I'm // matching them up here. // if (pLinkTmp->pbport.dwType == RASET_Direct) { item.iImage = DI_Direct; } else if (pLinkTmp->pbport.pbdevicetype == PBDT_Modem) { item.iImage = DI_Modem; } else { item.iImage = DI_Adapter; } item.lParam = (LPARAM )pNode; ListView_InsertItem( pInfo->hwndLv, &item ); Free( psz ); } } if (cMultilinkableIsdn > 1) { psz = PszFromId( g_hinstDll, SID_IsdnAdapter ); if (psz) { LONG lStyle; LV_ITEM item; /* Turn off sorting so the special ISDN-multilink item appears ** at the top of the list. */ lStyle = GetWindowLong( pInfo->hwndLv, GWL_STYLE ); SetWindowLong( pInfo->hwndLv, GWL_STYLE, (lStyle & ~(LVS_SORTASCENDING)) ); ZeroMemory( &item, sizeof(item) ); item.mask = LVIF_TEXT + LVIF_IMAGE + LVIF_PARAM; item.iItem = 0; item.pszText = psz; item.iImage = DI_Adapter; item.lParam = (LPARAM )NULL; ListView_InsertItem( pInfo->hwndLv, &item ); Free( psz ); } } return NO_ERROR; } BOOL RnSetActive( IN AIINFO* pInfo ) /* Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true to display the page, false to skip it. */ { INT cDevices; // pmay: 233295. // This page does not apply to VPN connections // if ( ((pInfo->pArgs->pEntry->dwType == RASET_Vpn && !pInfo->pArgs->fNt4Router) || (pInfo->fSkipMa) || (pInfo->pArgs->pEntry->dwType == RASET_Broadband)) //For whistler 349807 ) { return FALSE; } // If we have no physical devices, then this page is invalid // unless we're focused on an nt4 machine in which case the // tunneling adapters are selected from here. if ( ! (pInfo->dwFlags & AI_F_HasPhysDevs) ) { if ( ! pInfo->pArgs->fNt4Router ) return FALSE; } // Refresh the list view and make the correct selection // RnLvRefresh(pInfo); // for whistler DCR 524304 gangz // If there is no device, just skip this page // if( 0 == ListView_GetItemCount( pInfo->hwndLv ) ) { return FALSE; } ListView_SetItemState( pInfo->hwndLv, pInfo->dwSelectedDeviceIndex, LVIS_SELECTED, LVIS_SELECTED ); PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT ); return TRUE; } /*---------------------------------------------------------------------------- ** Phone Number property page ** Listed alphabetically following dialog proc **---------------------------------------------------------------------------- */ INT_PTR CALLBACK RpDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) /* DialogProc callback for the Phone Number page of the wizard. ** Parameters and return value are as described for standard windows ** 'DialogProc's. */ { #if 0 TRACE4("RpDlgProc(h=$%x,m=$%x,w=$%x,l=$%x)", (DWORD)hwnd,(DWORD)unMsg,(DWORD)wparam,(DWORD)lparam); #endif switch (unMsg) { case WM_INITDIALOG: return RpInit( hwnd ); case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AIINFO* pInfo; BOOL fDisplay; TRACE("RpSETACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fDisplay = RpSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; } case PSN_KILLACTIVE: { AIINFO* pInfo; BOOL fInvalid; TRACE("RpKILLACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fInvalid = RpKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } case WM_COMMAND: { AIINFO* pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } return RpCommand( pInfo, HIWORD( wparam ), LOWORD( wparam ), (HWND )lparam ); } } return FALSE; } VOID RpAlternates( IN AIINFO* pInfo ) /* Popup the Alternate Phone Numbers dialog. 'PInfo' is the property ** sheet context. */ { RpPhoneNumberToStash( pInfo ); if (PhoneNumberDlg( pInfo->hwndRp, pInfo->pArgs->fRouter, pInfo->pListPhoneNumbers, &pInfo->fPromoteHuntNumbers )) { TCHAR* pszPhoneNumber; pszPhoneNumber = FirstPszFromList( pInfo->pListPhoneNumbers ); SetWindowText( pInfo->hwndEbNumber, pszPhoneNumber ); } } BOOL RpCommand( IN AIINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ) /* Called on WM_COMMAND. 'PInfo' is the dialog context. 'WNotification' ** is the notification code of the command. 'wId' is the control/menu ** identifier of the command. 'HwndCtrl' is the control window handle of ** the command. ** ** Returns true if processed message, false otherwise. */ { TRACE3("RpCommand(n=%d,i=%d,c=$%x)", (DWORD)wNotification,(DWORD)wId,(ULONG_PTR )hwndCtrl); switch (wId) { case CID_RP_PB_Alternates: RpAlternates( pInfo ); return TRUE; } return FALSE; } BOOL RpInit( IN HWND hwndPage ) /* Called on WM_INITDIALOG. 'hwndPage' is the handle of the property ** page. ** ** Return false if focus was set, true otherwise. */ { AIINFO* pInfo; TRACE("RpInit"); pInfo = AiContext( hwndPage ); if (!pInfo) return TRUE; /* Initialize page-specific context information. */ pInfo->hwndRp = hwndPage; pInfo->hwndStNumber = GetDlgItem( hwndPage, CID_RP_ST_Number ); ASSERT(pInfo->hwndStNumber); pInfo->hwndEbNumber = GetDlgItem( hwndPage, CID_RP_EB_Number ); ASSERT(pInfo->hwndEbNumber); pInfo->hwndPbAlternates = GetDlgItem( hwndPage, CID_RP_PB_Alternates ); ASSERT(pInfo->hwndPbAlternates); /* Fill the phone number field from the stash created earlier. */ Edit_LimitText( pInfo->hwndEbNumber, RAS_MaxPhoneNumber ); SetWindowText( pInfo->hwndEbNumber, FirstPszFromList( pInfo->pListPhoneNumbers ) ); return FALSE; } BOOL RpKillActive( IN AIINFO* pInfo ) /* Called when PSN_KILLACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true if the page is invalid, false is it can be dismissed. */ { // pmay: 226610. Call RpPhoneNumberToStash if we were successfully // activated. /* Update the stashed phone number from the editbox. */ if ( (! pInfo->pArgs->fNt4Router) && ( (pInfo->pArgs->pEntry->dwType == RASET_Vpn) || (pInfo->pArgs->pEntry->dwType == RASET_Broadband) ) //For whistler 349807 ) { return FALSE; } RpPhoneNumberToStash( pInfo ); return FALSE; } VOID RpPhoneNumberToStash( IN AIINFO* pInfo ) /* Replace the first phone number in the stashed list with the contents of ** the phone number field. 'pInfo' is the property sheet context. */ { DWORD dwErr; TCHAR* pszPhoneNumber; TRACE("RpPhoneNumberToStash"); pszPhoneNumber = GetText( pInfo->hwndEbNumber ); if (pszPhoneNumber) { dwErr = FirstPszToList( pInfo->pListPhoneNumbers, pszPhoneNumber ); Free( pszPhoneNumber ); } else dwErr = ERROR_NOT_ENOUGH_MEMORY; if (dwErr != 0) { ErrorDlg( pInfo->hwndDlg, SID_OP_RetrievingData, dwErr, NULL ); AiExit( pInfo, dwErr ); } } BOOL RpSetActive( IN AIINFO* pInfo ) /* Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true to display the page, false to skip it. */ { INT iSel; DTLNODE* pNode; DTLLIST* pList; PBLINK* pLink; if (! pInfo->pArgs->fNt4Router) { // If we're focused on an nt5 machine, then skip this page // if the connection type is virtual because the phone number will // be gotten from the vpn destination page. if (pInfo->pArgs->pEntry->dwType == RASET_Vpn || pInfo->pArgs->pEntry->dwType == RASET_Broadband) //Add this for whistler 349087 { return FALSE; } // pmay: 233287 // // No phone number is requred if the device is dcc. Skip // this page if that is the case. // pList = pInfo->pArgs->pEntry->pdtllistLinks; ASSERT(pList); pNode = (DTLNODE* )ListView_GetSelectedParamPtr( pInfo->hwndLv ); if (pNode) { // Single device selected. See if its dcc pLink = (PBLINK* )DtlGetData( pNode ); if (pLink->pbport.dwType == RASET_Direct) { return FALSE; } } } // Instruct the wizard to use the destination editbox for the // phone number of this connection pInfo->hwndEbNumber = GetDlgItem(pInfo->hwndRp, CID_RP_EB_Number); PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT ); return TRUE; } /*---------------------------------------------------------------------------- ** Router welcome property page ** Listed alphabetically following dialog proc **---------------------------------------------------------------------------- */ INT_PTR CALLBACK RwDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) /* DialogProc callback for the Router Welcome page of the wizard. ** Parameters and return values are as described for standard windows ** 'DialogProc's. */ { switch (unMsg) { case WM_INITDIALOG: { return RwInit( hwnd, (EINFO* )(((PROPSHEETPAGE* )lparam)->lParam) ); } case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_RESET: { TRACE("RwRESET"); AiCancel( hwnd ); SetWindowLong( hwnd, DWLP_MSGRESULT, FALSE ); return TRUE; } case PSN_SETACTIVE: { AIINFO* pInfo; BOOL fDisplay; TRACE("RwSETACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fDisplay = RwSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; } case PSN_KILLACTIVE: { AIINFO* pInfo; BOOL fInvalid; TRACE("InKILLACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fInvalid = RwKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } case PSN_WIZFINISH: { AIINFO* pInfo; TRACE("InWIZFINISH"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } /* You'd think pressing Finish would trigger a KILLACTIVE ** event, but it doesn't, so we do it ourselves. */ RwKillActive( pInfo ); /* Set "no wizard" user preference, per user's check. */ pInfo->pArgs->pUser->fNewEntryWizard = FALSE; pInfo->pArgs->pUser->fDirty = TRUE; g_pSetUserPreferences( NULL, pInfo->pArgs->pUser, pInfo->pArgs->fNoUser ? UPM_Logon : UPM_Normal ); pInfo->pArgs->fPadSelected = FALSE; pInfo->pArgs->fChainPropertySheet = TRUE; AiFinish( hwnd ); SetWindowLong( hwnd, DWLP_MSGRESULT, 0 ); return TRUE; } } break; } case WM_DESTROY: { AiTerm( hwnd ); break; } } return FALSE; } BOOL RwInit( IN HWND hwndPage, IN OUT EINFO* pArgs ) /* Called on WM_INITDIALOG. 'hwndPage' is the handle of the property ** page. 'PArgs' is the arguments from the PropertySheet caller. ** ** Return false if focus was set, true otherwise. */ { DWORD dwErr; AIINFO* pInfo; TRACE("RwInit"); /* We're first page, so initialize the wizard. */ pInfo = AiInit( hwndPage, pArgs ); if (!pInfo) return TRUE; /* Initialize page-specific context information. */ pInfo->hwndRw = hwndPage; pInfo->hwndRwStWelcome = GetDlgItem( hwndPage, CID_RW_ST_Welcome); // Set up a bold font if we can. // if (pInfo->hBoldFont) { SendMessage( pInfo->hwndRwStWelcome, WM_SETFONT, (WPARAM)pInfo->hBoldFont, MAKELPARAM(TRUE, 0)); } /* Create and display the wizard bitmap. */ CreateWizardBitmap( hwndPage, TRUE ); return TRUE; } BOOL RwKillActive( IN AIINFO* pInfo ) /* Called when PSN_KILLACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true if the page is invalid, false is it can be dismissed. */ { return FALSE; } BOOL RwSetActive( IN AIINFO* pInfo ) /* Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true to display the page, false to skip it. */ { PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_NEXT ); return TRUE; } INT_PTR CALLBACK SrAddDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) { AIINFO * pInfo; switch (unMsg) { case WM_INITDIALOG: { pInfo = (AIINFO *)lparam; // //Set the ip addresses to "0.0.0.0" // pInfo->hwndDest = GetDlgItem(hwnd, CID_SR_Dest_Ip); pInfo->hwndNetMask = GetDlgItem(hwnd, CID_SR_NetMask_Ip); pInfo->hwndMetric = GetDlgItem(hwnd, CID_SR_Metric); // //Initialize Controls // SetWindowText( pInfo->hwndDest , EMPTY_IPADDRESS ); SetWindowText( pInfo->hwndNetMask , EMPTY_IPADDRESS ); SetWindowText( pInfo->hwndMetric , L"1" ); // //Set text limit for metric control // SendMessage(pInfo->hwndMetric, EM_LIMITTEXT, 2, 0 ); SetWindowLongPtr( hwnd, DWLP_USER, (ULONG_PTR )pInfo ); } case WM_COMMAND: { // //id is in loword of wparam and //notification is in hiword of wparam // switch (LOWORD( wparam )) { case IDOK: { TCHAR * pszDest = NULL; TCHAR * pszMask = NULL; TCHAR * pszMetric = NULL; SROUTEINFOLIST * pNode = NULL; ULONG ulDestIP, ulMask; pInfo = (AIINFO *)GetWindowLongPtr( hwnd, DWLP_USER); pszDest = GetText( pInfo->hwndDest ); // For whistler 492089 if( NULL == pszDest ) { break; } // // Check to see if the ip,mask and metric // are still empty. // pszMetric = GetText(pInfo->hwndMetric); if( NULL == pszMetric ) { Free( pszDest ); break; } if ( !lstrcmp ( pszMetric, L"0" ) ) { MsgDlg( hwnd, SID_SR_MetricRequired, NULL ); Free(pszDest); Free(pszMetric); return TRUE; } pszMask = GetText( pInfo->hwndNetMask ); ulDestIP = inet_addrw(pszDest); ulMask = inet_addrw(pszMask); if ( ulDestIP != (ulMask & ulDestIP) ) { MsgDlg( hwnd, SID_SR_InvalidMask, NULL ); Free(pszDest); Free(pszMask); Free(pszMetric); return TRUE; } // //Check to see if this entry has already been added // if ( AIInfoSRouteIsRouteinList(pInfo, pszDest, pszMask, pszMetric ) ) { Free(pszDest); Free(pszMask); Free(pszMetric); MsgDlg(hwnd, SID_SR_DuplicateRoute, NULL); return TRUE; } AIInfoSRouteCreateEntry(pInfo, pszDest, pszMask, pszMetric ); Free(pszDest); Free(pszMask); Free(pszMetric); } // ...fall thru... case IDCANCEL: { EndDialog( hwnd, TRUE ); return TRUE; } } } } return FALSE; } DWORD SrRefresSRouteList( IN AIINFO * pInfo ) { DWORD dwRetCode = ERROR_SUCCESS; SROUTEINFOLIST * pNode = AiInfoSRouteGetFirstNode(pInfo); LVITEM lvItem; SHORT nIndex = 0; ListView_DeleteAllItems (pInfo->hwndLvStaticRoutes); while ( pNode ) { ZeroMemory(&lvItem, sizeof(lvItem)); lvItem.iItem = nIndex; lvItem.mask = LVIF_TEXT | LVIF_STATE | LVIF_PARAM; lvItem.lParam = (LPARAM)pNode; lvItem.pszText = pNode->RouteInfo.pszDestIP; ListView_InsertItem(pInfo->hwndLvStaticRoutes, &lvItem ); ListView_SetItemText( pInfo->hwndLvStaticRoutes, nIndex, 1, pNode->RouteInfo.pszNetworkMask ); ListView_SetItemText( pInfo->hwndLvStaticRoutes, nIndex, 2, pNode->RouteInfo.pszMetric ); pNode = AiInfoSRouteGetNextNode(pNode); nIndex++; } SrLvItemChanged(pInfo); return dwRetCode; } void SrRemoveRoute (AIINFO * pInfo) { int nSelIndex = -1; SROUTEINFOLIST * pNode = NULL; LVITEM lvItem; nSelIndex = ListView_GetNextItem( pInfo->hwndLvStaticRoutes, -1, LVNI_SELECTED ); // //Check to see if any items are selected // if ( nSelIndex == -1 ) return; // //Now delete the entry from list box and from the list // ZeroMemory( &lvItem, sizeof(lvItem) ); lvItem.mask = LVIF_PARAM; lvItem.iItem = nSelIndex; ListView_GetItem(pInfo->hwndLvStaticRoutes, &lvItem); pNode = (SROUTEINFOLIST *)lvItem.lParam; AIInfoRemoveSRouteNode ( pInfo, pNode ); SrRefresSRouteList ( pInfo ); } /*------------------------------------------------------------------------ ** Static Routes property page ** **------------------------------------------------------------------------ */ BOOL SrCommand( IN AIINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ) { INT_PTR nStatus; TRACE( "SrCommand" ); switch (wId) { case CID_SR_PB_Add: // //Show the dialog here to add a new //static route // nStatus = (BOOL )DialogBoxParam( g_hinstDll, MAKEINTRESOURCE( DID_SR_StaticRoute ), pInfo->hwndSr, SrAddDlgProc, (LPARAM )pInfo ); SrRefresSRouteList(pInfo); return TRUE; case CID_SR_PB_Remove: // //Check to see if we have any items selected. // SrRemoveRoute ( pInfo ); return TRUE; } return FALSE; } INT_PTR CALLBACK SrDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) { switch (unMsg) { case WM_INITDIALOG: return SrInit( hwnd ); case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AIINFO* pInfo; BOOL fDisplay; TRACE("SrSETACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fDisplay = SrSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; } case PSN_KILLACTIVE: { AIINFO* pInfo; BOOL fInvalid; TRACE("SrKILLACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fInvalid = SrKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } case LVN_ITEMCHANGED: { AIINFO* pInfo; pInfo = AiContext( hwnd ); ASSERT(pInfo); SrLvItemChanged( pInfo ); return TRUE; } } break; } case WM_COMMAND: { AIINFO* pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } return SrCommand( pInfo, HIWORD( wparam ), LOWORD( wparam ), (HWND )lparam ); } } return FALSE; } VOID SrLvItemChanged( IN AIINFO* pInfo ) { HWND hwnd; int nSelIndex; hwnd = GetDlgItem(pInfo->hwndSr, CID_SR_PB_Remove); if(hwnd){ nSelIndex = ListView_GetNextItem( pInfo->hwndLvStaticRoutes, -1, LVNI_SELECTED); if(nSelIndex == -1){ //Disable the remove button EnableWindow(hwnd, FALSE); } else { //Enable remove button EnableWindow(hwnd, TRUE); } } } BOOL SrInit( IN HWND hwndPage ) { AIINFO* pInfo; HWND hwnd; TRACE("SrInit"); pInfo = AiContext( hwndPage ); if (!pInfo) return TRUE; //Disable the Remove button hwnd = GetDlgItem(hwndPage, CID_SR_PB_Remove); if(hwnd){ EnableWindow(hwnd, FALSE); } /* Initialize page-specific context information. */ pInfo->hwndSr = hwndPage; pInfo->hwndLvStaticRoutes = GetDlgItem(hwndPage, CID_SR_LV_StaticRoutes ); ListView_SetExtendedListViewStyle( pInfo->hwndLvStaticRoutes, ListView_GetExtendedListViewStyle(pInfo->hwndLvStaticRoutes) | LVS_EX_FULLROWSELECT ); // // Add columns. // { LV_COLUMN col; TCHAR* pszHeader0 = NULL; TCHAR* pszHeader1 = NULL; TCHAR* pszHeader2 = NULL; RECT rc; LONG lColWidth; pszHeader0 = PszFromId( g_hinstDll, SID_SR_Destination ); pszHeader1 = PszFromId( g_hinstDll, SID_SR_Netmask ); pszHeader2 = PszFromId( g_hinstDll, SID_SR_Metric ); ZeroMemory( &col, sizeof(col) ); col.mask = LVCF_FMT + LVCF_TEXT + LVCF_SUBITEM; col.fmt = LVCFMT_LEFT; col.pszText = (pszHeader0) ? pszHeader0 : TEXT(""); ListView_InsertColumn( pInfo->hwndLvStaticRoutes, 0, &col ); ZeroMemory( &col, sizeof(col) ); col.mask = LVCF_FMT + LVCF_SUBITEM + LVCF_TEXT; col.fmt = LVCFMT_LEFT; col.pszText = (pszHeader1) ? pszHeader1 : TEXT(""); col.iSubItem = 1; ListView_InsertColumn( pInfo->hwndLvStaticRoutes, 1, &col ); ZeroMemory( &col, sizeof(col) ); col.mask = LVCF_FMT + LVCF_SUBITEM + LVCF_TEXT ; col.fmt = LVCFMT_LEFT; col.pszText = (pszHeader2) ? pszHeader2 : TEXT(""); col.iSubItem = 2; ListView_InsertColumn( pInfo->hwndLvStaticRoutes, 2, &col ); // //Now Set the column headers // Free0( pszHeader0 ); Free0( pszHeader1 ); Free0( pszHeader2 ); // //Set column width // GetClientRect(pInfo->hwndLvStaticRoutes, &rc); lColWidth = ( rc.right - rc.left ) / 3; ListView_SetColumnWidth ( pInfo->hwndLvStaticRoutes, 0, lColWidth ); ListView_SetColumnWidth ( pInfo->hwndLvStaticRoutes, 1, lColWidth ); ListView_SetColumnWidth ( pInfo->hwndLvStaticRoutes, 2, lColWidth ); } // for whistler DCR 524304 gangz PropSheet_SetWizButtons( pInfo->hwndSr, PSWIZB_BACK | PSWIZB_NEXT ); return TRUE; } BOOL SrKillActive( IN AIINFO* pInfo ) { return FALSE; } BOOL SrSetActive( IN AIINFO* pInfo ) { BOOL fDisplay = FALSE; if (pInfo->fIp) { // //Check to see if there are existing routes. //If so, add them to the list. // SrRefresSRouteList(pInfo); fDisplay = TRUE; } else { fDisplay = FALSE; } // for whistler DCR 524304 gangz PropSheet_SetWizButtons( pInfo->hwndSr, PSWIZB_BACK | PSWIZB_NEXT ); // Won't show this for NAT path // if( RASEDFLAG_NAT & pInfo->pArgs->pApiArgs->dwFlags ) { // Add a default static route TCHAR pszDest[] = TEXT("0.0.0.0"); TCHAR pszMask[] = TEXT("0.0.0.0"); TCHAR pszMetric[] = TEXT("1"); if ( !AIInfoSRouteIsRouteinList(pInfo, pszDest, pszMask, pszMetric ) ) { AIInfoSRouteCreateEntry(pInfo, pszDest, pszMask, pszMetric ); } //Return No Display flag fDisplay = FALSE; } return fDisplay; } /*---------------------------------------------------------------------------- ** Server settings property page ** Listed alphabetically following dialog proc **---------------------------------------------------------------------------- */ INT_PTR CALLBACK SsDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) /* DialogProc callback for the 5 checkboxes page of the wizard. ** Parameters and return value are as described for standard windows ** 'DialogProc's. */ { #if 0 TRACE4("SsDlgProc(h=$%x,m=$%x,w=$%x,l=$%x)", (DWORD)hwnd,(DWORD)unMsg,(DWORD)wparam,(DWORD)lparam); #endif switch (unMsg) { case WM_INITDIALOG: return SsInit( hwnd ); case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AIINFO* pInfo; BOOL fDisplay; TRACE("SsSETACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fDisplay = SsSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; } case PSN_KILLACTIVE: { AIINFO* pInfo; BOOL fInvalid; TRACE("SsKILLACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fInvalid = SsKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } case WM_COMMAND: { AIINFO* pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } return SsCommand( pInfo, HIWORD( wparam ), LOWORD( wparam ), (HWND )lparam ); } } return FALSE; } BOOL SsCommand( IN AIINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ) /* Called on WM_COMMAND. 'PInfo' is the dialog context. 'WNotification' ** is the notification code of the command. 'wId' is the control/menu ** identifier of the command. 'HwndCtrl' is the control window handle of ** the command. ** ** Returns true if processed message, false otherwise. */ { TRACE3("SsCommand(n=%d,i=%d,c=$%x)", (DWORD)wNotification,(DWORD)wId,(ULONG_PTR )hwndCtrl); switch (wId) { case CID_SS_CB_AddUser: return TRUE; } return FALSE; } BOOL SsInit( IN HWND hwndPage ) /* Called on WM_INITDIALOG. 'hwndPage' is the handle of the property ** page. ** ** Return false if focus was set, true otherwise. */ { AIINFO* pInfo; TRACE("SsInit"); pInfo = AiContext( hwndPage ); if (!pInfo) return TRUE; /* Initialize page-specific context information. */ pInfo->hwndSs = hwndPage; if (pInfo->fIpConfigured) CheckDlgButton( hwndPage, CID_SS_CB_RouteIp, BST_CHECKED ); //for whistler bug 213901 //Hide the IPX checkbox //move other check boxes to cover the hole made by hiding // For .Net server bug 605988 remove IPX for all versions return FALSE; } BOOL SsKillActive( IN AIINFO* pInfo ) /* Called when PSN_KILLACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true if the page is invalid, false is it can be dismissed. */ { pInfo->fIp = IsDlgButtonChecked( pInfo->hwndSs, CID_SS_CB_RouteIp ); //for whistler bug 213901, .Net 605988, remove IPX // pInfo->fIpx = FALSE; pInfo->pArgs->fAddUser = IsDlgButtonChecked( pInfo->hwndSs, CID_SS_CB_AddUser ); pInfo->pArgs->pEntry->fAuthenticateServer = FALSE; pInfo->fClearPwOk = IsDlgButtonChecked( pInfo->hwndSs, CID_SS_CB_PlainPw ); pInfo->fNotNt = IsDlgButtonChecked( pInfo->hwndSs, CID_SS_CB_NotNt ); if (pInfo->fIp && !pInfo->fIpConfigured) { MsgDlg( pInfo->hwndDlg, SID_ConfigureIp, NULL ); SetFocus( GetDlgItem( pInfo->hwndSs, CID_SS_CB_RouteIp) ); return TRUE; } return FALSE; } BOOL SsSetActive( IN AIINFO* pInfo ) /* Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true to display the page, false to skip it. */ { HWND hwndScript = GetDlgItem( pInfo->hwndSs, CID_SS_CB_NotNt ); HWND hwndPw = GetDlgItem( pInfo->hwndSs, CID_SS_CB_PlainPw ); HWND hwndUser = GetDlgItem( pInfo->hwndSs, CID_SS_CB_AddUser ); // // We only allow interactive scripting on modem devices // // (pmay: 378432. Same for PAP/SPAP) // if ( pInfo->pArgs->pEntry->dwType == RASET_Vpn ) { Button_SetCheck( hwndScript, FALSE ); Button_SetCheck( hwndPw, FALSE ); EnableWindow( hwndScript, FALSE ); EnableWindow( hwndPw, FALSE ); } else { EnableWindow( hwndScript, TRUE ); EnableWindow( hwndPw, TRUE ); } //For PPPoE dont add a dial-in user account whistler 345068 349087 gangz // // For whistler bug 522292, Enable the AddUser check box if it is not a // PPPoE connections // if (hwndUser) { Button_SetCheck( hwndUser, FALSE ); if ( RASET_Broadband == pInfo->pArgs->pEntry->dwType ) { EnableWindow( hwndUser, FALSE); } else { //For whistler bug 522292 EnableWindow( hwndUser, TRUE); } } PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT ); return TRUE; } /*---------------------------------------------------------------------------- ** Vpn destination property page ** Listed alphabetically following dialog proc **---------------------------------------------------------------------------- */ INT_PTR CALLBACK VdDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) /* DialogProc callback for the vpn destination page of the wizard. ** Parameters and return value are as described for standard windows ** 'DialogProc's. */ { switch (unMsg) { case WM_INITDIALOG: return VdInit( hwnd ); case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AIINFO* pInfo; BOOL fDisplay; TRACE("VdSETACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fDisplay = VdSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; } case PSN_KILLACTIVE: { AIINFO* pInfo; BOOL fInvalid; TRACE("VdKILLACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fInvalid = VdKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } } return FALSE; } BOOL VdInit( IN HWND hwndPage ) /* Called on WM_INITDIALOG. 'hwndPage' is the handle of the property ** page. ** ** Return false if focus was set, true otherwise. */ { DWORD dwErr; AIINFO* pInfo = NULL; PBENTRY* pEntry; TRACE("InInit"); // Get the context of this page pInfo = AiContext( hwndPage ); ASSERT ( pInfo ); // Set up the interface name stuff // //For prefix bug 226336 to validate the pInfo gangz // if(pInfo) { pInfo->hwndEbNumber = GetDlgItem( hwndPage, CID_VD_EB_NameOrAddress ); // ASSERT(pInfo->hwndEbInterfaceName); ASSERT(pInfo->hwndEbNumber); Edit_LimitText( pInfo->hwndEbNumber, RAS_MaxPhoneNumber ); SetWindowText( pInfo->hwndEbNumber, FirstPszFromList( pInfo->pListPhoneNumbers ) ); /* Initialize page-specific context information. */ pInfo->hwndVd = hwndPage; return TRUE; } else { return FALSE; } } BOOL VdKillActive( IN AIINFO* pInfo ) /* Called when PSN_KILLACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true if the page is invalid, false is it can be dismissed. */ { // pmay: 226610. Call RpPhoneNumberToStash if we were successfully // activated. // If we're focused on an nt4 box, then this page is // invalid (pptp was the only type) if ( pInfo->pArgs->fNt4Router ) { return FALSE; } // If we have no tunnel devices, then this page is invalid else if ( ! (pInfo->dwFlags & AI_F_HasTunlDevs) ) { return FALSE; } // If the connection type is not virtual, skip this page since the // destination will be gotten from the phone number/PPPoE page. if ( pInfo->pArgs->pEntry->dwType != RASET_Vpn ) { return FALSE; } RpPhoneNumberToStash(pInfo); return FALSE; } BOOL VdSetActive( IN AIINFO* pInfo ) /* Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true to display the page, false to skip it. */ { // If we're focused on an nt4 box, then this page is // invalid (pptp was the only type) if ( pInfo->pArgs->fNt4Router ) { return FALSE; } // If we have no tunnel devices, then this page is invalid else if ( ! (pInfo->dwFlags & AI_F_HasTunlDevs) ) { return FALSE; } // If the connection type is not virtual, skip this page since the // destination will be gotten from the phone number page. if ( pInfo->pArgs->pEntry->dwType != RASET_Vpn ) { return FALSE; } // Instruct the wizard to use the destination editbox for the // phone number of this connection pInfo->hwndEbNumber = GetDlgItem(pInfo->hwndVd, CID_VD_EB_NameOrAddress); PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT ); return TRUE; } /*---------------------------------------------------------------------------- ** Vpn type property page ** Listed alphabetically following dialog proc **---------------------------------------------------------------------------- */ INT_PTR CALLBACK VtDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam ) /* DialogProc callback for the vpn type page of the wizard. ** Parameters and return value are as described for standard windows ** 'DialogProc's. */ { switch (unMsg) { case WM_INITDIALOG: return VtInit( hwnd ); case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AIINFO* pInfo; BOOL fDisplay; TRACE("VtSETACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fDisplay = VtSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; } case PSN_KILLACTIVE: { AIINFO* pInfo; BOOL fInvalid; TRACE("VtKILLACTIVE"); pInfo = AiContext( hwnd ); ASSERT(pInfo); if (pInfo == NULL) { break; } fInvalid = VtKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } } return FALSE; } BOOL VtInit( IN HWND hwndPage ) /* Called on WM_INITDIALOG. 'hwndPage' is the handle of the property ** page. ** ** Return false if focus was set, true otherwise. */ { AIINFO * pInfo; // Get the context pInfo = AiContext( hwndPage ); ASSERT ( pInfo ); if (pInfo == NULL) { return FALSE; } // Initialize the checks pInfo->hwndVtRbAutomatic = GetDlgItem( hwndPage, CID_VT_RB_Automatic ); pInfo->hwndVtRbPptp = GetDlgItem( hwndPage, CID_VT_RB_Pptp ); pInfo->hwndVtRbL2tp = GetDlgItem( hwndPage, CID_VT_RB_L2tp ); ASSERT( pInfo->hwndVtRbAutomatic ); ASSERT( pInfo->hwndVtRbPptp ); ASSERT( pInfo->hwndVtRbL2tp ); // Default to automatic Button_SetCheck( pInfo->hwndVtRbAutomatic, TRUE ); return FALSE; } BOOL VtKillActive( IN AIINFO* pInfo ) /* Called when PSN_KILLACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true if the page is invalid, false is it can be dismissed. */ { if ( Button_GetCheck( pInfo->hwndVtRbAutomatic ) ) { pInfo->dwVpnStrategy = VS_Default; } else if ( Button_GetCheck( pInfo->hwndVtRbPptp ) ) { pInfo->dwVpnStrategy = VS_PptpOnly; } else if ( Button_GetCheck( pInfo->hwndVtRbL2tp ) ) { pInfo->dwVpnStrategy = VS_L2tpOnly; } return FALSE; } BOOL VtSetActive( IN AIINFO* pInfo ) /* Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context. ** ** Returns true to display the page, false to skip it. */ { // If we're focused on an nt4 box, then this page is // invalid (pptp was the only type) if ( pInfo->pArgs->fNt4Router ) { return FALSE; } // If we have no tunnel devices, then this page is invalid else if ( ! (pInfo->dwFlags & AI_F_HasTunlDevs) ) { return FALSE; } // If the connection type is not virtual, skip this page since the // destination will be gotten from the phone number page. if ( pInfo->pArgs->pEntry->dwType != RASET_Vpn ) { return FALSE; } PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT ); return TRUE; }