|
|
///////////////////////////////////////////////////////////////////////
// Microsoft Windows //
// Copyright(c) Microsoft Corp., 1995 //
///////////////////////////////////////////////////////////////////////
//
// CONNECTN.C - "Connection" Property Sheet
//
// HISTORY:
//
// 6/22/96 t-gpease moved to this file
//
#include "inetcplp.h"
#include <inetcpl.h>
#include <rasdlg.h>
#include <mluisupp.h>
HINSTANCE hInstRNADll = NULL; DWORD dwRNARefCount = 0; BOOL g_fWin95 = TRUE; BOOL g_fMillennium = FALSE; BOOL g_fWin2K = FALSE;
static const TCHAR g_szSensPath[] = TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Webcheck");
// clsids used to jit in features
static const CLSID clsidFeatureICW = { // {5A8D6EE0-3E18-11D0-821E-444553540000}
0x5A8D6EE0, 0x3E18, 0x11D0, {0x82, 0x1E, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}};
static const CLSID clsidFeatureMobile = { // {3af36230-a269-11d1-b5bf-0000f8051515}
0x3af36230, 0xa269, 0x11d1, {0xb5, 0xbf, 0x00, 0x00, 0xf8, 0x05, 0x15, 0x15}};
// RNA api function names
static const CHAR szRasEditPhonebookEntryA[] = "RasEditPhonebookEntryA"; static const CHAR szRasEditPhonebookEntryW[] = "RasEditPhonebookEntryW"; static const CHAR szRasEnumEntriesA[] = "RasEnumEntriesA"; static const CHAR szRasEnumEntriesW[] = "RasEnumEntriesW"; static const CHAR szRasDeleteEntryA[] = "RasDeleteEntryA"; static const CHAR szRasDeleteEntryW[] = "RasDeleteEntryW"; static const CHAR szRasGetEntryDialParamsA[] = "RasGetEntryDialParamsA"; static const CHAR szRasGetEntryDialParamsW[] = "RasGetEntryDialParamsW"; static const CHAR szRasSetEntryDialParamsA[] = "RasSetEntryDialParamsA"; static const CHAR szRasSetEntryDialParamsW[] = "RasSetEntryDialParamsW"; static const CHAR szRasCreatePhonebookEntryA[] = "RasCreatePhonebookEntryA"; static const CHAR szRasGetEntryPropertiesW[] = "RasGetEntryPropertiesW"; static const CHAR szRnaActivateEngine[] = "RnaActivateEngine"; static const CHAR szRnaDeactivateEngine[] = "RnaDeactivateEngine"; static const CHAR szRnaDeleteEntry[] = "RnaDeleteConnEntry";
RASEDITPHONEBOOKENTRYA lpRasEditPhonebookEntryA = NULL; RASEDITPHONEBOOKENTRYW lpRasEditPhonebookEntryW = NULL; RASENUMENTRIESA lpRasEnumEntriesA = NULL; RASENUMENTRIESW lpRasEnumEntriesW = NULL; RASDELETEENTRYA lpRasDeleteEntryA = NULL; RASDELETEENTRYW lpRasDeleteEntryW = NULL; RASGETENTRYDIALPARAMSA lpRasGetEntryDialParamsA = NULL; RASGETENTRYDIALPARAMSW lpRasGetEntryDialParamsW = NULL; RASSETENTRYDIALPARAMSA lpRasSetEntryDialParamsA = NULL; RASSETENTRYDIALPARAMSW lpRasSetEntryDialParamsW = NULL; RASCREATEPHONEBOOKENTRYA lpRasCreatePhonebookEntryA = NULL; RASGETENTRYPROPERTIESW lpRasGetEntryPropertiesW = NULL; RNAACTIVATEENGINE lpRnaActivateEngine = NULL; RNADEACTIVATEENGINE lpRnaDeactivateEngine = NULL; RNADELETEENTRY lpRnaDeleteEntry = NULL;
#define NUM_RNAAPI_PROCS 15
APIFCN RasApiList[NUM_RNAAPI_PROCS] = { { (PVOID *) &lpRasEditPhonebookEntryA, szRasEditPhonebookEntryA}, { (PVOID *) &lpRasEditPhonebookEntryW, szRasEditPhonebookEntryW}, { (PVOID *) &lpRasEnumEntriesA, szRasEnumEntriesA}, { (PVOID *) &lpRasEnumEntriesW, szRasEnumEntriesW}, { (PVOID *) &lpRasGetEntryDialParamsA, szRasGetEntryDialParamsA}, { (PVOID *) &lpRasGetEntryDialParamsW, szRasGetEntryDialParamsW}, { (PVOID *) &lpRasSetEntryDialParamsA, szRasSetEntryDialParamsA}, { (PVOID *) &lpRasSetEntryDialParamsW, szRasSetEntryDialParamsW}, { (PVOID *) &lpRasDeleteEntryA, szRasDeleteEntryA}, { (PVOID *) &lpRasDeleteEntryW, szRasDeleteEntryW}, { (PVOID *) &lpRasCreatePhonebookEntryA, szRasCreatePhonebookEntryA}, { (PVOID *) &lpRasGetEntryPropertiesW, szRasGetEntryPropertiesW}, { (PVOID *) &lpRnaActivateEngine, szRnaActivateEngine}, { (PVOID *) &lpRnaDeactivateEngine, szRnaDeactivateEngine}, { (PVOID *) &lpRnaDeleteEntry, szRnaDeleteEntry} };
//
// Connection dialog needs info
//
typedef struct _conninfo {
HTREEITEM hDefault; TCHAR szEntryName[RAS_MaxEntryName+1];
} CONNINFO, *PCONNINFO;
//
// dial dialog needs some info asssociated with its window
//
typedef struct _dialinfo {
PROXYINFO proxy; // manual proxy info
BOOL fClickedAutodetect; // did the user actually click autodetect?
LPTSTR pszConnectoid; #ifdef UNIX
TCHAR szEntryName[RAS_MaxEntryName+1]; #endif
} DIALINFO, *PDIALINFO;
//
// Private Functions
//
BOOL ConnectionDlgInit(HWND hDlg, PCONNINFO pConn); BOOL ConnectionDlgOK(HWND hDlg, PCONNINFO pConn); VOID EnableConnectionControls(HWND hDlg, PCONNINFO pConn, BOOL fSetText); BOOL LoadRNADll(VOID); VOID UnloadRNADll(VOID); DWORD PopulateRasEntries(HWND hDlg, PCONNINFO pConn); BOOL MakeNewConnectoid(HWND hDlg, PCONNINFO pConn); BOOL EditConnectoid(HWND hDlg); VOID FixAutodialSettings(HWND hDlg, PCONNINFO pConn);
INT_PTR CALLBACK DialupDlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam); INT_PTR CALLBACK AdvDialupDlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam); INT_PTR CALLBACK AdvAutocnfgDlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam);
// Handy stuff for looking at proxy exceptions (from proxysup.cpp)
BOOL RemoveLocalFromExceptionList(IN LPTSTR lpszExceptionList);
extern const TCHAR cszLocalString[];
// defines for tree view image list
#define BITMAP_WIDTH 16
#define BITMAP_HEIGHT 16
#define CONN_BITMAPS 2
#define IMAGE_LAN 0
#define IMAGE_MODEM 1
void GetConnKey(LPTSTR pszConn, LPTSTR pszBuffer, int iBuffLen) { if(NULL == pszConn || 0 == *pszConn) { // use lan reg location
StrCpyN(pszBuffer, REGSTR_PATH_INTERNET_LAN_SETTINGS, iBuffLen); } else { // use connectoid reg location
wnsprintf(pszBuffer, iBuffLen, TEXT("%s\\Profile\\%s"), REGSTR_PATH_REMOTEACCESS, pszConn); } }
/////////////////////////////////////////////////////////////////////////////
//
// JitFeature - decide if a feature is present, not present but
// jitable, or not present and not jitable. Actually JIT it
// in if requested
//
/////////////////////////////////////////////////////////////////////////////
#define JIT_PRESENT 0 // Installed
#define JIT_AVAILABLE 1 // Can be JIT'ed
#define JIT_NOT_AVAILABLE 2 // You're in trouble - can't be JIT'ed
DWORD JitFeature(HWND hwnd, REFCLSID clsidFeature, BOOL fCheckOnly) { HRESULT hr = REGDB_E_CLASSNOTREG; uCLSSPEC classpec; DWORD dwFlags = 0;
// figure out struct and flags
classpec.tyspec = TYSPEC_CLSID; classpec.tagged_union.clsid = clsidFeature;
if(fCheckOnly) dwFlags = FIEF_FLAG_PEEK;
//
// since we only come to install of JIT features
// only via a UI code path in inetcpl, we want to
// simply ignore any previous UI action
//
dwFlags |= FIEF_FLAG_FORCE_JITUI; // call jit code
hr = FaultInIEFeature(hwnd, &classpec, NULL, dwFlags);
if(S_OK == hr) { // feature present
return JIT_PRESENT; }
if(S_FALSE == hr || E_ACCESSDENIED == hr) { // jit doesn't know about this feature. Assume it's present.
return JIT_PRESENT; }
if(HRESULT_FROM_WIN32(ERROR_CANCELLED) == hr) { // user didn't want it - may try again sometime, however
return JIT_AVAILABLE; }
if(fCheckOnly) { if(HRESULT_FROM_WIN32(ERROR_PRODUCT_UNINSTALLED) == hr) { // not present but can get it
return JIT_AVAILABLE; } }
//
// Actually tried to get it but didn't - return not available
//
return JIT_NOT_AVAILABLE; }
/////////////////////////////////////////////////////////////////////////////
//
// RasEnumHelp
//
// Abstract grusome details of getting a correct enumeration of entries
// from RAS. Works on all 9x and NT platforms correctly, maintaining unicode
// whenever possible.
//
/////////////////////////////////////////////////////////////////////////////
class RasEnumHelp { private: //
// Win2k version of RASENTRYNAMEW struct
//
#define W2KRASENTRYNAMEW struct tagW2KRASENTRYNAMEW
W2KRASENTRYNAMEW { DWORD dwSize; WCHAR szEntryName[ RAS_MaxEntryName + 1 ]; DWORD dwFlags; WCHAR szPhonebookPath[MAX_PATH + 1]; }; #define LPW2KRASENTRYNAMEW W2KRASENTRYNAMEW*
//
// Possible ways we got info from RAS
//
typedef enum { ENUM_MULTIBYTE, // Win9x
ENUM_UNICODE, // NT4
ENUM_WIN2K // Win2K
} ENUM_TYPE;
//
// How we got the info
//
ENUM_TYPE _EnumType;
//
// Any error we got during enumeration
//
DWORD _dwLastError;
//
// Number of entries we got
//
DWORD _dwEntries;
//
// Pointer to info retrieved from RAS
//
RASENTRYNAMEA * _preList;
//
// Last entry returned as multibyte or unicode when conversion required
//
WCHAR _szCurrentEntryW[RAS_MaxEntryName + 1];
public: RasEnumHelp(); ~RasEnumHelp();
DWORD GetError(); DWORD GetEntryCount(); LPWSTR GetEntryW(DWORD dwEntry); };
RasEnumHelp::RasEnumHelp() { DWORD dwBufSize, dwStructSize; OSVERSIONINFO ver;
// init
_dwEntries = 0; _dwLastError = 0;
// figure out which kind of enumeration we're doing - start with multibyte
_EnumType = ENUM_MULTIBYTE; dwStructSize = sizeof(RASENTRYNAMEA);
ver.dwOSVersionInfoSize = sizeof(ver); if(GetVersionEx(&ver)) { if(VER_PLATFORM_WIN32_NT == ver.dwPlatformId) { _EnumType = ENUM_UNICODE; dwStructSize = sizeof(RASENTRYNAMEW);
if(ver.dwMajorVersion >= 5) { _EnumType = ENUM_WIN2K; dwStructSize = sizeof(W2KRASENTRYNAMEW); } } }
// allocate space for 16 entries
dwBufSize = 16 * dwStructSize; _preList = (LPRASENTRYNAMEA)GlobalAlloc(LMEM_FIXED, dwBufSize); if(_preList) { do { // set up list
_preList[0].dwSize = dwStructSize;
// call ras to enumerate
_dwLastError = ERROR_UNKNOWN; if(ENUM_MULTIBYTE == _EnumType) { if(lpRasEnumEntriesA) { _dwLastError = lpRasEnumEntriesA( NULL, NULL, (LPRASENTRYNAMEA)_preList, &dwBufSize, &_dwEntries ); } } else { if(lpRasEnumEntriesW) { _dwLastError = lpRasEnumEntriesW( NULL, NULL, (LPRASENTRYNAMEW)_preList, &dwBufSize, &_dwEntries ); } } // reallocate buffer if necessary
if(ERROR_BUFFER_TOO_SMALL == _dwLastError) { GlobalFree(_preList); _preList = (LPRASENTRYNAMEA)GlobalAlloc(LMEM_FIXED, dwBufSize); if(NULL == _preList) { _dwLastError = ERROR_NOT_ENOUGH_MEMORY; break; } } else { break; }
} while(TRUE); } else { _dwLastError = ERROR_NOT_ENOUGH_MEMORY; }
if(_preList && (ERROR_SUCCESS != _dwLastError)) { GlobalFree(_preList); _preList = NULL; _dwEntries = 0; }
return; }
RasEnumHelp::~RasEnumHelp() { if(_preList) { GlobalFree(_preList); } }
DWORD RasEnumHelp::GetError() { return _dwLastError; }
DWORD RasEnumHelp::GetEntryCount() { return _dwEntries; }
LPWSTR RasEnumHelp::GetEntryW( DWORD dwEntryNum ) { LPWSTR pwszName = NULL;
if(dwEntryNum >= _dwEntries) { return NULL; }
switch(_EnumType) { case ENUM_MULTIBYTE: MultiByteToWideChar(CP_ACP, 0, _preList[dwEntryNum].szEntryName, -1, _szCurrentEntryW, RAS_MaxEntryName + 1); pwszName = _szCurrentEntryW; break; case ENUM_UNICODE: { LPRASENTRYNAMEW lpTemp = (LPRASENTRYNAMEW)_preList; pwszName = lpTemp[dwEntryNum].szEntryName; break; } case ENUM_WIN2K: { LPW2KRASENTRYNAMEW lpTemp = (LPW2KRASENTRYNAMEW)_preList; pwszName = lpTemp[dwEntryNum].szEntryName; break; } }
return pwszName; }
/////////////////////////////////////////////////////////////////////////////
//
// NAME: MakeNewConnectoid
//
// SYNOPSIS: Launches RNA new connectoid wizard; selects newly
// created connectoid (if any) in combo box
//
/////////////////////////////////////////////////////////////////////////////
typedef BOOL (*PFRED)(LPTSTR, LPTSTR, LPRASENTRYDLG);
BOOL MakeNewConnectoid(HWND hDlg, PCONNINFO pConn) { BOOL fRet = FALSE, fDone = FALSE; DWORD dwRes = 0;
ASSERT(lpRasCreatePhonebookEntryA);
if(FALSE == g_fWin95) { // on NT, use RasEntryDlg so we know who we created and can edit
// proxy info for that connectoid
HMODULE hRasDlg = LoadLibrary(TEXT("rasdlg.dll")); if(hRasDlg) { #ifdef UNICODE
PFRED pfred = (PFRED)GetProcAddress(hRasDlg, "RasEntryDlgW"); #else
PFRED pfred = (PFRED)GetProcAddress(hRasDlg, "RasEntryDlgA"); #endif
if(pfred) { RASENTRYDLG info;
memset(&info, 0, sizeof(RASENTRYDLG)); info.dwSize = sizeof(RASENTRYDLG); info.hwndOwner = hDlg; info.dwFlags = RASEDFLAG_NewEntry;
dwRes = (pfred)(NULL, NULL, &info); if(dwRes) { DialogBoxParam(MLGetHinst(), MAKEINTRESOURCE(IDD_DIALUP), hDlg, DialupDlgProc, (LPARAM)info.szEntry); dwRes = ERROR_SUCCESS;
// save name as default
lstrcpyn(pConn->szEntryName, info.szEntry, RAS_MaxEntryName); } else { dwRes = info.dwError; } fDone = TRUE; }
FreeLibrary(hRasDlg); } }
if(FALSE == fDone) { // on win95, show the ui to make new entry
if(lpRasCreatePhonebookEntryA) { dwRes = (lpRasCreatePhonebookEntryA)(hDlg,NULL); }
// if we're on millennium, refresh default
if(g_fMillennium) { FixAutodialSettings(hDlg, pConn); } }
if(ERROR_SUCCESS == dwRes) { // make sure dial default is turned on. If this is NT, default entry
// is set above to new entry.
if(IsDlgButtonChecked(hDlg, IDC_DIALUP_NEVER)) { CheckRadioButton(hDlg, IDC_DIALUP_NEVER, IDC_DIALUP, IDC_DIALUP); } PopulateRasEntries(hDlg, pConn); EnableConnectionControls(hDlg, pConn, FALSE); fRet = TRUE; }
return fRet; }
///////////////////////////////////////////////////////////////////////////
//
// NAME: PopulateRasEntries
//
// ENTRY: hwndDlg - dlg box window handle
//
// SYNOPSIS: Fills specified combo box with list of existing RNA
// connectoids
//
///////////////////////////////////////////////////////////////////////////
#define DEF_ENTRY_BUF_SIZE 8192
DWORD PopulateRasEntries(HWND hDlg, PCONNINFO pConn) { HWND hwndTree = GetDlgItem(hDlg, IDC_CONN_LIST); DWORD i; DWORD dwBufSize = 16 * sizeof(RASENTRYNAMEA); DWORD dwEntries = 0; TVITEM tvi; TVINSERTSTRUCT tvins; HTREEITEM hFirst = NULL;
ASSERT(hwndTree);
// init tvi and tvins
tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; tvi.lParam = 0; tvins.hInsertAfter = (HTREEITEM)TVI_SORT; tvins.hParent = TVI_ROOT;
// clear list
TreeView_DeleteAllItems(hwndTree);
// any old htree is now bogus - we'll get a new one
pConn->hDefault = NULL;
// enumerate
RasEnumHelp reh;
if(ERROR_SUCCESS == reh.GetError()) { TCHAR szTemp[RAS_MaxEntryName + 64]; BOOL fDefault, fFoundDefault = FALSE; LPTSTR pszEntryName;
// insert connectoid names from buffer into combo box
for(i=0; i<reh.GetEntryCount(); i++) { pszEntryName = reh.GetEntryW(i); fDefault = FALSE;
// if there's only one entry, force it to be the default
if(1 == dwEntries) { StrCpyN(pConn->szEntryName, pszEntryName, RAS_MaxEntryName); }
if(*pConn->szEntryName && 0 == StrCmp(pszEntryName, pConn->szEntryName)) { // this is the default entry - stick it in the default
// text control and append (Default) to it
SetWindowText(GetDlgItem(hDlg, IDC_DIAL_DEF_ISP), pConn->szEntryName); StrCpyN(szTemp, pszEntryName, RAS_MaxEntryName); MLLoadString(IDS_DEFAULT_TEXT, szTemp + lstrlen(szTemp), 64); tvi.pszText = szTemp; fDefault = TRUE; fFoundDefault = TRUE; } else { tvi.pszText = pszEntryName; } tvi.iImage = IMAGE_MODEM; tvi.iSelectedImage = IMAGE_MODEM; tvi.lParam = i; tvins.item = tvi; HTREEITEM hItem = TreeView_InsertItem(hwndTree, &tvins); if(NULL == hFirst) hFirst = hItem; if(fDefault) pConn->hDefault = hItem; }
// if we didn't match our default with a connectoid, kill it
if(FALSE == fFoundDefault) { *pConn->szEntryName = 0; MLLoadString(IDS_NONE, szTemp, 64); SetWindowText(GetDlgItem(hDlg, IDC_DIAL_DEF_ISP), szTemp); } }
// select default or first entry if there is one
if(pConn->hDefault) { TreeView_Select(hwndTree, pConn->hDefault, TVGN_CARET); } else if(hFirst) { TreeView_Select(hwndTree, hFirst, TVGN_CARET); }
return reh.GetEntryCount(); }
void PopulateProxyControls(HWND hDlg, LPPROXYINFO pInfo, BOOL fSetText) { BOOL fManual = FALSE, fScript = FALSE, fDisable, fTemp;
// decide if everything is disabled
fDisable = IsDlgButtonChecked(hDlg, IDC_DONT_USE_CONNECTION);
//
// disable proxy enable check box if proxy restricted
//
fTemp = fDisable || g_restrict.fProxy; EnableDlgItem(hDlg, IDC_MANUAL, !fTemp); if(FALSE == g_restrict.fProxy) { fManual = !fDisable && pInfo->fEnable; }
//
// Disable autoconfig if restricted
//
fScript = !fDisable && IsDlgButtonChecked(hDlg, IDC_CONFIGSCRIPT);
fTemp = fDisable || g_restrict.fAutoConfig; EnableDlgItem(hDlg, IDC_CONFIGSCRIPT, !fTemp); EnableDlgItem(hDlg, IDC_AUTODISCOVER, !fTemp); if(fTemp) { fScript = FALSE; }
// enable config script controls
EnableDlgItem(hDlg, IDC_CONFIG_ADDR, fScript); EnableDlgItem(hDlg, IDC_CONFIGADDR_TX, fScript); EnableDlgItem(hDlg, IDC_AUTOCNFG_ADVANCED, fScript);
// Button is always on and omit local addresses is available if proxy is checked
EnableDlgItem(hDlg, IDC_PROXY_ADVANCED, fManual); EnableDlgItem(hDlg, IDC_PROXY_OMIT_LOCAL_ADDRESSES, fManual);
// Enable dial controls as necessary
EnableDlgItem(hDlg, IDC_USER, !fDisable && !pInfo->fCustomHandler); EnableDlgItem(hDlg, IDC_PASSWORD, !fDisable && !pInfo->fCustomHandler); EnableDlgItem(hDlg, IDC_DOMAIN, !fDisable && !pInfo->fCustomHandler); EnableDlgItem(hDlg, IDC_TX_USER, !fDisable && !pInfo->fCustomHandler); EnableDlgItem(hDlg, IDC_TX_PASSWORD, !fDisable && !pInfo->fCustomHandler); EnableDlgItem(hDlg, IDC_TX_DOMAIN, !fDisable && !pInfo->fCustomHandler); EnableDlgItem(hDlg, IDC_RAS_SETTINGS, !fDisable); EnableDlgItem(hDlg, IDC_DIAL_ADVANCED, !fDisable && !pInfo->fCustomHandler);
// settings changed in here are enabled/disabled based on the actual proxy settings
if(StrChr(pInfo->szProxy, TEXT('='))) { // different servers for each - disable fields on this dialog
fManual = FALSE; if (fSetText) { SetWindowText(GetDlgItem(hDlg, IDC_PROXY_ADDR), TEXT("")); SetWindowText(GetDlgItem(hDlg, IDC_PROXY_PORT), TEXT("")); } } else if (fSetText) { TCHAR *pszColon, *pszColon2; //Is there a : in the proxy string ?
pszColon = StrChr(pInfo->szProxy, TEXT(':')); if(pszColon) { //Yes, Find if we have another ':'
pszColon2 = StrChr(pszColon + 1, TEXT(':')); if(pszColon2) { //Yes, so we have strig like http://itgproxy:80
pszColon = pszColon2; SetWindowText(GetDlgItem(hDlg, IDC_PROXY_PORT), pszColon + 1); *pszColon = 0; } else { //No, We dont have a second ':'
int ilength = (int) (pszColon - pInfo->szProxy); //Are there atleast two characters left beyond the first ':'
if (lstrlen(pInfo->szProxy) - ilength >= 2 ) { //Yes, Are Those characters equal //
if((pInfo->szProxy[++ilength] == TEXT('/')) && (pInfo->szProxy[++ilength] == TEXT('/'))) { //Yes then we have string like http://itgproxy
//make the whole thing as the server and make port fiel empty
SetWindowText(GetDlgItem(hDlg, IDC_PROXY_PORT), TEXT("")); } else { //No, so we have string like itgproxy:80.
SetWindowText(GetDlgItem(hDlg, IDC_PROXY_PORT), pszColon + 1); *pszColon = 0; } } else { //No We dont have atleast two character so lets parse this as server and port
// Assuming this strign to be something like itgproxy:8
SetWindowText(GetDlgItem(hDlg, IDC_PROXY_PORT), pszColon + 1); *pszColon = 0; }
} } else { //No we dont have a : so treat the string as just the proxy server.
//Case itgproxy
SetWindowText(GetDlgItem(hDlg, IDC_PROXY_PORT), TEXT("")); } SetWindowText(GetDlgItem(hDlg, IDC_PROXY_ADDR), pInfo->szProxy); }
EnableDlgItem(hDlg, IDC_ADDRESS_TEXT, fManual); EnableDlgItem(hDlg, IDC_PORT_TEXT, fManual); EnableDlgItem(hDlg, IDC_PROXY_ADDR, fManual); EnableDlgItem(hDlg, IDC_PROXY_PORT, fManual); }
void GetProxyInfo(HWND hDlg, PDIALINFO pDI) { pDI->proxy.fEnable = IsDlgButtonChecked(hDlg, IDC_MANUAL);
if(NULL == StrChr(pDI->proxy.szProxy, TEXT('='))) { //
// not per-protocol, so read edit boxes
//
TCHAR szProxy[MAX_URL_STRING]; TCHAR szPort[INTERNET_MAX_PORT_NUMBER_LENGTH + 1];
GetWindowText(GetDlgItem(hDlg, IDC_PROXY_ADDR), szProxy, ARRAYSIZE(szProxy) ); GetWindowText(GetDlgItem(hDlg, IDC_PROXY_PORT), szPort, ARRAYSIZE(szPort) );
// if we got a proxy and a port, combine in to one string
if(*szProxy && *szPort) wnsprintf(pDI->proxy.szProxy, ARRAYSIZE(pDI->proxy.szProxy), TEXT("%s:%s"), szProxy, szPort); else StrCpyN(pDI->proxy.szProxy, szProxy, ARRAYSIZE(pDI->proxy.szProxy)); }
//
// fix manual settings override
//
pDI->proxy.fOverrideLocal = IsDlgButtonChecked(hDlg, IDC_PROXY_OMIT_LOCAL_ADDRESSES);
if(pDI->proxy.fOverrideLocal) { RemoveLocalFromExceptionList(pDI->proxy.szOverride); if(*pDI->proxy.szOverride) wnsprintf(pDI->proxy.szOverride, ARRAYSIZE(pDI->proxy.szOverride), TEXT("%s;%s"), pDI->proxy.szOverride, cszLocalString); else StrCpyN(pDI->proxy.szOverride, cszLocalString, ARRAYSIZE(pDI->proxy.szOverride)); } }
//////////////////////////////////////////////////////////////////////
//
// NAME: DeleteRasEntry
//
// SYNOPSIS: Delete a connectoid
//
//////////////////////////////////////////////////////////////////////
void DeleteRasEntry(LPTSTR pszEntry) { // Use RasDeleteEntryW if possible
if(lpRasDeleteEntryW) { (lpRasDeleteEntryW)(NULL, pszEntry); } else { CHAR szEntryA[MAX_PATH]; SHUnicodeToAnsi(pszEntry, szEntryA, ARRAYSIZE(szEntryA));
// Use RasDeleteEntryA if possible
if(lpRasDeleteEntryA) { (lpRasDeleteEntryA)(NULL, szEntryA); } else { // no RasDeleteEntry - must by Win95 gold machine. Use RNA. Ick.
if( lpRnaActivateEngine && lpRnaDeleteEntry && lpRnaDeactivateEngine && ERROR_SUCCESS == (lpRnaActivateEngine)()) { (lpRnaDeleteEntry)(szEntryA); (lpRnaDeactivateEngine)(); } } } }
//////////////////////////////////////////////////////////////////////
//
// NAME: ChangeDefault
//
// SYNOPSIS: Change default connectoid to currently selected one
//
//////////////////////////////////////////////////////////////////////
void ChangeDefault(HWND hDlg, PCONNINFO pConn) { TVITEM tvi; HWND hwndTree = GetDlgItem(hDlg, IDC_CONN_LIST); HTREEITEM hCur;
memset(&tvi, 0, sizeof(TVITEM));
// find current selection - if there isn't one, bail
hCur = TreeView_GetSelection(hwndTree); if(NULL == hCur) return;
// remove (default) from current default
if(pConn->hDefault) { tvi.mask = TVIF_HANDLE | TVIF_TEXT; tvi.hItem = pConn->hDefault; tvi.pszText = pConn->szEntryName; tvi.cchTextMax = RAS_MaxEntryName; TreeView_SetItem(hwndTree, &tvi); }
// get text for current item
tvi.mask = TVIF_HANDLE | TVIF_TEXT; tvi.hItem = hCur; tvi.pszText = pConn->szEntryName; tvi.cchTextMax = RAS_MaxEntryName; TreeView_GetItem(hwndTree, &tvi);
// fill in default text field
SetWindowText(GetDlgItem(hDlg, IDC_DIAL_DEF_ISP), pConn->szEntryName);
// add (default) to current selection
TCHAR szTemp[RAS_MaxEntryName + 64];
StrCpyN(szTemp, pConn->szEntryName, RAS_MaxEntryName); MLLoadString(IDS_DEFAULT_TEXT, szTemp + lstrlen(szTemp), 64);
// stick it back in the tree
tvi.mask = TVIF_HANDLE | TVIF_TEXT; tvi.hItem = hCur; tvi.pszText = szTemp; tvi.cchTextMax = RAS_MaxEntryName; TreeView_SetItem(hwndTree, &tvi);
// save htree
pConn->hDefault = hCur; }
//////////////////////////////////////////////////////////////////////
//
// NAME: ShowConnProps
//
// SYNOPSIS: Show properties for selected connection
//
//////////////////////////////////////////////////////////////////////
HTREEITEM GetCurSel(PCONNINFO pConn, HWND hDlg, LPTSTR pszBuffer, int iLen, BOOL *pfChecked) { HWND hwndTree = GetDlgItem(hDlg, IDC_CONN_LIST); TVITEM tvi;
tvi.hItem = TreeView_GetSelection(hwndTree);
if(tvi.hItem) { tvi.mask = TVIF_HANDLE | TVIF_PARAM | TVIF_STATE; tvi.stateMask = TVIS_STATEIMAGEMASK;
// get test if needed
if(pszBuffer) { tvi.mask |= TVIF_TEXT; tvi.pszText = pszBuffer; tvi.cchTextMax = iLen; } TreeView_GetItem(hwndTree, &tvi);
if(pfChecked) *pfChecked = (BOOL)(tvi.state >> 12) - 1; }
// if this is the default connectiod, return name without (default) part
if(pszBuffer && tvi.hItem == pConn->hDefault) { StrCpyN(pszBuffer, pConn->szEntryName, iLen); }
return tvi.hItem; }
void ShowConnProps(HWND hDlg, PCONNINFO pConn, BOOL fLan) { HTREEITEM hItem = NULL; TCHAR szEntryName[RAS_MaxEntryName+1]; BOOL fChecked = FALSE;
// if not lan, apply current selections
if(g_fMillennium && !fLan) { ConnectionDlgOK(hDlg, pConn); }
// default to lan
*szEntryName = 0;
// find item of interest
if(FALSE == fLan) hItem = GetCurSel(pConn, hDlg, szEntryName, RAS_MaxEntryName, &fChecked);
if(hItem || fLan) { // show settings
DialogBoxParam(MLGetHinst(), MAKEINTRESOURCE(IDD_DIALUP), hDlg, DialupDlgProc, (LPARAM)szEntryName); }
// if not lan, some settings may have been changed by RAS UI -- refresh
if(g_fMillennium && !fLan ) { FixAutodialSettings(hDlg, pConn); } }
BOOL GetConnSharingDll(LPTSTR pszPath) { DWORD cb = SIZEOF(TCHAR) * MAX_PATH; return SHGetValue(HKEY_LOCAL_MACHINE, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings"), TEXT("SharingDLL"), NULL, pszPath, &cb) == ERROR_SUCCESS; }
BOOL IsConnSharingAvail() { TCHAR szPath[MAX_PATH]; return GetConnSharingDll(szPath); }
typedef HRESULT (WINAPI *PFNCONNECTIONSHARING)(HWND hwnd, DWORD dwFlags);
void ShowConnSharing(HWND hDlg) { TCHAR szPath[MAX_PATH]; if (GetConnSharingDll(szPath)) { HMODULE hmod = LoadLibrary(szPath); if (hmod) { PFNCONNECTIONSHARING pfn = (PFNCONNECTIONSHARING)GetProcAddress(hmod, "InternetConnectionSharing"); if (pfn) pfn(hDlg, 0); FreeLibrary(hmod); } } }
//////////////////////////////////////////////////////////////////////
//
// NAME: ConnectionDlgProc
//
// SYNOPSIS: Connection property sheet dialog proc.
//
//////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK ConnectionDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { PCONNINFO pConn = (PCONNINFO)GetWindowLongPtr(hDlg, GWLP_USERDATA); if (NULL == pConn && uMsg != WM_INITDIALOG) { return FALSE; }
switch (uMsg) { case WM_INITDIALOG: // build and save conninfo struct
pConn = new CONNINFO; if(NULL == pConn) return FALSE; SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR)pConn); memset(pConn, 0, sizeof(CONNINFO));
return ConnectionDlgInit(hDlg, pConn);
case WM_DESTROY: { UnloadRNADll();
// Free the image list used by the connection list
HWND hwndConnList = GetDlgItem(hDlg, IDC_CONN_LIST); HIMAGELIST himl = TreeView_SetImageList(hwndConnList, NULL, TVSIL_NORMAL); if (himl) { ImageList_Destroy(himl); }
SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR)NULL); delete pConn; return TRUE; } case WM_NOTIFY: { NMHDR * lpnm = (NMHDR *) lParam; switch (lpnm->code) { case TVN_KEYDOWN: { TV_KEYDOWN *pkey = (TV_KEYDOWN*)lpnm; if(pkey->wVKey == VK_SPACE) { ENABLEAPPLY(hDlg); SetWindowLongPtr(hDlg, DWLP_MSGRESULT, TRUE); // eat the key
return TRUE; } break; }
case NM_CLICK: case NM_DBLCLK: { // is this click in our tree?
if(lpnm->idFrom == IDC_CONN_LIST) { HWND hwndTree = GetDlgItem(hDlg, IDC_CONN_LIST); TV_HITTESTINFO ht; HTREEITEM hItem;
GetCursorPos(&ht.pt); ScreenToClient(hwndTree, &ht.pt); hItem = TreeView_HitTest(hwndTree, &ht); if(hItem) { TreeView_SelectItem(hwndTree, hItem);
// If it's a double click, show settings
if(NM_DBLCLK == lpnm->code) { PostMessage(hDlg, WM_COMMAND, IDC_MODEM_SETTINGS, 0); } } } EnableConnectionControls(hDlg, pConn, FALSE); break; }
case TVN_SELCHANGEDA: case TVN_SELCHANGEDW: EnableConnectionControls(hDlg, pConn, FALSE); break;
case PSN_QUERYCANCEL: case PSN_KILLACTIVE: case PSN_RESET: SetWindowLongPtr(hDlg, DWLP_MSGRESULT, FALSE); return TRUE;
case PSN_APPLY: { BOOL fRet = ConnectionDlgOK(hDlg, pConn); SetPropSheetResult(hDlg,!fRet); return !fRet; break; } } break; }
case WM_COMMAND: switch (LOWORD(wParam)) { case IDC_LAN_SETTINGS: ShowConnProps(hDlg, pConn, TRUE); break;
case IDC_CON_SHARING: ShowConnSharing(hDlg); break;
case IDC_DIALUP_ADD: MakeNewConnectoid(hDlg, pConn); break;
case IDC_DIALUP_REMOVE: { TCHAR szEntryName[RAS_MaxEntryName+1];
if (GetCurSel(pConn, hDlg, szEntryName, RAS_MaxEntryName, NULL) && *szEntryName) { if(IDOK == MsgBox(hDlg, IDS_DELETECONNECTOID, MB_ICONWARNING, MB_OKCANCEL)) { DeleteRasEntry(szEntryName); PopulateRasEntries(hDlg, pConn);
// fix controls
EnableConnectionControls(hDlg, pConn, FALSE); } } break; }
case IDC_DIALUP: case IDC_DIALUP_ON_NONET: case IDC_DIALUP_NEVER:
// fix radio buttons
CheckRadioButton(hDlg, IDC_DIALUP_NEVER, IDC_DIALUP, LOWORD(wParam));
// enable/disable other controls appropriately
EnableConnectionControls(hDlg, pConn, FALSE); ENABLEAPPLY(hDlg); break;
case IDC_ENABLE_SECURITY: ENABLEAPPLY(hDlg); break;
case IDC_SET_DEFAULT: ChangeDefault(hDlg, pConn); if(GetFocus() == GetDlgItem(hDlg, IDC_SET_DEFAULT)) { // focus is currently on the button and it's about to be disabled
SetFocus(GetDlgItem(hDlg, IDC_CONN_LIST)); } EnableConnectionControls(hDlg, pConn, FALSE); ENABLEAPPLY(hDlg); break;
case IDC_MODEM_SETTINGS: ShowConnProps(hDlg, pConn, FALSE); break;
case IDC_CONNECTION_WIZARD: TCHAR szICWReg[MAX_PATH]; TCHAR szICWPath[MAX_PATH + 1]; DWORD cbSize = MAX_PATH, dwType;
if (IsOS(OS_WHISTLERORGREATER)) { // This is the invocation path for the New Connection Wizard in Whistler
StrCpy(szICWPath, TEXT("rundll32.exe netshell.dll,StartNCW")); } else { // Try and get ICW from IOD. If it fails, try to run
// ICW anyway. We may luck out and get an old one.
DWORD dwRes = JitFeature(hDlg, clsidFeatureICW, FALSE);
// find path of ICW
MLLoadString(IDS_ICW_NAME, szICWPath, MAX_PATH); wnsprintf(szICWReg, ARRAYSIZE(szICWReg), TEXT("%s\\%s"), REGSTR_PATH_APPPATHS, szICWPath);
// read app paths key
if(ERROR_SUCCESS != SHGetValue(HKEY_LOCAL_MACHINE, szICWReg, NULL, &dwType, szICWPath, &cbSize)) break; }
// run connection wizard
STARTUPINFO si; PROCESS_INFORMATION pi; memset(&si, 0, sizeof(si)); si.cb = sizeof(si);
if(CreateProcess(NULL, szICWPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { // successfully ran ICW - get rid of this dialog
CloseHandle(pi.hProcess); CloseHandle(pi.hThread); PropSheet_PressButton(GetParent(hDlg), PSBTN_CANCEL); } break; } break;
case WM_HELP: // F1
ResWinHelp((HWND) ((LPHELPINFO)lParam)->hItemHandle, IDS_HELPFILE, HELP_WM_HELP, (DWORD_PTR)(LPSTR)mapIDCsToIDHs); break;
case WM_CONTEXTMENU: // right mouse click
ResWinHelp((HWND)wParam, IDS_HELPFILE, HELP_CONTEXTMENU, (DWORD_PTR)(LPSTR)mapIDCsToIDHs); break;
default: return FALSE; }
return TRUE; }
/*******************************************************************
NAME: ConnectionDlgOK
SYNOPSIS: OK button handler for connection prop page
********************************************************************/
// prototype for IsNetworkAlive()
typedef BOOL (WINAPI *ISNETWORKALIVE)(LPDWORD);
BOOL ConnectionDlgOK(HWND hDlg, PCONNINFO pConn) { DWORD dwAutodial;
RegEntry re(REGSTR_PATH_INTERNETSETTINGS,HKEY_CURRENT_USER); if(ERROR_SUCCESS == re.GetError()) {
// autodial
dwAutodial = AUTODIAL_MODE_NEVER; if(IsDlgButtonChecked(hDlg, IDC_DIALUP)) { dwAutodial = AUTODIAL_MODE_ALWAYS; } else if(IsDlgButtonChecked(hDlg, IDC_DIALUP_ON_NONET)) { dwAutodial = AUTODIAL_MODE_NO_NETWORK_PRESENT;
DWORD dwRes = JitFeature(hDlg, clsidFeatureMobile, FALSE); if(JIT_PRESENT != dwRes) { // user doesn't want MOP, change to dial always.
dwAutodial = AUTODIAL_MODE_ALWAYS; } else { // Call IsNetworkAlive. This will start sens service
// and next instance of wininet will use it.
HINSTANCE hSens; ISNETWORKALIVE pfnIsNetworkAlive; DWORD dwFlags;
hSens = LoadLibrary(TEXT("sensapi.dll")); if(hSens) { pfnIsNetworkAlive = (ISNETWORKALIVE)GetProcAddress(hSens, "IsNetworkAlive"); if(pfnIsNetworkAlive) { // Call it. Don't really care about the result.
pfnIsNetworkAlive(&dwFlags); } FreeLibrary(hSens); } } }
// save autodial mode
InternetSetOption(NULL, INTERNET_OPTION_AUTODIAL_MODE, &dwAutodial, sizeof(dwAutodial));
// save default connectoid
if(*pConn->szEntryName) { InternetSetOption(NULL, INTERNET_OPTION_AUTODIAL_CONNECTION, pConn->szEntryName, lstrlen(pConn->szEntryName)); } }
// save security check state on win95
if(g_fWin95) { DWORD dwValue = 0; if(IsDlgButtonChecked(hDlg, IDC_ENABLE_SECURITY)) { dwValue = 1; } re.SetValue(REGSTR_VAL_ENABLESECURITYCHECK, dwValue); }
//
// Have wininet refresh it's connection settings
//
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
UpdateAllWindows();
return TRUE; }
/////////////////////////////////////////////////////////////////////////////
//
// NAME: EnableConnectionControls
//
// SYNOPSIS: Enables controls appropriately depending on what
// checkboxes are checked.
//
/////////////////////////////////////////////////////////////////////////////
VOID EnableConnectionControls(HWND hDlg, PCONNINFO pConn, BOOL fSetText) { TCHAR szEntryName[RAS_MaxEntryName + 1]; BOOL fList = FALSE, fDial = FALSE, fAutodial = FALSE; BOOL fAdd = FALSE, fSettings = FALSE, fLan = TRUE, fSetDefault = TRUE; BOOL fDialDefault = FALSE, fNT4SP3; HTREEITEM hItem; int iCount;
fNT4SP3 = IsNTSPx(FALSE, 4, 3);
if(fNT4SP3) { // no sens stuff on NT4SP3, so make sure on no net isn't picked
if(IsDlgButtonChecked(hDlg, IDC_DIALUP_ON_NONET)) { CheckRadioButton(hDlg, IDC_DIALUP_NEVER, IDC_DIALUP, IDC_DIALUP); } }
//
// Check out how much stuff is in the tree view and what's selected
//
iCount = TreeView_GetCount(GetDlgItem(hDlg, IDC_CONN_LIST)); hItem = GetCurSel(pConn, hDlg, szEntryName, RAS_MaxEntryName, NULL);
if(dwRNARefCount) { // Ras is loaded so enable list control
fList = TRUE;
// if anything is selected, turn on settings button
if(hItem) { fSettings = TRUE; if(hItem == pConn->hDefault) { fSetDefault = FALSE; } }
// Ensure ras is loaded
if(iCount > 0) fDial = TRUE; }
// check to see if dial default is checked
if(fDial) fDialDefault = !IsDlgButtonChecked(hDlg, IDC_DIALUP_NEVER);
if(fList && lpRasCreatePhonebookEntryA) fAdd = TRUE;
// if dialing restriction is present, make sure user can't do nothing.
if(g_restrict.fDialing) fAdd = fList = fDial = fDialDefault = fAutodial = fSettings = fLan = fSetDefault = FALSE;
// enable list controls
EnableDlgItem(hDlg, IDC_CONN_LIST, fList); EnableDlgItem(hDlg, IDC_DIALUP_ADD, fAdd); EnableDlgItem(hDlg, IDC_DIALUP_REMOVE, fSettings); EnableDlgItem(hDlg, IDC_MODEM_SETTINGS, fSettings);
// enable lan controls
EnableDlgItem(hDlg, IDC_LAN_SETTINGS, fLan);
// enable default controls
EnableDlgItem(hDlg, IDC_DIALUP_NEVER, fDial); EnableDlgItem(hDlg, IDC_DIALUP_ON_NONET, fDial && !fNT4SP3); EnableDlgItem(hDlg, IDC_DIALUP, fDial); EnableDlgItem(hDlg, IDC_DIAL_DEF_TXT, fDialDefault); EnableDlgItem(hDlg, IDC_DIAL_DEF_ISP, fDialDefault); EnableDlgItem(hDlg, IDC_ENABLE_SECURITY, fDialDefault); EnableDlgItem(hDlg, IDC_SET_DEFAULT, fDialDefault && fSetDefault);
// if autodialing is disabled (no connectoids) make sure it's not checked
if(FALSE == fDial) CheckRadioButton(hDlg, IDC_DIALUP_NEVER, IDC_DIALUP, IDC_DIALUP_NEVER);
//
// Fix connection wizard
//
if (g_restrict.fConnectionWizard) { EnableDlgItem(hDlg, IDC_CONNECTION_WIZARD, FALSE); } }
VOID FixAutodialSettings(HWND hDlg, PCONNINFO pConn) { // Find default connectoid
DWORD dwSize = RAS_MaxEntryName + 1; if(FALSE == InternetQueryOption(NULL, INTERNET_OPTION_AUTODIAL_CONNECTION, pConn->szEntryName, &dwSize)) { *pConn->szEntryName = 0; }
// populate connectoids, will do the right thing with the default read above
PopulateRasEntries(hDlg, pConn);
// fix autodial radio buttons
int iSel; DWORD dwAutodial;
dwSize = sizeof(DWORD); if(FALSE == InternetQueryOption(NULL, INTERNET_OPTION_AUTODIAL_MODE, &dwAutodial, &dwSize)) { dwAutodial = AUTODIAL_MODE_NEVER; }
switch(dwAutodial) { case AUTODIAL_MODE_ALWAYS: iSel = IDC_DIALUP; break; case AUTODIAL_MODE_NO_NETWORK_PRESENT: iSel = IDC_DIALUP_ON_NONET; break; default : iSel = IDC_DIALUP_NEVER; break; } /* switch */ CheckRadioButton(hDlg, IDC_DIALUP_NEVER, IDC_DIALUP, iSel);
// enable appropriate controls
EnableConnectionControls(hDlg, pConn, TRUE); }
BOOL ConnectionDlgInit(HWND hDlg, PCONNINFO pConn) { BOOL fProxy = FALSE; BOOL fDial = FALSE; HIMAGELIST himl; HICON hIcon;
// Get platform - we need this as there's no security check on NT.
OSVERSIONINFOA osvi; osvi.dwOSVersionInfoSize = sizeof(osvi); GetVersionExA(&osvi);
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) { g_fWin95 = FALSE;
if(osvi.dwMajorVersion > 4) { g_fWin2K = TRUE; } } else { if(osvi.dwMinorVersion >= 90) { g_fMillennium = TRUE; } }
// load ras (success checked later - see dwRNARefCount in EnableConnectionControls
LoadRNADll();
// create image list for tree view
himl = ImageList_Create(BITMAP_WIDTH, BITMAP_HEIGHT, ILC_COLOR | ILC_MASK, CONN_BITMAPS, 4 ); hIcon = LoadIcon(ghInstance, MAKEINTRESOURCE(IDI_LAN)); ImageList_AddIcon(himl, hIcon); hIcon = LoadIcon(ghInstance, MAKEINTRESOURCE(IDI_PHONE)); ImageList_AddIcon(himl, hIcon);
TreeView_SetImageList(GetDlgItem(hDlg, IDC_CONN_LIST), himl, TVSIL_NORMAL);
// populate and configure autodial settings
FixAutodialSettings(hDlg, pConn);
// fix security check
if(g_fWin95) { RegEntry re(REGSTR_PATH_INTERNETSETTINGS,HKEY_CURRENT_USER); if (re.GetError() == ERROR_SUCCESS) { if(re.GetNumber(REGSTR_VAL_ENABLESECURITYCHECK,0)) { CheckDlgButton(hDlg, IDC_ENABLE_SECURITY, TRUE); } } } else { // no security check on NT so hide check box
ShowWindow(GetDlgItem(hDlg, IDC_ENABLE_SECURITY), SW_HIDE); }
if (!IsConnSharingAvail()) ShowWindow(GetDlgItem(hDlg, IDC_CON_SHARING), SW_HIDE);
// disable wizard button if for some reason ICW cannot be JITed in
DWORD dwRes = JitFeature(hDlg, clsidFeatureICW, TRUE); if(JIT_NOT_AVAILABLE == dwRes) { // can never get ICW so grey button
EnableWindow(GetDlgItem(hDlg, IDC_CONNECTION_WIZARD), FALSE); }
return TRUE; }
///////////////////////////////////////////////////////////////////////////
//
// NAME: LoadRNADll
//
// SYNOPSIS: Loads RNA dll if not already loaded and obtains pointers
// for function addresses.
//
// NOTES: Maintains a reference count so we know when to unload
//
///////////////////////////////////////////////////////////////////////////
BOOL LoadRNADll(VOID) { // increase reference count
dwRNARefCount++;
if (hInstRNADll) { // already loaded, nothing to do
return TRUE; }
// Ask wininet if Ras is installed. Always make this call even if ras
// dll doesn't load since it also forces wininet to migrate proxy
// settings if necessary.
DWORD dwFlags; InternetGetConnectedStateExA(&dwFlags, NULL, 0, 0); if(0 == (dwFlags & INTERNET_RAS_INSTALLED)) { // not installed - none of the functions will work so bail
dwRNARefCount--; return FALSE; }
// get the file name from resource
TCHAR szDllFilename[SMALL_BUF_LEN+1]; if (!MLLoadString(IDS_RNADLL_FILENAME,szDllFilename,ARRAYSIZE(szDllFilename))) { dwRNARefCount--; return FALSE; }
// load the DLL
hInstRNADll = LoadLibrary(szDllFilename); if (!hInstRNADll) { dwRNARefCount--; return FALSE; }
// cycle through the API table and get proc addresses for all the APIs we
// need
UINT nIndex; for (nIndex = 0;nIndex < NUM_RNAAPI_PROCS;nIndex++) { if (!(*RasApiList[nIndex].ppFcnPtr = (PVOID) GetProcAddress(hInstRNADll, RasApiList[nIndex].pszName))) { // no longer fatal - no RasDeleteEntry on Win95 gold.
TraceMsg(TF_GENERAL, "Unable to get address of function %s", RasApiList[nIndex].pszName);
// UnloadRNADll();
// return FALSE;
} }
if(g_fWin95) { // make sure we don't use any W versions that may be around on Win9x.
// They'll almost certainly be stubs.
lpRasEditPhonebookEntryW = NULL; lpRasEnumEntriesW = NULL; lpRasDeleteEntryW = NULL; lpRasGetEntryDialParamsW = NULL; lpRasSetEntryDialParamsW = NULL; lpRasGetEntryPropertiesW = NULL; }
return TRUE; }
/////////////////////////////////////////////////////////////////////////////
//
// NAME: UnloadRNADll
//
// SYNOPSIS: Decrements RNA dll reference count and unloads it if
// zero
//
/////////////////////////////////////////////////////////////////////////////
VOID UnloadRNADll(VOID) { // decrease reference count
if (dwRNARefCount) dwRNARefCount --;
// unload DLL if reference count hits zero
if (!dwRNARefCount && hInstRNADll) {
// set function pointers to NULL
UINT nIndex; for (nIndex = 0;nIndex < NUM_RNAAPI_PROCS;nIndex++) *RasApiList[nIndex].ppFcnPtr = NULL;
// free the library
FreeLibrary(hInstRNADll); hInstRNADll = NULL; } }
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//
// Dialup Dialog ie modem settings
//
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
#define W2KRASENTRYW struct tagW2KRASENTRYW
W2KRASENTRYW { DWORD dwSize; DWORD dwfOptions; DWORD dwCountryID; DWORD dwCountryCode; WCHAR szAreaCode[ RAS_MaxAreaCode + 1 ]; WCHAR szLocalPhoneNumber[ RAS_MaxPhoneNumber + 1 ]; DWORD dwAlternateOffset; RASIPADDR ipaddr; RASIPADDR ipaddrDns; RASIPADDR ipaddrDnsAlt; RASIPADDR ipaddrWins; RASIPADDR ipaddrWinsAlt; DWORD dwFrameSize; DWORD dwfNetProtocols; DWORD dwFramingProtocol; WCHAR szScript[ MAX_PATH ]; WCHAR szAutodialDll[ MAX_PATH ]; WCHAR szAutodialFunc[ MAX_PATH ]; WCHAR szDeviceType[ RAS_MaxDeviceType + 1 ]; WCHAR szDeviceName[ RAS_MaxDeviceName + 1 ]; WCHAR szX25PadType[ RAS_MaxPadType + 1 ]; WCHAR szX25Address[ RAS_MaxX25Address + 1 ]; WCHAR szX25Facilities[ RAS_MaxFacilities + 1 ]; WCHAR szX25UserData[ RAS_MaxUserData + 1 ]; DWORD dwChannels; DWORD dwReserved1; DWORD dwReserved2; DWORD dwSubEntries; DWORD dwDialMode; DWORD dwDialExtraPercent; DWORD dwDialExtraSampleSeconds; DWORD dwHangUpExtraPercent; DWORD dwHangUpExtraSampleSeconds; DWORD dwIdleDisconnectSeconds; DWORD dwType; DWORD dwEncryptionType; DWORD dwCustomAuthKey; GUID guidId; WCHAR szCustomDialDll[MAX_PATH]; DWORD dwVpnStrategy; };
BOOL GetConnectoidInfo(HWND hDlg, LPTSTR pszEntryName) { BOOL fPassword = FALSE;
if(g_fWin2K && lpRasGetEntryPropertiesW) { W2KRASENTRYW re[2]; DWORD dwSize;
// get props for this connectoid and see if it has a custom dial dll
re[0].dwSize = sizeof(W2KRASENTRYW); dwSize = sizeof(re); if(ERROR_SUCCESS == (lpRasGetEntryPropertiesW)(NULL, pszEntryName, (LPRASENTRYW)re, &dwSize, NULL, NULL)) { if(0 != re[0].szCustomDialDll[0]) { // Win2K handler exists - flag that we need to grey out
// credential fields
return TRUE; } } } else { // on down level platforms, check registry for cdh
TCHAR szTemp[MAX_PATH];
GetConnKey(pszEntryName, szTemp, MAX_PATH); RegEntry re(szTemp, HKEY_CURRENT_USER); if(ERROR_SUCCESS == re.GetError()) { if(re.GetString(REGSTR_VAL_AUTODIALDLLNAME, szTemp, MAX_PATH) && *szTemp) { // CDH exists - flag that we need to grey credentials
return TRUE; } } }
if(lpRasGetEntryDialParamsW) { RASDIALPARAMSW params; WCHAR *pszUser = L"", *pszPassword = L"", *pszDomain = L"";
memset(¶ms, 0, sizeof(params)); params.dwSize = sizeof(params);
StrCpyN(params.szEntryName, pszEntryName, RAS_MaxEntryName); if(ERROR_SUCCESS == (lpRasGetEntryDialParamsW)(NULL, (LPRASDIALPARAMSW)¶ms, &fPassword)) { pszUser = params.szUserName; if(' ' != params.szDomain[0] || IsNTSPx(TRUE, 4, 6)) // NT4SP6 or greater?
pszDomain = params.szDomain; if(fPassword) pszPassword = params.szPassword; }
SetWindowText(GetDlgItem(hDlg, IDC_USER), pszUser); SetWindowText(GetDlgItem(hDlg, IDC_DOMAIN), pszDomain); SetWindowText(GetDlgItem(hDlg, IDC_PASSWORD), pszPassword); } else if(lpRasGetEntryDialParamsA) { RASDIALPARAMSA params; CHAR *pszUser = "", *pszPassword = "", *pszDomain = "";
memset(¶ms, 0, sizeof(params)); params.dwSize = sizeof(params); SHUnicodeToAnsi(pszEntryName, params.szEntryName, ARRAYSIZE(params.szEntryName));
if(ERROR_SUCCESS == (lpRasGetEntryDialParamsA)(NULL, ¶ms, &fPassword)) { pszUser = params.szUserName; if(' ' != params.szDomain[0] || IsNTSPx(TRUE, 4, 6)) // NT4SP6 or greater?
pszDomain = params.szDomain; if(fPassword) pszPassword = params.szPassword; }
SetWindowTextA(GetDlgItem(hDlg, IDC_USER), pszUser); SetWindowTextA(GetDlgItem(hDlg, IDC_DOMAIN), pszDomain); SetWindowTextA(GetDlgItem(hDlg, IDC_PASSWORD), pszPassword); }
return FALSE; }
#ifndef WS_EX_LAYOUTRTL
#define WS_EX_LAYOUTRTL 0x00400000L // Right to left mirroring
#else
#error "WS_EX_LAYOUTRTL is already defined in winuser.h"
#endif // WS_EX_LAYOUTRTL
///////////////////////////////////////////////////////////////////
//
// NAME: FixDialogForLan
//
// SYNOPSIS: Remove dialing section of dialog box
//
///////////////////////////////////////////////////////////////////
void FixDialogForLan(HWND hDlg) { RECT rectParent, rectDial, rectNet, rectCur; POINT pt; int i;
static int iHideIDs[] = { IDC_GRP_DIAL, IDC_RAS_SETTINGS, IDC_TX_USER, IDC_USER, IDC_TX_PASSWORD, IDC_PASSWORD, IDC_TX_DOMAIN, IDC_DOMAIN, IDC_DIAL_ADVANCED, IDC_DONT_USE_CONNECTION }; #define NUM_HIDE (sizeof(iHideIDs) / sizeof(int))
static int iMoveIDs[] = { IDCANCEL, IDOK }; #define NUM_MOVE (sizeof(iMoveIDs) / sizeof(int))
// hide relevant windows
for(i=0; i<NUM_HIDE; i++) { ShowWindow(GetDlgItem(hDlg, iHideIDs[i]), SW_HIDE); }
// move relevant windows (yuck)
GetWindowRect(hDlg, &rectParent); GetWindowRect(GetDlgItem(hDlg, IDC_GRP_DIAL), &rectDial); GetWindowRect(GetDlgItem(hDlg, IDC_GRP_PROXY), &rectNet);
for(i=0; i<NUM_MOVE; i++) { GetWindowRect(GetDlgItem(hDlg, iMoveIDs[i]), &rectCur); pt.x = (GetWindowLong(hDlg, GWL_EXSTYLE) & WS_EX_LAYOUTRTL) ? rectCur.right : rectCur.left; pt.y = rectCur.top; ScreenToClient(hDlg, &pt); MoveWindow(GetDlgItem(hDlg, iMoveIDs[i]), pt.x, pt.y - (rectDial.bottom - rectNet.bottom), rectCur.right - rectCur.left, rectCur.bottom - rectCur.top, TRUE); }
// adjust dialog box size
MoveWindow(hDlg, rectParent.left, rectParent.top, rectParent.right - rectParent.left, rectParent.bottom - rectParent.top - (rectDial.bottom - rectNet.bottom), TRUE); }
///////////////////////////////////////////////////////////////////
//
// NAME: DialupDlgInit
//
// SYNOPSIS: Does initalization for dialup dialog
//
////////////////////////////////////////////////////////////////////
BOOL DialupDlgInit(HWND hDlg, LPTSTR pszConnectoid) { PDIALINFO pDI; TCHAR szTemp[MAX_PATH], szSettings[64]; DWORD dwIEAK = 0, cb;
// set up dailinfo struct
pDI = new DIALINFO; if(NULL == pDI) return FALSE; memset(pDI, 0, sizeof(DIALINFO)); // new already zero init?
#ifndef UNIX
pDI->pszConnectoid = pszConnectoid; #else
// Can't pass lparam from PSheet because we put dialup dialog directly
// on the tab.
pszConnectoid = TEXT(""); pDI->pszConnectoid = pDI->szEntryName;
#endif
SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR)pDI);
// Fix window title
if(0 == *(pDI->pszConnectoid)) { if (MLLoadString(IDS_LAN_SETTINGSPROXY, szTemp, MAX_PATH)) { SetDlgItemText(hDlg, IDC_MANUAL, szTemp); } MLLoadString(IDS_LAN_SETTINGS, szTemp, MAX_PATH); } else { MLLoadString(IDS_SETTINGS, szSettings, 64); wnsprintf(szTemp, ARRAYSIZE(szTemp), TEXT("%s %s"), pDI->pszConnectoid, szSettings); } SetWindowText(hDlg, szTemp);
#ifndef UNIX
// Different stuff if we're editing a connectoid vs. lan settings
if(NULL == pszConnectoid || 0 == *pszConnectoid) { // remove dialing goo from dialog
FixDialogForLan(hDlg); } else { // fill in username/password/domain
pDI->proxy.fCustomHandler = GetConnectoidInfo(hDlg, pszConnectoid); } #endif
// hide advanced button for autoconfig info if IEAK restriction is not set
cb = sizeof(dwIEAK); if ((SHGetValue(HKEY_CURRENT_USER, REGSTR_PATH_INETCPL_RESTRICTIONS, REGSTR_VAL_INETCPL_IEAK, NULL, (LPVOID)&dwIEAK, &cb) != ERROR_SUCCESS) || !dwIEAK) ShowWindow(GetDlgItem(hDlg, IDC_AUTOCNFG_ADVANCED), SW_HIDE);
// hide advanced button on millennium
if(g_fMillennium) { ShowWindow(GetDlgItem(hDlg, IDC_DIAL_ADVANCED), SW_HIDE); EnableWindow(GetDlgItem(hDlg, IDC_DIAL_ADVANCED), FALSE); }
//
// Read proxy and autoconfig settings for this connection
//
INTERNET_PER_CONN_OPTION_LIST list; DWORD dwBufSize = sizeof(list);
list.pszConnection = (pszConnectoid && *pszConnectoid) ? pszConnectoid : NULL; list.dwSize = sizeof(list); list.dwOptionCount = 4; list.pOptions = new INTERNET_PER_CONN_OPTION[4]; if(NULL == list.pOptions) { return FALSE; }
list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS; list.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER; list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS; list.pOptions[3].dwOption = INTERNET_PER_CONN_AUTOCONFIG_URL;
if(FALSE == InternetQueryOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &list, &dwBufSize)) { delete [] list.pOptions; return FALSE; }
//
// move options to pDI struct
//
pDI->proxy.fEnable = (list.pOptions[0].Value.dwValue & PROXY_TYPE_PROXY); if(list.pOptions[1].Value.pszValue) { StrCpyN(pDI->proxy.szProxy, list.pOptions[1].Value.pszValue, MAX_URL_STRING); GlobalFree(list.pOptions[1].Value.pszValue); list.pOptions[1].Value.pszValue = NULL; } if(list.pOptions[2].Value.pszValue) { StrCpyN(pDI->proxy.szOverride, list.pOptions[2].Value.pszValue, MAX_URL_STRING); GlobalFree(list.pOptions[2].Value.pszValue); list.pOptions[2].Value.pszValue = NULL; }
//
// fill in dialog fields
//
// proxy enable
if(pDI->proxy.fEnable) { CheckDlgButton(hDlg, IDC_MANUAL, TRUE); }
// autoconfig enable and url
if(list.pOptions[0].Value.dwValue & PROXY_TYPE_AUTO_PROXY_URL) { CheckDlgButton(hDlg, IDC_CONFIGSCRIPT, TRUE); } if(list.pOptions[3].Value.pszValue) { SetWindowText(GetDlgItem(hDlg, IDC_CONFIG_ADDR), list.pOptions[3].Value.pszValue); GlobalFree(list.pOptions[3].Value.pszValue); list.pOptions[3].Value.pszValue = NULL; }
// autodiscovery enable
if(list.pOptions[0].Value.dwValue & PROXY_TYPE_AUTO_DETECT) { CheckDlgButton(hDlg, IDC_AUTODISCOVER, TRUE); }
// all done with options list
delete [] list.pOptions;
// check enable and override and parse out server and port
pDI->proxy.fOverrideLocal = RemoveLocalFromExceptionList(pDI->proxy.szOverride); CheckDlgButton(hDlg, IDC_PROXY_ENABLE, pDI->proxy.fEnable); CheckDlgButton(hDlg, IDC_PROXY_OMIT_LOCAL_ADDRESSES, pDI->proxy.fOverrideLocal); PopulateProxyControls(hDlg, &pDI->proxy, TRUE);
return TRUE; }
///////////////////////////////////////////////////////////////////
//
// NAME: DialupDlgOk
//
// SYNOPSIS: Apply settings for dial up dialog box
//
////////////////////////////////////////////////////////////////////
BOOL DialupDlgOk(HWND hDlg, PDIALINFO pDI) { DWORD dwValue = 0;
//
// Save proxy settings
//
INTERNET_PER_CONN_OPTION_LIST list; DWORD dwBufSize = sizeof(list); DWORD dwOptions = 2; // always save FLAGS & DISCOVERY_FLAGS
TCHAR szAutoConfig[MAX_URL_STRING]; list.pszConnection = (pDI->pszConnectoid && *pDI->pszConnectoid) ? pDI->pszConnectoid : NULL; list.dwSize = sizeof(list); list.dwOptionCount = 1; list.pOptions = new INTERNET_PER_CONN_OPTION[5]; if(NULL == list.pOptions) { return FALSE; }
list.pOptions[0].dwOption = INTERNET_PER_CONN_AUTODISCOVERY_FLAGS;
//
// Query autodiscover flags - we just need to set one bit in there
//
if(FALSE == InternetQueryOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &list, &dwBufSize)) { delete [] list.pOptions; return FALSE; }
//
// save off all other options
//
list.pOptions[1].dwOption = INTERNET_PER_CONN_FLAGS; list.pOptions[1].Value.dwValue = PROXY_TYPE_DIRECT;
//
// save proxy settings
//
GetProxyInfo(hDlg, pDI);
if(pDI->proxy.fEnable) { list.pOptions[1].Value.dwValue |= PROXY_TYPE_PROXY; }
list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_SERVER; list.pOptions[2].Value.pszValue = pDI->proxy.szProxy; list.pOptions[3].dwOption = INTERNET_PER_CONN_PROXY_BYPASS; list.pOptions[3].Value.pszValue = pDI->proxy.szOverride;
dwOptions += 2;
//
// save autodetect
//
if(IsDlgButtonChecked(hDlg, IDC_AUTODISCOVER)) { list.pOptions[1].Value.dwValue |= PROXY_TYPE_AUTO_DETECT; if(pDI->fClickedAutodetect) { list.pOptions[0].Value.dwValue |= AUTO_PROXY_FLAG_USER_SET; } } else { list.pOptions[0].Value.dwValue &= ~AUTO_PROXY_FLAG_DETECTION_RUN; }
//
// save autoconfig
//
if(IsDlgButtonChecked(hDlg, IDC_CONFIGSCRIPT) && GetWindowText(GetDlgItem(hDlg, IDC_CONFIG_ADDR), szAutoConfig, MAX_URL_STRING)) { list.pOptions[1].Value.dwValue |= PROXY_TYPE_AUTO_PROXY_URL; list.pOptions[dwOptions].Value.pszValue = szAutoConfig; list.pOptions[dwOptions].dwOption = INTERNET_PER_CONN_AUTOCONFIG_URL; dwOptions++; }
// update wininet
list.dwOptionCount = dwOptions; InternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
// tell wininet that the proxy info has changed
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
// all done with options list
delete [] list.pOptions;
// all done if we're editing lan settings
if(NULL == pDI->pszConnectoid || 0 == *pDI->pszConnectoid) return TRUE;
// no credentials to store if we have a w2k custom handler
if(pDI->proxy.fCustomHandler) { return TRUE; }
//
// save connectoid information - use wide version if possible
//
BOOL fDeletePassword = FALSE;
if(lpRasSetEntryDialParamsW) { RASDIALPARAMSW params;
memset(¶ms, 0, sizeof(RASDIALPARAMSW)); params.dwSize = sizeof(RASDIALPARAMSW); StrCpyN(params.szEntryName, pDI->pszConnectoid, RAS_MaxEntryName+1); GetWindowText(GetDlgItem(hDlg, IDC_USER), params.szUserName, UNLEN); GetWindowText(GetDlgItem(hDlg, IDC_PASSWORD), params.szPassword, PWLEN); if(0 == params.szPassword[0]) fDeletePassword = TRUE; GetWindowText(GetDlgItem(hDlg, IDC_DOMAIN), params.szDomain, DNLEN); if(0 == params.szDomain[0] && !IsNTSPx(TRUE, 4, 6)) { // NT4SP6 or greater?
// user wants empty domain
params.szDomain[0] = TEXT(' '); } (lpRasSetEntryDialParamsW)(NULL, ¶ms, fDeletePassword);
} else if(lpRasSetEntryDialParamsA) { RASDIALPARAMSA params;
memset(¶ms, 0, sizeof(RASDIALPARAMSA)); params.dwSize = sizeof(RASDIALPARAMSA); SHUnicodeToAnsi(pDI->pszConnectoid, params.szEntryName, ARRAYSIZE(params.szEntryName)); GetWindowTextA(GetDlgItem(hDlg, IDC_USER), params.szUserName, UNLEN); GetWindowTextA(GetDlgItem(hDlg, IDC_PASSWORD), params.szPassword, PWLEN); if(0 == params.szPassword[0]) fDeletePassword = TRUE; GetWindowTextA(GetDlgItem(hDlg, IDC_DOMAIN), params.szDomain, DNLEN); if(0 == params.szDomain[0] && !IsNTSPx(TRUE, 4, 6)) { // NT4SP6 or greater?
// user wants empty domain
params.szDomain[0] = TEXT(' '); } (lpRasSetEntryDialParamsA)(NULL, ¶ms, fDeletePassword); }
return TRUE; }
///////////////////////////////////////////////////////////////////
//
// NAME: DialupDlgProc
//
// SYNOPSIS: Dialog proc for dial up dialog
//
////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK DialupDlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { PDIALINFO pDI = (PDIALINFO)GetWindowLongPtr(hDlg, GWLP_USERDATA);
switch (uMsg) {
case WM_INITDIALOG: ASSERT(lParam); DialupDlgInit(hDlg, (LPTSTR)lParam); return FALSE;
case WM_DESTROY: delete pDI; break;
case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDC_AUTODISCOVER: pDI->fClickedAutodetect = TRUE; break; case IDC_AUTOCNFG_ADVANCED: if(GET_WM_COMMAND_CMD(wParam, lParam) != BN_CLICKED) break; // show advanced dialog box
DialogBoxParam(MLGetHinst(), MAKEINTRESOURCE(IDD_AUTOCNFG_SETTINGS), hDlg, AdvAutocnfgDlgProc, (LPARAM) pDI->pszConnectoid); break;
case IDC_PROXY_ADVANCED: if(GET_WM_COMMAND_CMD(wParam, lParam) != BN_CLICKED) break;
GetProxyInfo(hDlg, pDI);
// remove local so it doesn't show up in advanced dialog
RemoveLocalFromExceptionList(pDI->proxy.szOverride);
// show advanced dialog box
if (DialogBoxParam(MLGetHinst(), MAKEINTRESOURCE(IDD_PROXY_SETTINGS), hDlg, ProxyDlgProc, (LPARAM) &pDI->proxy) == IDOK) { if(FALSE == pDI->proxy.fEnable) { // user disabled proxy in advanced dialog
CheckDlgButton(hDlg, IDC_MANUAL, FALSE); } PopulateProxyControls(hDlg, &pDI->proxy, TRUE); } break;
case IDC_RAS_SETTINGS: if (g_fWin95) //jeffsi
{ if(lpRasEditPhonebookEntryW) { (lpRasEditPhonebookEntryW)(hDlg, NULL, pDI->pszConnectoid); } else if(lpRasEditPhonebookEntryA) { CHAR szConnectoid[MAX_PATH]; SHUnicodeToAnsi(pDI->pszConnectoid, szConnectoid, ARRAYSIZE(szConnectoid)); (lpRasEditPhonebookEntryA)(hDlg, NULL, szConnectoid); } } else { PFRED pfred = NULL; HMODULE hRasDlg = LoadLibrary(TEXT("rasdlg.dll")); RASENTRYDLG info;
if (!hRasDlg) { break; } #ifdef UNICODE
pfred = (PFRED)GetProcAddress(hRasDlg, "RasEntryDlgW"); #else
pfred = (PFRED)GetProcAddress(hRasDlg, "RasEntryDlgA"); #endif
if (!pfred) { FreeLibrary(hRasDlg); break; }
memset(&info, 0, sizeof(RASENTRYDLG)); info.dwSize = sizeof(RASENTRYDLG); info.hwndOwner = hDlg;
#ifdef UNICODE
(pfred)(NULL, pDI->pszConnectoid, &info); #else
CHAR szConnectoid[MAX_PATH]; SHUnicodeToAnsi(pDI->pszConnectoid, szConnectoid, ARRAYSIZE(szConnectoid)); (pfred)(NULL, szConnectoid, &info); #endif
FreeLibrary(hRasDlg); } break; case IDC_DIAL_ADVANCED: DialogBoxParam(MLGetHinst(), MAKEINTRESOURCE(IDD_DIALUP_ADVANCED), hDlg, AdvDialupDlgProc, (LPARAM) pDI->pszConnectoid); break;
case IDC_MANUAL: if(IsDlgButtonChecked(hDlg, IDC_MANUAL)) { pDI->proxy.fEnable = TRUE; SetFocus(GetDlgItem(hDlg, IDC_PROXY_ADDR)); SendMessage(GetDlgItem(hDlg, IDC_PROXY_ADDR), EM_SETSEL, 0, -1); } else { pDI->proxy.fEnable = FALSE; } PopulateProxyControls(hDlg, &pDI->proxy, FALSE); #ifdef UNIX
ENABLEAPPLY(hDlg); #endif
break;
case IDC_CONFIGSCRIPT: if(IsDlgButtonChecked(hDlg, IDC_CONFIGSCRIPT)) { // set focus to config script url
SetFocus(GetDlgItem(hDlg, IDC_CONFIG_ADDR)); SendMessage(GetDlgItem(hDlg, IDC_CONFIG_ADDR), EM_SETSEL, 0, -1); } PopulateProxyControls(hDlg, &pDI->proxy, FALSE); #ifdef UNIX
ENABLEAPPLY(hDlg); #endif
break;
#ifdef UNIX
case IDC_AUTODISCOVER: case IDC_PROXY_OMIT_LOCAL_ADDRESSES: ENABLEAPPLY(hDlg); break; case IDC_PROXY_PORT: case IDC_PROXY_ADDR: case IDC_CONFIG_ADDR: switch (HIWORD(wParam)) { case EN_CHANGE: ENABLEAPPLY(hDlg); break; } break; #endif
case IDC_DONT_USE_CONNECTION: PopulateProxyControls(hDlg, &pDI->proxy, FALSE); break;
case IDOK: if(FALSE == DialupDlgOk(hDlg, pDI)) // something is wrong... don't exit yet
break;
// fall through
case IDCANCEL: return EndDialog(hDlg, 0); } break;
case WM_HELP: // F1
ResWinHelp((HWND) ((LPHELPINFO)lParam)->hItemHandle, IDS_HELPFILE, HELP_WM_HELP, (DWORD_PTR)(LPSTR)mapIDCsToIDHs); break;
case WM_CONTEXTMENU: // right mouse click
ResWinHelp((HWND)wParam, IDS_HELPFILE, HELP_CONTEXTMENU, (DWORD_PTR)(LPSTR)mapIDCsToIDHs); break; #ifdef UNIX
case WM_NOTIFY: { NMHDR * lpnm = (NMHDR *) lParam; switch (lpnm->code) { case PSN_APPLY: { if(FALSE == DialupDlgOk(hDlg, pDI)) // something is wrong... don't exit yet
break; // fall through
} } } #endif
}
return FALSE; }
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//
// Advanced dial-up settings dialog
//
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
//
// NAME: AdvDialupDlgProc
//
// SYNOPSIS: Dialog proc for dial up dialog
//
////////////////////////////////////////////////////////////////////
void EnableAdvDialControls(HWND hDlg) { BOOL fIdle = IsDlgButtonChecked(hDlg, IDC_ENABLE_AUTODISCONNECT);
// on if we have idle disconnect...
EnableDlgItem(hDlg, IDC_IDLE_TIMEOUT, fIdle); EnableDlgItem(hDlg, IDC_IDLE_SPIN, fIdle); }
BOOL AdvDialupDlgInit(HWND hDlg, LPTSTR pszConnectoid) { TCHAR szTemp[MAX_PATH]; DWORD dwRedialAttempts, dwRedialInterval, dwAutodisconnectTime; BOOL fExit, fDisconnect;
// save connectoid name
SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR)pszConnectoid);
// figure out our registry key
GetConnKey(pszConnectoid, szTemp, MAX_PATH);
// open connectoid or lan settings
RegEntry reCon(szTemp, HKEY_CURRENT_USER); if(ERROR_SUCCESS != reCon.GetError()) return FALSE;
//
// Read autodial / redial stuff
//
// We get this stuff from the connectoid if possible. We assume it's all
// saved to the connectoid together so if EnableAutodial is present there,
// read everything from there else read everything from the IE4 settings.
//
dwRedialInterval = reCon.GetNumber(REGSTR_VAL_REDIALINTERVAL, DEF_REDIAL_WAIT); dwRedialAttempts = reCon.GetNumber(REGSTR_VAL_REDIALATTEMPTS, DEF_REDIAL_TRIES);
// autodisconnect
fDisconnect = (BOOL)reCon.GetNumber(REGSTR_VAL_ENABLEAUTODIALDISCONNECT, 0); dwAutodisconnectTime = reCon.GetNumber(REGSTR_VAL_DISCONNECTIDLETIME, DEF_AUTODISCONNECT_TIME); fExit = (BOOL)reCon.GetNumber(REGSTR_VAL_ENABLEEXITDISCONNECT, 0);
//
// Check if the mobile pack is installed and if it is not - then do not have it checked
//
DWORD dwRes = JitFeature(hDlg, clsidFeatureMobile, TRUE); if(JIT_PRESENT != dwRes) { fDisconnect = FALSE; fExit = FALSE; // check to see if offline pack is installed and disable the disconnect
// options if user has bailed on it
if(JIT_NOT_AVAILABLE == dwRes) { // can't get offline pack so disable options
CheckDlgButton(hDlg, IDC_ENABLE_AUTODISCONNECT, FALSE); CheckDlgButton(hDlg, IDC_EXIT_DISCONNECT, FALSE); EnableWindow(GetDlgItem(hDlg, IDC_ENABLE_AUTODISCONNECT), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_TX_AUTODISCONNECT), FALSE); EnableWindow(GetDlgItem(hDlg, IDC_EXIT_DISCONNECT), FALSE); } }
//
// Populate controls
//
CheckDlgButton(hDlg, IDC_ENABLE_AUTODISCONNECT, fDisconnect); CheckDlgButton(hDlg, IDC_EXIT_DISCONNECT, fExit);
SendDlgItemMessage(hDlg, IDC_IDLE_SPIN, UDM_SETPOS, 0, dwAutodisconnectTime); SendDlgItemMessage(hDlg, IDC_CONNECT_SPIN,UDM_SETPOS, 0, dwRedialAttempts); SendDlgItemMessage(hDlg, IDC_INTERVAL_SPIN,UDM_SETPOS, 0, dwRedialInterval);
//
// Set control limits
//
Edit_LimitText(GetDlgItem(hDlg,IDC_IDLE_TIMEOUT), 2); // limit edit ctrl to 2 chars
Edit_LimitText(GetDlgItem(hDlg,IDC_IDLE_SPIN), 2); Edit_LimitText(GetDlgItem(hDlg,IDC_CONNECT_SPIN), 2);
// set spin control min/max
SendDlgItemMessage(hDlg,IDC_IDLE_SPIN,UDM_SETRANGE,0, MAKELPARAM(MAX_AUTODISCONNECT_TIME,MIN_AUTODISCONNECT_TIME)); SendDlgItemMessage(hDlg,IDC_CONNECT_SPIN,UDM_SETRANGE,0, MAKELPARAM(MAX_REDIAL_TRIES,MIN_REDIAL_TRIES)); SendDlgItemMessage(hDlg,IDC_INTERVAL_SPIN,UDM_SETRANGE,0, MAKELPARAM(MAX_REDIAL_WAIT,MIN_REDIAL_WAIT));
// enable controls
EnableAdvDialControls(hDlg);
return TRUE; }
BOOL AdvDialupDlgOk(HWND hDlg, LPTSTR pszConnectoid) { TCHAR szTemp[MAX_PATH];
GetConnKey(pszConnectoid, szTemp, MAX_PATH);
// open connectoid or lan settings
RegEntry reCon(szTemp, HKEY_CURRENT_USER); if(ERROR_SUCCESS != reCon.GetError()) return FALSE;
// Save autodisconnect values
BOOL fExit = IsDlgButtonChecked(hDlg,IDC_EXIT_DISCONNECT); BOOL fDisconnect = IsDlgButtonChecked(hDlg,IDC_ENABLE_AUTODISCONNECT);
if(fExit || fDisconnect) { // make sure offline pack is installed or this feature won't work.
DWORD dwRes = JitFeature(hDlg, clsidFeatureMobile, FALSE); if(JIT_PRESENT != dwRes) { // user doesn't want to download it so turn off autodisconnect
fExit = FALSE; fDisconnect = FALSE; } }
reCon.SetValue(REGSTR_VAL_ENABLEAUTODIALDISCONNECT, (DWORD)fDisconnect); reCon.SetValue(REGSTR_VAL_ENABLEEXITDISCONNECT, (DWORD)fExit);
if(fDisconnect) { // get autodisconnect time from edit control
// Sundown: coercion to 32b since values are range checked
DWORD dwAutoDisconnectTime = (DWORD) SendDlgItemMessage(hDlg, IDC_IDLE_SPIN, UDM_GETPOS,0,0);
if(HIWORD(dwAutoDisconnectTime)) { MsgBox(hDlg, IDS_INVALID_AUTODISCONNECT_TIME, 0, MB_OK);
// decide if it's too big or too small and fix it appropriately
if(GetDlgItemInt(hDlg, IDC_IDLE_TIMEOUT, NULL, FALSE) < MIN_AUTODISCONNECT_TIME) dwAutoDisconnectTime = MIN_AUTODISCONNECT_TIME; else dwAutoDisconnectTime = MAX_AUTODISCONNECT_TIME; SendDlgItemMessage(hDlg, IDC_IDLE_SPIN, UDM_SETPOS, 0, dwAutoDisconnectTime); SetFocus(GetDlgItem(hDlg, IDC_IDLE_TIMEOUT)); return FALSE; }
// save it to registry
reCon.SetValue(REGSTR_VAL_DISCONNECTIDLETIME, dwAutoDisconnectTime);
// also save this value to MSN autodisconnect value, to
// avoid confusion. At some point in the future we'll
// combine our UI...
RegEntry reMSN(REGSTR_PATH_MOSDISCONNECT,HKEY_CURRENT_USER); if (reMSN.GetError() == ERROR_SUCCESS) { reMSN.SetValue(REGSTR_VAL_MOSDISCONNECT,dwAutoDisconnectTime); } }
// save redial info
DWORD_PTR dwRedialTry = SendDlgItemMessage(hDlg, IDC_CONNECT_SPIN, UDM_GETPOS, 0, 0); DWORD_PTR dwRedialWait = SendDlgItemMessage(hDlg, IDC_INTERVAL_SPIN, UDM_GETPOS, 0, 0);
if(HIWORD(dwRedialTry)) { MsgBox(hDlg, IDS_INVALID_REDIAL_ATTEMPTS, 0, MB_OK); if(GetDlgItemInt(hDlg, IDC_CONNECT, NULL, FALSE) < MIN_REDIAL_TRIES) dwRedialTry = MIN_REDIAL_TRIES; else dwRedialTry = MAX_REDIAL_TRIES; SendDlgItemMessage(hDlg, IDC_CONNECT_SPIN, UDM_SETPOS, 0, dwRedialTry); SetFocus(GetDlgItem(hDlg, IDC_CONNECT)); return FALSE; }
if(HIWORD(dwRedialWait)) { MsgBox(hDlg, IDS_INVALID_REDIAL_WAIT, 0, MB_OK); if(GetDlgItemInt(hDlg, IDC_INTERVAL, NULL, FALSE) < MIN_REDIAL_WAIT) dwRedialWait = MIN_REDIAL_WAIT; else dwRedialWait = MAX_REDIAL_WAIT; SendDlgItemMessage(hDlg, IDC_INTERVAL_SPIN, UDM_SETPOS, 0, dwRedialWait); SetFocus(GetDlgItem(hDlg, IDC_INTERVAL)); return FALSE; }
reCon.SetValue(REGSTR_VAL_REDIALATTEMPTS, (DWORD) dwRedialTry); reCon.SetValue(REGSTR_VAL_REDIALINTERVAL, (DWORD) dwRedialWait);
return TRUE; }
INT_PTR CALLBACK AdvDialupDlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { LPTSTR pszConn = (LPTSTR) GetWindowLongPtr(hDlg, GWLP_USERDATA);
switch (uMsg) {
case WM_INITDIALOG: ASSERT(lParam); AdvDialupDlgInit(hDlg, (LPTSTR)lParam); return FALSE;
case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDC_ENABLE_AUTODISCONNECT: EnableAdvDialControls(hDlg); break;
case IDOK: if(FALSE == AdvDialupDlgOk(hDlg, pszConn)) // something is wrong... don't exit yet
break;
// fall through
case IDCANCEL: return EndDialog(hDlg, 0); } break;
case WM_HELP: // F1
ResWinHelp((HWND) ((LPHELPINFO)lParam)->hItemHandle, IDS_HELPFILE, HELP_WM_HELP, (DWORD_PTR)(LPSTR)mapIDCsToIDHs); break;
case WM_CONTEXTMENU: // right mouse click
ResWinHelp((HWND)wParam, IDS_HELPFILE, HELP_CONTEXTMENU, (DWORD_PTR)(LPSTR)mapIDCsToIDHs); break; }
return FALSE; }
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//
// Advanced autoconfig settings dialog (only used by IEAK)
//
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
BOOL AdvAutocnfgDlgInit(HWND hDlg, LPTSTR pszConnectoid) { INTERNET_PER_CONN_OPTION_LIST list; DWORD dwBufSize = sizeof(list);
// save connectoid name
SetWindowLongPtr(hDlg, GWLP_USERDATA, (LONG_PTR)pszConnectoid);
list.pszConnection = (pszConnectoid && *pszConnectoid) ? pszConnectoid : NULL; list.dwSize = sizeof(list); list.dwOptionCount = 3; list.pOptions = new INTERNET_PER_CONN_OPTION[3]; if(NULL == list.pOptions) { return FALSE; }
list.pOptions[0].dwOption = INTERNET_PER_CONN_AUTOCONFIG_SECONDARY_URL; list.pOptions[1].dwOption = INTERNET_PER_CONN_AUTOCONFIG_RELOAD_DELAY_MINS; list.pOptions[2].dwOption = INTERNET_PER_CONN_AUTODISCOVERY_FLAGS;
if(FALSE == InternetQueryOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &list, &dwBufSize)) { delete [] list.pOptions; return FALSE; }
// autoproxy url (js)
if(list.pOptions[0].Value.pszValue) { SetWindowText(GetDlgItem(hDlg, IDC_CONFIGJS_ADDR), list.pOptions[0].Value.pszValue); }
// autoconfig timer interval
if(list.pOptions[1].Value.dwValue) { TCHAR szTimerInterval[16];
wsprintf(szTimerInterval, TEXT("%d"), list.pOptions[1].Value.dwValue); SetWindowText(GetDlgItem(hDlg, IDC_CONFIGTIMER), szTimerInterval); }
// autoconfig optimization
CheckDlgButton(hDlg, IDC_CONFIGOPTIMIZE, (list.pOptions[2].Value.dwValue & AUTO_PROXY_FLAG_CACHE_INIT_RUN ) ? BST_CHECKED : BST_UNCHECKED);
// all done with options list
if (list.pOptions[0].Value.pszValue) { GlobalFree(list.pOptions[0].Value.pszValue); } delete [] list.pOptions;
return TRUE; }
BOOL AdvAutocnfgDlgOk(HWND hDlg, LPTSTR pszConnectoid) { INTERNET_PER_CONN_OPTION_LIST list; DWORD dwBufSize = sizeof(list); TCHAR szAutoconfig[MAX_URL_STRING]; TCHAR szTimerInterval[16];
list.pszConnection = (pszConnectoid && *pszConnectoid) ? pszConnectoid : NULL; list.dwSize = sizeof(list); list.dwOptionCount = 1; list.pOptions = new INTERNET_PER_CONN_OPTION[3]; if(NULL == list.pOptions) { return FALSE; }
list.pOptions[0].dwOption = INTERNET_PER_CONN_AUTODISCOVERY_FLAGS; //
// Query autodiscover flags - we just need to set one bit in there
//
if(FALSE == InternetQueryOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &list, &dwBufSize)) { delete [] list.pOptions; return FALSE; }
// save autoconfiguration optimization field
if (IsDlgButtonChecked(hDlg, IDC_CONFIGOPTIMIZE) == BST_CHECKED) list.pOptions[0].Value.dwValue |= AUTO_PROXY_FLAG_CACHE_INIT_RUN ; else list.pOptions[0].Value.dwValue &= ~AUTO_PROXY_FLAG_CACHE_INIT_RUN ;
//
// save autoproxy url
//
list.pOptions[1].dwOption = INTERNET_PER_CONN_AUTOCONFIG_SECONDARY_URL; GetWindowText(GetDlgItem(hDlg, IDC_CONFIGJS_ADDR), szAutoconfig, sizeof(szAutoconfig)); list.pOptions[1].Value.pszValue = szAutoconfig;
//
// save autoconfig timer
//
list.pOptions[2].dwOption = INTERNET_PER_CONN_AUTOCONFIG_RELOAD_DELAY_MINS; list.pOptions[2].Value.dwValue = 0; if(GetWindowText(GetDlgItem(hDlg, IDC_CONFIGTIMER), szTimerInterval, sizeof(szTimerInterval))) list.pOptions[2].Value.dwValue = StrToInt(szTimerInterval); // update wininet
list.dwOptionCount = 3; InternetSetOption(NULL, INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
// tell wininet that the proxy info has changed
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
delete [] list.pOptions;
return TRUE; }
///////////////////////////////////////////////////////////////////
//
// NAME: AdvAutocnfgProc
//
// SYNOPSIS: Dialog proc for autoconfig dialog
//
////////////////////////////////////////////////////////////////////
INT_PTR CALLBACK AdvAutocnfgDlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam) { LPTSTR pszConn = (LPTSTR) GetWindowLongPtr(hDlg, GWLP_USERDATA);
switch (uMsg) {
case WM_INITDIALOG: AdvAutocnfgDlgInit(hDlg, (LPTSTR)lParam); return FALSE;
case WM_COMMAND: switch (GET_WM_COMMAND_ID(wParam, lParam)) { case IDOK: if(FALSE == AdvAutocnfgDlgOk(hDlg, pszConn)) // something is wrong... don't exit yet
break;
// fall through
case IDCANCEL: return EndDialog(hDlg, 0); } break;
case WM_HELP: // F1
ResWinHelp((HWND) ((LPHELPINFO)lParam)->hItemHandle, IDS_HELPFILE, HELP_WM_HELP, (DWORD_PTR)(LPSTR)mapIDCsToIDHs); break;
case WM_CONTEXTMENU: // right mouse click
ResWinHelp((HWND)wParam, IDS_HELPFILE, HELP_CONTEXTMENU, (DWORD_PTR)(LPSTR)mapIDCsToIDHs); break; }
return FALSE; }
|