|
|
// Copyright (c) 1995, Microsoft Corporation, all rights reserved
//
// entryw.c
// Remote Access Common Dialog APIs
// Add Entry wizard
//
// 06/20/95 Steve Cobb
// 11/10/97 Shaun Cox, NT5/Connections rework
#include "rasdlgp.h"
#include "inetcfgp.h"
#include "netcon.h"
#include "rasuip.h"
#include "rassrvp.h"
#include <winscard.h>
#include "hnportmapping.h"
#include <wchar.h>
static int MAX_ENTERCONNECTIONNAME = 200; DWORD OpenPhonebookFile( BOOL fForAllUsers, PBFILE* pFile ) { TCHAR pszPhonebookPath [MAX_PATH];
pszPhonebookPath[0] = TEXT('\0');
// Get the correct phonebook file path depending on whether it is
// for all users or the current one.
//
if (fForAllUsers) { if(!GetPublicPhonebookPath( pszPhonebookPath )) { return ERROR_CANNOT_OPEN_PHONEBOOK; } } else { if(!GetPersonalPhonebookPath( NULL, pszPhonebookPath )) { return ERROR_CANNOT_OPEN_PHONEBOOK; } }
return ReadPhonebookFile( pszPhonebookPath, NULL, NULL, 0, pFile ); }
VOID ReOpenPhonebookFile( BOOL fForAllUsers, PBFILE* pFile ) { // Close the previous phonebook file.
//
if (pFile) { ClosePhonebookFile( pFile ); }
// Open the one corresponding to the selection.
//
OpenPhonebookFile( fForAllUsers, pFile ); }
//----------------------------------------------------------------------------
// Local datatypes (alphabetically)
//----------------------------------------------------------------------------
// Add Entry wizard context block. All property pages refer to the single
// context block associated with the sheet.
//
typedef struct _AEINFO { // Common input arguments.
//
EINFO* pArgs;
// Wizard and page handles.
//
HWND hwndDlg; HWND hwndLa; HWND hwndMa; HWND hwndCn; //Add for bug 328673
HWND hwndPa; HWND hwndBs; HWND hwndDa; HWND hwndPn; HWND hwndUs; HWND hwndDt; HWND hwndEn; HWND hwndGh; HWND hwndDn; HWND hwndSw; HWND hwndSp; HWND hwndSc;
// Legacy application page.
//
HFONT hfontBold;
// Modem/Adapter page.
//
HWND hwndLv;
// Connection Name page.
//
HWND hwndCnName; HWND hwndCnStHMsg; HWND hwndCnStHMsg2; HWND hwndCnEbConnectionName; //Add for bug 328673
BOOL fCnWizNext; //if Back button is pressed
// Phone number page.
//
HWND hwndEbNumber;
// Smart Card page
//
HWND hwndScRbYes; HWND hwndScRbNo;
// Destination page.
//
HWND hwndEbHostName;
// Broadband service page
//
HWND hwndEbBroadbandService;
// Public network page.
//
HWND hwndLbDialFirst;
// Entry Name page.
//
HWND hwndEbEntryName;
// Shared Access private-lan page
//
HWND hwndSpLbPrivateLan;
// User/default connection windows
//
HWND hwndUsRbForAll; HWND hwndUsRbForMe;
HWND hwndDtCbFirewall; //add for whistler bug 328673
HWND hwndDtCbDefault; HWND hwndDtCbUseCredentials; HWND hwndDtEbUserName; HWND hwndDtEbPassword; HWND hwndDtEbPassword2; HWND hwndDtStUserName; HWND hwndDtStPassword; HWND hwndDtStPassword2;
// 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;
// Set to true if there are no connections to show on the public
// network page and therefore no reason to show the page.
//
BOOL fHidePublicNetworkPage;
// Set true if administrator/power user wants the entry available to all
// users.
//
BOOL fCreateForAllUsers; BOOL fFirewall; //for whistler bug 328673
// The NB_* mask of protocols configured for RAS.
//
DWORD dwfConfiguredProtocols;
// Set true if IP is configured for RAS.
//
BOOL fIpConfigured;
// Area-code and country-code helper context block, and a flag indicating
// if the block has been initialized.
//
CUINFO cuinfo; BOOL fCuInfoInitialized;
// List of area codes passed CuInit plus all strings retrieved with
// CuGetInfo. The list is an editing duplicate of the one from the
// PBUSER.
//
DTLLIST* pListAreaCodes;
// Scripting utility context block, and a flag indicating if the block has
// been initialized.
//
SUINFO suinfo; BOOL fSuInfoInitialized;
// Set to true if we want to show the host pages in the dcc wizard, false
// otherwise. If true, rassrvui will administer most of the wizard.
BOOL fDccHost;
// The context used to identify the modifications being made through the
// dcc host wizard
PVOID pvDccHostContext;
// Flags that track whether a smart card reader is installed and whether
// the user has opted to use it.
BOOL fSmartCardInstalled; BOOL fUseSmartCard;
// Modem device dialog
BOOL fMaAlreadyInitialized;
//For Isdn devices on Ma page, for whislter bug 354542
//
BOOL fMultilinkAllIsdn; } AEINFO;
//----------------------------------------------------------------------------
// Local prototypes (alphabetically)
//----------------------------------------------------------------------------
AEINFO* AeContext( IN HWND hwndPage );
void AeSetContext( IN HWND hwndPage, IN LPARAM lparam);
void AeFinish( IN AEINFO* pInfo );
DWORD AeInit( IN HWND hwndOwner, IN EINFO* pEinfo, OUT AEINFO** ppInfo );
VOID AeTerm( IN AEINFO* pInfo );
BOOL ApCommand( IN AEINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl );
INT_PTR CALLBACK BsDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam );
BOOL BsInit( IN HWND hwndPage );
BOOL BsKillActive( IN AEINFO* pInfo );
BOOL BsSetActive( IN AEINFO* pInfo );
INT_PTR CALLBACK CnDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam );
BOOL CnInit( IN HWND hwndPage );
BOOL CnKillActive( IN AEINFO* pInfo );
BOOL CnSetActive( IN AEINFO* pInfo );
BOOL CnCommand( IN AEINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl );
INT_PTR CALLBACK DaDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam );
BOOL DaInit( IN HWND hwndPage );
BOOL DaKillActive( IN AEINFO* pInfo );
BOOL DaSetActive( IN AEINFO* pInfo );
BOOL DnCommand( IN AEINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl );
INT_PTR CALLBACK DnDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam );
BOOL DtCommand( IN AEINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl ); BOOL DnInit( IN HWND hwndPage );
BOOL DnKillActive( IN AEINFO* pInfo );
BOOL DnSetActive( IN AEINFO* pInfo );
INT_PTR CALLBACK DtDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam );
BOOL DtInit( IN HWND hwndPage );
BOOL DtKillActive( IN AEINFO* pInfo );
BOOL DtSetActive( IN AEINFO* pInfo );
INT_PTR CALLBACK EnDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam );
BOOL EnInit( IN HWND hwndPage );
BOOL EnKillActive( IN AEINFO* pInfo );
BOOL EnSetActive( IN AEINFO* pInfo );
BOOL GhCommand( IN AEINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl );
INT_PTR CALLBACK GhDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam );
BOOL GhInit( IN HWND hwndPage );
BOOL GhKillActive( IN AEINFO* pInfo );
BOOL GhSetActive( IN AEINFO* pInfo );
INT_PTR CALLBACK LaDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam );
BOOL LaInit( IN HWND hwndPage );
BOOL LaKillActive( IN AEINFO* pInfo );
BOOL LaSetActive( IN AEINFO* pInfo );
INT_PTR CALLBACK MaDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam );
BOOL MaInit( IN HWND hwndPage );
LVXDRAWINFO* MaLvCallback( IN HWND hwndLv, IN DWORD dwItem );
BOOL MaSetActive( IN AEINFO* pInfo );
BOOL MaKillActive( IN AEINFO* pInfo );
BOOL PaCommand( IN AEINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl );
INT_PTR CALLBACK PaDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam );
BOOL PaInit( IN HWND hwndPage );
BOOL PaKillActive( IN AEINFO* pInfo );
BOOL PaSetActive( IN AEINFO* pInfo );
VOID PnClearLbDialFirst( IN HWND hwndLbDialFirst );
INT_PTR CALLBACK PnDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam );
BOOL PnInit( IN HWND hwndPage );
BOOL PnKillActive( IN AEINFO* pInfo );
BOOL PnSetActive( IN AEINFO* pInfo );
VOID PnDialAnotherFirstSelChange( IN AEINFO* pInfo );
VOID PnUpdateLbDialAnotherFirst( IN AEINFO* pInfo );
INT_PTR CALLBACK ScDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam );
BOOL ScInit( IN HWND hwndPage );
BOOL ScKillActive( IN AEINFO* pInfo );
BOOL ScSetActive( IN AEINFO* pInfo );
BOOL ScSmartCardReaderInstalled( IN AEINFO* pInfo);
INT_PTR CALLBACK SpDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam );
BOOL SpInit( IN HWND hwndPage );
BOOL SpKillActive( IN AEINFO* pInfo );
BOOL SpSetActive( IN AEINFO* pInfo );
INT_PTR CALLBACK StDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam );
BOOL StInit( IN HWND hwndPage, IN OUT AEINFO* pInfo );
BOOL StKillActive( IN AEINFO* pInfo );
BOOL StSetActive( IN AEINFO* pInfo );
BOOL SwCommand( IN AEINFO* pInfo, IN WORD wNotification, IN WORD wId, IN HWND hwndCtrl );
INT_PTR CALLBACK SwDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam );
BOOL SwInit( IN HWND hwndPage );
BOOL SwKillActive( IN AEINFO* pInfo );
BOOL SwSetActive( IN AEINFO* pInfo );
INT_PTR CALLBACK UsDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam );
BOOL UsInit( IN HWND hwndPage );
BOOL UsKillActive( IN AEINFO* pInfo );
BOOL UsSetActive( IN AEINFO* pInfo );
// This is as good of a hack as I could think of to incorporate the direct
// connect host ui wizard pages without actually exposing the resources and
// functions that implement them (which are in the project, rassrvui)
#define DCC_HOST_PROCID ((DLGPROC)0x1)
struct PAGE_INFO { DLGPROC pfnDlgProc; INT nPageId; INT nSidTitle; INT nSidSubtitle; DWORD dwConnectionFlags; };
static const struct PAGE_INFO c_aWizInfo [] = { { StDlgProc, PID_ST_Start, 0, 0, RASEDFLAG_AnyNewEntry | RASEDFLAG_CloneEntry }, { LaDlgProc, PID_LA_NameAndType, SID_LA_Title, SID_LA_Subtitle, RASEDFLAG_NewEntry }, { MaDlgProc, PID_MA_ModemAdapter, SID_MA_Title, SID_MA_Subtitle, RASEDFLAG_NewEntry | RASEDFLAG_NewPhoneEntry },
//put Guest/Host page before Connection Name page for bug 328673
//
{ GhDlgProc, PID_GH_GuestHost, SID_GH_Title, SID_GH_Subtitle, RASEDFLAG_NewDirectEntry },
//Add a new wizard page to get Connection Name, this is not available for rasphone.exe
//for whistler bug 328673 gangz
//
{ CnDlgProc, PID_CN_ConnectionName, SID_CN_Title, SID_CN_SubtitleInternet, RASEDFLAG_AnyNewEntry | RASEDFLAG_ShellOwned }, { PaDlgProc, PID_PA_PhoneNumber, SID_PA_Title, SID_PA_Subtitle, RASEDFLAG_NewEntry | RASEDFLAG_NewPhoneEntry }, { PnDlgProc, PID_PN_PublicNetwork, SID_PN_Title, SID_PN_Subtitle, RASEDFLAG_NewEntry | RASEDFLAG_NewTunnelEntry }, { DaDlgProc, PID_DA_VpnDestination, SID_DA_Title, SID_DA_Subtitle, RASEDFLAG_NewEntry | RASEDFLAG_NewTunnelEntry }, { BsDlgProc, PID_BS_BroadbandService, SID_BS_Title, SID_BS_Subtitle, RASEDFLAG_NewEntry | RASEDFLAG_NewBroadbandEntry }, { ScDlgProc, PID_SC_SmartCard, SID_SC_Title, SID_SC_Subtitle, RASEDFLAG_NewEntry | RASEDFLAG_NewPhoneEntry | RASEDFLAG_NewTunnelEntry }, { DnDlgProc, PID_DN_DccDevice, SID_DN_Title, SID_DN_Subtitle, RASEDFLAG_NewEntry | RASEDFLAG_NewDirectEntry }, { DCC_HOST_PROCID, 0, 0, 0, RASEDFLAG_NewDirectEntry }, { UsDlgProc, PID_US_Users, SID_US_Title, SID_US_Subtitle, RASEDFLAG_AnyNewEntry | RASEDFLAG_ShellOwned }, { DtDlgProc, PID_DT_DefaultInternet, SID_DT_Title, SID_DT_Subtitle, RASEDFLAG_AnyNewEntry | RASEDFLAG_ShellOwned }, { SwDlgProc, PID_SW_SharedAccess, SID_SW_Title, SID_SW_Subtitle, RASEDFLAG_NewEntry | RASEDFLAG_NewPhoneEntry | RASEDFLAG_NewTunnelEntry | RASEDFLAG_NewBroadbandEntry }, { SpDlgProc, PID_SP_SharedLan, SID_SP_Title, SID_SP_Subtitle, RASEDFLAG_NewEntry | RASEDFLAG_NewPhoneEntry | RASEDFLAG_NewTunnelEntry | RASEDFLAG_NewBroadbandEntry }, { EnDlgProc, PID_EN_EntryName, SID_EN_Title, SID_EN_Subtitle, RASEDFLAG_AnyNewEntry | RASEDFLAG_CloneEntry }, }; #define c_cWizPages (sizeof (c_aWizInfo) / sizeof(c_aWizInfo[0]))
//----------------------------------------------------------------------------
// Private exports - New client connection wizard
//----------------------------------------------------------------------------
DWORD APIENTRY NccCreateNewEntry( IN LPVOID pvData, OUT LPWSTR pszwPbkFile, OUT LPWSTR pszwEntryName, OUT DWORD* pdwFlags) { DWORD dwErr = ERROR_SUCCESS; BOOL fIcRunning = FALSE;
if (!pvData || !pszwPbkFile || !pszwEntryName || !pdwFlags) { dwErr = ERROR_INVALID_PARAMETER; } else { AEINFO* pInfo = (AEINFO*)pvData;
// If the direct connect wizard went down the host path, then we
// need to instruct the shell to create the "Incoming Connections"
// connection.
if (pInfo->fDccHost) { RassrvCommitSettings (pInfo->pvDccHostContext, RASWIZ_TYPE_DIRECT); *pdwFlags = NCC_FLAG_CREATE_INCOMING; return NO_ERROR; }
// Otherwise, create the phone book entry
ASSERT (pInfo->pArgs->file.pszPath); ASSERT (pInfo->pArgs->pEntry->pszEntryName);
lstrcpynW( pszwPbkFile, pInfo->pArgs->file.pszPath, MAX_PATH ); lstrcpynW( pszwEntryName, pInfo->pArgs->pEntry->pszEntryName, MAX_PATH ); *pdwFlags = (pInfo->fCreateForAllUsers) ? NCC_FLAG_ALL_USERS : 0;
//Add this for the Account and password page, only available for consumer
//platform. for whistler bug 328673 gangz
//
if(pInfo->fFirewall) { *pdwFlags |= NCC_FLAG_FIREWALL; }
AeFinish( pInfo );
EuCommit( pInfo->pArgs );
//Setup port mapping for this new connection
//According to the VPN enable/disable and
// IC exist/non-exist condition and
// if it is a Firewall available platform
//
//Detect if Incoming Connection exists
//If it is a DccHost connection, SetPortMapping
//is already done in RassrvCommitSettings()
//
if ( pInfo->fFirewall && //For bug 342810
(NO_ERROR == RasSrvIsServiceRunning( &fIcRunning )) && fIcRunning ) { HnPMConfigureSingleConnectionGUIDIfVpnEnabled( pInfo->pArgs->pEntry->pGuid, FALSE, NULL ); }
dwErr = pInfo->pArgs->pApiArgs->dwError; } return dwErr; }
DWORD APIENTRY NccGetSuggestedEntryName( IN LPVOID pvData, OUT LPWSTR pszwSuggestedName) { DWORD dwErr = ERROR_SUCCESS;
if (!pvData || !pszwSuggestedName) { dwErr = ERROR_INVALID_PARAMETER; } else { AEINFO* pInfo = (AEINFO*)pvData; PBENTRY* pEntry = pInfo->pArgs->pEntry; LPTSTR pszName;
// If this is a dcc host connection, ask the ras server
// module for the name.
if (pInfo->fDccHost) { WCHAR pszBuf[MAX_PATH]; DWORD dwSize = MAX_PATH; DWORD dwErr; if ((dwErr = RassrvGetDefaultConnectionName(pszBuf, &dwSize)) != NO_ERROR) return dwErr; lstrcpynW(pszwSuggestedName, pszBuf, MAX_PATH); return NO_ERROR; }
// If pFile is NULL, it probably means that the wizard page
// to determine where the phonebook should be stored was never
// visited.
//
if (!pInfo->pArgs->pFile) { dwErr = ERROR_INVALID_PARAMETER; } else { dwErr = GetDefaultEntryName( NULL, pEntry->dwType, FALSE, &pszName ); if (ERROR_SUCCESS == dwErr) { // Whistler bug 224074 use only lstrcpyn's to prevent
// maliciousness
//
lstrcpynW( pszwSuggestedName, pszName, MAX_PATH );
Free( pszName ); } } } return dwErr; }
DWORD APIENTRY NccQueryMaxPageCount() { // Return the number of pages in the array We subtract
// 1 from this since DCC_HOST_PROCID takes a space in the array.
return c_cWizPages - 1; }
//+---------------------------------------------------------------------------
//
// Function: NccSetEntryName
//
// Purpose:
//
// Arguments:
// pvData []
// pszwName []
//
// Returns: ERROR_SUCCESS, ERROR_INVALID_PARAMETER,
// ERROR_NOT_ENOUGH_MEMORY or ERROR_DUP_NAME.
//
// Author: shaunco 21 Jan 1998
//
// Notes:
//
DWORD APIENTRY NccSetEntryName( IN LPVOID pvData, IN LPCWSTR pszwName) { DWORD dwErr = ERROR_SUCCESS; AEINFO* pInfo = (AEINFO*)pvData;
if (!pvData || !pszwName) { dwErr = ERROR_INVALID_PARAMETER; } else if (pInfo->fDccHost) { // dwErr = ERROR_CAN_NOT_COMPLETE;
dwErr = ERROR_SUCCESS; } else if (ERROR_SUCCESS == (dwErr = LoadRasapi32Dll())) { // Validate the entry name against the current phonebook.
// If we can't open the phonebook, its okay. It just means
// it hasn't been created yet. The name is valid in this case.
//
dwErr = g_pRasValidateEntryName (pInfo->pArgs->pFile->pszPath, pszwName); if (ERROR_ALREADY_EXISTS == dwErr) { dwErr = ERROR_DUP_NAME; } else if ((ERROR_SUCCESS == dwErr) || (ERROR_CANNOT_OPEN_PHONEBOOK == dwErr)) { PBENTRY* pEntry = pInfo->pArgs->pEntry;
dwErr = ERROR_SUCCESS;
Free( pEntry->pszEntryName ); pEntry->pszEntryName = StrDup( pszwName ); if (!pEntry->pszEntryName) { dwErr = ERROR_NOT_ENOUGH_MEMORY; } } } return dwErr; }
//+---------------------------------------------------------------------------
//
// Function: NccIsEntryRenamable
//
// Purpose: Returns whether the user should be allowed
// to rename the given connection.
//
// Arguments:
// pvData []
// pfRenamable // Set to TRUE if renamable
//
// Returns: ERROR_SUCCESS, ERROR_INVALID_PARAMETER,
// ERROR_NOT_ENOUGH_MEMORY or ERROR_DUP_NAME.
//
// Author: pmay 2/4/98
//
// Notes:
//
DWORD APIENTRY NccIsEntryRenamable( IN LPVOID pvData, OUT BOOL* pfRenamable) { AEINFO* pInfo = (AEINFO*)pvData;
if (!pInfo || !pfRenamable) return ERROR_INVALID_PARAMETER;
// Only dcc host connections are non-renamable
*pfRenamable = !pInfo->fDccHost;
return NO_ERROR; }
DWORD APIENTRY RasWizCreateNewEntry( IN DWORD dwRasWizType, IN LPVOID pvData, OUT LPWSTR pszwPbkFile, OUT LPWSTR pszwEntryName, OUT DWORD* pdwFlags) { switch (dwRasWizType) { case RASWIZ_TYPE_DIALUP: case RASWIZ_TYPE_DIRECT: case RASWIZ_TYPE_BROADBAND: return NccCreateNewEntry(pvData, pszwPbkFile, pszwEntryName, pdwFlags); break;
case RASWIZ_TYPE_INCOMING: return RassrvCommitSettings((HWND)pvData, RASWIZ_TYPE_INCOMING); break; }
return ERROR_INVALID_PARAMETER; }
// Add for whistler bug 328673
// This is function is called by folder team just before the
// RasWizCreateNewEntry(), because it is only meaningful to call it
// after the rasdlg wizard pages are done
DWORD APIENTRY RasWizGetNCCFlags( IN DWORD dwRasWizType, IN LPVOID pvData, OUT DWORD * pdwFlags) { DWORD dwErr = NO_ERROR; if (!pvData || !pdwFlags) { dwErr = ERROR_INVALID_PARAMETER; } else { AEINFO* pInfo = (AEINFO*)pvData;
*pdwFlags = 0; switch (dwRasWizType) { case RASWIZ_TYPE_DIRECT: case RASWIZ_TYPE_DIALUP: case RASWIZ_TYPE_BROADBAND: if (pInfo->fDccHost) { *pdwFlags |= NCC_FLAG_CREATE_INCOMING; dwErr = NO_ERROR; } else { if ( pInfo->fCreateForAllUsers ) { //the connecntion is created for all users
//for Us page
//
*pdwFlags |= NCC_FLAG_ALL_USERS; }
if(pInfo->fFirewall) { *pdwFlags |= NCC_FLAG_FIREWALL; }
if ( IsConsumerPlatform()) { if (pInfo->pArgs->fGlobalCred) { //The password is saved for every users
//for Dt page
//
*pdwFlags |= NCC_FLAG_GLOBALCREDS; } }
if ( pInfo->pArgs->fDefInternet ) { *pdwFlags |= NCC_FLAG_DEFAULT_INTERNET; }
if ( pInfo->pArgs->fGlobalCred ) { *pdwFlags |= NCC_FLAG_GLOBALCREDS; } dwErr = NO_ERROR; } break;
case RASWIZ_TYPE_INCOMING: *pdwFlags |= NCC_FLAG_CREATE_INCOMING; dwErr = NO_ERROR; break; default: dwErr = ERROR_INVALID_PARAMETER; } }
return dwErr; }
//This is function is called by folder team just before the
//RasWizCreateNewEntry()
//
DWORD APIENTRY RasWizGetUserInputConnectionName ( IN LPVOID pvData, OUT LPWSTR pszwInputName) { DWORD dwErr = ERROR_SUCCESS;
if (!pvData || !pszwInputName) { dwErr = ERROR_INVALID_PARAMETER; } else { AEINFO* pInfo = (AEINFO*)pvData; WCHAR * pszwTemp = NULL; if ( pInfo->pArgs->pEntry->pszEntryName ) { pszwTemp = StrDupWFromT( pInfo->pArgs->pEntry->pszEntryName ); if (!pszwTemp) { dwErr = ERROR_NOT_ENOUGH_MEMORY; } else { // Truncate to maximum name length (including terminating NULL)
// that rest of MAX_PATH can be appened by netcfg
//
lstrcpynW(pszwInputName, pszwTemp, MAX_ENTERCONNECTIONNAME); Free0(pszwTemp); } } else { dwErr = ERROR_NO_DATA; } }
return dwErr; }
DWORD APIENTRY RasWizGetSuggestedEntryName ( IN DWORD dwRasWizType, IN LPVOID pvData, OUT LPWSTR pszwSuggestedName) { DWORD dwSize = MAX_PATH;
switch (dwRasWizType) { case RASWIZ_TYPE_DIALUP: case RASWIZ_TYPE_DIRECT: case RASWIZ_TYPE_BROADBAND: return NccGetSuggestedEntryName(pvData, pszwSuggestedName); break;
case RASWIZ_TYPE_INCOMING: return RassrvGetDefaultConnectionName(pszwSuggestedName, &dwSize); break; }
return ERROR_INVALID_PARAMETER; }
DWORD APIENTRY RasWizQueryMaxPageCount ( IN DWORD dwRasWizType) { switch (dwRasWizType) { case RASWIZ_TYPE_DIALUP: case RASWIZ_TYPE_BROADBAND: return NccQueryMaxPageCount(); break;
case RASWIZ_TYPE_DIRECT: { DWORD dwDirect;
// Find out whether the dcc wizard option should be disabled
// based on whether we allow it.
if (! AllowDccWizard(NULL)) return 0;
// Find out how many pages the server library needs for dcc.
// If 0 pages are returned from RassrvQueryMaxPageCount, it means
// that we shouldn't display the direct connect wizard (which is
// true for member nts or dc nts.) By returning 0, we tell the
// shell that the given type isn't available.
if ((dwDirect = RassrvQueryMaxPageCount (RASWIZ_TYPE_DIRECT)) == 0) return 0;
return dwDirect + NccQueryMaxPageCount(); } break;
case RASWIZ_TYPE_INCOMING: return RassrvQueryMaxPageCount(RASWIZ_TYPE_INCOMING); break; }
return ERROR_INVALID_PARAMETER; }
DWORD APIENTRY RasWizSetEntryName ( IN DWORD dwRasWizType, IN LPVOID pvData, IN LPCWSTR pszwName) { switch (dwRasWizType) { case RASWIZ_TYPE_DIALUP: case RASWIZ_TYPE_DIRECT: case RASWIZ_TYPE_BROADBAND: return NccSetEntryName(pvData, pszwName); break;
case RASWIZ_TYPE_INCOMING: // We'll accept it even though we don't do anything with it.
return NOERROR; break; }
return ERROR_INVALID_PARAMETER; }
DWORD APIENTRY RasWizIsEntryRenamable ( IN DWORD dwRasWizType, IN LPVOID pvData, OUT BOOL* pfRenamable) { if (!pfRenamable) return ERROR_INVALID_PARAMETER;
switch (dwRasWizType) { case RASWIZ_TYPE_DIALUP: case RASWIZ_TYPE_DIRECT: case RASWIZ_TYPE_BROADBAND: return NccIsEntryRenamable(pvData, pfRenamable); break;
case RASWIZ_TYPE_INCOMING: *pfRenamable = FALSE; return NO_ERROR; break; }
return ERROR_INVALID_PARAMETER; }
// 232097: (shaunco) Fix a memory leak in the shell-owned case.
// For start pages which don't get created, WM_DESTROY won't be called which
// is where we used to free the memory. Free the memory via a propsheet
// callback function associated only with the start page in shell-owned mode.
//
UINT CALLBACK DestroyStartPageCallback ( HWND hwnd, UINT unMsg, LPPROPSHEETPAGE ppsp) { if (PSPCB_RELEASE == unMsg) { AEINFO* pInfo; EINFO* pArgs;
pInfo = (AEINFO*)ppsp->lParam; ASSERT( pInfo );
ASSERT( pInfo->pArgs->pApiArgs->dwFlags & RASEDFLAG_ShellOwned );
pArgs = pInfo->pArgs;
AeTerm( pInfo ); // pInfo invalid after this call
EuFree( pArgs ); }
// for PSPCB_CREATE == unMsg, returning non-zero means create the page.
// Ignored for PSPCB_RELEASE.
//
return 1; }
//----------------------------------------------------------------------------
// Add Entry wizard entry point
//----------------------------------------------------------------------------
BOOL AeIsWorkPlace(DWORD dwFlags) { TRACE("AeIsWorkPlace");
if( RASEDFLAG_InternetEntry & dwFlags || RASEDFLAG_NewDirectEntry & dwFlags) { return FALSE; } else { return TRUE; } }
//Add this for whistler 364818 gangz
//
AeTitle(RASENTRYDLG * pArgs, struct PAGE_INFO c_aPageInfo) { INT nTitle = 0; TRACE("AeTitle");
if( !pArgs ) { nTitle = c_aPageInfo.nSidTitle; } else if ( c_aPageInfo.nPageId == PID_DT_DefaultInternet ) { if ( pArgs->dwFlags & RASEDFLAG_InternetEntry ) { nTitle = SID_DT_Title; } else if( pArgs->dwFlags & RASEDFLAG_NewDirectEntry ) { nTitle = SID_DT_TitleWork; } else { nTitle = SID_DT_TitleWork; } } else { nTitle = c_aPageInfo.nSidTitle; }
return nTitle; }
INT AeSubTitle(RASENTRYDLG * pArgs, struct PAGE_INFO c_aPageInfo) { INT nSubTitle = 0; TRACE("AeSubTitle");
if( !pArgs ) { nSubTitle = c_aPageInfo.nSidSubtitle; } else if ( c_aPageInfo.nPageId == PID_CN_ConnectionName ) { //Return different subtitle for Conneciton Name page
//
if( RASEDFLAG_InternetEntry & pArgs->dwFlags ) { nSubTitle = SID_CN_SubtitleInternet; } else if( RASEDFLAG_NewDirectEntry & pArgs->dwFlags ) { nSubTitle = SID_CN_SubtitleDccGuest; } else { nSubTitle = SID_CN_SubtitleWork; } } //Add this for whistler 364818
//
else if ( c_aPageInfo.nPageId == PID_DT_DefaultInternet ) { if ( RASEDFLAG_InternetEntry & pArgs->dwFlags ) { nSubTitle = SID_DT_Subtitle; } else if ( RASEDFLAG_NewDirectEntry & pArgs->dwFlags ) { nSubTitle = SID_DT_SubtitleWork; } else { nSubTitle = SID_DT_SubtitleWork; } } //Add this for whistler bug 382701
//
else if ( c_aPageInfo.nPageId == PID_PA_PhoneNumber ) { if ( RASEDFLAG_InternetEntry & pArgs->dwFlags ) { nSubTitle = SID_PA_Subtitle; } else { nSubTitle = SID_PA_SubtitleWork; } } else { nSubTitle = c_aPageInfo.nSidSubtitle; }
return nSubTitle; }
VOID AeWizard( IN OUT EINFO* pEinfo )
// Runs the Phonebook entry property sheet. 'PEinfo' is an input block
// with only caller's API arguments filled in.
//
{ AEINFO* pAeinfo; RASEDSHELLOWNEDR2* pShellOwnedInfo = NULL; BOOL fShellOwned; BOOL fShowSharedAccessUi = TRUE; HPROPSHEETPAGE ahpage [ c_cWizPages ]; HPROPSHEETPAGE* phpage = ahpage; INT i; HRESULT hr; INetConnectionUiUtilities * pncuu = NULL;
TRACE("AeWizard");
if (0 != AeInit( pEinfo->pApiArgs->hwndOwner, pEinfo, &pAeinfo )) { return; }
fShellOwned = (pEinfo->pApiArgs->dwFlags & RASEDFLAG_ShellOwned);
if (fShellOwned) { pShellOwnedInfo = (RASEDSHELLOWNEDR2*)pEinfo->pApiArgs->reserved2; pShellOwnedInfo->pvWizardCtx = pAeinfo; }
if (pEinfo->pApiArgs->dwFlags & RASEDFLAG_NewTunnelEntry) { EuChangeEntryType (pEinfo, RASET_Vpn); } else if (pEinfo->pApiArgs->dwFlags & RASEDFLAG_NewDirectEntry) { EuChangeEntryType (pEinfo, RASET_Direct); } else if (pEinfo->pApiArgs->dwFlags & RASEDFLAG_NewBroadbandEntry) { EuChangeEntryType (pEinfo, RASET_Broadband); } else if (!(pEinfo->pApiArgs->dwFlags & RASEDFLAG_CloneEntry)) { ASSERT (RASET_Phone == pEinfo->pEntry->dwType); }
// Check if ZAW is denying access to the Shared Access UI
//
hr = HrCreateNetConnectionUtilities(&pncuu); if (SUCCEEDED(hr)) { fShowSharedAccessUi = INetConnectionUiUtilities_UserHasPermission( pncuu, NCPERM_ShowSharedAccessUi); INetConnectionUiUtilities_Release(pncuu); } for (i = 0; i < c_cWizPages; i++) { if (pEinfo->pApiArgs->dwFlags & c_aWizInfo[i].dwConnectionFlags) { // If the page specifies that it is for shell-owned scenarios
// only and this is not a shell-owned scenario, then don't add
// the page to the property sheet. (124654)
//
if ((c_aWizInfo[i].dwConnectionFlags & RASEDFLAG_ShellOwned) && !(pEinfo->pApiArgs->dwFlags & RASEDFLAG_ShellOwned)) { continue; } // HACK: Add the host-side direct connect pages if needed.
if (c_aWizInfo[i].pfnDlgProc == DCC_HOST_PROCID) { if (fShellOwned) { RassrvAddDccWizPages( pShellOwnedInfo->pfnAddPage, pShellOwnedInfo->lparam, &(pAeinfo->pvDccHostContext) ); } } else if ((c_aWizInfo[i].nPageId == PID_SW_SharedAccess) && !fShowSharedAccessUi) { // Do not add the Shared Access Ui if disallowed by ZAW
//
continue; } else { // Otherwise, add pages as normal.
PROPSHEETPAGE page; ZeroMemory (&page, sizeof(page));
page.dwSize = sizeof(PROPSHEETPAGE); page.hInstance = g_hinstDll; page.pszTemplate = MAKEINTRESOURCE( c_aWizInfo[i].nPageId ); page.pfnDlgProc = c_aWizInfo[i].pfnDlgProc; page.lParam = (LPARAM )pAeinfo;
if (c_aWizInfo[i].nSidTitle) { page.dwFlags |= PSP_USEHEADERTITLE; page.pszHeaderTitle = PszLoadString( g_hinstDll, AeTitle(pEinfo->pApiArgs, c_aWizInfo[i]) ); //For whstler bug 364818
}
if(c_aWizInfo[i].nSidSubtitle) { page.dwFlags |= PSP_USEHEADERSUBTITLE; page.pszHeaderSubTitle = PszLoadString( g_hinstDll, AeSubTitle(pEinfo->pApiArgs, c_aWizInfo[i]) ); }
if (fShellOwned && (PID_ST_Start == c_aWizInfo[i].nPageId)) { page.dwFlags |= PSP_USECALLBACK; page.pfnCallback = DestroyStartPageCallback; }
*phpage = CreatePropertySheetPage( &page );
if (fShellOwned) { ASSERT (*phpage); pShellOwnedInfo->pfnAddPage (*phpage, pShellOwnedInfo->lparam); }
phpage++; } } }
if (!fShellOwned) { PROPSHEETHEADER header; ZeroMemory( &header, sizeof(header) ); header.dwSize = sizeof(PROPSHEETHEADER); header.dwFlags = PSH_WIZARD | PSH_WIZARD97 | PSH_WATERMARK | PSH_HEADER | PSH_STRETCHWATERMARK; header.hwndParent = pEinfo->pApiArgs->hwndOwner; header.hInstance = g_hinstDll; header.nPages = (ULONG)(phpage - ahpage); header.phpage = ahpage; header.pszbmHeader = MAKEINTRESOURCE( BID_WizardHeader );
if (-1 == PropertySheet( &header )) { TRACE("PropertySheet failed"); ErrorDlg( pEinfo->pApiArgs->hwndOwner, SID_OP_LoadDlg, ERROR_UNKNOWN, NULL ); }
AeTerm (pAeinfo); } }
//----------------------------------------------------------------------------
// Add Entry wizard
// Listed alphabetically
//----------------------------------------------------------------------------
AEINFO* AeContext( IN HWND hwndPage )
// Retrieve the property sheet context from a wizard page handle.
//
{ return (AEINFO* )GetWindowLongPtr( hwndPage, DWLP_USER ); }
void AeSetContext( IN HWND hwndPage, IN LPARAM lparam) { AEINFO* pInfo = (AEINFO* )(((PROPSHEETPAGE* )lparam)->lParam); SetWindowLongPtr( hwndPage, DWLP_USER, (ULONG_PTR )pInfo ); }
void AeFinish( IN AEINFO* pInfo )
// 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.
//
{ PBENTRY* pEntry;
TRACE("AeFinish");
ASSERT(pInfo); pEntry = pInfo->pArgs->pEntry; ASSERT(pEntry);
// Retrieve information from the phone number set of controls.
//
if (RASET_Phone == pEntry->dwType) { PBLINK* pLink; DTLNODE* pPhoneNode;
pLink = (PBLINK* )DtlGetData( pInfo->pArgs->pSharedNode ); ASSERT( pLink );
pPhoneNode = FirstPhoneNodeFromPhoneList( pLink->pdtllistPhones ); if (pPhoneNode) { CuGetInfo( &pInfo->cuinfo, pPhoneNode ); FirstPhoneNodeToPhoneList( pLink->pdtllistPhones, pPhoneNode ); }
/*
// Bug #221837: (danielwe) Default to disable file and print sharing
// for dialup connections.
//
pEntry->fShareMsFilePrint = FALSE;
// Disable File and Print services by default
//
EnableOrDisableNetComponent( pEntry, TEXT("ms_server"), FALSE);
*/ }
// Retrieve the hostname information if this is a Vpn wizard.
//
else if (RASET_Vpn == pEntry->dwType) { // !!! Share code with stuff in PeApply.
DTLNODE* pNode; PBLINK* pLink; PBPHONE* pPhone;
// Save host name, i.e. the VPN phone number.
//
pNode = DtlGetFirstNode( pEntry->pdtllistLinks ); ASSERT( pNode ); pLink = (PBLINK* )DtlGetData( pNode ); pNode = FirstPhoneNodeFromPhoneList( pLink->pdtllistPhones );
if(NULL == pNode) { return; } pPhone = (PBPHONE* )DtlGetData( pNode ); Free0( pPhone->pszPhoneNumber ); pPhone->pszPhoneNumber = GetText( pInfo->hwndEbHostName ); FirstPhoneNodeToPhoneList( pLink->pdtllistPhones, pNode );
// Whistler bug 312921
//
// Default the "automatic" setting in the ui to mean
// "try pptp first". This is because in the Whistler timeframe
// we found that l2tp/ipsec was not being widely deployed so
// people were more commonly getting unneccessary timeout delays
// while the client would attempt l2tp to no avail.
//
pEntry->dwVpnStrategy = VS_PptpFirst; }
// Retrieve the service name information if this is a broadband wizard.
//
else if (RASET_Broadband == pEntry->dwType) { // !!! Share code with stuff in PeApply.
DTLNODE* pNode; PBLINK* pLink; PBPHONE* pPhone;
// Save service name, i.e. the broadband phone number.
//
pNode = DtlGetFirstNode( pEntry->pdtllistLinks ); ASSERT( pNode ); pLink = (PBLINK* )DtlGetData( pNode ); pNode = FirstPhoneNodeFromPhoneList( pLink->pdtllistPhones );
if(NULL == pNode) { return; } pPhone = (PBPHONE* )DtlGetData( pNode ); Free0( pPhone->pszPhoneNumber ); pPhone->pszPhoneNumber = GetText( pInfo->hwndEbBroadbandService ); FirstPhoneNodeToPhoneList( pLink->pdtllistPhones, pNode );
// 222177, pppoe connections should default to unsecure
//
pEntry->dwTypicalAuth = TA_Unsecure; pEntry->dwAuthRestrictions = AuthRestrictionsFromTypicalAuth(TA_Unsecure); }
else if ( RASET_Direct == pEntry->dwType ) { PBLINK* pLink = NULL; DTLNODE* pNode = NULL;
// The currently enabled device is the one
// that should be used for the connection. Only
// one device will be enabled (DnUpdateSelectedDevice).
for (pNode = DtlGetFirstNode( pEntry->pdtllistLinks ); pNode; pNode = DtlGetNextNode( pNode )) { pLink = (PBLINK* )DtlGetData( pNode ); ASSERT(pLink);
if ( pLink->fEnabled ) break; }
// If we found a link successfully, deal with it
// now.
if ( pLink && pLink->fEnabled ) { if (pLink->pbport.pbdevicetype == PBDT_ComPort) { // Install the null modem
MdmInstallNullModem (pLink->pbport.pszPort);
// Delete the bogus device name. This will cause
// the device to automatically be mapped to the
// null modem we just installed when the phonebook
// is next read.
Free0 ( pLink->pbport.pszDevice ); pLink->pbport.pszDevice = NULL; } }
// DCC guest should by default enable LM Hash in MSCHAPv1
// Whistler bug 216458
//
pEntry->dwAuthRestrictions |= AR_F_AuthW95MSCHAP | AR_F_AuthCustom; }
// If the user opted to use his/her smart card for this
// connection, set up the entry accordingly now.
if ( ( pInfo->fSmartCardInstalled ) && ( pInfo->fUseSmartCard ) ) { pEntry->dwAuthRestrictions = AR_F_TypicalCardOrCert; pEntry->dwTypicalAuth = TA_CardOrCert; pEntry->dwCustomAuthKey = EAPCFG_DefaultKey; pEntry->dwDataEncryption = DE_Require; }
// Default Software compression ON.
//
pEntry->fSwCompression = TRUE;
// Set the appropriate defaults if this is an "Internet"
// connection
//
if ((pInfo->pArgs->pApiArgs->dwFlags & RASEDFLAG_InternetEntry) || (RASET_Broadband == pEntry->dwType)) // all broadband are to Internet
{ // IP only
//
pEntry->dwfExcludedProtocols |= (NP_Nbf | NP_Ipx);
// Disable file and print sharing
//
pEntry->fShareMsFilePrint = FALSE; pEntry->fBindMsNetClient = FALSE; EnableOrDisableNetComponent( pEntry, TEXT("ms_server"), FALSE); EnableOrDisableNetComponent( pEntry, TEXT("ms_msclient"), FALSE); pEntry->dwIpNbtFlags = 0;
// Enable redial on link failure
//
pEntry->fRedialOnLinkFailure = TRUE;
// Add default idle timeout for whistler bug 307969 gangz
//
if ( RASET_Phone == pEntry->dwType ) { pEntry->lIdleDisconnectSeconds = 1200; } else { pEntry->lIdleDisconnectSeconds = 0; }
// Enable PAP -- most common to ISPs
//
pEntry->dwTypicalAuth = TA_Unsecure; pEntry->dwAuthRestrictions = AuthRestrictionsFromTypicalAuth(pEntry->dwTypicalAuth);
// Do not include a domain -- not logging into secure domain
//
pEntry->fPreviewDomain = FALSE;
// Record that this is a connection to the Internet
//
pEntry->dwUseFlags |= PBK_ENTRY_USE_F_Internet; }
// 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; }
DWORD AeInit( IN HWND hwndParent, IN EINFO* pArgs, OUT AEINFO** ppInfo )
// Wizard level initialization. 'HwndPage' is the handle of the first
// page. 'pInfo' 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.
//
{ AEINFO* pInfo;
TRACE("AeInit");
*ppInfo = NULL;
pInfo = Malloc( sizeof(AEINFO) ); if (!pInfo) { return ERROR_NOT_ENOUGH_MEMORY; }
*ppInfo = pInfo;
ZeroMemory( pInfo, sizeof(*pInfo) ); pInfo->pArgs = pArgs;
if ( pArgs->fRouter ) { INTERNALARGS *pIArgs = (INTERNALARGS *) pArgs->pApiArgs->reserved;
// Check for installed protocols over router and RasServer if router
// bit is set.
//
pInfo->dwfConfiguredProtocols = g_pGetInstalledProtocolsEx((pIArgs) ? pIArgs->hConnection : NULL, TRUE, FALSE, TRUE); } else { INTERNALARGS *pIArgs = (INTERNALARGS *) pArgs->pApiArgs->reserved;
// Check over which protocols is dial up client enabled.
//
pInfo->dwfConfiguredProtocols = g_pGetInstalledProtocolsEx( (pIArgs) ? pIArgs->hConnection : NULL, FALSE, TRUE, FALSE); }
pInfo->fIpConfigured = (pInfo->dwfConfiguredProtocols & NP_Ip);
//initialization for RasWizGetNCCFlags()
//
pInfo->fCreateForAllUsers = TRUE; //for this for Dt Page
pInfo->fFirewall = FALSE; pInfo->pArgs->fGlobalCred = FALSE; pInfo->pArgs->fDefInternet = FALSE;
return ERROR_SUCCESS; }
VOID AeTerm( IN AEINFO* pInfo ) { TRACE("AeTerm");
if (pInfo) { if (pInfo->hwndLbDialFirst) { PnClearLbDialFirst( pInfo->hwndLbDialFirst ); }
if (pInfo->hfontBold) { DeleteObject (pInfo->hfontBold); }
if (pInfo->pListAreaCodes) { DtlDestroyList( pInfo->pListAreaCodes, DestroyPszNode ); }
if (pInfo->fCuInfoInitialized) { CuFree( &pInfo->cuinfo ); }
Free (pInfo); } }
//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 BsDlgProc( 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: AeSetContext( hwnd, lparam ); return BsInit( hwnd );
case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AEINFO* pInfo; BOOL fDisplay;
TRACE("BsSETACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fDisplay = BsSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; }
case PSN_KILLACTIVE: { AEINFO* pInfo; BOOL fInvalid;
TRACE("BsKILLACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fInvalid = BsKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } }
return FALSE; }
BOOL BsInit( IN HWND hwndPage )
// Called on WM_INITDIALOG. 'hwndPage' is the handle of the property
// page.
//
// Return false if focus was set, true otherwise.
//
{ AEINFO* pInfo;
TRACE("BsInit");
pInfo = AeContext( hwndPage ); if (!pInfo) return TRUE;
// Initialize page-specific context information.
//
pInfo->hwndBs = hwndPage; pInfo->hwndEbBroadbandService = GetDlgItem( hwndPage, CID_BS_EB_ServiceName ); ASSERT(pInfo->hwndEbBroadbandService);
Edit_LimitText( pInfo->hwndEbBroadbandService, RAS_MaxPhoneNumber );
return TRUE; }
BOOL BsKillActive( IN AEINFO* 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 BsSetActive( IN AEINFO* 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;
ASSERT(pInfo);
//For bug 364818, we decide to remove Broadband's service name
//From the NCW gang
//
return FALSE;
/*
pEntry = pInfo->pArgs->pEntry;
if (RASET_Broadband != pEntry->dwType) { fDisplayPage = FALSE; } else { LPARAM dwWizButtons = PSWIZB_NEXT; DWORD dwFlags = pInfo->pArgs->pApiArgs->dwFlags;
// Show the back button if we're shell owned or we have the
// LA page before us.
//
if ((dwFlags & RASEDFLAG_ShellOwned) || !(dwFlags & RASEDFLAG_NewTunnelEntry)) { dwWizButtons |= PSWIZB_BACK; }
PropSheet_SetWizButtons( pInfo->hwndDlg, dwWizButtons ); fDisplayPage = TRUE; }
return fDisplayPage; */ }
//Add ConnectionName Dialog proc for whistler bug 328673
//
//----------------------------------------------------------------------------
// Connection Name property page, this is only for shellowned, the filtering
// is already done in AeWizard()
// Listed alphabetically following dialog proc
//----------------------------------------------------------------------------
INT_PTR CALLBACK CnDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam )
// DialogProc callback for the Connection Name page of the wizard.
// Parameters and return value are as described for standard windows
// 'DialogProc's.
//
{ switch (unMsg) { case WM_INITDIALOG: AeSetContext( hwnd, lparam ); return CnInit( hwnd );
case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AEINFO* pInfo; BOOL fDisplay;
TRACE("CnSETACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fDisplay = CnSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; }
case PSN_KILLACTIVE: { AEINFO* pInfo; BOOL fInvalid;
TRACE("CnKILLACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fInvalid = CnKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; }
case PSN_WIZNEXT: { AEINFO* pInfo;
TRACE("CnNEXT"); pInfo = AeContext( hwnd ); ASSERT(pInfo);
pInfo->fCnWizNext = TRUE; SetWindowLong( hwnd, DWLP_MSGRESULT, FALSE ); return TRUE; }
} break; }
}
return FALSE; }
BOOL CnInit( IN HWND hwndPage )
// Called on WM_INITDIALOG. 'hwndPage' is the handle of the property
// page.
//
// Return false if focus was set, true otherwise.
//
{ AEINFO* pInfo; TRACE("CnInit");
pInfo = AeContext( hwndPage ); if (!pInfo) { return TRUE; }
// A DCC host conneciton will be forward to the incoming connection path
//
if ( pInfo->fDccHost ) { return TRUE; }
//This page wont be available for rasphone.exe
//the filtering is done in AeWizard
//
pInfo->hwndCn = hwndPage; pInfo->hwndCnEbConnectionName = GetDlgItem( hwndPage, CID_CN_EB_ConnectionName ); ASSERT(pInfo->hwndCnEbConnectionName); pInfo->hwndCnStHMsg = GetDlgItem( hwndPage, CID_CN_ST_HMsg ); ASSERT(pInfo->hwndCnStHMsg); pInfo->hwndCnStHMsg2 = GetDlgItem( hwndPage, CID_CN_ST_HMsg2 ); ASSERT(pInfo->hwndCnStHMsg2); pInfo->hwndCnName = GetDlgItem( hwndPage, CID_CN_Name ); ASSERT(pInfo->hwndCnName);
//the length does NOT include the terminating NULL character
//in order to match the RasWizGetUserInputConnectionName()
//we need to minus one from the lenght limit
//
//
//For whistler bug 270255, for the sake of creating short cut which will be placed
//under "Documents and Setttings\...", we dynamically limit the maximum connection
//name
//
{ long lPathLen = 0; WCHAR szPath[MAX_PATH];
if (SHGetSpecialFolderPath(hwndPage, szPath, CSIDL_DESKTOPDIRECTORY, FALSE)) { lPathLen = wcslen(szPath); }
if (SHGetSpecialFolderPath(hwndPage, szPath, CSIDL_COMMON_DESKTOPDIRECTORY, FALSE)) { lPathLen = max(lPathLen, (long)wcslen(szPath)); }
// We need to take the following lengths into acount:
// "\\\\?\\" - 4
// "(path)" - dwPathLen (Desktop path)
// "\\" - 1
// "(connection name)" - rest from MAX_PATH
// "(number)" - 5 (duplicate counter, should not exceed 5 digits)
// ".lnk" - 4
// "\0" - 1
ASSERT( 9 < (MAX_PATH - lPathLen - 15)); if( 9 >= (MAX_PATH - lPathLen - 15) ) { MAX_ENTERCONNECTIONNAME = 9; //We sacrifice the shortcut for the NCW task
} else { MAX_ENTERCONNECTIONNAME = min(MAX_ENTERCONNECTIONNAME, MAX_PATH - lPathLen - 15); } }
Edit_LimitText( pInfo->hwndCnEbConnectionName, MAX_ENTERCONNECTIONNAME-1);//RAS_MaxEntryName );
// Set the static text box
//
{ DWORD dwFlags; TCHAR *pszMsg = NULL, *pszSubTitle = NULL, *pszMsg2 = NULL, *pszName=NULL; HWND hwndHMsg = NULL, hwndPage = NULL, hwndHMsg2 = NULL, hwndName = NULL;
hwndHMsg = pInfo->hwndCnStHMsg; hwndHMsg2 = pInfo->hwndCnStHMsg2; hwndPage = pInfo->hwndCn; hwndName = pInfo->hwndCnName;
if(!hwndHMsg || !hwndPage || !hwndHMsg2 ||!hwndName) { return FALSE; }
//Set the message on this page, the subtitle is set in AeWizard
//by help function AeSubTitle()
//
{ dwFlags = pInfo->pArgs->pApiArgs->dwFlags; if (dwFlags & RASEDFLAG_NewDirectEntry) { pszMsg = PszFromId( g_hinstDll, SID_CN_HMsgDccGuest ); pszName = PszFromId( g_hinstDll, SID_CN_NameDccGuest ); } else if( dwFlags & RASEDFLAG_InternetEntry) { pszMsg = PszFromId( g_hinstDll, SID_CN_HMsgInternet ); pszName = PszFromId( g_hinstDll, SID_CN_NameInternet ); } else { pszMsg = PszFromId( g_hinstDll, SID_CN_HMsgWork ); pszMsg2 = PszFromId( g_hinstDll, SID_CN_HMsgWork2 ); pszName = PszFromId( g_hinstDll, SID_CN_NameWork ); } }
if(pszMsg) { if(hwndHMsg) { SetWindowText(hwndHMsg, pszMsg); } Free(pszMsg); }
if (pszMsg2) { if(hwndHMsg2) { SetWindowText(hwndHMsg2, pszMsg2); } Free(pszMsg2); }
if (pszName) { if(hwndName) { SetWindowText(hwndName, pszName); }
Free(pszName); } }
return TRUE; }
//For whistler bug 346886
//
BOOL CnValidName(TCHAR * pszSrc) { WCHAR pszwInvalidChars[] = L"\\/:*?\"<>|\t"; WCHAR * pszwSrc=NULL; BOOL fValid = TRUE;
if(!pszSrc) { return FALSE; }
pszwSrc = StrDupWFromT(pszSrc); ASSERT(pszwSrc); if(!pszwSrc) { return TRUE; }
fValid= ( !wcspbrk( pszwSrc, pszwInvalidChars ) )?TRUE:FALSE;
return fValid; }
BOOL CnKillActive( IN AEINFO* 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 = NULL;
TRACE("CnKillActive"); // A DCC host conneciton will be forward to the incoming connection path
//
if ( pInfo->fDccHost ) { return FALSE; } Free0( pInfo->pArgs->pEntry->pszEntryName ); pInfo->pArgs->pEntry->pszEntryName = NULL;
//this GetText will always return an allocated buffer if memory
//is availabe, if user input nothing, it will return a string has
//only a NULL termination, TEXT('\0');
//
psz = GetText( pInfo->hwndCnEbConnectionName ); if (psz) { // Update the entry name from the editbox.
// We wont enfore a name to be entered, we also wont check if the
// the name entered here is a duplicate, because it is just part
// of the final name
//
// Validate the entry name. It cannot begin with a "."
//
if( pInfo->fCnWizNext ) { pInfo->fCnWizNext = FALSE;
if ( 0 < lstrlen( psz ) && ( (psz[ 0 ] == TEXT('.') ) || !CnValidName(psz) ) ) { Free0(psz); MsgDlg( pInfo->hwndDlg, SID_BadEntryWithDot, NULL ); SetFocus( pInfo->hwndCnEbConnectionName ); Edit_SetSel( pInfo->hwndCnEbConnectionName, 0, -1 ); return TRUE; } }
if( TEXT('\0') != psz[0] ) { pInfo->pArgs->pEntry->pszEntryName = psz; } else { Free0(psz); } }
return FALSE; }
BOOL CnSetActive( IN AEINFO* pInfo )
// Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context.
//
// Returns true to display the page, false to skip it.
//
{ TRACE("CnSetActive");
// A DCC host conneciton will be forward to the incoming connection path
//
if ( pInfo->fDccHost ) { /*
//when forwarded to incoming connection path, there is no Connection page
//beside, the incoming conneciton's name is not changable,
//so we remove the possible entered connection by previous given path
//like the DCC guest path
//
Free0( pInfo->pArgs->pEntry->pszEntryName ); pInfo->pArgs->pEntry->pszEntryName = NULL; */ return FALSE; }
PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT );
return TRUE; }
//----------------------------------------------------------------------------
// Destination property page
// Listed alphabetically following dialog proc
//----------------------------------------------------------------------------
INT_PTR CALLBACK DaDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam )
// DialogProc callback for the Destination page of the wizard. Parameters
// and return value are as described for standard windows 'DialogProc's.
//
{ switch (unMsg) { case WM_INITDIALOG: AeSetContext( hwnd, lparam ); return DaInit( hwnd );
case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AEINFO* pInfo; BOOL fDisplay;
TRACE("DaSETACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fDisplay = DaSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; }
case PSN_KILLACTIVE: { AEINFO* pInfo; BOOL fInvalid;
TRACE("DaKILLACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fInvalid = DaKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } }
return FALSE; }
BOOL DaInit( IN HWND hwndPage )
// Called on WM_INITDIALOG. 'hwndPage' is the handle of the property
// page.
//
// Return false if focus was set, true otherwise.
//
{ AEINFO* pInfo;
TRACE("DaInit");
pInfo = AeContext( hwndPage ); if (!pInfo) return TRUE;
// Initialize page-specific context information.
//
pInfo->hwndDa = hwndPage; pInfo->hwndEbHostName = GetDlgItem( hwndPage, CID_DA_EB_HostName ); ASSERT(pInfo->hwndEbHostName);
Edit_LimitText( pInfo->hwndEbHostName, RAS_MaxPhoneNumber );
return TRUE; }
BOOL DaKillActive( IN AEINFO* 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 DaSetActive( IN AEINFO* 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;
ASSERT(pInfo); pEntry = pInfo->pArgs->pEntry;
if (RASET_Vpn != pEntry->dwType) { fDisplayPage = FALSE; } else { LPARAM dwWizButtons = PSWIZB_NEXT; DWORD dwFlags = pInfo->pArgs->pApiArgs->dwFlags;
// Show the back button if we're shell owned or, we have the
// La page or the Pn page before us.
//
if ((dwFlags & RASEDFLAG_ShellOwned) || !(dwFlags & RASEDFLAG_NewTunnelEntry) || !pInfo->fHidePublicNetworkPage) { dwWizButtons |= PSWIZB_BACK; }
PropSheet_SetWizButtons( pInfo->hwndDlg, dwWizButtons ); fDisplayPage = TRUE; }
return fDisplayPage; }
//----------------------------------------------------------------------------
// Default inTernet wizard page
// This is a personal-sku only page.
//----------------------------------------------------------------------------
INT_PTR CALLBACK DtDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam )
// DialogProc callback for the Default inTernet page of the wizard.
// Parameters and return value are as described for standard
// windows 'DialogProc's.
//
{ switch (unMsg) { case WM_INITDIALOG: AeSetContext( hwnd, lparam ); return DtInit( hwnd );
case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AEINFO* pInfo; BOOL fDisplay;
TRACE("DtSETACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fDisplay = DtSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; }
case PSN_KILLACTIVE: { AEINFO* pInfo; BOOL fInvalid;
TRACE("DtKILLACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fInvalid = DtKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } }
return FALSE; }
DWORD DtEnableDisableControls( IN AEINFO* pInfo, IN BOOL fEnable) { EnableWindow(pInfo->hwndDtEbUserName, fEnable ); EnableWindow(pInfo->hwndDtEbPassword, fEnable ); EnableWindow(pInfo->hwndDtEbPassword2, fEnable ); EnableWindow(pInfo->hwndDtStUserName, fEnable ); EnableWindow(pInfo->hwndDtStPassword, fEnable ); EnableWindow(pInfo->hwndDtStPassword2, fEnable );
return NO_ERROR; }
BOOL DtInit( IN HWND hwndPage )
// Called on WM_INITDIALOG. 'hwndPage' is the handle of the property
// page.
//
// Return false if focus was set, true otherwise.
//
{ AEINFO* pInfo; BOOL fWork = FALSE;
TRACE("DtInit");
pInfo = AeContext( hwndPage ); if (!pInfo) return TRUE;
// Initialize page-specific context information.
//
pInfo->hwndDt = hwndPage; pInfo->hwndDtCbFirewall = GetDlgItem( hwndPage, CID_DT_CB_Firewall ); pInfo->hwndDtCbDefault = GetDlgItem( hwndPage, CID_DT_CB_Default ); pInfo->hwndDtEbUserName = GetDlgItem( hwndPage, CID_DT_EB_UserName ); pInfo->hwndDtEbPassword = GetDlgItem( hwndPage, CID_DT_EB_Password ); pInfo->hwndDtEbPassword2= GetDlgItem( hwndPage, CID_DT_EB_Password2 ); pInfo->hwndDtStUserName = GetDlgItem( hwndPage, CID_DT_ST_UserName ); pInfo->hwndDtStPassword = GetDlgItem( hwndPage, CID_DT_ST_Password ); pInfo->hwndDtStPassword2= GetDlgItem( hwndPage, CID_DT_ST_Password2 ); pInfo->hwndDtCbUseCredentials = GetDlgItem( hwndPage, CID_DT_CB_UseSharedCredentials );
Edit_LimitText( pInfo->hwndDtEbUserName, UNLEN ); Edit_LimitText( pInfo->hwndDtEbPassword, PWLEN ); Edit_LimitText( pInfo->hwndDtEbPassword2, PWLEN );
{ DWORD dwFlags = pInfo->pArgs->pApiArgs->dwFlags;
if ( dwFlags & RASEDFLAG_NewDirectEntry || dwFlags & RASEDFLAG_InternetEntry ) { fWork = FALSE; } else { fWork = TRUE; } }
//Turn on the Domain bits for workplace path
//Per the request of Jenellec and approved by Davidei and pmay,
//we revert this change
/*
if(fWork) { pInfo->pArgs->pEntry->fPreviewDomain = 1; } */ //Change the HeadMessage for workplace path
//For whistler bug 364818 gangz
//
if( fWork || (RASEDFLAG_NewDirectEntry & pInfo->pArgs->pApiArgs->dwFlags) ) { HWND hwndHeadMsg = GetDlgItem( hwndPage, CID_DT_HeadMessage );
TCHAR * pszMsg = PszFromId( g_hinstDll, SID_DT_HMsgWork );
if(pszMsg) { if(hwndHeadMsg) { SetWindowText( hwndHeadMsg, pszMsg); } Free(pszMsg); } }
// Intialize the three check buttons, turn them off for the
// workplace path gangz
//
Button_SetCheck( pInfo->hwndDtCbDefault, !fWork ); Button_SetCheck( pInfo->hwndDtCbUseCredentials, !fWork );
//Show the Firewall check box according to 3 conditions
//(1) Admin or Power Users
//(2) only for Personal, Professional and Standard Server
//(3) Group Policy enable it(GPA is not configues is viewed as enable)
if (pInfo->pArgs->fIsUserAdminOrPowerUser && IsFirewallAvailablePlatform() && IsGPAEnableFirewall()) { EnableWindow( pInfo->hwndDtCbFirewall, TRUE ); Button_SetCheck( pInfo->hwndDtCbFirewall, !fWork ); } else { EnableWindow( pInfo->hwndDtCbFirewall, FALSE ); ShowWindow( pInfo->hwndDtCbFirewall, SW_HIDE); pInfo->fFirewall = FALSE; }
//Normal user doesnt have the privilege to set a connectoid
//as a default internet connection
//
if ( !pInfo->pArgs->fIsUserAdminOrPowerUser) { Button_SetCheck( pInfo->hwndDtCbDefault, FALSE); EnableWindow(pInfo->hwndDtCbDefault, FALSE); } // Reset the title and subtitle if this is the work path
// this is done in AeWizard() by calling AeTitle() and AeSubtitle()
//
// This entry is default to be available for all users
//
// pInfo->fCreateForAllUsers = TRUE; //this is done in AeInit()
return TRUE; }
BOOL DtKillActive( IN AEINFO* 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.
//
{ // Remember whether to set this as the default Internet connection
//
BOOL fResult = FALSE;
//Dont show the Account name page for DCC guest connection
//for whistler bug 364818 gangz
//
if( pInfo->pArgs->pApiArgs->dwFlags & RASEDFLAG_NewDirectEntry ) { return FALSE; } pInfo->pArgs->fDefInternet = Button_GetCheck( pInfo->hwndDtCbDefault );
//Add firewall check and GlobalCred for whistler bug 328673
//
pInfo->fFirewall = Button_GetCheck( pInfo->hwndDtCbFirewall );
pInfo->pArgs->fGlobalCred = Button_GetCheck( pInfo->hwndDtCbUseCredentials ); Free0(pInfo->pArgs->pszDefUserName); Free0(pInfo->pArgs->pszDefPassword);
// Get the credentials
//
{ TCHAR pszUserName[UNLEN + 1]; TCHAR pszPassword[PWLEN + 1]; TCHAR pszPassword2[PWLEN + 1]; INT iLen;
pszUserName[0] = TEXT('\0'); pszPassword[0] = TEXT('\0'); pszPassword2[0] = TEXT('\0');
// Get the credentials
//
do { GetWindowText( pInfo->hwndDtEbUserName, pszUserName, UNLEN + 1); GetWindowText( pInfo->hwndDtEbPassword, pszPassword, PWLEN + 1); GetWindowText( pInfo->hwndDtEbPassword2, pszPassword2, PWLEN + 1);
// Verify there is a user name
//
//Add for whistler bug 328673
//User can leave the credential blank or must fill a complete
//credential information
//
if ( 0 == lstrlen(pszUserName) && 0 == lstrlen(pszPassword) && 0 == lstrlen(pszPassword2) ) { fResult = FALSE; break; } if (lstrlen(pszUserName) == 0) { MsgDlg(pInfo->hwndDt, SID_MissingUserName, NULL); fResult = TRUE; break; }
// Verify the passwords match
//
if (lstrcmp(pszPassword, pszPassword2) != 0) { MsgDlg(pInfo->hwndDt, SID_PasswordMismatch, NULL); fResult = TRUE; break; }
pInfo->pArgs->pszDefUserName = StrDup(pszUserName); if (pInfo->pArgs->pszDefUserName == NULL) { fResult = TRUE; break; }
pInfo->pArgs->pszDefPassword = StrDup(pszPassword); if (pInfo->pArgs->pszDefPassword) { // Scramble the password
//
EncodePassword(pInfo->pArgs->pszDefPassword); fResult = FALSE; } else if (lstrlen(pszPassword)) { // Copy failed
fResult = TRUE; } else { fResult = FALSE; } } while(FALSE); // Clear passwords from temporary stack memory
//
ZeroMemory(pszPassword, sizeof(pszPassword)); ZeroMemory(pszPassword2, sizeof(pszPassword2)); }
if ( fResult ) { Free0(pInfo->pArgs->pszDefUserName); Free0(pInfo->pArgs->pszDefPassword); } return fResult; }
BOOL DtSetActive( IN AEINFO* pInfo )
// Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context.
//
// Returns true to display the page, false to skip it.
//
{ if (pInfo->fDccHost) { return FALSE; }
// Dont show the Account name page for DCC guest connection
// or workpath connections
// for whistler bug 364818 383533 gangz
//
if( RASEDFLAG_NewDirectEntry & pInfo->pArgs->pApiArgs->dwFlags || !(RASEDFLAG_InternetEntry & pInfo->pArgs->pApiArgs->dwFlags) ) { pInfo->pArgs->fDefInternet = FALSE; pInfo->fFirewall = FALSE; pInfo->pArgs->fGlobalCred = FALSE; return FALSE; }
// If this is a singer-user connection then we hide the option to save the
// password globally.
//
if ( !pInfo->fCreateForAllUsers ) { Button_SetCheck( pInfo->hwndDtCbUseCredentials, FALSE ); EnableWindow( pInfo->hwndDtCbUseCredentials, FALSE ); ShowWindow( pInfo->hwndDtCbUseCredentials, SW_HIDE ); } else { ShowWindow( pInfo->hwndDtCbUseCredentials, SW_SHOW ); EnableWindow( pInfo->hwndDtCbUseCredentials, TRUE ); }
PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT ); return TRUE; }
//----------------------------------------------------------------------------
// Entry Name property page
// Listed alphabetically following dialog proc
//----------------------------------------------------------------------------
INT_PTR CALLBACK EnDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam )
// DialogProc callback for the Entry Name page of the wizard. Parameters
// and return value are as described for standard windows 'DialogProc's.
//
{ switch (unMsg) { case WM_INITDIALOG: AeSetContext( hwnd, lparam ); return EnInit( hwnd );
case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_RESET: { TRACE("EnRESET"); SetWindowLong( hwnd, DWLP_MSGRESULT, FALSE ); return TRUE; }
case PSN_SETACTIVE: { AEINFO* pInfo; BOOL fDisplay;
TRACE("EnSETACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fDisplay = EnSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; }
case PSN_KILLACTIVE: { AEINFO* pInfo; BOOL fInvalid;
TRACE("EnKILLACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fInvalid = EnKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; }
case PSN_WIZBACK: { AEINFO* pInfo;
TRACE("EnWIZBACK"); pInfo = AeContext( hwnd ); PropSheet_SetWizButtons(pInfo->hwndDlg, PSWIZB_NEXT | PSWIZB_BACK); return FALSE; }
case PSN_WIZFINISH: { AEINFO* pInfo; BOOL fInvalid;
TRACE("EnWIZFINISH");
pInfo = AeContext( hwnd ); ASSERT(pInfo);
// You'd think pressing Finish would trigger a KILLACTIVE
// event, but it doesn't, so we do it ourselves.
//
fInvalid = EnKillActive( pInfo ); if (!fInvalid) { pInfo->pArgs->pUser->fDirty = TRUE; SetUserPreferences( NULL, pInfo->pArgs->pUser, pInfo->pArgs->fNoUser ? UPM_Logon : UPM_Normal );
AeFinish( pInfo ); }
SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } }
return FALSE; }
BOOL EnInit( 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; AEINFO* pInfo; PBENTRY* pEntry;
TRACE("EnInit");
pInfo = AeContext( hwndPage ); if (!pInfo) return TRUE; // The shell owns the finished page, so if we're shell owned, don't
// display ours.
//
if (pInfo->pArgs->pApiArgs->dwFlags & RASEDFLAG_ShellOwned) { return TRUE; }
// Initialize page-specific context information.
//
pInfo->hwndEn = hwndPage; pInfo->hwndEbEntryName = GetDlgItem( hwndPage, CID_EN_EB_EntryName ); ASSERT(pInfo->hwndEbEntryName);
// Initialize the entry name field.
//
pEntry = pInfo->pArgs->pEntry; if (!pEntry->pszEntryName) { ASSERT( pInfo->pArgs->pFile );
// No entry name, so think up a default.
//
dwErr = GetDefaultEntryName( NULL, pEntry->dwType, pInfo->pArgs->fRouter, &pEntry->pszEntryName ); }
Edit_LimitText( pInfo->hwndEbEntryName, RAS_MaxEntryName ); SetWindowText( pInfo->hwndEbEntryName, pEntry->pszEntryName );
return TRUE; }
BOOL EnKillActive( IN AEINFO* 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;
// The shell owns the finished page, so if we're shell owned, don't
// display ours.
//
if (pInfo->pArgs->pApiArgs->dwFlags & RASEDFLAG_ShellOwned) { return FALSE; }
psz = GetText( pInfo->hwndEbEntryName ); 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->hwndEbEntryName ); Edit_SetSel( pInfo->hwndEbEntryName, 0, -1 ); return TRUE; } }
return FALSE; }
BOOL EnSetActive( IN AEINFO* pInfo )
// Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context.
//
// Returns true to display the page, false to skip it.
//
{ LPARAM dwWizButtons = PSWIZB_FINISH; DWORD dwFlags = pInfo->pArgs->pApiArgs->dwFlags;
// The shell owns the finished page, so if we're shell owned, don't
// display ours.
//
if (dwFlags & RASEDFLAG_ShellOwned) { return FALSE; }
if (!(dwFlags & RASEDFLAG_CloneEntry)) { dwWizButtons |= PSWIZB_BACK; } PropSheet_SetWizButtons( pInfo->hwndDlg, dwWizButtons ); return TRUE; }
INT_PTR CALLBACK LaDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam )
// DialogProc callback for the start page of the wizard. Parameters and
// return value are as described for standard windows 'DialogProc's.
//
{ switch (unMsg) { case WM_INITDIALOG: AeSetContext( hwnd, lparam ); return LaInit( hwnd );
case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AEINFO* pInfo; BOOL fDisplay;
TRACE("LaSETACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fDisplay = LaSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; }
case PSN_KILLACTIVE: { AEINFO* pInfo; BOOL fInvalid;
TRACE("LaKILLACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fInvalid = LaKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } }
return FALSE; }
BOOL LaInit( IN HWND hwndPage )
// Called on WM_INITDIALOG. 'hwndPage' is the handle of the property
// page. 'pInfo' is the arguments from the PropertySheet caller.
//
// Return false if focus was set, true otherwise.
//
{ AEINFO* pInfo; DWORD dwType; INT nIdButton; HFONT hfont;
TRACE("LaInit");
pInfo = AeContext( hwndPage ); if (!pInfo) return TRUE;
// Initialize page-specific context information.
//
pInfo->hwndLa = hwndPage;
// Create the bold font and apply it to the buttons.
//
hfont = GetWindowFont (hwndPage); if (!hfont) { // If not found then the dialog is using the system font.
//
hfont = (HFONT )GetStockObject (SYSTEM_FONT); } if (hfont) { LOGFONT lf;
// Get the font info so we can generate the bold version.
//
if (GetObject (hfont, sizeof(lf), &lf)) { lf.lfWeight = FW_BOLD; hfont = CreateFontIndirect (&lf);
if (hfont) { // Store this so we can destroy it during cleanup.
//
pInfo->hfontBold = hfont;
// Set the fonts of the radio buttons using this bold font.
//
SetWindowFont (GetDlgItem (hwndPage, CID_LA_RB_Phone), hfont, FALSE);
SetWindowFont (GetDlgItem (hwndPage, CID_LA_RB_Tunnel), hfont, FALSE);
SetWindowFont (GetDlgItem (hwndPage, CID_LA_RB_Direct), hfont, FALSE);
SetWindowFont (GetDlgItem (hwndPage, CID_LA_RB_Broadband), hfont, FALSE); } } }
// Set the radio buttons.
//
dwType = pInfo->pArgs->pEntry->dwType;
if (RASET_Phone == dwType) { nIdButton = CID_LA_RB_Phone; } else if (RASET_Vpn == dwType) { nIdButton = CID_LA_RB_Tunnel; } else if (RASET_Broadband == dwType) { nIdButton = CID_LA_RB_Broadband; } else { nIdButton = CID_LA_RB_Direct; } CheckDlgButton( hwndPage, nIdButton, BST_CHECKED );
return TRUE; }
BOOL LaKillActive( IN AEINFO* 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 (BST_CHECKED == IsDlgButtonChecked (pInfo->hwndLa, CID_LA_RB_Phone)) { EuChangeEntryType (pInfo->pArgs, RASET_Phone); } else if (BST_CHECKED == IsDlgButtonChecked (pInfo->hwndLa, CID_LA_RB_Tunnel)) { EuChangeEntryType (pInfo->pArgs, RASET_Vpn); } else if (BST_CHECKED == IsDlgButtonChecked (pInfo->hwndLa, CID_LA_RB_Broadband)) { EuChangeEntryType (pInfo->pArgs, RASET_Broadband); } else { EuChangeEntryType (pInfo->pArgs, RASET_Direct); }
return FALSE; }
BOOL LaSetActive( IN AEINFO* pInfo )
// Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context.
//
// Returns true to display the page, false to skip it.
//
{ DWORD dwFlags = pInfo->pArgs->pApiArgs->dwFlags;
// If we are owned by the shell, then we are not displayed.
//
if (dwFlags & RASEDFLAG_ShellOwned) { return FALSE; }
// If we were told by the caller, which type of entry we should be,
// then we are not displayed.
//
if (dwFlags & (RASEDFLAG_NewPhoneEntry | RASEDFLAG_NewTunnelEntry | RASEDFLAG_NewDirectEntry | RASEDFLAG_NewBroadbandEntry)) //Add _NewBroadbandEntry for bug237175
{ return FALSE; }
PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_NEXT ); return TRUE; }
//----------------------------------------------------------------------------
// Modem/Adapter property page
// Listed alphabetically following dialog proc
//----------------------------------------------------------------------------
INT_PTR CALLBACK MaDlgProc( 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 (ListView_OwnerHandler( hwnd, unMsg, wparam, lparam, MaLvCallback )) { return TRUE; }
switch (unMsg) { case WM_INITDIALOG: AeSetContext( hwnd, lparam ); return MaInit( hwnd );
case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AEINFO* pInfo; BOOL fDisplay;
TRACE("MaSETACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fDisplay = MaSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; }
case LVXN_SETCHECK: { AEINFO* pInfo;
TRACE("MaLVXNSETCHECK"); pInfo = AeContext( hwnd ); ASSERT(pInfo); if (ListView_GetCheckedCount(pInfo->hwndLv) > 0) { PropSheet_SetWizButtons(pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT); } else { // Disable Next button if no items are checked
PropSheet_SetWizButtons(pInfo->hwndDlg, PSWIZB_BACK); } return TRUE; }
case PSN_KILLACTIVE: { AEINFO* pInfo; BOOL fInvalid;
TRACE("MaKILLACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fInvalid = MaKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } }
return FALSE; }
BOOL MaInit( IN HWND hwndPage )
// Called on WM_INITDIALOG. 'hwndPage' is the handle of the property
// page.
//
// Return false if focus was set, true otherwise.
//
{ AEINFO* pInfo;
TRACE("MaInit");
pInfo = AeContext( hwndPage ); if (!pInfo) return TRUE;
// Initialize page-specific context information.
//
pInfo->hwndMa = hwndPage; pInfo->hwndLv = GetDlgItem( hwndPage, CID_MA_LV_Devices ); ASSERT(pInfo->hwndLv);
// Add the modem and adapter images.
//
ListView_InstallChecks( pInfo->hwndLv, g_hinstDll ); 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.
//
if (DtlGetNodes( pInfo->pArgs->pEntry->pdtllistLinks ) < 2) { pInfo->fSkipMa = TRUE; }
//For whislter bug 354542
//
pInfo->fMultilinkAllIsdn = FALSE; return FALSE; }
LVXDRAWINFO* MaLvCallback( 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; }
BOOL MaKillActive( IN AEINFO* pInfo )
// Called when the modem/adapter page is loosing activation.
{ PBENTRY* pEntry;
ASSERT(pInfo); pEntry = pInfo->pArgs->pEntry;
if (!pInfo->fSkipMa && (RASET_Phone == pEntry->dwType)) {
// Initialization of i to -1 is important here. It means start
// the search beginning with that item.
//
INT i = -1;
//For whistler bug 354542
//
pInfo->fMultilinkAllIsdn = FALSE;
while ((i = ListView_GetNextItem(pInfo->hwndLv, i, LVNI_ALL )) >= 0) { DTLNODE* pNode;
pNode = (DTLNODE* )ListView_GetParamPtr( pInfo->hwndLv, i );
if (pNode) { PBLINK* pLink = (PBLINK* )DtlGetData( pNode ); ASSERT( pLink );
// If we're multilinking all ISDN, we only need to
// set enabled based on the check state if the device type
// is not ISDN. (If it is ISDN and we're multilinking, we've
// already taken care of it below.
//
if (!pInfo->fMultilinkAllIsdn || (pLink->pbport.pbdevicetype != PBDT_Isdn)) { pLink->fEnabled = ListView_GetCheck( pInfo->hwndLv, i ); } } //Only the Dummy "All available Isdn" item will return the NULL pLink
//
else if (ListView_GetCheck( pInfo->hwndLv, i )) { // ISDN multi-link selected. Enable the ISDN multi-link
// nodes, move them to the head of the list, and disable
// all the other links.
//
DTLNODE* pNextNode; DTLNODE* pAfterNode; DTLLIST* pList;
//For whistler bug 354542
//
pInfo->fMultilinkAllIsdn = TRUE;
pList = pInfo->pArgs->pEntry->pdtllistLinks;
pInfo->fModem = FALSE;
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; } } } } }
return FALSE; }
BOOL MaSetActive( IN AEINFO* 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;
ASSERT(pInfo); pEntry = pInfo->pArgs->pEntry;
if (pInfo->fSkipMa || (RASET_Phone != pEntry->dwType)) { fDisplayPage = FALSE; } else { TCHAR* psz; DTLNODE* pNode; DWORD cMultilinkableIsdn; LV_ITEM item; INT iItem, iIndex;
ListView_DeleteAllItems( pInfo->hwndLv );
// Fill the list of devices and select the first item.
//
iItem = 1; cMultilinkableIsdn = 0; for (pNode = DtlGetFirstNode( pInfo->pArgs->pEntry->pdtllistLinks ); pNode; pNode = DtlGetNextNode( pNode )) { PBLINK* pLink; DWORD dwImage;
pLink = (PBLINK* )DtlGetData( pNode ); ASSERT(pLink);
if ((pLink->pbport.pbdevicetype == PBDT_Isdn) && !pLink->fProprietaryIsdn) { ++cMultilinkableIsdn; }
psz = DisplayPszFromPpbport( &pLink->pbport, &dwImage ); if (psz) { PBLINK* pLink;
pLink = (PBLINK* )DtlGetData( pNode );
ZeroMemory( &item, sizeof(item) ); item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; item.iItem = iItem++; item.pszText = psz; item.iImage = dwImage; item.lParam = (LPARAM )pNode;
iIndex = ListView_InsertItem( pInfo->hwndLv, &item );
if (pInfo->fMaAlreadyInitialized) { ListView_SetCheck(pInfo->hwndLv, iIndex, pLink->fEnabled); } else { ListView_SetCheck(pInfo->hwndLv, iIndex, FALSE); } Free( psz ); } }
if (cMultilinkableIsdn > 1) { psz = PszFromId( g_hinstDll, SID_IsdnAdapter ); if (psz) { LONG lStyle;
// 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;
iIndex = ListView_InsertItem( pInfo->hwndLv, &item );
//For whislter bug 354542
//
ListView_SetCheck(pInfo->hwndLv, iIndex, pInfo->fMultilinkAllIsdn); Free( psz ); } }
// Select the first item.
//
ListView_SetItemState( pInfo->hwndLv, 0, LVIS_SELECTED, LVIS_SELECTED ); if (!pInfo->fMaAlreadyInitialized) { ListView_SetCheck( pInfo->hwndLv, 0, TRUE );
{ LPARAM dwWizButtons = PSWIZB_NEXT; DWORD dwFlags = pInfo->pArgs->pApiArgs->dwFlags;
if ((dwFlags & RASEDFLAG_ShellOwned) || !(dwFlags & RASEDFLAG_NewPhoneEntry)) { dwWizButtons |= PSWIZB_BACK; }
PropSheet_SetWizButtons( pInfo->hwndDlg, dwWizButtons ); }
pInfo->fMaAlreadyInitialized = TRUE; } else { if (!ListView_GetCheckedCount(pInfo->hwndLv)) { // Disable next button if no items checked
PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK ); } }
fDisplayPage = TRUE; }
return fDisplayPage; }
//----------------------------------------------------------------------------
// Phone Number property page
// Listed alphabetically following dialog proc
//----------------------------------------------------------------------------
INT_PTR CALLBACK PaDlgProc( 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.
//
{ switch (unMsg) { case WM_INITDIALOG: AeSetContext( hwnd, lparam ); return PaInit( hwnd );
case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AEINFO* pInfo; BOOL fDisplay;
TRACE("PaSETACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fDisplay = PaSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; }
case PSN_KILLACTIVE: { AEINFO* pInfo; BOOL fInvalid;
TRACE("PaKILLACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fInvalid = PaKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; }
}
return FALSE; }
BOOL PaInit( IN HWND hwndPage )
// Called on WM_INITDIALOG. 'hwndPage' is the handle of the property
// page.
//
// Return false if focus was set, true otherwise.
//
{ AEINFO* pInfo; CUINFO * pCuInfo = NULL;
TRACE("PaInit");
pInfo = AeContext( hwndPage ); if (!pInfo) return TRUE;
// Initialize page-specific context information.
//
pInfo->hwndPa = hwndPage; pInfo->hwndEbNumber = GetDlgItem( hwndPage, CID_PA_EB_Number ); ASSERT(pInfo->hwndEbNumber);
// Initialize the complex phone number context and use those utilities to
// set the phone number controls.
//
pInfo->pListAreaCodes = DtlDuplicateList( pInfo->pArgs->pUser->pdtllistAreaCodes, DuplicatePszNode, DestroyPszNode );
//Modify Phonenumber page for bug 328673 gangz
//Initialize pInfo->CuInfoCuInfo
//
pCuInfo=&pInfo->cuinfo; ZeroMemory(pCuInfo, sizeof(*pCuInfo) );
pCuInfo->hwndStAreaCodes = NULL; pCuInfo->hwndClbAreaCodes = NULL; pCuInfo->hwndStPhoneNumber = NULL; pCuInfo->hwndEbPhoneNumber = pInfo->hwndEbNumber; pCuInfo->hwndStCountryCodes = NULL; pCuInfo->hwndLbCountryCodes = NULL; pCuInfo->hwndCbUseDialingRules = NULL; pCuInfo->hwndPbDialingRules = NULL; pCuInfo->hwndPbAlternates = NULL; pCuInfo->hwndStComment = NULL; pCuInfo->hwndEbComment = NULL; pCuInfo->pListAreaCodes = pInfo->pListAreaCodes;
// Disaster defaults only. Not used in normal operation.
//
pCuInfo->dwCountryId = 1; pCuInfo->dwCountryCode = 1;
Edit_LimitText( pCuInfo->hwndEbPhoneNumber, RAS_MaxPhoneNumber );
pInfo->fCuInfoInitialized = TRUE;
// Load the phone number fields from the shared link.
//
{ PBLINK* pLink; DTLNODE* pPhoneNode;
pLink = (PBLINK* )DtlGetData( pInfo->pArgs->pSharedNode ); ASSERT( pLink );
pPhoneNode = FirstPhoneNodeFromPhoneList( pLink->pdtllistPhones ); if (pPhoneNode) { CuSetInfo( &pInfo->cuinfo, pPhoneNode, FALSE ); DestroyPhoneNode( pPhoneNode ); } }
Edit_SetSel( pInfo->hwndEbNumber, 0, -1 ); SetFocus( pInfo->hwndEbNumber );
return FALSE; }
BOOL PaKillActive( IN AEINFO* pInfo )
// Called when PSN_KILLACTIVE is received. 'PInfo' is the wizard context.
//
// Returns true if the page is invalid, false if it can be dismissed.
//
{ return FALSE; }
BOOL PaSetActive( IN AEINFO* 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;
ASSERT(pInfo); pEntry = pInfo->pArgs->pEntry;
if (RASET_Phone != pEntry->dwType) { fDisplayPage = FALSE; } else { LPARAM dwWizButtons = PSWIZB_NEXT; DWORD dwFlags = pInfo->pArgs->pApiArgs->dwFlags;
// Show the back button if we're shell owned or, we have the
// La page or the Ma page before us. La page will be shown if
// not RASEDFLAG_NewPhoneEntry. Ma page will be shown if !fSkipMa.
//
if ((dwFlags & RASEDFLAG_ShellOwned) || !(dwFlags & RASEDFLAG_NewPhoneEntry) || !pInfo->fSkipMa) { dwWizButtons |= PSWIZB_BACK; }
PropSheet_SetWizButtons( pInfo->hwndDlg, dwWizButtons ); fDisplayPage = TRUE; }
return fDisplayPage; }
//----------------------------------------------------------------------------
// Public network property page
// Listed alphabetically following dialog proc
//----------------------------------------------------------------------------
INT_PTR CALLBACK PnDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam )
// DialogProc callback for the Public Network page of the wizard.
// Parameters and return value are as described for standard windows
// 'DialogProc's.
//
{ switch (unMsg) { case WM_INITDIALOG: AeSetContext( hwnd, lparam ); return PnInit( hwnd );
case WM_COMMAND: { AEINFO* pInfo = AeContext( hwnd ); ASSERT (pInfo);
switch (LOWORD(wparam)) { case CID_PN_LB_DialAnotherFirst: { if (HIWORD( wparam ) == CBN_SELCHANGE) { PnDialAnotherFirstSelChange( pInfo ); return TRUE; } break; }
case CID_PN_RB_DoNotDialFirst: case CID_PN_RB_DialFirst: { switch (HIWORD( wparam)) { case BN_CLICKED: { PnUpdateLbDialAnotherFirst( pInfo ); return TRUE; } } break; } } break; }
case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AEINFO* pInfo; BOOL fDisplay;
TRACE("PnSETACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fDisplay = PnSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; }
case PSN_KILLACTIVE: { AEINFO* pInfo; BOOL fInvalid;
TRACE("PnKILLACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fInvalid = PnKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } }
return FALSE; }
VOID PnClearLbDialFirst( IN HWND hwndLbDialFirst )
// Clear prerequisite entry list box. 'hwndLbDialAnotherFirst' is the
// window handle of the listbox control. context.
//
{ PREREQITEM* pItem;
while (pItem = ComboBox_GetItemDataPtr( hwndLbDialFirst, 0 )) { ComboBox_DeleteString( hwndLbDialFirst, 0 ); Free0( pItem->pszEntry ); Free0( pItem->pszPbk ); Free( pItem ); } }
VOID PnDialAnotherFirstSelChange( IN AEINFO* pInfo ) { PBENTRY* pEntry; PREREQITEM* pItem; INT iSel;
iSel = ComboBox_GetCurSel( pInfo->hwndLbDialFirst ); if (iSel < 0) { return; }
pEntry = pInfo->pArgs->pEntry;
Free0( pEntry->pszPrerequisiteEntry ); Free0( pEntry->pszPrerequisitePbk );
pItem = (PREREQITEM* ) ComboBox_GetItemDataPtr( pInfo->hwndLbDialFirst, iSel );
if(NULL != pItem) { pEntry->pszPrerequisiteEntry = StrDup( pItem->pszEntry ); pEntry->pszPrerequisitePbk = StrDup( pItem->pszPbk ); } }
// !!! Make this common with GeFillLbDialAnotherFirst
VOID PnUpdateLbDialAnotherFirst( IN AEINFO* pInfo )
// Fill prerequisite entry list box with all non-VPN entries in the
// phonebook, and select the prerequiste one. 'pInfo' is the property
// sheet context.
//
{ BOOL fEnabledLb = FALSE;
ComboBox_ResetContent( pInfo->hwndLbDialFirst );
if (BST_CHECKED == IsDlgButtonChecked (pInfo->hwndPn, CID_PN_RB_DialFirst)) { DWORD i; INT iThis; INT iSel; TCHAR* pszEntry; TCHAR* pszPrerequisiteEntry; RASENTRYNAME* pRens; RASENTRYNAME* pRen; DWORD dwRens;
PnClearLbDialFirst( pInfo->hwndLbDialFirst );
iSel = 0; pszEntry = pInfo->pArgs->pEntry->pszEntryName; pszPrerequisiteEntry = pInfo->pArgs->pEntry->pszPrerequisiteEntry;
if (GetRasEntrynameTable( &pRens, &dwRens ) != 0) { return; }
for (i = 0, pRen = pRens; i < dwRens; ++i, ++pRen ) { PREREQITEM* pItem;
if (lstrcmp( pRen->szEntryName, pszEntry ) == 0) { continue; }
pItem = Malloc( sizeof(PREREQITEM) ); if (!pItem) { continue; }
pItem->pszEntry = StrDup( pRen->szEntryName ); pItem->pszPbk = StrDup( pRen->szPhonebookPath );
if (!pItem->pszEntry || !pItem->pszPbk) { Free0( pItem->pszEntry ); Free( pItem ); continue; }
iThis = ComboBox_AddItem( pInfo->hwndLbDialFirst, pItem->pszEntry, pItem );
if (pszPrerequisiteEntry && *(pszPrerequisiteEntry) && lstrcmp( pItem->pszEntry, pszPrerequisiteEntry ) == 0) { iSel = iThis; ComboBox_SetCurSelNotify( pInfo->hwndLbDialFirst, iSel ); } }
Free( pRens );
if (iSel == 0) { ComboBox_SetCurSelNotify( pInfo->hwndLbDialFirst, iSel ); }
fEnabledLb = TRUE; } else { // Toss the existing prerequesite entry since its disabled.
//
PBENTRY* pEntry = pInfo->pArgs->pEntry;
Free0( pEntry->pszPrerequisiteEntry ); pEntry->pszPrerequisiteEntry = NULL; Free0( pEntry->pszPrerequisitePbk ); pEntry->pszPrerequisitePbk = NULL; } EnableWindow( pInfo->hwndLbDialFirst, fEnabledLb ); }
BOOL PnInit( IN HWND hwndPage )
// Called on WM_INITDIALOG. 'hwndPage' is the handle of the property
// page.
//
// Return false if focus was set, true otherwise.
//
{ AEINFO* pInfo;
PBENTRY *pEntry;
TRACE("PnInit");
pInfo = AeContext( hwndPage ); if (!pInfo) return TRUE;
// Initialize page-specific context information.
//
pInfo->hwndPn = hwndPage;
pInfo->hwndLbDialFirst = GetDlgItem( hwndPage, CID_PN_LB_DialAnotherFirst ); ASSERT( pInfo->hwndLbDialFirst );
pEntry = pInfo->pArgs->pEntry;
if(RASET_Vpn == pEntry->dwType) {
// Set the dial another first radio button so that the
// combo box of entries to dial can be filled in. If it
// turns out that there were no entries we don't need to show the page.
//
CheckDlgButton( hwndPage, CID_PN_RB_DialFirst, BST_CHECKED ); }
PnUpdateLbDialAnotherFirst( pInfo );
if (0 == ComboBox_GetCount( pInfo->hwndLbDialFirst )) { pInfo->fHidePublicNetworkPage = TRUE; }
return TRUE; }
BOOL PnKillActive( IN AEINFO* 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 PnSetActive( IN AEINFO* 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;
ASSERT(pInfo); pEntry = pInfo->pArgs->pEntry;
if (pInfo->fHidePublicNetworkPage || (RASET_Vpn != pEntry->dwType)) { fDisplayPage = FALSE; } else { LPARAM dwWizButtons = PSWIZB_NEXT; DWORD dwFlags = pInfo->pArgs->pApiArgs->dwFlags;
// Show the back button if we're shell owned or, we have the
// La page before us. La page will be shown if
// not RASEDFLAG_NewTunnelEntry.
//
if ((dwFlags & RASEDFLAG_ShellOwned) || !(dwFlags & RASEDFLAG_NewTunnelEntry)) { dwWizButtons |= PSWIZB_BACK; }
PropSheet_SetWizButtons( pInfo->hwndDlg, dwWizButtons ); fDisplayPage = TRUE; }
return fDisplayPage; }
//----------------------------------------------------------------------------
// Smart card wizard page
// Listed alphabetically following dialog proc
//----------------------------------------------------------------------------
INT_PTR CALLBACK ScDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam )
// DialogProc callback for the Smart Card page of the wizard.
// Parameters and return value are as described for standard windows
// 'DialogProc's.
//
{ switch (unMsg) { case WM_INITDIALOG: AeSetContext( hwnd, lparam ); return ScInit( hwnd );
case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AEINFO* pInfo; BOOL fDisplay;
TRACE("ScSETACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fDisplay = ScSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; }
case PSN_KILLACTIVE: { AEINFO* pInfo; BOOL fInvalid;
TRACE("MaKILLACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fInvalid = ScKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } }
return FALSE; }
BOOL ScInit( IN HWND hwndPage )
// Called on WM_INITDIALOG. 'hwndPage' is the handle of the property
// page.
//
// Return false if focus was set, true otherwise.
//
{ AEINFO* pInfo;
TRACE("ScInit");
pInfo = AeContext( hwndPage ); if (!pInfo) { return TRUE; }
//Smart card page is shown only for workplace path
//
if ( !AeIsWorkPlace(pInfo->pArgs->pApiArgs->dwFlags) ) { pInfo->fSmartCardInstalled = FALSE; pInfo->fUseSmartCard = FALSE;
return TRUE; } // Initialize page-specific context information.
//
pInfo->hwndSc = hwndPage; pInfo->hwndScRbYes = GetDlgItem ( hwndPage, CID_SC_RB_YesSmartCard ); pInfo->hwndScRbNo = GetDlgItem ( hwndPage, CID_SC_RB_NoSmartCard );
// Discover whether a smart card reader is installed. If so, default
// to not use it.
//
pInfo->fSmartCardInstalled = ScSmartCardReaderInstalled( pInfo ); pInfo->fUseSmartCard = FALSE;
return FALSE; }
BOOL ScKillActive( IN AEINFO* pInfo )
// Called when the smart card page is loosing activation. Records
// whether the use selected to use his/her smart card.
{ //Smart card page is shown only for workplace path
//
if ( !AeIsWorkPlace(pInfo->pArgs->pApiArgs->dwFlags) ) { return FALSE; }
pInfo->fUseSmartCard = ( SendMessage(pInfo->hwndScRbYes, BM_GETCHECK, 0, 0) == BST_CHECKED );
return FALSE; }
BOOL ScSetActive( IN AEINFO* pInfo )
// Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context.
//
// Returns true to display the page, false to skip it.
//
{ //Smart card page is shown only for workplace path
//
if ( !AeIsWorkPlace(pInfo->pArgs->pApiArgs->dwFlags) ) { return FALSE; }
// Initialize the "use smart card" check
SendMessage ( pInfo->hwndScRbYes, BM_SETCHECK, (pInfo->fUseSmartCard) ? BST_CHECKED : BST_UNCHECKED, 0);
// Initialize the "use smart card" check
SendMessage ( pInfo->hwndScRbNo, BM_SETCHECK, (pInfo->fUseSmartCard) ? BST_UNCHECKED : BST_CHECKED, 0);
// Only show the page when a smart card reader is installed
return pInfo->fSmartCardInstalled; }
BOOL ScSmartCardReaderInstalled( IN AEINFO* pInfo)
// Returns TRUE iff there is a smart card reader installed.
// Clone of FSmartCardReaderInstalled in ppp\eaptls\util.c
//
{ LONG lErr; DWORD dwLen = 0; SCARDCONTEXT hCtx = 0; BOOL fReturn = FALSE;
lErr = SCardListReadersA(0, NULL, NULL, &dwLen);
fReturn = ( (NO_ERROR == lErr) && (2 * sizeof(CHAR) < dwLen));
if (!fReturn) { goto LDone; }
fReturn = FALSE;
lErr = SCardEstablishContext(SCARD_SCOPE_USER, 0, 0, &hCtx);
if (SCARD_S_SUCCESS != lErr) { goto LDone; }
lErr = SCardListReadersA(hCtx, NULL, NULL, &dwLen);
fReturn = ( (NO_ERROR == lErr) && (2 * sizeof(CHAR) < dwLen));
LDone:
if (0 != hCtx) { SCardReleaseContext(hCtx); } return(fReturn); }
INT_PTR CALLBACK StDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam )
// DialogProc callback for the start page of the wizard. Parameters and
// return value are as described for standard windows 'DialogProc's.
//
{ switch (unMsg) { case WM_INITDIALOG: { AEINFO* pInfo = (AEINFO* )(((PROPSHEETPAGE* )lparam)->lParam); SetWindowLongPtr( hwnd, DWLP_USER, (ULONG_PTR )pInfo );
// Position the dialog per caller's instructions if we're not
// owned by the shell.
//
if (!(pInfo->pArgs->pApiArgs->dwFlags & RASEDFLAG_ShellOwned)) { PositionDlg( GetParent( hwnd ), pInfo->pArgs->pApiArgs->dwFlags & RASDDFLAG_PositionDlg, pInfo->pArgs->pApiArgs->xDlg, pInfo->pArgs->pApiArgs->yDlg ); }
return StInit( hwnd, pInfo ); }
case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AEINFO* pInfo; BOOL fDisplay;
TRACE("StSETACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fDisplay = StSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; }
case PSN_KILLACTIVE: { AEINFO* pInfo; BOOL fInvalid;
TRACE("StKILLACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fInvalid = StKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } }
return FALSE; }
BOOL StInit( IN HWND hwndPage, IN OUT AEINFO* pInfo )
// Called on WM_INITDIALOG. 'hwndPage' is the handle of the property
// page. 'pInfo' is the arguments from the PropertySheet caller.
//
// Return false if focus was set, true otherwise.
//
{ pInfo->hwndDlg = GetParent( hwndPage );
// Initialize the common controls library for the controls we use.
//
{ INITCOMMONCONTROLSEX icc; icc.dwSize = sizeof(icc); icc.dwICC = ICC_INTERNET_CLASSES; InitCommonControlsEx (&icc); }
return TRUE; }
BOOL StKillActive( IN AEINFO* 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 StSetActive( IN AEINFO* pInfo )
// Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context.
//
// Returns true to display the page, false to skip it.
//
{ return FALSE; }
//----------------------------------------------------------------------------
// Users property page
// Listed alphabetically following dialog proc
//----------------------------------------------------------------------------
INT_PTR CALLBACK UsDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam )
// DialogProc callback for the Users page of the wizard. Parameters and
// return value are as described for standard windows 'DialogProc's.
//
{ switch (unMsg) { case WM_INITDIALOG: AeSetContext( hwnd, lparam ); return UsInit( hwnd );
case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AEINFO* pInfo; BOOL fDisplay;
TRACE("UsSETACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fDisplay = UsSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; }
case PSN_KILLACTIVE: { AEINFO* pInfo; BOOL fInvalid;
TRACE("UsKILLACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fInvalid = UsKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } }
return FALSE; }
BOOL UsInit( IN HWND hwndPage )
// Called on WM_INITDIALOG. 'hwndPage' is the handle of the property
// page.
//
// Return false if focus was set, true otherwise.
//
{ AEINFO* pInfo;
TRACE("UsInit");
pInfo = AeContext( hwndPage ); if (!pInfo) return TRUE;
// Don't execute on personal (DT page in this case)
//
if (IsConsumerPlatform()) { //For consumer platform, personal or non-domain professional
//all connections are all-user
pInfo->fCreateForAllUsers = TRUE; return TRUE; } // Initialize page-specific context information.
//
pInfo->hwndUs = hwndPage; pInfo->hwndUsRbForAll = GetDlgItem( hwndPage, CID_US_RB_All ); pInfo->hwndUsRbForMe = GetDlgItem( hwndPage, CID_US_RB_Myself ); // If the user is an administrator or power user, we want the default
// to be to create the phone book entry for all users. This
// must correspond to how ReadPhonebookFile opens the default phonebook.
//
//For whistler bug 382795
//We let the VPN connection default to "My use only"
//
if ( RASEDFLAG_NewTunnelEntry & pInfo->pArgs->pApiArgs->dwFlags ) { pInfo->fCreateForAllUsers = FALSE; } else { pInfo->fCreateForAllUsers = pInfo->pArgs->fIsUserAdminOrPowerUser; }
return TRUE; }
BOOL UsKillActive( IN AEINFO* 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 fCreateForAllUsers;
// Don't execute on personal (DT page in this case)
//
if (IsConsumerPlatform()) { return FALSE; }
fCreateForAllUsers = Button_GetCheck( pInfo->hwndUsRbForAll );
// We need to (re)open the phonebook file corresponding to the selection.
// Only do this if the selection has changed, or we don't have the file
// open yet. We definitely need to have it open when this page is left
// because subsequent pages depend on it.
//
if ((fCreateForAllUsers != pInfo->fCreateForAllUsers) || !pInfo->pArgs->pFile || (fCreateForAllUsers != IsPublicPhonebook(pInfo->pArgs->pFile->pszPath))) {
pInfo->fCreateForAllUsers = fCreateForAllUsers;
// Close and re-open the phonebook file since the All Users flag has
// changed
ReOpenPhonebookFile(pInfo->fCreateForAllUsers, pInfo->pArgs->pFile);
}
return FALSE; }
BOOL UsSetActive( IN AEINFO* pInfo )
// Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context.
//
// Returns true to display the page, false to skip it.
//
{ // Don't execute on personal (DT page in this case)
//
if (IsConsumerPlatform()) { return FALSE; } if (pInfo->fDccHost) { return FALSE; }
// We don't give the option to create all-user connections to non-admins.
//
if (!pInfo->pArgs->fIsUserAdminOrPowerUser) { EnableWindow( pInfo->hwndUsRbForAll, FALSE );
//Change for whistler bug 283902 gangz
//
Button_SetCheck( pInfo->hwndUsRbForMe, TRUE);
}
// Set the radio buttons.
//
/*
//For whistler bug 382795
//We let the VPN connection default to "My use only"
//
if ( RASEDFLAG_NewTunnelEntry & pInfo->pArgs->pApiArgs->dwFlags ) { Button_SetCheck( pInfo->hwndUsRbForAll, FALSE); Button_SetCheck( pInfo->hwndUsRbForMe, TRUE ); } else */ { Button_SetCheck( pInfo->hwndUsRbForAll, pInfo->fCreateForAllUsers ); Button_SetCheck( pInfo->hwndUsRbForMe, !pInfo->fCreateForAllUsers ); }
PropSheet_SetWizButtons( pInfo->hwndDlg, PSWIZB_BACK | PSWIZB_NEXT ); return TRUE; }
//----------------------------------------------------------------------------
// Shared-access property page
// Listed alphabetically following dialog proc
//----------------------------------------------------------------------------
INT_PTR CALLBACK SwDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam )
// DialogProc callback for the Shared-access page of the wizard. Parameters
// and return value are as described for standard windows 'DialogProc's.
//
{ switch (unMsg) { case WM_INITDIALOG: AeSetContext( hwnd, lparam ); return SwInit( hwnd );
case WM_COMMAND: { AEINFO* pInfo = AeContext( hwnd ); ASSERT(pInfo);
return SwCommand( pInfo, HIWORD( wparam ), LOWORD( wparam ),(HWND )lparam ); }
case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AEINFO* pInfo; BOOL fDisplay;
TRACE("SwSETACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fDisplay = SwSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; }
case PSN_KILLACTIVE: { AEINFO* pInfo; BOOL fInvalid;
TRACE("SwKILLACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fInvalid = SwKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } }
return FALSE; }
BOOL SwCommand( IN AEINFO* 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( "SwCommand(n=%d,i=%d,c=$%x)", (DWORD )wNotification, (DWORD )wId, (ULONG_PTR )hwndCtrl );
switch (wId) { case CID_SW_PB_Shared: { BOOL fShared = Button_GetCheck( GetDlgItem(pInfo->hwndSw, CID_SW_PB_Shared) ); EnableWindow( GetDlgItem( pInfo->hwndSw, CID_SW_ST_DemandDial), fShared ); EnableWindow( GetDlgItem( pInfo->hwndSw, CID_SW_PB_DemandDial), fShared ); return TRUE; } }
return FALSE; }
BOOL SwInit( IN HWND hwndPage )
// Called on WM_INITDIALOG. 'hwndPage' is the handle of the property
// page.
//
// Return false if focus was set, true otherwise.
//
{ AEINFO* pInfo;
TRACE("SwInit");
pInfo = AeContext( hwndPage ); if (!pInfo) return TRUE;
// Initialize page-specific context information.
//
pInfo->hwndSw = hwndPage; Button_SetCheck( GetDlgItem(pInfo->hwndSw, CID_SW_PB_Shared), pInfo->pArgs->fShared ); Button_SetCheck( GetDlgItem(pInfo->hwndSw, CID_SW_PB_DemandDial), pInfo->pArgs->fDemandDial ); SwCommand( pInfo, BN_CLICKED, CID_SW_PB_Shared, GetDlgItem(pInfo->hwndSw, CID_SW_PB_Shared) );
return TRUE; }
BOOL SwKillActive( IN AEINFO* 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 (!pInfo->fCreateForAllUsers) { pInfo->pArgs->fNewShared = pInfo->pArgs->fShared; pInfo->pArgs->fNewDemandDial = pInfo->pArgs->fDemandDial; } else { pInfo->pArgs->fNewShared = Button_GetCheck( GetDlgItem(pInfo->hwndSw, CID_SW_PB_Shared) ); pInfo->pArgs->fNewDemandDial = Button_GetCheck( GetDlgItem(pInfo->hwndSw, CID_SW_PB_DemandDial) ); if (pInfo->pArgs->fNewShared) { UINT unId; MSGARGS msgargs; ZeroMemory( &msgargs, sizeof(msgargs) ); msgargs.dwFlags = MB_YESNO | MB_ICONINFORMATION; unId = MsgDlg( pInfo->hwndDlg, SID_EnableSharedAccess, &msgargs ); if (unId == IDNO) { pInfo->pArgs->fNewShared = pInfo->pArgs->fShared; pInfo->pArgs->fNewDemandDial = pInfo->pArgs->fDemandDial; return TRUE; } } } return FALSE; }
BOOL SwSetActive( IN AEINFO* pInfo )
// Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context.
//
// Returns true to display the page, false to skip it.
//
{ NT_PRODUCT_TYPE ProductType; ASSERT(pInfo); // skip the page if
// (a) this is a workstation installation
// (b) the user does not have administrative privileges
// (c) the connection is not for all users
// (d) TCP/IP is not configured
// (e) there is already a shared connection
// (f) there are no lan connections
//
RtlGetNtProductType(&ProductType); if (ProductType == NtProductWinNt || !pInfo->pArgs->fIsUserAdminOrPowerUser || !pInfo->fCreateForAllUsers || !pInfo->fIpConfigured || // pInfo->pArgs->fAnyShared ||
!pInfo->pArgs->dwLanCount ) { return FALSE; } else { EnableWindow( GetDlgItem( pInfo->hwndSw, CID_SW_ST_DemandDial ), pInfo->pArgs->fNewShared ); EnableWindow( GetDlgItem( pInfo->hwndSw, CID_SW_PB_DemandDial ), pInfo->pArgs->fNewShared ); return TRUE; } }
//----------------------------------------------------------------------------
// Shared private-lan property page
// Listed alphabetically following dialog proc
//----------------------------------------------------------------------------
INT_PTR CALLBACK SpDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam )
// DialogProc callback for the Shared private-lan page of the wizard.
// Parameters / and return value are as described for standard windows
// 'DialogProc's.
//
{ switch (unMsg) { case WM_INITDIALOG: AeSetContext( hwnd, lparam ); return SpInit( hwnd );
case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AEINFO* pInfo; BOOL fDisplay;
TRACE("SpSETACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fDisplay = SpSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; }
case PSN_KILLACTIVE: { AEINFO* pInfo; BOOL fInvalid;
TRACE("SpKILLACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fInvalid = SpKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; } }
return FALSE; }
BOOL SpInit( IN HWND hwndPage )
// Called on WM_INITDIALOG. 'hwndPage' is the handle of the property
// page.
//
// Return false if focus was set, true otherwise.
//
{ DWORD i; INT item; AEINFO* pInfo; NETCON_PROPERTIES* pLanTable;
TRACE("SpInit");
pInfo = AeContext( hwndPage ); if (!pInfo) return TRUE;
// Initialize page-specific context information.
//
pInfo->hwndSp = hwndPage; pInfo->hwndSpLbPrivateLan = GetDlgItem( hwndPage, CID_SP_LB_PrivateLan ); ASSERT( pInfo->hwndSpLbPrivateLan );
// Fill the drop-list with lan connections
//
/* pLanTable = (NETCON_PROPERTIES*)pInfo->pArgs->pLanTable;
for (i = 0; i < pInfo->pArgs->dwLanCount; i++) { item = ComboBox_AddString( pInfo->hwndSpLbPrivateLan, pLanTable[i].pszwName ); if (item != CB_ERR) { ComboBox_SetItemData( pInfo->hwndSpLbPrivateLan, item, &pLanTable[i].guidId ); } }*/
ComboBox_SetCurSel( pInfo->hwndSpLbPrivateLan, 0 );
return TRUE; }
BOOL SpKillActive( IN AEINFO* 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 (!pInfo->pArgs->fNewShared || (pInfo->pArgs->dwLanCount <= 1)) { pInfo->pArgs->pPrivateLanConnection = NULL; } else { INT item = ComboBox_GetCurSel( pInfo->hwndSpLbPrivateLan ); if (item != CB_ERR) { pInfo->pArgs->pPrivateLanConnection = (IHNetConnection*)ComboBox_GetItemData( pInfo->hwndSpLbPrivateLan, item ); } } return FALSE; }
BOOL SpSetActive( IN AEINFO* pInfo )
// Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context.
//
// Returns true to display the page, false to skip it.
//
{ ASSERT(pInfo); // skip the page if
// (a) sharing has not been enabled
// (b) there is less than or equal to one lan interface.
//
if (!pInfo->pArgs->fNewShared || (pInfo->pArgs->dwLanCount <= 1)) { return FALSE; } return TRUE; }
BOOL GhCommand( IN AEINFO* 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("GhCommand(n=%d,i=%d,c=$%x)", (DWORD)wNotification,(DWORD)wId,(ULONG_PTR )hwndCtrl);
switch (wId) { case CID_GH_RB_Host: { switch (wNotification) { case BN_CLICKED: { pInfo->fDccHost = TRUE; break; } } break; }
case CID_GH_RB_Guest: { switch (wNotification) { case BN_CLICKED: { pInfo->fDccHost = FALSE; break; } } break; } }
return FALSE; }
INT_PTR CALLBACK GhDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam )
// DialogProc callback for the Guest Host page of the Direct Connect wizard.
// Parameters and return value are as described for standard windows
// 'DialogProc's.
//
{ switch (unMsg) { case WM_INITDIALOG: AeSetContext( hwnd, lparam ); return GhInit( hwnd );
case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AEINFO* pInfo; BOOL fDisplay;
TRACE("GhSETACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fDisplay = GhSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; }
case PSN_KILLACTIVE: { AEINFO* pInfo; BOOL fInvalid;
TRACE("PaKILLACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fInvalid = GhKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; }
case WM_COMMAND: { AEINFO* pInfo = AeContext( hwnd ); ASSERT(pInfo);
return GhCommand( pInfo, HIWORD( wparam ), LOWORD( wparam ), (HWND )lparam ); } }
return FALSE; }
BOOL GhInit( IN HWND hwndPage )
// Called on WM_INITDIALOG. 'hwndPage' is the handle of the property
// page.
//
// Return false if focus was set, true otherwise.
//
{ AEINFO* pInfo; HWND hwndHost = GetDlgItem( hwndPage, CID_GH_RB_Host ); HWND hwndGuest = GetDlgItem( hwndPage, CID_GH_RB_Guest );
TRACE("GhInit");
// Initialize page-specific context information.
//
pInfo = AeContext( hwndPage ); if (!pInfo) return TRUE;
pInfo->hwndGh = hwndPage;
// If the user is an admin or power user, then enable the
// host control and set focus to it
//
if (pInfo->pArgs->fIsUserAdminOrPowerUser) { pInfo->fDccHost = TRUE; SetFocus(hwndHost); }
// Otherwise, this page will be skipped
//
else { pInfo->fDccHost = FALSE; EnableWindow(hwndHost, FALSE); SetFocus(hwndGuest); }
SendMessage ( hwndHost, BM_SETCHECK, (pInfo->fDccHost) ? BST_CHECKED : BST_UNCHECKED, 0);
SendMessage ( hwndGuest, BM_SETCHECK, (!pInfo->fDccHost) ? BST_CHECKED : BST_UNCHECKED, 0);
return FALSE; }
BOOL GhKillActive( IN AEINFO* pInfo )
// Called when PSN_KILLACTIVE is received. 'PInfo' is the wizard context.
//
// Returns true if the page is invalid, false if it can be dismissed.
//
{ // Show the ras-server specific pages according to whether
// host was selected. Show the ras client pages accordingly.
RassrvShowWizPages (pInfo->pvDccHostContext, pInfo->fDccHost);
return FALSE; }
BOOL GhSetActive( IN AEINFO* pInfo )
// Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context.
//
// Returns true to display the page, false to skip it.
//
{ LPARAM dwWizButtons = PSWIZB_NEXT;
// If we're not an admin, only the guest path
// is available.
//
if (! pInfo->pArgs->fIsUserAdminOrPowerUser) { pInfo->fDccHost = FALSE; }
if (pInfo->pArgs->pApiArgs->dwFlags & RASEDFLAG_ShellOwned) { dwWizButtons |= PSWIZB_BACK; }
PropSheet_SetWizButtons( pInfo->hwndDlg, dwWizButtons ); return TRUE; }
DWORD DnUpdateSelectedDevice( IN AEINFO* pInfo, IN HWND hwndLv)
// Called to a handle the fact that a device has changed
// in the direct connect wizard.
{
DTLLIST* pList = NULL; DTLNODE* pNode = NULL, *pNode2 = NULL; PBLINK * pLink = NULL;
// pmay: 372661
//
// Validate the connection type so that the right logic is
// applied.
//
if (pInfo->pArgs->pEntry->dwType != RASET_Direct) { return NO_ERROR; }
pList = pInfo->pArgs->pEntry->pdtllistLinks;
// Get node from current selection
pNode = (DTLNODE* )ComboBox_GetItemDataPtr( hwndLv, ComboBox_GetCurSel( hwndLv ) );
if(NULL == pNode) { return NO_ERROR; }
// Remove selected item from list of links
// and disable all other links
DtlRemoveNode ( pList, pNode );
for (pNode2 = DtlGetFirstNode (pList); pNode2; pNode2 = DtlGetNextNode (pNode2)) { pLink = (PBLINK* )DtlGetData( pNode2 ); pLink->fEnabled = FALSE; }
// Enable selected device and Re-add
// in list of links at front
pLink = (PBLINK* )DtlGetData( pNode ); pLink->fEnabled = TRUE; DtlAddNodeFirst( pList, pNode );
return NO_ERROR; }
BOOL DnCommand( IN AEINFO* 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("DnCommand(n=%d,i=%d,c=$%x)", (DWORD)wNotification,(DWORD)wId,(ULONG_PTR )hwndCtrl);
switch (wNotification) { case CBN_SELCHANGE: if (wId == CID_DN_CB_DeviceSelect) DnUpdateSelectedDevice(pInfo, hwndCtrl); break; }
return FALSE; }
INT_PTR CALLBACK DnDlgProc( IN HWND hwnd, IN UINT unMsg, IN WPARAM wparam, IN LPARAM lparam )
// DialogProc callback for the direct connect device page of the Direct Connect wizard.
// Parameters and return value are as described for standard windows
// 'DialogProc's.
//
{ switch (unMsg) { case WM_INITDIALOG: AeSetContext( hwnd, lparam ); return DnInit( hwnd );
case WM_NOTIFY: { switch (((NMHDR* )lparam)->code) { case PSN_SETACTIVE: { AEINFO* pInfo; BOOL fDisplay;
TRACE("GhSETACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fDisplay = DnSetActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, (fDisplay) ? 0 : -1 ); return TRUE; }
case PSN_KILLACTIVE: { AEINFO* pInfo; BOOL fInvalid;
TRACE("PaKILLACTIVE"); pInfo = AeContext( hwnd ); ASSERT(pInfo); fInvalid = DnKillActive( pInfo ); SetWindowLong( hwnd, DWLP_MSGRESULT, fInvalid ); return TRUE; } } break; }
case WM_COMMAND: { AEINFO* pInfo = AeContext( hwnd ); ASSERT(pInfo);
return DnCommand( pInfo, HIWORD( wparam ), LOWORD( wparam ), (HWND )lparam ); } }
return FALSE; }
BOOL DnInit( IN HWND hwndPage )
// Called on WM_INITDIALOG. 'hwndPage' is the handle of the property
// page.
//
// Return false if focus was set, true otherwise.
//
{ AEINFO* pInfo; HWND hwndCb = GetDlgItem( hwndPage, CID_DN_CB_DeviceSelect );
TRACE("DnInit");
// Initialize page-specific context information.
//
pInfo = AeContext( hwndPage ); if (!pInfo) return TRUE;
pInfo->hwndDn = hwndPage;
// Fill the dropdown list of devices and select the first item.
//
{ TCHAR* psz; DTLNODE* pNode; INT iItem;
iItem = 1; for (pNode = DtlGetFirstNode( pInfo->pArgs->pEntry->pdtllistLinks ); pNode; pNode = DtlGetNextNode( pNode )) { PBLINK* pLink; DWORD dwImage;
pLink = (PBLINK* )DtlGetData( pNode ); ASSERT(pLink);
psz = DisplayPszFromPpbport( &pLink->pbport, &dwImage ); if (psz) { PBLINK* pLink;
pLink = (PBLINK* )DtlGetData( pNode ); ComboBox_AddItem( hwndCb, psz, pNode ); Free( psz ); } } ComboBox_SetCurSelNotify(hwndCb, 0); }
SetFocus( hwndCb );
return FALSE; }
BOOL DnKillActive( IN AEINFO* pInfo )
// Called when PSN_KILLACTIVE is received. 'PInfo' is the wizard context.
//
// Returns true if the page is invalid, false if it can be dismissed.
//
{ return FALSE; }
BOOL DnSetActive( IN AEINFO* pInfo )
// Called when PSN_SETACTIVE is received. 'PInfo' is the wizard context.
//
// Returns true to display the page, false to skip it.
//
{ LPARAM dwWizButtons = PSWIZB_NEXT; DWORD dwFlags = pInfo->pArgs->pApiArgs->dwFlags;
PBENTRY* pEntry = pInfo->pArgs->pEntry;
// If the "guest" option of the dcc client wasn't selected,
// don't allow this page to show.
if ((pInfo->fDccHost) || (RASET_Direct != pEntry->dwType)) { return FALSE; }
// Show the back button if we're shell owned or, we have the
// La page before us.
//
if ((dwFlags & RASEDFLAG_ShellOwned) || !(dwFlags & RASEDFLAG_NewDirectEntry) || !pInfo->fSkipMa) { dwWizButtons |= PSWIZB_BACK; }
PropSheet_SetWizButtons( pInfo->hwndDlg, dwWizButtons ); return TRUE; }
|