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