Windows2003-3790/inetcore/connectionwizard/icwhelp/refdial.cpp
2020-09-30 16:53:55 +02:00

3828 lines
118 KiB
C++

//**********************************************************************
// File name: RefDial.cpp
//
// Implementation of CRefDial
//
// Functions:
//
// Copyright (c) 1992 - 1999 Microsoft Corporation. All rights reserved.
//**********************************************************************
#include "stdafx.h"
#include "icwhelp.h"
#include "RefDial.h"
#include "appdefs.h"
#include <regstr.h>
#include <urlmon.h>
#include <mshtmhst.h>
const TCHAR c_szCreditsMagicNum[] = TEXT("1 425 555 1212");
const TCHAR c_szRegStrValDigitalPID[] = TEXT("DigitalProductId");
const TCHAR c_szSignedPIDFName[] = TEXT("signed.pid");
const TCHAR c_szRASProfiles[] = TEXT("RemoteAccess\\Profile");
const TCHAR c_szProxyEnable[] = TEXT("ProxyEnable");
TCHAR g_BINTOHEXLookup[16] =
{
TEXT('0'),
TEXT('1'),
TEXT('2'),
TEXT('3'),
TEXT('4'),
TEXT('5'),
TEXT('6'),
TEXT('7'),
TEXT('8'),
TEXT('9'),
TEXT('A'),
TEXT('B'),
TEXT('C'),
TEXT('D'),
TEXT('E'),
TEXT('F')
};
typedef DWORD (WINAPI * GETICWCONNVER) ();
GETICWCONNVER lpfnGetIcwconnVer;
HWND g_hwndRNAApp = NULL;
/////////////////////////////////////////////////////////////////////////////
// CRefDial
HRESULT CRefDial::OnDraw(ATL_DRAWINFO& di)
{
return S_OK;
}
LRESULT CRefDial::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
// Register the RASDIALEVENT message
m_unRasDialMsg = RegisterWindowMessageA( RASDIALEVENT );
if (m_unRasDialMsg == 0)
{
m_unRasDialMsg = WM_RASDIALEVENT;
}
// Make sure the window is hidden
ShowWindow(SW_HIDE);
return 0;
}
LRESULT CRefDial::OnDownloadEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
USES_CONVERSION;
if (uMsg == WM_DOWNLOAD_DONE)
{
DWORD dwThreadResults = STILL_ACTIVE;
int iRetries = 0;
// We keep the RAS connection open here, it must be explicitly
// close by the container (a call DoHangup)
// This code will wait until the download thread exists, and
// collect the download status.
do {
if (!GetExitCodeThread(m_hThread,&dwThreadResults))
{
AssertMsg(0,TEXT("CONNECT:GetExitCodeThread failed.\n"));
}
iRetries++;
if (dwThreadResults == STILL_ACTIVE)
Sleep(500);
} while (dwThreadResults == STILL_ACTIVE && iRetries < MAX_EXIT_RETRIES);
// See if there is an URL to pass to the container
BSTR bstrURL;
if (m_szRefServerURL[0] != TEXT('\0'))
bstrURL = (BSTR)A2BSTR(m_szRefServerURL);
else
bstrURL = NULL;
m_RasStatusID = IDS_DOWNLOAD_COMPLETE;
Fire_DownloadComplete(bstrURL, dwThreadResults);
// The download is complete now, so we reset this to TRUE, so the RAS
// event handler does not get confused
m_bDownloadHasBeenCanceled = TRUE;
// Free any memory allocated above during the conversion
SysFreeString(bstrURL);
}
else if (uMsg == WM_DOWNLOAD_PROGRESS)
{
// Fire a progress event to the container
m_RasStatusID = IDS_DOWNLOADING;
Fire_DownloadProgress((long)wParam);
}
return 0;
}
static const TCHAR szRnaAppWindowClass[] = _T("#32770"); // hard coded dialog class name
BOOL NeedZapperEx(void)
{
OSVERSIONINFO oi;
memset(&oi, 0, sizeof(oi));
oi.dwOSVersionInfoSize = sizeof(oi);
if( GetVersionEx(&oi) &&
(oi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS) &&
(oi.dwMajorVersion==4) &&
(oi.dwMinorVersion==0) &&
(LOWORD(oi.dwBuildNumber) <= 1070) )
return TRUE;
else
return FALSE;
}
void GetRNAWindowEx()
{
TCHAR szTitle[MAX_PATH] = TEXT("\0");
if (!LoadString(_Module.GetModuleInstance(), IDS_CONNECTED, szTitle, ARRAYSIZE(szTitle)))
lstrcpy(szTitle , _T("Connected To "));
g_hwndRNAApp = FindWindow(szRnaAppWindowClass, szTitle);
}
BOOL MinimizeRNAWindowEx()
{
if(g_hwndRNAApp)
{
// Get the main frame window's style
LONG window_style = GetWindowLong(g_hwndRNAApp, GWL_STYLE);
//Remove the system menu from the window's style
window_style |= WS_MINIMIZE;
//set the style attribute of the main frame window
SetWindowLong(g_hwndRNAApp, GWL_STYLE, window_style);
ShowWindow(g_hwndRNAApp, SW_MINIMIZE);
return TRUE;
}
return FALSE;
}
LRESULT CRefDial::OnRasDialEvent(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
RNAAPI* pcRNA;
TraceMsg(TF_GENERAL, TEXT("ICWHELP: Ras event %u error code (%ld)\n"),wParam,lParam);
TCHAR dzRasError[10];
wsprintf(dzRasError,TEXT("%d %d"),wParam,lParam);
RegSetValue(HKEY_LOCAL_MACHINE,TEXT("Software\\Microsoft\\iSignUp"),REG_SZ,dzRasError,lstrlen(dzRasError)+1);
// In NT4, it gives wParma with error code in lParam rather than a
// actual wParam message
if (lParam)
{
wParam = RASCS_Disconnected;
}
m_RasStatusID = 0;
switch(wParam)
{
case RASCS_OpenPort:
m_RasStatusID = IDS_RAS_OPENPORT;
break;
case RASCS_PortOpened:
m_RasStatusID = IDS_RAS_PORTOPENED;
break;
case RASCS_ConnectDevice:
m_RasStatusID = IDS_RAS_DIALING;
break;
case RASCS_DeviceConnected:
m_RasStatusID = IDS_RAS_CONNECTED;
break;
case RASCS_AllDevicesConnected:
m_RasStatusID = IDS_RAS_CONNECTED;
break;
case RASCS_Authenticate:
m_RasStatusID = IDS_RAS_CONNECTING;
break;
case RASCS_StartAuthentication:
case RASCS_LogonNetwork:
m_RasStatusID = IDS_RAS_LOCATING;
break;
case RASCS_Connected:
{
m_RasStatusID = IDS_RAS_CONNECTED;
//
// Hide RNA window on Win95 retail
//
if (NeedZapperEx())
GetRNAWindowEx();
break;
}
case RASCS_Disconnected:
// Normandy 13184 - ChrisK 1-9-97
m_RasStatusID = IDS_RAS_HANGINGUP;
IF_NTONLY
// jmazner Normandy #5603 ported from ChrisK's fix in icwdial
// There is a possibility that we will get multiple disconnects in NT
// and we only want to handle the first one. Note: the flag is reset
// in the INITIALIZE event, so we should handle 1 disconnect per instance
// of the dialog.
if (m_bDisconnect)
break;
else
m_bDisconnect = TRUE;
ENDIF_NTONLY
//
// If we are in the middle of a download, cancel the it!
//
//
// ChrisK 5240 Olympus
// Only the thread that creates the dwDownload should invalidate it
// so we need another method to track if the cancel button has been
// pressed.
//
if (!m_bDownloadHasBeenCanceled)
{
HINSTANCE hDLDLL = LoadLibrary(DOWNLOAD_LIBRARY);
if (hDLDLL)
{
FARPROC fp = GetProcAddress(hDLDLL,DOWNLOADCANCEL);
if(fp)
((PFNDOWNLOADCANCEL)fp)(m_dwDownLoad);
FreeLibrary(hDLDLL);
hDLDLL = NULL;
m_bDownloadHasBeenCanceled = TRUE;
}
}
// If we get a disconnected status from the RAS server, then
// hangup the modem here
if (m_hrasconn)
{
pcRNA = new RNAAPI;
if (pcRNA)
{
pcRNA->RasHangUp(m_hrasconn);
m_hrasconn = NULL;
delete pcRNA;
pcRNA = NULL;
}
}
break;
}
// Fire the event to the container.
Fire_RasDialStatus((USHORT)wParam);
// If we are connected then fire an event telling the container
// that we are ready
if (wParam == RASCS_Connected)
Fire_RasConnectComplete(TRUE);
else if (wParam == RASCS_Disconnected)
{
m_hrDialErr = (HRESULT)lParam;
Fire_RasConnectComplete(FALSE);
}
return 0;
}
STDMETHODIMP CRefDial::get_DownloadStatusString(BSTR * pVal)
{
USES_CONVERSION;
if (pVal == NULL)
return E_POINTER;
if (m_DownloadStatusID)
*pVal = (BSTR)A2BSTR(GetSz((USHORT)m_DownloadStatusID));
else
*pVal = (BSTR)A2BSTR(TEXT(""));
return S_OK;
}
/******************************************************************************
// These functions come from the existing ICW code and are use to setup a
// connectiod to the referral server, dial it, and perform the download.
******************************************************************************/
//+----------------------------------------------------------------------------
// Function: ReadConnectionInformation
//
// Synopsis: Read the contents from the ISP file
//
// Arguments: none
//
// Returns: error value - ERROR_SUCCESS = succes
//
// History: 1/9/98 DONALDM Adapted from ICW 1.x
//-----------------------------------------------------------------------------
DWORD CRefDial::ReadConnectionInformation(void)
{
USES_CONVERSION;
DWORD hr;
TCHAR szUserName[UNLEN+1];
TCHAR szPassword[PWLEN+1];
LPTSTR pszTemp;
BOOL bReboot;
LPTSTR lpRunOnceCmd;
bReboot = FALSE;
lpRunOnceCmd = NULL;
//
// Get the name of DUN file from ISP file, if there is one.
//
TCHAR pszDunFile[MAX_PATH];
#ifdef UNICODE
hr = GetDataFromISPFile(m_bstrISPFile,INF_SECTION_ISPINFO, INF_DUN_FILE, pszDunFile,MAX_PATH);
#else
hr = GetDataFromISPFile(OLE2A(m_bstrISPFile),INF_SECTION_ISPINFO, INF_DUN_FILE, pszDunFile,MAX_PATH);
#endif
if (ERROR_SUCCESS == hr)
{
//
// Get the full path to the DUN File
//
TCHAR szTempPath[MAX_PATH];
lstrcpy(szTempPath,pszDunFile);
if (!(hr = SearchPath(NULL,szTempPath,NULL,MAX_PATH,pszDunFile,&pszTemp)))
{
ErrorMsg1(m_hWnd, IDS_CANTREADTHISFILE, CharUpper(pszDunFile));
goto ReadConnectionInformationExit;
}
//
// save current DUN file name in global (for ourself)
//
lstrcpy(m_szCurrentDUNFile, pszDunFile);
}
//
// Read the DUN/ISP file File
//
hr = m_ISPImport.ImportConnection(m_szCurrentDUNFile[0] != '\0' ? m_szCurrentDUNFile : OLE2A(m_bstrISPFile),
m_szISPSupportNumber,
m_szEntryName,
szUserName,
szPassword,
&bReboot);
if ((VER_PLATFORM_WIN32_NT == g_dwPlatform) && (ERROR_INVALID_PARAMETER == hr))
{
// If there are only dial-out entries configured on NT, we get
// ERROR_INVALID_PARAMETER returned from RasSetEntryProperties,
// which InetConfigClient returns to ImportConnection which
// returns it to us. If we get this error, we want to display
// a different error instructing the user to configure a modem
// for dial-out.
MessageBox(GetSz(IDS_NODIALOUT),
GetSz(IDS_TITLE),
MB_ICONERROR | MB_OK | MB_APPLMODAL);
goto ReadConnectionInformationExit;
}
else
if (ERROR_CANNOT_FIND_PHONEBOOK_ENTRY == hr)
{
//
// The disk is full, or something is wrong with the
// phone book file
MessageBox(GetSz(IDS_NOPHONEENTRY),
GetSz(IDS_TITLE),
MB_ICONERROR | MB_OK | MB_APPLMODAL);
goto ReadConnectionInformationExit;
}
else if (hr == ERROR_CANCELLED)
{
TraceMsg(TF_GENERAL, TEXT("ICWHELP: User cancelled, quitting.\n"));
goto ReadConnectionInformationExit;
}
else if (hr == ERROR_RETRY)
{
TraceMsg(TF_GENERAL, TEXT("ICWHELP: User retrying.\n"));
goto ReadConnectionInformationExit;
}
else if (hr != ERROR_SUCCESS)
{
ErrorMsg1(m_hWnd, IDS_CANTREADTHISFILE, CharUpper(pszDunFile));
goto ReadConnectionInformationExit;
}
else
{
//
// place the name of the connectoid in the registry
//
if (ERROR_SUCCESS != (hr = StoreInSignUpReg((LPBYTE)m_szEntryName, lstrlen(m_szEntryName)+1, REG_SZ, RASENTRYVALUENAME)))
{
MsgBox(IDS_CANTSAVEKEY,MB_MYERROR);
goto ReadConnectionInformationExit;
}
}
AssertMsg(!bReboot, TEXT("ICWHELP: We should never reboot here.\r\n"));
ReadConnectionInformationExit:
return hr;
}
HRESULT CRefDial::GetDisplayableNumber()
{
HRESULT hr = ERROR_SUCCESS;
LPRASENTRY lpRasEntry = NULL;
LPRASDEVINFO lpRasDevInfo = NULL;
DWORD dwRasEntrySize = 0;
DWORD dwRasDevInfoSize = 0;
RNAAPI *pcRNA = NULL;
LPLINETRANSLATEOUTPUT lpOutput1 = NULL;
DWORD dwNumDev;
LPLINETRANSLATEOUTPUT lpOutput2;
LPLINEEXTENSIONID lpExtensionID = NULL;
//
// Get phone number from connectoid
//
hr = MyRasGetEntryProperties(NULL,
m_szConnectoid,
&lpRasEntry,
&dwRasEntrySize,
&lpRasDevInfo,
&dwRasDevInfoSize);
if (hr != ERROR_SUCCESS || NULL == lpRasEntry)
{
goto GetDisplayableNumberExit;
}
//
// If this is a dial as is number, just get it from the structure
//
m_bDialAsIs = !(lpRasEntry->dwfOptions & RASEO_UseCountryAndAreaCodes);
if (m_bDialAsIs)
{
if (m_pszDisplayable) GlobalFree(m_pszDisplayable);
m_pszDisplayable = (LPTSTR)GlobalAlloc(GPTR, sizeof(TCHAR)*(lstrlen(lpRasEntry->szLocalPhoneNumber)+1));
if (!m_pszDisplayable)
{
hr = ERROR_NOT_ENOUGH_MEMORY;
goto GetDisplayableNumberExit;
}
lstrcpy(m_szPhoneNumber, lpRasEntry->szLocalPhoneNumber);
lstrcpy(m_pszDisplayable, lpRasEntry->szLocalPhoneNumber);
TCHAR szAreaCode[MAX_AREACODE+1];
TCHAR szCountryCode[8];
if (SUCCEEDED(tapiGetLocationInfo(szCountryCode,szAreaCode)))
{
if (szCountryCode[0] != '\0')
m_dwCountryCode = _ttoi(szCountryCode);
else
m_dwCountryCode = 1;
}
else
{
m_dwCountryCode = 1;
}
}
else
{
//
// If there is no area code, don't use parentheses
//
if (lpRasEntry->szAreaCode[0])
wsprintf(m_szPhoneNumber,TEXT("+%lu (%s) %s\0"),lpRasEntry->dwCountryCode,
lpRasEntry->szAreaCode,lpRasEntry->szLocalPhoneNumber);
else
wsprintf(m_szPhoneNumber,TEXT("+%lu %s\0"),lpRasEntry->dwCountryCode,
lpRasEntry->szLocalPhoneNumber);
//
// Initialize TAPIness
//
dwNumDev = 0;
hr = lineInitialize(&m_hLineApp,_Module.GetModuleInstance(),LineCallback,(LPSTR)NULL,&dwNumDev);
if (hr != ERROR_SUCCESS)
goto GetDisplayableNumberExit;
lpExtensionID = (LPLINEEXTENSIONID )GlobalAlloc(GPTR,sizeof(LINEEXTENSIONID));
if (!lpExtensionID)
{
hr = ERROR_NOT_ENOUGH_MEMORY;
goto GetDisplayableNumberExit;
}
if (m_dwTapiDev == 0xFFFFFFFF)
{
m_dwTapiDev = 0;
}
//
// ChrisK Olympus 5558 6/11/97
// PPTP device will choke the version negotiating
//
do {
hr = lineNegotiateAPIVersion(m_hLineApp, m_dwTapiDev, 0x00010004, 0x00010004,
&m_dwAPIVersion, lpExtensionID);
} while (hr != ERROR_SUCCESS && m_dwTapiDev++ < dwNumDev - 1);
if (m_dwTapiDev >= dwNumDev)
{
m_dwTapiDev = 0;
}
// ditch it since we don't use it
//
if (lpExtensionID) GlobalFree(lpExtensionID);
lpExtensionID = NULL;
if (hr != ERROR_SUCCESS)
goto GetDisplayableNumberExit;
// Format the phone number
//
lpOutput1 = (LPLINETRANSLATEOUTPUT)GlobalAlloc(GPTR,sizeof(LINETRANSLATEOUTPUT));
if (!lpOutput1)
{
hr = ERROR_NOT_ENOUGH_MEMORY;
goto GetDisplayableNumberExit;
}
lpOutput1->dwTotalSize = sizeof(LINETRANSLATEOUTPUT);
// Turn the canonical form into the "displayable" form
//
hr = lineTranslateAddress(m_hLineApp,m_dwTapiDev,m_dwAPIVersion,
m_szPhoneNumber,0,
LINETRANSLATEOPTION_CANCELCALLWAITING,
lpOutput1);
if (hr != ERROR_SUCCESS || (lpOutput1->dwNeededSize != lpOutput1->dwTotalSize))
{
lpOutput2 = (LPLINETRANSLATEOUTPUT)GlobalAlloc(GPTR, (size_t)lpOutput1->dwNeededSize);
if (!lpOutput2)
{
hr = ERROR_NOT_ENOUGH_MEMORY;
goto GetDisplayableNumberExit;
}
lpOutput2->dwTotalSize = lpOutput1->dwNeededSize;
GlobalFree(lpOutput1);
lpOutput1 = lpOutput2;
lpOutput2 = NULL;
hr = lineTranslateAddress(m_hLineApp,m_dwTapiDev,
m_dwAPIVersion,m_szPhoneNumber,0,
LINETRANSLATEOPTION_CANCELCALLWAITING,
lpOutput1);
}
if (hr != ERROR_SUCCESS)
{
goto GetDisplayableNumberExit;
}
m_pszDisplayable = (LPTSTR)GlobalAlloc(GPTR, ((size_t)lpOutput1->dwDisplayableStringSize+1));
if (!m_pszDisplayable)
{
hr = ERROR_NOT_ENOUGH_MEMORY;
goto GetDisplayableNumberExit;
}
lstrcpyn(m_pszDisplayable,
(LPTSTR)&((LPBYTE)lpOutput1)[lpOutput1->dwDisplayableStringOffset],
(int)lpOutput1->dwDisplayableStringSize);
TCHAR szAreaCode[MAX_AREACODE+1];
TCHAR szCountryCode[8];
if (SUCCEEDED(tapiGetLocationInfo(szCountryCode,szAreaCode)))
{
if (szCountryCode[0] != '\0')
m_dwCountryCode = _ttoi(szCountryCode);
else
m_dwCountryCode = 1;
}
else
{
m_dwCountryCode = 1;
}
}
GetDisplayableNumberExit:
if (lpOutput1) GlobalFree(lpOutput1);
if (m_hLineApp) lineShutdown(m_hLineApp);
return hr;
}
typedef DWORD (WINAPI* PFNRASDIALA)(LPRASDIALEXTENSIONS,LPSTR,LPRASDIALPARAMSA,DWORD,LPVOID,LPHRASCONN);
DWORD CRefDial::MyRasDial
(
LPRASDIALEXTENSIONS lpRasDialExtensions,
LPTSTR lpszPhonebook,
LPRASDIALPARAMS lpRasDialParams,
DWORD dwNotifierType,
LPVOID lpvNotifier,
LPHRASCONN lphRasConn
)
{
HRESULT hr;
if (!m_hRasDll)
m_hRasDll = LoadLibrary(TEXT("RasApi32.dll"));
if (!m_hRasDll)
{
hr = GetLastError();
goto MyRasDialExit;
}
if (m_hRasDll && !m_fpRasDial)
m_fpRasDial = GetProcAddress(m_hRasDll,"RasDialA");
if (!m_fpRasDial)
{
hr = GetLastError();
goto MyRasDialExit;
}
if (m_fpRasDial)
{
#ifdef UNICODE
// RasDialW version always fails to connect.
// I don't know why. So I want to call RasDialA even if this is UNICODE build.
RASDIALPARAMSA RasDialParams;
RasDialParams.dwSize = sizeof(RASDIALPARAMSA);
wcstombs(RasDialParams.szEntryName, lpRasDialParams->szEntryName, RAS_MaxEntryName+1);
wcstombs(RasDialParams.szPhoneNumber, lpRasDialParams->szPhoneNumber, RAS_MaxPhoneNumber+1);
wcstombs(RasDialParams.szCallbackNumber, lpRasDialParams->szCallbackNumber, RAS_MaxCallbackNumber+1);
wcstombs(RasDialParams.szUserName, lpRasDialParams->szUserName, UNLEN+1);
wcstombs(RasDialParams.szPassword, lpRasDialParams->szPassword, PWLEN+1);
wcstombs(RasDialParams.szDomain, lpRasDialParams->szDomain, DNLEN+1);
hr = ((PFNRASDIALA)m_fpRasDial)(lpRasDialExtensions,NULL,
&RasDialParams,
dwNotifierType,
(LPVOID) lpvNotifier,
lphRasConn);
#else
hr = ((PFNRASDIAL)m_fpRasDial)(lpRasDialExtensions,lpszPhonebook,
lpRasDialParams,
dwNotifierType,
(LPVOID) lpvNotifier,
lphRasConn);
#endif
Assert(hr == ERROR_SUCCESS);
}
MyRasDialExit:
return hr;
}
DWORD CRefDial::MyRasGetEntryDialParams
(
LPTSTR lpszPhonebook,
LPRASDIALPARAMS lprasdialparams,
LPBOOL lpfPassword
)
{
HRESULT hr;
if (!m_hRasDll)
m_hRasDll = LoadLibrary(TEXT("RasApi32.dll"));
if (!m_hRasDll)
{
hr = GetLastError();
goto MyRasGetEntryDialParamsExit;
}
if (m_hRasDll && !m_fpRasGetEntryDialParams)
#ifdef UNICODE
m_fpRasGetEntryDialParams = GetProcAddress(m_hRasDll,"RasGetEntryDialParamsW");
#else
m_fpRasGetEntryDialParams = GetProcAddress(m_hRasDll,"RasGetEntryDialParamsA");
#endif
if (!m_fpRasGetEntryDialParams)
{
hr = GetLastError();
goto MyRasGetEntryDialParamsExit;
}
if (m_fpRasGetEntryDialParams)
hr = ((PFNRASGETENTRYDIALPARAMS)m_fpRasGetEntryDialParams)(lpszPhonebook,lprasdialparams,lpfPassword);
MyRasGetEntryDialParamsExit:
return hr;
}
BOOL CRefDial::FShouldRetry(HRESULT hrErr)
{
BOOL bRC;
m_uiRetry++;
if (hrErr == ERROR_LINE_BUSY ||
hrErr == ERROR_VOICE_ANSWER ||
hrErr == ERROR_NO_ANSWER ||
hrErr == ERROR_NO_CARRIER ||
hrErr == ERROR_AUTHENTICATION_FAILURE ||
hrErr == ERROR_PPP_TIMEOUT ||
hrErr == ERROR_REMOTE_DISCONNECTION ||
hrErr == ERROR_AUTH_INTERNAL ||
hrErr == ERROR_PROTOCOL_NOT_CONFIGURED ||
hrErr == ERROR_PPP_NO_PROTOCOLS_CONFIGURED)
{
bRC = TRUE;
} else {
bRC = FALSE;
}
bRC = bRC && m_uiRetry < MAX_RETIES;
return bRC;
}
// This function will perform the actual dialing
STDMETHODIMP CRefDial::DoConnect(BOOL * pbRetVal)
{
USES_CONVERSION;
TCHAR szPassword[PWLEN+2];
LPRASDIALPARAMS lpRasDialParams = NULL;
LPRASDIALEXTENSIONS lpRasDialExtentions = NULL;
HRESULT hr = ERROR_SUCCESS;
BOOL bPW;
// Initialize the dial error member
m_hrDialErr = ERROR_SUCCESS;
// Get connectoid information
//
lpRasDialParams = (LPRASDIALPARAMS)GlobalAlloc(GPTR,sizeof(RASDIALPARAMS));
if (!lpRasDialParams)
{
hr = ERROR_NOT_ENOUGH_MEMORY;
goto DialExit;
}
lpRasDialParams->dwSize = sizeof(RASDIALPARAMS);
lstrcpyn(lpRasDialParams->szEntryName,m_szConnectoid,ARRAYSIZE(lpRasDialParams->szEntryName));
bPW = FALSE;
hr = MyRasGetEntryDialParams(NULL,lpRasDialParams,&bPW);
if (hr != ERROR_SUCCESS)
{
goto DialExit;
}
//
// This is only used on WINNT
//
lpRasDialExtentions = (LPRASDIALEXTENSIONS)GlobalAlloc(GPTR,sizeof(RASDIALEXTENSIONS));
if (lpRasDialExtentions)
{
lpRasDialExtentions->dwSize = sizeof(RASDIALEXTENSIONS);
lpRasDialExtentions->dwfOptions = RDEOPT_UsePrefixSuffix;
}
//
// Add the user's password
//
szPassword[0] = 0;
GetPrivateProfileString(INFFILE_USER_SECTION,
INFFILE_PASSWORD,
NULLSZ,
szPassword,
PWLEN + 1,
m_szCurrentDUNFile[0] != '\0'? m_szCurrentDUNFile : OLE2A(m_bstrISPFile));
if(szPassword[0])
lstrcpy(lpRasDialParams->szPassword, szPassword);
//
// Dial connectoid
//
//Fix for redialing, on win9x we need to make sure we "hangup"
//and free the rna resources in case we are redialing.
//NT - is smart enough not to need it but it won't hurt.
if (m_pcRNA)
m_pcRNA->RasHangUp(m_hrasconn);
m_hrasconn = NULL;
#if defined(DEBUG)
if (FCampusNetOverride())
{
m_bModemOverride = TRUE;
}
#endif
if (m_bModemOverride)
{
// Skip dialing because the server is on the campus network
//
PostMessage(RegisterWindowMessageA(RASDIALEVENT),RASCS_Connected,0);
hr = ERROR_SUCCESS;
}
else
hr = MyRasDial(lpRasDialExtentions,NULL,lpRasDialParams,0xFFFFFFFF, m_hWnd,
&m_hrasconn);
m_bModemOverride = FALSE;
if (( hr != ERROR_SUCCESS) || m_bWaitingToHangup)
{
// We failed to connect for some reason, so hangup
if (m_hrasconn)
{
if (!m_pcRNA) m_pcRNA = new RNAAPI;
if (!m_pcRNA)
{
MsgBox(IDS_OUTOFMEMORY,MB_MYERROR);
} else {
m_pcRNA->RasHangUp(m_hrasconn);
m_bWaitingToHangup = FALSE;
m_hrasconn = NULL;
}
}
goto DialExit;
}
if (lpRasDialParams)
GlobalFree(lpRasDialParams);
lpRasDialParams = NULL;
DialExit:
if (lpRasDialExtentions)
GlobalFree(lpRasDialExtentions);
lpRasDialExtentions = NULL;
// Set the return value for the method
if (hr != ERROR_SUCCESS)
*pbRetVal = FALSE;
else
*pbRetVal = TRUE;
m_hrDialErr = hr;
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Function: MyRasGetEntryProperties()
//
// Synopsis: Performs some buffer size checks and then calls RasGetEntryProperties()
// See the RasGetEntryProperties() docs to understand why this is needed.
//
// Arguments: Same as RasGetEntryProperties with the following exceptions:
// lplpRasEntryBuff -- pointer to a pointer to a RASENTRY struct. On successfull
// return, *lplpRasEntryBuff will point to the RASENTRY struct
// and buffer returned by RasGetEntryProperties.
// NOTE: should not have memory allocated to it at call time!
// To emphasize this point, *lplpRasEntryBuff must be NULL
// lplpRasDevInfoBuff -- pointer to a pointer to a RASDEVINFO struct. On successfull
// return, *lplpRasDevInfoBuff will point to the RASDEVINFO struct
// and buffer returned by RasGetEntryProperties.
// NOTE: should not have memory allocated to it at call time!
// To emphasize this point, *lplpRasDevInfoBuff must be NULL
// NOTE: Even on a successfull call to RasGetEntryProperties,
// *lplpRasDevInfoBuff may return with a value of NULL
// (occurs when there is no extra device info)
//
// Returns: ERROR_NOT_ENOUGH_MEMORY if unable to allocate either RASENTRY or RASDEVINFO buffer
// Otherwise, it retuns the error code from the call to RasGetEntryProperties.
// NOTE: if return is anything other than ERROR_SUCCESS, *lplpRasDevInfoBuff and
// *lplpRasEntryBuff will be NULL,
// and *lpdwRasEntryBuffSize and *lpdwRasDevInfoBuffSize will be 0
//
// Example:
//
// LPRASENTRY lpRasEntry = NULL;
// LPRASDEVINFO lpRasDevInfo = NULL;
// DWORD dwRasEntrySize, dwRasDevInfoSize;
//
// hr = MyRasGetEntryProperties( NULL,
// g_pcDialErr->m_szConnectoid,
// &lpRasEntry,
// &dwRasEntrySize,
// &lpRasDevInfo,
// &dwRasDevInfoSize);
//
//
// if (hr != ERROR_SUCCESS)
// {
// //handle errors here
// } else
// {
// //continue processing
// }
//
//
// History: 9/10/96 JMazner Created for icwconn2
// 9/17/96 JMazner Adapted for icwconn1
// 1/8/98 DONALDM Moved to the new ICW/GetConn project
//----------------------------------------------------------------------------
HRESULT CRefDial::MyRasGetEntryProperties(LPTSTR lpszPhonebookFile,
LPTSTR lpszPhonebookEntry,
LPRASENTRY *lplpRasEntryBuff,
LPDWORD lpdwRasEntryBuffSize,
LPRASDEVINFO *lplpRasDevInfoBuff,
LPDWORD lpdwRasDevInfoBuffSize)
{
HRESULT hr;
RNAAPI *pcRNA = NULL;
DWORD dwOldDevInfoBuffSize;
Assert( NULL != lplpRasEntryBuff );
Assert( NULL != lpdwRasEntryBuffSize );
Assert( NULL != lplpRasDevInfoBuff );
Assert( NULL != lpdwRasDevInfoBuffSize );
*lpdwRasEntryBuffSize = 0;
*lpdwRasDevInfoBuffSize = 0;
pcRNA = new RNAAPI;
if (!pcRNA)
{
hr = ERROR_NOT_ENOUGH_MEMORY;
goto MyRasGetEntryPropertiesErrExit;
}
// use RasGetEntryProperties with a NULL lpRasEntry pointer to find out size buffer we need
// As per the docs' recommendation, do the same with a NULL lpRasDevInfo pointer.
hr = pcRNA->RasGetEntryProperties(lpszPhonebookFile, lpszPhonebookEntry,
(LPBYTE) NULL,
lpdwRasEntryBuffSize,
(LPBYTE) NULL,
lpdwRasDevInfoBuffSize);
// we expect the above call to fail because the buffer size is 0
// If it doesn't fail, that means our RasEntry is messed, so we're in trouble
if( ERROR_BUFFER_TOO_SMALL != hr )
{
goto MyRasGetEntryPropertiesErrExit;
}
// dwRasEntryBuffSize and dwRasDevInfoBuffSize now contain the size needed for their
// respective buffers, so allocate the memory for them
// dwRasEntryBuffSize should never be less than the size of the RASENTRY struct.
// If it is, we'll run into problems sticking values into the struct's fields
Assert( *lpdwRasEntryBuffSize >= sizeof(RASENTRY) );
if (m_reflpRasEntryBuff)
{
if (*lpdwRasEntryBuffSize > m_reflpRasEntryBuff->dwSize)
{
LPRASENTRY pTemp = m_reflpRasEntryBuff;
m_reflpRasEntryBuff = (LPRASENTRY)GlobalReAlloc(pTemp, *lpdwRasEntryBuffSize, GPTR);
if (m_reflpRasEntryBuff == NULL)
{
GlobalFree(pTemp);
}
}
}
else
{
m_reflpRasEntryBuff = (LPRASENTRY)GlobalAlloc(GPTR,*lpdwRasEntryBuffSize);
}
if (!m_reflpRasEntryBuff)
{
hr = ERROR_NOT_ENOUGH_MEMORY;
goto MyRasGetEntryPropertiesErrExit;
}
// This is a bit convoluted: lpRasEntrySize->dwSize needs to contain the size of _only_ the
// RASENTRY structure, and _not_ the actual size of the buffer that lpRasEntrySize points to.
// This is because the dwSize field is used by RAS for compatability purposes to determine which
// version of the RASENTRY struct we're using.
// Same holds for lpRasDevInfo->dwSize
m_reflpRasEntryBuff->dwSize = sizeof(RASENTRY);
//
// Allocate the DeviceInfo size that RasGetEntryProperties told us we needed.
// If size is 0, don't alloc anything
//
if( *lpdwRasDevInfoBuffSize > 0 )
{
Assert( *lpdwRasDevInfoBuffSize >= sizeof(RASDEVINFO) );
if (m_reflpRasDevInfoBuff)
{
// check if existing size is not sufficient
if ( *lpdwRasDevInfoBuffSize > m_reflpRasDevInfoBuff->dwSize )
{
LPRASDEVINFO pTemp = m_reflpRasDevInfoBuff;
m_reflpRasDevInfoBuff = (LPRASDEVINFO)GlobalReAlloc(pTemp,*lpdwRasDevInfoBuffSize, GPTR);
if (m_reflpRasDevInfoBuff == NULL)
{
GlobalFree(pTemp);
}
}
}
else
{
m_reflpRasDevInfoBuff = (LPRASDEVINFO)GlobalAlloc(GPTR,*lpdwRasDevInfoBuffSize);
}
if (!m_reflpRasDevInfoBuff)
{
hr = ERROR_NOT_ENOUGH_MEMORY;
goto MyRasGetEntryPropertiesErrExit;
}
}
else
{
m_reflpRasDevInfoBuff = NULL;
}
if( m_reflpRasDevInfoBuff )
{
m_reflpRasDevInfoBuff->dwSize = sizeof(RASDEVINFO);
}
// now we're ready to make the actual call...
// jmazner see below for why this is needed
dwOldDevInfoBuffSize = *lpdwRasDevInfoBuffSize;
hr = pcRNA->RasGetEntryProperties(lpszPhonebookFile, lpszPhonebookEntry,
(LPBYTE) m_reflpRasEntryBuff,
lpdwRasEntryBuffSize,
(LPBYTE) m_reflpRasDevInfoBuff,
lpdwRasDevInfoBuffSize);
// jmazner 10/7/96 Normandy #8763
// For unknown reasons, in some cases on win95, devInfoBuffSize increases after the above call,
// but the return code indicates success, not BUFFER_TOO_SMALL. If this happens, set the
// size back to what it was before the call, so the DevInfoBuffSize and the actuall space allocated
// for the DevInfoBuff match on exit.
if( (ERROR_SUCCESS == hr) && (dwOldDevInfoBuffSize != *lpdwRasDevInfoBuffSize) )
{
*lpdwRasDevInfoBuffSize = dwOldDevInfoBuffSize;
}
if( pcRNA )
{
delete pcRNA;
pcRNA = NULL;
}
*lplpRasEntryBuff = m_reflpRasEntryBuff;
*lplpRasDevInfoBuff = m_reflpRasDevInfoBuff;
return( hr );
MyRasGetEntryPropertiesErrExit:
if(m_reflpRasEntryBuff)
{
GlobalFree(m_reflpRasEntryBuff);
m_reflpRasEntryBuff = NULL;
*lplpRasEntryBuff = NULL;
}
if(m_reflpRasDevInfoBuff)
{
GlobalFree(m_reflpRasDevInfoBuff);
m_reflpRasDevInfoBuff = NULL;
*lplpRasDevInfoBuff = NULL;
}
if( pcRNA )
{
delete pcRNA;
pcRNA = NULL;
}
*lpdwRasEntryBuffSize = 0;
*lpdwRasDevInfoBuffSize = 0;
return( hr );
}
//+---------------------------------------------------------------------------
//
// Function: LineCallback()
//
// Synopsis: Call back for TAPI line
//
//+---------------------------------------------------------------------------
void CALLBACK LineCallback(DWORD hDevice,
DWORD dwMessage,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwParam3)
{
}
HRESULT MyGetFileVersion(LPCTSTR pszFileName, LPGATHERINFO lpGatherInfo)
{
HRESULT hr = ERROR_NOT_ENOUGH_MEMORY;
DWORD dwSize = 0;
DWORD dwTemp = 0;
LPVOID pv = NULL, pvVerInfo = NULL;
UINT uiSize;
DWORD dwVerPiece;
//int idx;
// verify parameters
//
Assert(pszFileName && lpGatherInfo);
// Get version
//
dwSize = GetFileVersionInfoSize((LPTSTR)pszFileName,&dwTemp);
if (!dwSize)
{
hr = GetLastError();
goto MyGetFileVersionExit;
}
pv = (LPVOID)GlobalAlloc(GPTR, (size_t)dwSize);
if (!pv) goto MyGetFileVersionExit;
if (!GetFileVersionInfo((LPTSTR)pszFileName,dwTemp,dwSize,pv))
{
hr = GetLastError();
goto MyGetFileVersionExit;
}
if (!VerQueryValue(pv,TEXT("\\\0"),&pvVerInfo,&uiSize))
{
hr = GetLastError();
goto MyGetFileVersionExit;
}
pvVerInfo = (LPVOID)((DWORD_PTR)pvVerInfo + sizeof(DWORD)*4);
lpGatherInfo->m_szSUVersion[0] = '\0';
dwVerPiece = (*((LPDWORD)pvVerInfo)) >> 16;
wsprintf(lpGatherInfo->m_szSUVersion,TEXT("%d."),dwVerPiece);
dwVerPiece = (*((LPDWORD)pvVerInfo)) & 0x0000ffff;
wsprintf(lpGatherInfo->m_szSUVersion,TEXT("%s%d."),lpGatherInfo->m_szSUVersion,dwVerPiece);
dwVerPiece = (((LPDWORD)pvVerInfo)[1]) >> 16;
wsprintf(lpGatherInfo->m_szSUVersion,TEXT("%s%d."),lpGatherInfo->m_szSUVersion,dwVerPiece);
dwVerPiece = (((LPDWORD)pvVerInfo)[1]) & 0x0000ffff;
wsprintf(lpGatherInfo->m_szSUVersion,TEXT("%s%d"),lpGatherInfo->m_szSUVersion,dwVerPiece);
if (!VerQueryValue(pv,TEXT("\\VarFileInfo\\Translation"),&pvVerInfo,&uiSize))
{
hr = GetLastError();
goto MyGetFileVersionExit;
}
// separate version information from character set
lpGatherInfo->m_lcidApps = (LCID)(LOWORD(*(DWORD*)pvVerInfo));
hr = ERROR_SUCCESS;
MyGetFileVersionExit:
if (pv) GlobalFree(pv);
return hr;
}
DWORD CRefDial::FillGatherInfoStruct(LPGATHERINFO lpGatherInfo)
{
USES_CONVERSION;
HKEY hkey = NULL;
SYSTEM_INFO si;
TCHAR szTempPath[MAX_PATH];
DWORD dwRet = ERROR_SUCCESS;
lpGatherInfo->m_lcidUser = GetUserDefaultLCID();
lpGatherInfo->m_lcidSys = GetSystemDefaultLCID();
OSVERSIONINFO osvi;
ZeroMemory(&osvi,sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (!GetVersionEx(&osvi))
{
// Nevermind, we'll just assume the version is 0.0 if we can't read it
//
ZeroMemory(&osvi,sizeof(OSVERSIONINFO));
}
lpGatherInfo->m_dwOS = osvi.dwPlatformId;
lpGatherInfo->m_dwMajorVersion = osvi.dwMajorVersion;
lpGatherInfo->m_dwMinorVersion = osvi.dwMinorVersion;
ZeroMemory(&si,sizeof(SYSTEM_INFO));
GetSystemInfo(&si);
lpGatherInfo->m_wArchitecture = si.wProcessorArchitecture;
// Sign-up version
//
lpGatherInfo->m_szSUVersion[0] = '\0';
if( GetModuleFileName(_Module.GetModuleInstance(), szTempPath, MAX_PATH))
{
if ((MyGetFileVersion(szTempPath, lpGatherInfo)) != ERROR_SUCCESS)
{
return (GetLastError());
}
}
else
return( GetLastError() );
// OEM code
//
TCHAR szOeminfoPath[MAX_PATH + 1];
TCHAR *lpszTerminator = NULL;
TCHAR *lpszLastChar = NULL;
TCHAR szTemp[MAX_PATH];
if( 0 != GetSystemDirectory( szOeminfoPath, MAX_PATH + 1 ) )
{
lpszTerminator = &(szOeminfoPath[ lstrlen(szOeminfoPath) ]);
lpszLastChar = CharPrev( szOeminfoPath, lpszTerminator );
if( '\\' != *lpszLastChar )
{
lpszLastChar = CharNext( lpszLastChar );
*lpszLastChar = '\\';
lpszLastChar = CharNext( lpszLastChar );
*lpszLastChar = '\0';
}
lstrcat( szOeminfoPath, ICW_OEMINFO_FILENAME );
//Default oem code must be NULL if it doesn't exist in oeminfo.ini
if (!GetPrivateProfileString(ICW_OEMINFO_OEMSECTION,
ICW_OEMINFO_OEMKEY,
TEXT(""),
m_szOEM,
MAX_OEMNAME,
szOeminfoPath))
{
//oem = (nothing), set to NULL
m_szOEM[0] = '\0';
}
// Get the Product Code, Promo code and ALLOFFERS code if they exist
if (GetPrivateProfileString(ICW_OEMINFO_ICWSECTION,
ICW_OEMINFO_PRODUCTCODE,
DEFAULT_PRODUCTCODE,
szTemp,
ARRAYSIZE(szTemp),
szOeminfoPath))
{
m_bstrProductCode = A2BSTR(szTemp);
}
else
m_bstrProductCode = A2BSTR(DEFAULT_PRODUCTCODE);
if (GetPrivateProfileString(ICW_OEMINFO_ICWSECTION,
ICW_OEMINFO_PROMOCODE,
DEFAULT_PROMOCODE,
szTemp,
ARRAYSIZE(szTemp),
szOeminfoPath))
{
m_bstrPromoCode = A2BSTR(szTemp);
}
else
m_bstrPromoCode = A2BSTR(DEFAULT_PROMOCODE);
m_lAllOffers = GetPrivateProfileInt(ICW_OEMINFO_ICWSECTION,
ICW_OEMINFO_ALLOFFERS,
1,
szOeminfoPath);
}
// 2/20/97 jmazner Olympus #259
if ( RegOpenKey(HKEY_LOCAL_MACHINE,ICWSETTINGSPATH,&hkey) == ERROR_SUCCESS)
{
DWORD dwSize;
DWORD dwType;
dwType = REG_SZ;
dwSize = sizeof(TCHAR)*(MAX_RELPROD + 1);
if (RegQueryValueEx(hkey,RELEASEPRODUCTKEY,NULL,&dwType,(LPBYTE)&lpGatherInfo->m_szRelProd[0],&dwSize) != ERROR_SUCCESS)
lpGatherInfo->m_szRelProd[0] = '\0';
dwSize = sizeof(TCHAR)*(MAX_RELVER + 1);
if (RegQueryValueEx(hkey,RELEASEVERSIONKEY,NULL,&dwType,(LPBYTE)&lpGatherInfo->m_szRelVer[0],&dwSize) != ERROR_SUCCESS)
lpGatherInfo->m_szRelVer[0] = '\0';
RegCloseKey(hkey);
}
// PromoCode
lpGatherInfo->m_szPromo[0] = '\0';
TCHAR szPIDPath[MAX_PATH]; // Reg path to the PID
// Form the Path, it is HKLM\\Software\\Microsoft\Windows[ NT]\\CurrentVersion
lstrcpy(szPIDPath, TEXT("Software\\Microsoft\\Windows"));
IF_NTONLY
lstrcat(szPIDPath, TEXT(" NT"));
ENDIF_NTONLY
lstrcat(szPIDPath, TEXT("\\CurrentVersion"));
BYTE byDigitalPID[MAX_DIGITAL_PID];
// Get the Product ID for this machine
if ( RegOpenKey(HKEY_LOCAL_MACHINE,szPIDPath,&hkey) == ERROR_SUCCESS)
{
DWORD dwSize;
DWORD dwType;
dwType = REG_BINARY;
dwSize = sizeof(byDigitalPID);
if (RegQueryValueEx(hkey,
c_szRegStrValDigitalPID,
NULL,
&dwType,
(LPBYTE)byDigitalPID,
&dwSize) == ERROR_SUCCESS)
{
// BINHEX the digital PID data so we can send it to the ref_server
int i = 0;
BYTE by;
for (DWORD dwX = 0; dwX < dwSize; dwX++)
{
by = byDigitalPID[dwX];
m_szPID[i++] = g_BINTOHEXLookup[((by & 0xF0) >> 4)];
m_szPID[i++] = g_BINTOHEXLookup[(by & 0x0F)];
}
m_szPID[i] = '\0';
}
else
{
m_szPID[0] = '\0';
}
RegCloseKey(hkey);
}
return( dwRet );
}
// ############################################################################
HRESULT CRefDial::CreateEntryFromDUNFile(LPTSTR pszDunFile)
{
TCHAR szFileName[MAX_PATH];
TCHAR szUserName[UNLEN+1];
TCHAR szPassword[PWLEN+1];
LPTSTR pszTemp;
HRESULT hr;
BOOL fNeedsRestart=FALSE;
hr = ERROR_SUCCESS;
// Get fully qualified path name
//
if (!SearchPath(NULL,pszDunFile,NULL,MAX_PATH,&szFileName[0],&pszTemp))
{
hr = ERROR_FILE_NOT_FOUND;
goto CreateEntryFromDUNFileExit;
}
// save current DUN file name in global
lstrcpy(m_szCurrentDUNFile, &szFileName[0]);
hr = m_ISPImport.ImportConnection (&szFileName[0], m_szISPSupportNumber, m_szEntryName, szUserName, szPassword,&fNeedsRestart);
// place the name of the connectoid in the registry
//
if (ERROR_SUCCESS != (StoreInSignUpReg((LPBYTE)m_szEntryName, lstrlen(m_szEntryName)+1, REG_SZ, RASENTRYVALUENAME)))
{
goto CreateEntryFromDUNFileExit;
}
lstrcpy(m_szLastDUNFile, pszDunFile);
CreateEntryFromDUNFileExit:
return hr;
}
HRESULT CRefDial::UserPickANumber(HWND hWnd,
LPGATHERINFO lpGatherInfo,
PSUGGESTINFO lpSuggestInfo,
HINSTANCE hPHBKDll,
DWORD_PTR dwPhoneBook,
TCHAR *pszConnectoid,
DWORD dwSize,
DWORD dwPhoneDisplayFlags)
{
USES_CONVERSION;
HRESULT hr = ERROR_NOT_ENOUGH_MEMORY;
FARPROC fp;
RASENTRY *prasentry = NULL;
RASDEVINFO *prasdevinfo = NULL;
DWORD dwRasentrySize = 0;
DWORD dwRasdevinfoSize = 0;
TCHAR szTemp[256];
TCHAR *ppszDunFiles[1];
TCHAR *ppszTemp[1];
TCHAR szDunFile[12];
BOOL bStatus = TRUE;
//
// If the phone book can't find a number let the user pick
//
ppszDunFiles[0] = &szDunFile[0];
lstrcpy(&szDunFile[0],OLE2A(m_bstrISPFile));
fp = GetProcAddress(hPHBKDll, PHBK_DISPLAYAPI);
AssertMsg(fp != NULL,TEXT("display access number api is missing"));
ppszTemp[0] = szTemp;
//
// donsc - 3/10/98
//
// We have seen at least one code-path that could bring you into
// here with lpSuggestInfo or lpGatherInfo == NULL. That has been
// fixed, but to be defensive, we will ensure that these pointers
// are valid...even if they don't have information, we will still let
// the user pick a number.
SUGGESTINFO SugInfo;
GATHERINFO GatInfo;
::ZeroMemory(&SugInfo,sizeof(SugInfo));
::ZeroMemory(&GatInfo,sizeof(GatInfo));
if(lpSuggestInfo == NULL)
{
TraceMsg(TF_GENERAL, TEXT("UserPickANumber: lpSuggestInfo is NULL\n"));
lpSuggestInfo = &SugInfo;
}
if(lpGatherInfo == NULL)
{
TraceMsg(TF_GENERAL, TEXT("UserPickANumber: lpGatherInfo is NULL\n"));
lpGatherInfo = &GatInfo;
}
hr = ((PFNPHONEDISPLAY)fp)(dwPhoneBook,
ppszTemp,
ppszDunFiles,
&(lpSuggestInfo->wNumber),
&(lpSuggestInfo->dwCountryID),
&(lpGatherInfo->m_wState),
lpGatherInfo->m_fType,
lpGatherInfo->m_bMask,
hWnd,
dwPhoneDisplayFlags);
if (hr != ERROR_SUCCESS)
goto UserPickANumberExit;
ZeroMemory(pszConnectoid,dwSize);
hr = ReadSignUpReg((LPBYTE)pszConnectoid, &dwSize, REG_SZ,
RASENTRYVALUENAME);
if (hr != ERROR_SUCCESS)
goto UserPickANumberExit;
hr = MyRasGetEntryProperties(NULL,
pszConnectoid,
&prasentry,
&dwRasentrySize,
&prasdevinfo,
&dwRasdevinfoSize);
if (hr != ERROR_SUCCESS)
goto UserPickANumberExit;
//
// Check to see if the user selected a phone number with a different dun file
// than the one already used to create the connectoid
//
TCHAR szTempPath[MAX_PATH];
// If we did not use dun file last time, assumed we used the default.
if ( *m_szLastDUNFile )
lstrcpy(szTempPath, m_szLastDUNFile);
else
bStatus = (ERROR_SUCCESS == GetDataFromISPFile(OLE2A(m_bstrISPFile),INF_SECTION_ISPINFO, INF_DUN_FILE,szTempPath,MAX_PATH));
if (bStatus)
{
if (_tcsicmp(szTempPath,ppszDunFiles[0]))
{
//
// Rats, they changed dun files. We now get to build the connectoid
// from scratch
//
if (CreateEntryFromDUNFile(ppszDunFiles[0]) == ERROR_SUCCESS)
{
prasentry = NULL;
dwRasentrySize = 0;
prasdevinfo = NULL;
dwRasdevinfoSize = 0;
hr = MyRasGetEntryProperties(NULL,
pszConnectoid,
&prasentry,
&dwRasentrySize,
&prasdevinfo,
&dwRasdevinfoSize);
if (hr != ERROR_SUCCESS || NULL == prasentry)
goto UserPickANumberExit;
BreakUpPhoneNumber(prasentry, szTemp);
prasentry->dwCountryID = lpSuggestInfo->dwCountryID;
}
else
{
hr = ERROR_READING_DUN;
goto UserPickANumberExit;
}
}
else
{
BreakUpPhoneNumber(prasentry, szTemp);
prasentry->dwCountryID = lpSuggestInfo->dwCountryID;
}
}
else
{
hr = ERROR_READING_ISP;
goto UserPickANumberExit;
}
prasentry->dwfOptions |= RASEO_UseCountryAndAreaCodes;
//
// Write out new connectoid
//
if (m_pcRNA)
hr = m_pcRNA->RasSetEntryProperties(NULL, pszConnectoid,
(LPBYTE)prasentry,
dwRasentrySize,
(LPBYTE)prasdevinfo,
dwRasdevinfoSize);
if (hr != ERROR_SUCCESS)
goto UserPickANumberExit;
return hr;
UserPickANumberExit:
TCHAR szBuff256[257];
if (hr == ERROR_READING_ISP)
{
MsgBox(IDS_CANTREADMSNSUISP, MB_MYERROR);
} else if (hr == ERROR_READING_DUN) {
MsgBox(IDS_CANTREADMSDUNFILE, MB_MYERROR);
} else if (hr == ERROR_PHBK_NOT_FOUND) {
wsprintf(szBuff256,GetSz(IDS_CANTLOADINETCFG),TEXT("ICWPHBK.DLL"));
MessageBox(szBuff256,GetSz(IDS_TITLE),MB_MYERROR);
} else if (hr == ERROR_PHBK_NOT_FOUND) {
wsprintf(szBuff256,GetSz(IDS_CANTLOADINETCFG),TEXT("ICWDL.DLL"));
MessageBox(szBuff256,GetSz(IDS_TITLE),MB_MYERROR);
} else if (hr == ERROR_USERBACK || hr == ERROR_USERCANCEL) {
// Do nothing
} else if (hr == ERROR_NOT_ENOUGH_MEMORY) {
MsgBox(IDS_OUTOFMEMORY,MB_MYERROR);
} else if ((hr == ERROR_NO_MORE_ITEMS) || (hr == ERROR_INVALID_DATA)
|| (hr == ERROR_FILE_NOT_FOUND)) {
MsgBox(IDS_CORRUPTPHONEBOOK, MB_MYERROR);
} else if (hr != ERROR_SUCCESS) {
wsprintf(szBuff256,TEXT("You can ignore this, just report it and include this number (%d).\n"),hr);
AssertMsg(0,szBuff256);
}
return hr;
}
HRESULT CRefDial::SetupForRASDialing
(
LPGATHERINFO lpGatherInfo,
HINSTANCE hPHBKDll,
DWORD_PTR *lpdwPhoneBook,
PSUGGESTINFO *ppSuggestInfo,
TCHAR *pszConnectoid,
BOOL FAR *bConnectiodCreated
)
{
USES_CONVERSION;
HRESULT hr = ERROR_NOT_ENOUGH_MEMORY;
FARPROC fp;
PSUGGESTINFO pSuggestInfo = NULL;
TCHAR szEntry[MAX_RASENTRYNAME];
DWORD dwSize = sizeof(szEntry);
RASENTRY *prasentry = NULL;
RASDEVINFO *prasdevinfo = NULL;
DWORD dwRasentrySize = 0;
DWORD dwRasdevinfoSize = 0;
HINSTANCE hRasDll =NULL;
TCHAR szBuff256[257];
LPRASCONN lprasconn = NULL;
// Load the connectoid
//
if (!m_pcRNA)
m_pcRNA = new RNAAPI;
if (!m_pcRNA)
goto SetupForRASDialingExit;
prasentry = (RASENTRY*)GlobalAlloc(GPTR,sizeof(RASENTRY)+2);
Assert(prasentry);
if (!prasentry)
{
hr = GetLastError();
goto SetupForRASDialingExit;
}
prasentry->dwSize = sizeof(RASENTRY);
dwRasentrySize = sizeof(RASENTRY);
prasdevinfo = (RASDEVINFO*)GlobalAlloc(GPTR,sizeof(RASDEVINFO));
Assert(prasdevinfo);
if (!prasdevinfo)
{
hr = GetLastError();
goto SetupForRASDialingExit;
}
prasdevinfo->dwSize = sizeof(RASDEVINFO);
dwRasdevinfoSize = sizeof(RASDEVINFO);
hr = ReadSignUpReg((LPBYTE)&szEntry[0], &dwSize, REG_SZ,
RASENTRYVALUENAME);
if (hr != ERROR_SUCCESS)
goto SetupForRASDialingExit;
#ifdef UNICODE
// Comment for UNICODE.
// RasGetEntryProperties fails in case of UNICODE
// because of size. So I ask the size first before actual call.
hr = m_pcRNA->RasGetEntryProperties(NULL, szEntry,
NULL,
&dwRasentrySize,
NULL,
&dwRasdevinfoSize);
#else
hr = m_pcRNA->RasGetEntryProperties(NULL, szEntry,
(LPBYTE)prasentry,
&dwRasentrySize,
(LPBYTE)prasdevinfo,
&dwRasdevinfoSize);
#endif
if (hr == ERROR_BUFFER_TOO_SMALL)
{
// Comment for UNICODE.
// This must be happen for UNICODE.
TraceMsg(TF_GENERAL,TEXT("CONNECT:RasGetEntryProperties failed, try a new size.\n"));
GlobalFree(prasentry);
prasentry = (RASENTRY*)GlobalAlloc(GPTR,((size_t)dwRasentrySize));
prasentry->dwSize = dwRasentrySize;
GlobalFree(prasdevinfo);
if(dwRasdevinfoSize > 0)
{
prasdevinfo = (RASDEVINFO*)GlobalAlloc(GPTR,((size_t)dwRasdevinfoSize));
prasdevinfo->dwSize = dwRasdevinfoSize;
}
else
prasdevinfo = NULL;
hr = m_pcRNA->RasGetEntryProperties(NULL, szEntry,
(LPBYTE)prasentry,
&dwRasentrySize,
(LPBYTE)prasdevinfo,
&dwRasdevinfoSize);
}
if (hr != ERROR_SUCCESS)
goto SetupForRASDialingExit;
lpGatherInfo->m_wState = 0;
lpGatherInfo->m_fType = TYPE_SIGNUP_ANY | (m_ISPImport.m_bIsISDNDevice ? MASK_ISDN_BIT:MASK_ANALOG_BIT);
lpGatherInfo->m_bMask = MASK_SIGNUP_ANY | (m_ISPImport.m_bIsISDNDevice ? MASK_ISDN_BIT:MASK_ANALOG_BIT);
//
// Check to see if the phone number was filled in
//
if (lstrcmp(&prasentry->szLocalPhoneNumber[0],DUN_NOPHONENUMBER) == 0)
{
//
// allocate and intialize memory
//
pSuggestInfo = (PSUGGESTINFO)GlobalAlloc(GPTR,sizeof(SUGGESTINFO));
Assert(pSuggestInfo);
if (!pSuggestInfo)
{
hr = GetLastError();
goto SetupForRASDialingExit;
}
*ppSuggestInfo = pSuggestInfo;
// set phone number type and mask
pSuggestInfo->fType = TYPE_SIGNUP_ANY | (m_ISPImport.m_bIsISDNDevice ? MASK_ISDN_BIT:MASK_ANALOG_BIT);
pSuggestInfo->bMask = MASK_SIGNUP_ANY | (m_ISPImport.m_bIsISDNDevice ? MASK_ISDN_BIT:MASK_ANALOG_BIT);
pSuggestInfo->wAreaCode = Sz2W(lpGatherInfo->m_szAreaCode);
pSuggestInfo->dwCountryID = lpGatherInfo->m_dwCountry;
// Load Microsoft's phonebook
//
fp = GetProcAddress(hPHBKDll,PHBK_LOADAPI);
AssertMsg(fp != NULL,TEXT("PhoneBookLoad is missing from icwphbk.dll"));
hr = ((PFNPHONEBOOKLOAD)fp)(OLE2A(m_bstrISPFile),lpdwPhoneBook);
if (hr != ERROR_SUCCESS) goto SetupForRASDialingExit;
AssertMsg((*lpdwPhoneBook == TRUE),TEXT("Phonebook Load return no error and 0 for phonebook"));
//
// Load Suggest procedure
//
fp = GetProcAddress(hPHBKDll,PHBK_SUGGESTAPI);
AssertMsg(fp != NULL,TEXT("PhoneBookSuggest is missing from icwphbk.dll"));
// Set the number of suggestions
pSuggestInfo->wNumber = NUM_PHBK_SUGGESTIONS;
// get phone number
hr = ((PFPHONEBOOKSUGGEST)fp)(*lpdwPhoneBook,pSuggestInfo);
// Inore error because we can continue even without a suggested
// phone number (the user will just have to pick one).
hr = ERROR_SUCCESS;
}
else
{
ZeroMemory(pszConnectoid, dwSize);
hr = ReadSignUpReg((LPBYTE)pszConnectoid, &dwSize, REG_SZ,
RASENTRYVALUENAME);
if (hr != ERROR_SUCCESS)
goto SetupForRASDialingExit;
// Use the RASENTRY that we have to create the connectiod
hr = m_pcRNA->RasSetEntryProperties(NULL,
pszConnectoid,
(LPBYTE)prasentry,
dwRasentrySize,
(LPBYTE)prasdevinfo,
dwRasdevinfoSize);
*bConnectiodCreated = TRUE;
}
SetupForRASDialingExit:
if (prasentry)
GlobalFree(prasentry);
if (prasdevinfo)
GlobalFree(prasdevinfo);
if (hr == ERROR_READING_ISP)
{
MsgBox(IDS_CANTREADMSNSUISP, MB_MYERROR);
} else if (hr == ERROR_READING_DUN) {
MsgBox(IDS_CANTREADMSDUNFILE, MB_MYERROR);
} else if (hr == ERROR_PHBK_NOT_FOUND) {
wsprintf(szBuff256,GetSz(IDS_CANTLOADINETCFG),TEXT("ICWPHBK.DLL"));
MessageBox(szBuff256,GetSz(IDS_TITLE),MB_MYERROR);
} else if (hr == ERROR_PHBK_NOT_FOUND) {
wsprintf(szBuff256,GetSz(IDS_CANTLOADINETCFG),TEXT("ICWDL.DLL"));
MessageBox(szBuff256,GetSz(IDS_TITLE),MB_MYERROR);
} else if (hr == ERROR_USERBACK || hr == ERROR_USERCANCEL) {
// Do nothing
} else if (hr == ERROR_NOT_ENOUGH_MEMORY) {
MsgBox(IDS_OUTOFMEMORY,MB_MYERROR);
} else if ((hr == ERROR_NO_MORE_ITEMS) || (hr == ERROR_INVALID_DATA)
|| (hr == ERROR_FILE_NOT_FOUND)) {
MsgBox(IDS_CORRUPTPHONEBOOK, MB_MYERROR);
} else if (hr != ERROR_SUCCESS) {
wsprintf(szBuff256,TEXT("You can ignore this, just report it and include this number (%d).\n"),hr);
AssertMsg(0,szBuff256);
}
return hr;
}
// 10/22/96 jmazner Normandy #9923
// Since in SetupConnectoidExit we're treating results other than ERROR_SUCCESS as
// indicating successfull completion, we need bSuccess to provide a simple way for the
// caller to tell whether the function completed.
HRESULT CRefDial::SetupConnectoid
(
PSUGGESTINFO pSuggestInfo,
int irc,
TCHAR *pszConnectoid,
DWORD dwSize,
BOOL *pbSuccess
)
{
USES_CONVERSION;
HRESULT hr = ERROR_NOT_ENOUGH_MEMORY;
RASENTRY *prasentry = NULL;
RASDEVINFO *prasdevinfo = NULL;
DWORD dwRasentrySize = 0;
DWORD dwRasdevinfoSize = 0;
HINSTANCE hPHBKDll = NULL;
HINSTANCE hRasDll =NULL;
LPTSTR lpszSetupFile;
LPRASCONN lprasconn = NULL;
CMcRegistry reg;
Assert(pbSuccess);
if (!pSuggestInfo)
{
hr = ERROR_PHBK_NOT_FOUND;
goto SetupConnectoidExit;
}
lpszSetupFile = m_szCurrentDUNFile[0] != '\0' ? m_szCurrentDUNFile : OLE2A(m_bstrISPFile);
if (lstrcmp(pSuggestInfo->rgpAccessEntry[irc]->szDataCenter,lpszSetupFile))
{
hr = CreateEntryFromDUNFile(pSuggestInfo->rgpAccessEntry[irc]->szDataCenter);
if (hr == ERROR_SUCCESS)
{
ZeroMemory(pszConnectoid, dwSize);
hr = ReadSignUpReg((LPBYTE)pszConnectoid, &dwSize, REG_SZ,
RASENTRYVALUENAME);
if (hr != ERROR_SUCCESS)
goto SetupConnectoidExit;
if( prasentry )
{
GlobalFree( prasentry );
prasentry = NULL;
dwRasentrySize = NULL;
}
if( prasdevinfo )
{
GlobalFree( prasdevinfo );
prasdevinfo = NULL;
dwRasdevinfoSize = NULL;
}
hr = MyRasGetEntryProperties(NULL,
pszConnectoid,
&prasentry,
&dwRasentrySize,
&prasdevinfo,
&dwRasdevinfoSize);
if (hr != ERROR_SUCCESS || NULL == prasentry)
goto SetupConnectoidExit;
}
else
{
// 10/22/96 jmazner Normandy #9923
goto SetupConnectoidExit;
}
}
else
{
goto SetupConnectoidExit;
}
prasentry->dwCountryID = pSuggestInfo->rgpAccessEntry[irc]->dwCountryID;
lstrcpyn(prasentry->szAreaCode,
pSuggestInfo->rgpAccessEntry[irc]->szAreaCode,
ARRAYSIZE(prasentry->szAreaCode));
lstrcpyn(prasentry->szLocalPhoneNumber,
pSuggestInfo->rgpAccessEntry[irc]->szAccessNumber,
ARRAYSIZE(prasentry->szLocalPhoneNumber));
prasentry->dwCountryCode = 0;
prasentry->dwfOptions |= RASEO_UseCountryAndAreaCodes;
// 10/19/96 jmazner Multiple modems problems
// If no device name and type has been specified, grab the one we've stored
// in ConfigRasEntryDevice
if( 0 == lstrlen(prasentry->szDeviceName) )
{
// doesn't make sense to have an empty device name but a valid device type
Assert( 0 == lstrlen(prasentry->szDeviceType) );
// double check that we've already stored the user's choice.
Assert( lstrlen(m_ISPImport.m_szDeviceName) );
Assert( lstrlen(m_ISPImport.m_szDeviceType) );
lstrcpyn( prasentry->szDeviceName, m_ISPImport.m_szDeviceName, lstrlen(m_ISPImport.m_szDeviceName) );
lstrcpyn( prasentry->szDeviceType, m_ISPImport.m_szDeviceType, lstrlen(m_ISPImport.m_szDeviceType) );
}
// Write out new connectoid
if (m_pcRNA)
hr = m_pcRNA->RasSetEntryProperties(NULL, pszConnectoid,
(LPBYTE)prasentry,
dwRasentrySize,
(LPBYTE)prasdevinfo,
dwRasdevinfoSize);
// Set this connetiod to have not proxy enabled
TCHAR szConnectionProfile[REGSTR_MAX_VALUE_LENGTH];
lstrcpy(szConnectionProfile, c_szRASProfiles);
lstrcat(szConnectionProfile, TEXT("\\"));
lstrcat(szConnectionProfile, pszConnectoid);
reg.CreateKey(HKEY_CURRENT_USER, szConnectionProfile);
reg.SetValue(c_szProxyEnable, (DWORD)0);
SetupConnectoidExit:
*pbSuccess = FALSE;
TCHAR szBuff256[257];
if (hr == ERROR_READING_ISP)
{
MsgBox(IDS_CANTREADMSNSUISP, MB_MYERROR);
} else if (hr == ERROR_READING_DUN) {
MsgBox(IDS_CANTREADMSDUNFILE, MB_MYERROR);
} else if (hr == ERROR_PHBK_NOT_FOUND) {
wsprintf(szBuff256,GetSz(IDS_CANTLOADINETCFG),TEXT("ICWPHBK.DLL"));
MessageBox(szBuff256,GetSz(IDS_TITLE),MB_MYERROR);
} else if (hr == ERROR_PHBK_NOT_FOUND) {
wsprintf(szBuff256,GetSz(IDS_CANTLOADINETCFG),TEXT("ICWDL.DLL"));
MessageBox(szBuff256,GetSz(IDS_TITLE),MB_MYERROR);
} else if (hr == ERROR_USERBACK || hr == ERROR_USERCANCEL || hr == ERROR_SUCCESS) {
// Do nothing
*pbSuccess = TRUE;
} else if (hr == ERROR_NOT_ENOUGH_MEMORY) {
MsgBox(IDS_OUTOFMEMORY,MB_MYERROR);
} else if ((hr == ERROR_NO_MORE_ITEMS) || (hr == ERROR_INVALID_DATA)
|| (hr == ERROR_FILE_NOT_FOUND)) {
MsgBox(IDS_CORRUPTPHONEBOOK, MB_MYERROR);
} else if (hr != ERROR_SUCCESS) {
wsprintf(szBuff256,TEXT("You can ignore this, just report it and include this number (%d).\n"),hr);
AssertMsg(0,szBuff256);
*pbSuccess = TRUE;
}
return hr;
}
// Form the Dialing URL. Must be called after setting up for dialing.
HRESULT CRefDial::FormURL()
{
USES_CONVERSION;
TCHAR szTemp[MAX_PATH];
TCHAR szPromo[MAX_PATH];
TCHAR szProd[MAX_PATH];
TCHAR szArea[MAX_PATH];
TCHAR szOEM[MAX_PATH];
DWORD dwCONNWIZVersion = 0; // Version of CONNWIZ.HTM
//
// ChrisK Olympus 3997 5/25/97
//
TCHAR szRelProd[MAX_PATH];
TCHAR szRelProdVer[MAX_PATH];
HRESULT hr = ERROR_SUCCESS;
OSVERSIONINFO osvi;
//
// Build URL complete with name value pairs
//
hr = GetDataFromISPFile(OLE2A(m_bstrISPFile),INF_SECTION_ISPINFO, INF_REFERAL_URL,&szTemp[0],256);
if ('\0' == szTemp[0])
{
MsgBox(IDS_MSNSU_WRONG,MB_MYERROR);
return hr;
}
Assert(szTemp[0]);
ANSI2URLValue(m_szOEM,szOEM,0);
ANSI2URLValue(m_lpGatherInfo->m_szAreaCode,szArea,0);
if (m_bstrProductCode)
ANSI2URLValue(OLE2A((BSTR)m_bstrProductCode),szProd,0);
else
ANSI2URLValue(DEFAULT_PRODUCTCODE,szProd,0);
if (m_bstrPromoCode)
ANSI2URLValue(OLE2A((BSTR)m_bstrPromoCode),szPromo,0);
else
ANSI2URLValue(DEFAULT_PROMOCODE,szProd,0);
//
// ChrisK Olympus 3997 5/25/97
//
ANSI2URLValue(m_lpGatherInfo->m_szRelProd, szRelProd, 0);
ANSI2URLValue(m_lpGatherInfo->m_szRelVer, szRelProdVer, 0);
ZeroMemory(&osvi,sizeof(OSVERSIONINFO));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (!GetVersionEx(&osvi))
{
ZeroMemory(&osvi,sizeof(OSVERSIONINFO));
}
#if defined(DEBUG)
LoadTestingLocaleOverride(&m_lpGatherInfo->m_dwCountry,
&m_lpGatherInfo->m_lcidUser);
#endif //DEBUG
HINSTANCE hInstIcwconn = LoadLibrary(ICW_DOWNLOADABLE_COMPONENT_NAME);
if (hInstIcwconn)
{
lpfnGetIcwconnVer = (GETICWCONNVER)GetProcAddress(hInstIcwconn, ICW_DOWNLOADABLE_COMPONENT_GETVERFUNC);
// Get the version of ICWCONN.DLL
if (lpfnGetIcwconnVer)
dwCONNWIZVersion = lpfnGetIcwconnVer();
FreeLibrary(hInstIcwconn);
}
#if defined(DEBUG)
if (FRefURLOverride())
{
TweakRefURL(szTemp,
&m_lpGatherInfo->m_lcidUser,
&m_lpGatherInfo->m_dwOS,
&m_lpGatherInfo->m_dwMajorVersion,
&m_lpGatherInfo->m_dwMinorVersion,
&m_lpGatherInfo->m_wArchitecture,
szPromo,
szOEM,
szArea,
&m_lpGatherInfo->m_dwCountry,
&m_lpGatherInfo->m_szSUVersion[0],
szProd,
&osvi.dwBuildNumber, //For this we really want to LOWORD
szRelProd,
szRelProdVer,
&dwCONNWIZVersion,
m_szPID,
&m_lAllOffers);
}
#endif //DEBUG
// Autoconfig will set alloffers always.
if ( m_lAllOffers || (m_lpGatherInfo->m_dwFlag & ICW_CFGFLAG_AUTOCONFIG) )
{
m_lpGatherInfo->m_dwFlag |= ICW_CFGFLAG_ALLOFFERS;
}
wsprintf(m_szUrl,TEXT("%slcid=%lu&sysdeflcid=%lu&appslcid=%lu&icwos=%lu&osver=%lu.%2.2d%s&arch=%u&promo=%s&oem=%s&area=%s&country=%lu&icwver=%s&prod=%s&osbld=%d&icwrp=%s&icwrpv=%s&wizver=%lu&PID=%s&cfgflag=%lu"),
szTemp,
m_lpGatherInfo->m_lcidUser,
m_lpGatherInfo->m_lcidSys,
m_lpGatherInfo->m_lcidApps,
m_lpGatherInfo->m_dwOS,
m_lpGatherInfo->m_dwMajorVersion,
m_lpGatherInfo->m_dwMinorVersion,
ICW_OS_VER,
m_lpGatherInfo->m_wArchitecture,
szPromo,
szOEM,
szArea,
m_lpGatherInfo->m_dwCountry,
&m_lpGatherInfo->m_szSUVersion[0],
szProd,
LOWORD(osvi.dwBuildNumber),
szRelProd,
szRelProdVer,
dwCONNWIZVersion,
m_szPID,
m_lpGatherInfo->m_dwFlag);
// Update registry values
//
wsprintf(m_lpGatherInfo->m_szISPFile,TEXT("%s\\%s"),g_pszAppDir,OLE2A(m_bstrISPFile));
lstrcpyn(m_lpGatherInfo->m_szAppDir,g_pszAppDir,ARRAYSIZE(m_lpGatherInfo->m_szAppDir));
StoreInSignUpReg(
(LPBYTE)m_lpGatherInfo,
sizeof(GATHERINFO),
REG_BINARY,
GATHERINFOVALUENAME);
return hr;
}
static const TCHAR cszBrandingSection[] = TEXT("Branding");
static const TCHAR cszBrandingFlags[] = TEXT("Flags");
static const TCHAR cszSupportSection[] = TEXT("Support");
static const TCHAR cszSupportNumber[] = TEXT("SupportPhoneNumber");
static const TCHAR cszLoggingSection[] = TEXT("Logging");
static const TCHAR cszStartURL[] = TEXT("StartURL");
static const TCHAR cszEndURL[] = TEXT("EndURL");
void CRefDial::GetISPFileSettings(LPTSTR lpszFile)
{
TCHAR szTemp[INTERNET_MAX_URL_LENGTH];
GetINTFromISPFile(lpszFile,
(LPTSTR)cszBrandingSection,
(LPTSTR)cszBrandingFlags,
(int FAR *)&m_lBrandingFlags,
BRAND_DEFAULT);
// Read the Support Number
if (ERROR_SUCCESS == GetDataFromISPFile(lpszFile,
(LPTSTR)cszSupportSection,
(LPTSTR)cszSupportNumber,
szTemp,
ARRAYSIZE(szTemp)))
m_bstrSupportNumber = A2BSTR(szTemp);
else
m_bstrSupportNumber.Empty();
if (ERROR_SUCCESS == GetDataFromISPFile(lpszFile,
(LPTSTR)cszLoggingSection,
(LPTSTR)cszStartURL,
szTemp,
ARRAYSIZE(szTemp)))
m_bstrLoggingStartUrl = A2BSTR(szTemp);
else
m_bstrLoggingStartUrl.Empty();
if (ERROR_SUCCESS == GetDataFromISPFile(lpszFile,
(LPTSTR)cszLoggingSection,
(LPTSTR)cszEndURL,
szTemp,
ARRAYSIZE(szTemp)))
m_bstrLoggingEndUrl = A2BSTR(szTemp);
else
m_bstrLoggingEndUrl.Empty();
}
// This function will accept user selected values that are necessary to
// setup a connectiod for dialing
// Returns:
// TRUE OK to dial
// FALSE Some kind of problem
// QuitWizard - TRUE, then terminate
// UserPickNumber - TRUE, then display Pick a Number DLG
// QuitWizard and UserPickNumber both FALSE, then just
// display the page prior to Dialing UI.
STDMETHODIMP CRefDial::SetupForDialing
(
BSTR bstrISPFile,
DWORD dwCountry,
BSTR bstrAreaCode,
DWORD dwFlag,
BOOL *pbRetVal
)
{
USES_CONVERSION;
HRESULT hr = S_OK;
long lRC = 0;
LPLINECOUNTRYENTRY pLCETemp;
HINSTANCE hPHBKDll = NULL;
DWORD_PTR dwPhoneBook = 0;
DWORD idx;
BOOL bSuccess = FALSE;
BOOL bConnectiodCreated = FALSE;
// Create a Window. We need a window, which will be hidden, so that we can process RAS status
// messages
RECT rcPos;
Create(NULL, rcPos, NULL, 0, 0, 0 );
// Initialize failure codes
*pbRetVal = FALSE;
m_bQuitWizard = FALSE;
m_bUserPickNumber = FALSE;
// Stuff the Area Code, and Country Code into the GatherInfo struct
Assert(bstrAreaCode);
lstrcpy(m_lpGatherInfo->m_szAreaCode,OLE2A(bstrAreaCode));
m_lpGatherInfo->m_dwCountry = dwCountry;
m_lpGatherInfo->m_dwFlag = dwFlag;
// Make a copy of the ISP file we should use.
Assert(bstrISPFile);
m_bstrISPFile = bstrISPFile;
// Read the ISP file stuff
GetISPFileSettings(OLE2A(m_bstrISPFile));
// Read the Connection File information which will create
// a connectiod from the passed in ISP file
switch(ReadConnectionInformation())
{
case ERROR_SUCCESS:
{
// Fill in static info into the GatherInfo sturct
DWORD dwRet = FillGatherInfoStruct(m_lpGatherInfo);
switch( dwRet )
{
case ERROR_FILE_NOT_FOUND:
MsgBox(IDS_MSNSU_WRONG,MB_MYERROR);
m_bQuitWizard = TRUE;
hr = S_FALSE;
break;
case ERROR_SUCCESS:
//do nothing
break;
default:
AssertMsg(dwRet, TEXT("FillGatherInfoStruct did not successfully complete. DUNfile entry corrupt?"));
break;
}
break;
}
case ERROR_CANCELLED:
hr = S_FALSE;
m_bQuitWizard = TRUE;
goto SetupForDialingExit;
break;
case ERROR_RETRY:
m_bTryAgain = TRUE;
hr = S_FALSE;
break;
default:
MsgBox(IDS_MSNSU_WRONG,MB_MYERROR);
hr = S_FALSE;
break;
}
// If we failed for some reason above, we need to return
// the error to the caller, and Quit The Wizard.
if (S_OK != hr)
goto SetupForDialingExit;
// we need to pass a valid window handle to lineTranslateDialog
// API call -MKarki (4/17/97) Fix for Bug #428
//
if (m_lpGatherInfo != NULL)
{
m_lpGatherInfo->m_hwnd = GetActiveWindow();
}
//
// Fill in country
//
m_lpGatherInfo->m_pLineCountryList = (LPLINECOUNTRYLIST)GlobalAlloc(GPTR,sizeof(LINECOUNTRYLIST));
Assert(m_lpGatherInfo->m_pLineCountryList);
if (!(m_lpGatherInfo->m_pLineCountryList))
{
m_bQuitWizard = TRUE;
MsgBox(IDS_OUTOFMEMORY,MB_MYERROR);
goto SetupForDialingExit;
}
m_lpGatherInfo->m_pLineCountryList->dwTotalSize = sizeof(LINECOUNTRYLIST);
//
// figure out how much memory we will need
//
lRC = lineGetCountry(m_lpGatherInfo->m_dwCountry,0x10004,
m_lpGatherInfo->m_pLineCountryList);
if ( lRC && lRC != LINEERR_STRUCTURETOOSMALL)
AssertMsg(0,TEXT("lineGetCountry error"));
Assert(m_lpGatherInfo->m_pLineCountryList->dwNeededSize);
LPLINECOUNTRYLIST pLineCountryTemp;
pLineCountryTemp = (LPLINECOUNTRYLIST)GlobalAlloc(GPTR,
((size_t)m_lpGatherInfo->m_pLineCountryList->dwNeededSize));
Assert (pLineCountryTemp);
if (!pLineCountryTemp)
{
m_bQuitWizard = TRUE;
MsgBox(IDS_OUTOFMEMORY,MB_MYERROR);
goto SetupForDialingExit;
}
//
// initialize structure
//
pLineCountryTemp->dwTotalSize = m_lpGatherInfo->m_pLineCountryList->dwNeededSize;
GlobalFree(m_lpGatherInfo->m_pLineCountryList);
m_lpGatherInfo->m_pLineCountryList = pLineCountryTemp;
pLineCountryTemp = NULL;
//
// fetch information from TAPI
//
lRC = lineGetCountry(m_lpGatherInfo->m_dwCountry,0x10004,
m_lpGatherInfo->m_pLineCountryList);
if (lRC)
{
Assert(0);
m_bQuitWizard = TRUE;
// BUGBUG Probably should have an error message here
goto SetupForDialingExit;
}
//
// On Windows 95, lineGetCountry has a bug -- if we try to retrieve the
// dialing properties of just one country (i.e, if the first parameter is
// not zero), it returns m_pLineCountryList->dwNumCountries = 0!!
// But the m_pLineCountryList still has valid data
//
if (VER_PLATFORM_WIN32_NT != g_dwPlatform)
{
if (0 == m_lpGatherInfo->m_pLineCountryList->dwNumCountries)
m_lpGatherInfo->m_pLineCountryList->dwNumCountries = 1;
}
pLCETemp = (LPLINECOUNTRYENTRY)((UINT_PTR)m_lpGatherInfo->m_pLineCountryList +
(UINT)m_lpGatherInfo->m_pLineCountryList->dwCountryListOffset);
//
// build look up array
//
m_lpGatherInfo->m_rgNameLookUp = (LPCNTRYNAMELOOKUPELEMENT)GlobalAlloc(GPTR,((size_t)(sizeof(CNTRYNAMELOOKUPELEMENT)
* m_lpGatherInfo->m_pLineCountryList->dwNumCountries)));
for (idx=0; idx < m_lpGatherInfo->m_pLineCountryList->dwNumCountries;
idx++)
{
m_lpGatherInfo->m_rgNameLookUp[idx].psCountryName = (LPTSTR)((DWORD_PTR)m_lpGatherInfo->m_pLineCountryList + (DWORD)pLCETemp[idx].dwCountryNameOffset);
m_lpGatherInfo->m_rgNameLookUp[idx].dwNameSize = pLCETemp[idx].dwCountryNameSize;
m_lpGatherInfo->m_rgNameLookUp[idx].pLCE = &pLCETemp[idx];
AssertMsg(m_lpGatherInfo->m_rgNameLookUp[idx].psCountryName[0],
TEXT("Blank country name in look up array"));
}
// Prepare to Setup for Dialing, which will use the phonebook
// to get a suggested number
hPHBKDll = LoadLibrary(PHONEBOOK_LIBRARY);
AssertMsg(hPHBKDll != NULL,TEXT("Phonebook DLL is missing"));
if (!hPHBKDll)
{
//
// TODO: BUGBUG Pop-up error message
//
m_bQuitWizard = TRUE;
goto SetupForDialingExit;
}
// Setup, and possible create a connectiod
hr = SetupForRASDialing(m_lpGatherInfo,
hPHBKDll,
&dwPhoneBook,
&m_pSuggestInfo,
&m_szConnectoid[0],
&bConnectiodCreated);
if (ERROR_SUCCESS != hr)
{
m_bQuitWizard = TRUE;
goto SetupForDialingExit;
}
// If we have a RASENTRY struct from SetupForRASDialing, then just use it
// otherwise use the suggest info
if (!bConnectiodCreated)
{
// If there is only 1 suggested number, then we setup the
// connectiod, and we are ready to dial
if (1 == m_pSuggestInfo->wNumber)
{
SetupConnectoid(m_pSuggestInfo, 0, &m_szConnectoid[0],
sizeof(m_szConnectoid), &bSuccess);
if( !bSuccess )
{
m_bQuitWizard = TRUE;
goto SetupForDialingExit;
}
}
else
{
// More than 1 entry in the Phonebook, so we need to
// ask the user which one they want to use
if (m_pSuggestInfo->wNumber > 1)
{
// we are going to have to save these values for later
if (m_rgpSuggestedAE)
{
// We allocated an extra pointer so we'd have NULL on the
// end of the list and this for loop will work
for (int i=0; m_rgpSuggestedAE[i]; i++)
GlobalFree(m_rgpSuggestedAE[i]);
GlobalFree(m_rgpSuggestedAE);
m_rgpSuggestedAE = NULL;
}
// We first need to allocate space for the pointers.
// We'll allocate an extra one so that we will have
// a NULL pointer at the end of the list for when
// we free g_rgpSuggestedAE. We don't need to set
// the pointers to NULL because GPTR includes a flag
// to tell GlobalAlloc to initialize the memory to zero.
m_rgpSuggestedAE = (PACCESSENTRY*)GlobalAlloc(GPTR,
sizeof(PACCESSENTRY)*(m_pSuggestInfo->wNumber + 1));
if (NULL == m_rgpSuggestedAE)
hr = E_ABORT;
else if (m_pSuggestInfo->rgpAccessEntry)
{
for (UINT i=0; i < m_pSuggestInfo->wNumber; i++)
{
m_rgpSuggestedAE[i] = (PACCESSENTRY)GlobalAlloc(GPTR, sizeof(ACCESSENTRY));
if (NULL == m_rgpSuggestedAE[i])
{
hr = E_ABORT;
break; // for loop
}
memmove(m_rgpSuggestedAE[i], m_pSuggestInfo->rgpAccessEntry[i],
sizeof(ACCESSENTRY));
}
m_pSuggestInfo->rgpAccessEntry = m_rgpSuggestedAE;
}
if (E_ABORT == hr)
{
MsgBox(IDS_OUTOFMEMORY,MB_MYERROR);
m_bQuitWizard = TRUE;
goto SetupForDialingExit;
}
m_bUserPickNumber = TRUE;
goto SetupForDialingExit;
}
else
{
// Call RAS to have the user pick a number to dial
hr = UserPickANumber( GetActiveWindow(), m_lpGatherInfo,
m_pSuggestInfo,
hPHBKDll,
dwPhoneBook,
&m_szConnectoid[0],
sizeof(m_szConnectoid),
0);
if (ERROR_USERBACK == hr)
{
goto SetupForDialingExit;
}
else if (ERROR_USERCANCEL == hr)
{
m_bQuitWizard = TRUE;
goto SetupForDialingExit;
}
else if (ERROR_SUCCESS != hr)
{
// Go back to prev page.
goto SetupForDialingExit;
}
// Error SUCCESS will fall through and set pbRetVal to TRUE below
}
}
}
// Success if we get to here
*pbRetVal = TRUE;
// Generate a Displayable number
m_hrDisplayableNumber = GetDisplayableNumber();
SetupForDialingExit:
if (hPHBKDll)
{
if (dwPhoneBook)
{
FARPROC fp = GetProcAddress(hPHBKDll,PHBK_UNLOADAPI);
ASSERT(fp);
((PFNPHONEBOOKUNLOAD)fp)(dwPhoneBook);
dwPhoneBook = 0;
}
FreeLibrary(hPHBKDll);
hPHBKDll = NULL;
}
return S_OK;
}
STDMETHODIMP CRefDial::RemoveConnectoid(BOOL * pVal)
{
if (m_hrasconn)
DoHangup();
if (m_pSuggestInfo)
{
GlobalFree(m_pSuggestInfo->rgpAccessEntry);
GlobalFree(m_pSuggestInfo);
m_pSuggestInfo = NULL;
}
if( (m_pcRNA!=NULL) && (m_szConnectoid[0]!='\0') )
{
m_pcRNA->RasDeleteEntry(NULL,m_szConnectoid);
delete m_pcRNA;
m_pcRNA = NULL;
}
return S_OK;
}
STDMETHODIMP CRefDial::get_QuitWizard(BOOL * pVal)
{
if (pVal == NULL)
return E_POINTER;
*pVal = m_bQuitWizard;
return S_OK;
}
STDMETHODIMP CRefDial::get_UserPickNumber(BOOL * pVal)
{
if (pVal == NULL)
return E_POINTER;
*pVal = m_bUserPickNumber;
return S_OK;
}
STDMETHODIMP CRefDial::get_DialPhoneNumber(BSTR * pVal)
{
USES_CONVERSION;
if (pVal == NULL)
return E_POINTER;
if (m_hrDisplayableNumber == ERROR_SUCCESS)
*pVal = A2BSTR(m_pszDisplayable);
else
*pVal = A2BSTR(m_szPhoneNumber);
return S_OK;
}
STDMETHODIMP CRefDial::put_DialPhoneNumber(BSTR newVal)
{
USES_CONVERSION;
LPRASENTRY lpRasEntry = NULL;
LPRASDEVINFO lpRasDevInfo = NULL;
DWORD dwRasEntrySize = 0;
DWORD dwRasDevInfoSize = 0;
RNAAPI *pcRNA = NULL;
HRESULT hr;
// Get the current RAS entry properties
hr = MyRasGetEntryProperties(NULL,
m_szConnectoid,
&lpRasEntry,
&dwRasEntrySize,
&lpRasDevInfo,
&dwRasDevInfoSize);
if (NULL ==lpRasDevInfo)
{
dwRasDevInfoSize = 0;
}
if (hr == ERROR_SUCCESS && NULL != lpRasEntry)
{
// Replace the phone number with the new one
//
lstrcpy(lpRasEntry->szLocalPhoneNumber, OLE2A(newVal));
// non-zero dummy values are required due to bugs in win95
lpRasEntry->dwCountryID = 1;
lpRasEntry->dwCountryCode = 1;
lpRasEntry->szAreaCode[1] = '\0';
lpRasEntry->szAreaCode[0] = '8';
// Set to dial as is
//
lpRasEntry->dwfOptions &= ~RASEO_UseCountryAndAreaCodes;
pcRNA = new RNAAPI;
if (pcRNA)
{
#if defined(DEBUG)
TCHAR szMsg[256];
OutputDebugString(TEXT("CRefDial::put_DialPhoneNumber - MyRasGetEntryProperties()"));
wsprintf(szMsg, TEXT("lpRasEntry->dwfOptions: %ld"), lpRasEntry->dwfOptions);
OutputDebugString(szMsg);
wsprintf(szMsg, TEXT("lpRasEntry->dwCountryID: %ld"), lpRasEntry->dwCountryID);
OutputDebugString(szMsg);
wsprintf(szMsg, TEXT("lpRasEntry->dwCountryCode: %ld"), lpRasEntry->dwCountryCode);
OutputDebugString(szMsg);
wsprintf(szMsg, TEXT("lpRasEntry->szAreaCode: %s"), lpRasEntry->szAreaCode);
OutputDebugString(szMsg);
wsprintf(szMsg, TEXT("lpRasEntry->szLocalPhoneNumber: %s"), lpRasEntry->szLocalPhoneNumber);
OutputDebugString(szMsg);
wsprintf(szMsg, TEXT("lpRasEntry->dwAlternateOffset: %ld"), lpRasEntry->dwAlternateOffset);
OutputDebugString(szMsg);
#endif //DEBUG
pcRNA->RasSetEntryProperties(NULL,
m_szConnectoid,
(LPBYTE)lpRasEntry,
dwRasEntrySize,
(LPBYTE)lpRasDevInfo,
dwRasDevInfoSize);
delete pcRNA;
}
}
// Regenerate the displayable number
GetDisplayableNumber();
return S_OK;
}
STDMETHODIMP CRefDial::get_URL(BSTR * pVal)
{
USES_CONVERSION;
TCHAR szTemp[256];
if (pVal == NULL)
return E_POINTER;
// Get the URL from the ISP file, and then convert it
if (SUCCEEDED(GetDataFromISPFile(OLE2A(m_bstrISPFile),INF_SECTION_ISPINFO, INF_REFERAL_URL,&szTemp[0],256)))
{
*pVal = A2BSTR(szTemp);
}
else
{
*pVal = NULL;
}
return S_OK;
}
STDMETHODIMP CRefDial::get_PromoCode(BSTR * pVal)
{
if (pVal == NULL)
return E_POINTER;
*pVal = m_bstrPromoCode.Copy();
return S_OK;
}
STDMETHODIMP CRefDial::put_PromoCode(BSTR newVal)
{
if (newVal && wcslen(newVal))
m_bstrPromoCode = newVal;
return S_OK;
}
STDMETHODIMP CRefDial::get_ProductCode(BSTR * pVal)
{
if (pVal == NULL)
return E_POINTER;
*pVal = m_bstrProductCode;
return S_OK;
}
STDMETHODIMP CRefDial::put_ProductCode(BSTR newVal)
{
if (newVal && wcslen(newVal))
m_bstrProductCode = newVal;
return S_OK;
}
STDMETHODIMP CRefDial::put_OemCode(BSTR newVal)
{
USES_CONVERSION;
if (newVal && wcslen(newVal))
lstrcpy(m_szOEM, OLE2A(newVal));
return S_OK;
}
STDMETHODIMP CRefDial::put_AllOfferCode(long newVal)
{
m_lAllOffers = newVal;
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Function: DoOfferDownload
//
// Synopsis: Download the ISP offer from the ISP server
//
//+---------------------------------------------------------------------------
STDMETHODIMP CRefDial::DoOfferDownload(BOOL *pbRetVal)
{
HRESULT hr;
RNAAPI *pcRNA;
//
// Hide RNA window on Win95 retail
//
// MinimizeRNAWindow(m_pszConnectoid,g_hInst);
// 4/2/97 ChrisK Olympus 296
// g_hRNAZapperThread = LaunchRNAReestablishZapper(g_hInst);
//
// The connection is open and ready. Start the download.
//
m_dwThreadID = 0;
m_hThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)DownloadThreadInit,
(LPVOID)this,
0,
&m_dwThreadID);
// 5-1-97 ChrisK Olympus 2934
// m_objBusyMessages.Start(m_hWnd,IDC_LBLSTATUS,m_hrasconn);
// If we dont get the donwload thread, then kill the open
// connection
if (!m_hThread)
{
hr = GetLastError();
if (m_hrasconn)
{
pcRNA = new RNAAPI;
if (pcRNA)
{
pcRNA->RasHangUp(m_hrasconn);
m_hrasconn = NULL;
delete pcRNA;
pcRNA = NULL;
}
}
*pbRetVal = FALSE;
}
else
{
// Download has started.
m_bDownloadHasBeenCanceled = FALSE;
*pbRetVal = TRUE;
}
return S_OK;
}
STDMETHODIMP CRefDial::get_DialStatusString(BSTR * pVal)
{
USES_CONVERSION;
if (pVal == NULL)
return E_POINTER;
if (m_RasStatusID)
{
if (m_bRedial)
{
switch (m_RasStatusID)
{
case IDS_RAS_DIALING:
case IDS_RAS_PORTOPENED:
case IDS_RAS_OPENPORT:
{
*pVal = A2BSTR(GetSz(IDS_RAS_REDIALING));
return S_OK;
}
default:
break;
}
}
*pVal = A2BSTR(GetSz((USHORT)m_RasStatusID));
}
else
*pVal = A2BSTR(TEXT(""));
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Function: DoInit
//
// Synopsis: Initialize cancel status and the displayable number for this
// round of dialing.
//
//+---------------------------------------------------------------------------
STDMETHODIMP CRefDial::DoInit()
{
m_bWaitingToHangup = FALSE;
// Update the phone number to display if user has changed dialing properties
// This function should be called re-init the dialing properties.
// SetupforDialing should be called prior to this.
GetDisplayableNumber();
return S_OK;
}
//+---------------------------------------------------------------------------
//
// Function: DoHangup
//
// Synopsis: Hangup the modem for the currently active RAS session
//
//+---------------------------------------------------------------------------
STDMETHODIMP CRefDial::DoHangup()
{
RNAAPI *pcRNA;
// Set the disconnect flag as the system may be too busy with dialing.
// Once we get a chance to terminate dialing, we know we have to hangup
m_bWaitingToHangup = TRUE;
if (NULL != m_hrasconn)
{
pcRNA = new RNAAPI;
if (pcRNA)
{
pcRNA->RasHangUp(m_hrasconn);
m_hrasconn = NULL;
delete pcRNA;
pcRNA = NULL;
}
}
return (m_hrasconn == NULL) ? S_OK : E_POINTER;
}
STDMETHODIMP CRefDial::ProcessSignedPID(BOOL * pbRetVal)
{
USES_CONVERSION;
HANDLE hfile;
DWORD dwFileSize;
DWORD dwBytesRead;
LPBYTE lpbSignedPID;
LPTSTR lpszSignedPID;
*pbRetVal = FALSE;
// Open the PID file for Binary Reading. It will be in the CWD
if (INVALID_HANDLE_VALUE != (hfile = CreateFile(c_szSignedPIDFName,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL)))
{
dwFileSize = GetFileSize(hfile, NULL);
// Allocate a buffer to read the file, and one to store the BINHEX version
lpbSignedPID = new BYTE[dwFileSize];
lpszSignedPID = new TCHAR[(dwFileSize * 2) + 1];
if (lpbSignedPID && lpszSignedPID)
{
if (ReadFile(hfile, (LPVOID) lpbSignedPID, dwFileSize, &dwBytesRead, NULL) &&
(dwFileSize == dwBytesRead))
{
// BINHEX the signed PID data so we can send it to the signup server
DWORD dwX = 0;
BYTE by;
for (DWORD dwY = 0; dwY < dwFileSize; dwY++)
{
by = lpbSignedPID[dwY];
lpszSignedPID[dwX++] = g_BINTOHEXLookup[((by & 0xF0) >> 4)];
lpszSignedPID[dwX++] = g_BINTOHEXLookup[(by & 0x0F)];
}
lpszSignedPID[dwX] = '\0';
// Convert the signed pid to a BSTR
m_bstrSignedPID = A2BSTR(lpszSignedPID);
// Set the return value
*pbRetVal = TRUE;
}
}
// Free the buffers we allocated
if (lpbSignedPID)
{
delete[] lpbSignedPID;
}
if (lpszSignedPID)
{
delete[] lpszSignedPID;
}
// Close the File
CloseHandle(hfile);
#ifndef DEBUG
// Delete the File
// defer removal of this file until the container app exits.
// see BUG 373.
//DeleteFile(c_szSignedPIDFName);
#endif
}
return S_OK;
}
STDMETHODIMP CRefDial::get_SignedPID(BSTR * pVal)
{
if (pVal == NULL)
return E_POINTER;
*pVal = m_bstrSignedPID.Copy();
return S_OK;
}
STDMETHODIMP CRefDial::FormReferralServerURL(BOOL * pbRetVal)
{
// Form the URL to be used to access the referal server
if (ERROR_SUCCESS != FormURL())
*pbRetVal = FALSE;
else
*pbRetVal = TRUE;
return S_OK;
}
STDMETHODIMP CRefDial::get_SignupURL(BSTR * pVal)
{
USES_CONVERSION;
TCHAR szTemp[256];
if (pVal == NULL)
return E_POINTER;
// Get the URL from the ISP file, and then convert it
if (SUCCEEDED(GetDataFromISPFile(OLE2A(m_bstrISPFile),INF_SECTION_URL, INF_SIGNUP_URL,&szTemp[0],256)))
{
*pVal = A2BSTR(szTemp);
}
else
{
*pVal = NULL;
}
return S_OK;
}
STDMETHODIMP CRefDial::get_AutoConfigURL(BSTR * pVal)
{
USES_CONVERSION;
TCHAR szTemp[256];
if (pVal == NULL)
return E_POINTER;
// Get the URL from the ISP file, and then convert it
if (SUCCEEDED(GetDataFromISPFile(OLE2A(m_bstrISPFile),INF_SECTION_URL, INF_AUTOCONFIG_URL,&szTemp[0],256)))
{
*pVal = A2BSTR(szTemp);
}
else
{
*pVal = NULL;
}
return S_OK;
}
STDMETHODIMP CRefDial::get_ISDNURL(BSTR * pVal)
{
USES_CONVERSION;
TCHAR szTemp[256];
if (pVal == NULL)
return E_POINTER;
// Get the ISDN URL from the ISP file, and then convert it
if (SUCCEEDED(GetDataFromISPFile(OLE2A(m_bstrISPFile),INF_SECTION_URL, INF_ISDN_URL,&szTemp[0],256)))
{
*pVal = A2BSTR(szTemp);
}
else
{
*pVal = NULL;
}
if (0 == szTemp[0] || NULL == *pVal)
{
// Get the sign up URL from the ISP file, and then convert it
if (SUCCEEDED(GetDataFromISPFile(OLE2A(m_bstrISPFile),INF_SECTION_URL, INF_SIGNUP_URL,&szTemp[0],256)))
{
*pVal = A2BSTR(szTemp);
}
else
{
*pVal = NULL;
}
}
return S_OK;
}
STDMETHODIMP CRefDial::get_ISDNAutoConfigURL(BSTR * pVal)
{
USES_CONVERSION;
TCHAR szTemp[256];
if (pVal == NULL)
return E_POINTER;
// Get the URL from the ISP file, and then convert it
if (SUCCEEDED(GetDataFromISPFile(OLE2A(m_bstrISPFile),INF_SECTION_URL, INF_ISDN_AUTOCONFIG_URL,&szTemp[0],256)))
{
*pVal = A2BSTR(szTemp);
}
else
{
*pVal = NULL;
}
return S_OK;
}
STDMETHODIMP CRefDial::get_TryAgain(BOOL * pVal)
{
if (pVal == NULL)
return E_POINTER;
*pVal = m_bTryAgain;
return S_OK;
}
STDMETHODIMP CRefDial::get_DialError(HRESULT * pVal)
{
*pVal = m_hrDialErr;
return S_OK;
}
STDMETHODIMP CRefDial::put_ModemOverride(BOOL newbVal)
{
m_bModemOverride = newbVal;
return S_OK;
}
STDMETHODIMP CRefDial::put_Redial(BOOL newbVal)
{
m_bRedial = newbVal;
return S_OK;
}
STDMETHODIMP CRefDial::get_DialErrorMsg(BSTR * pVal)
{
USES_CONVERSION;
if (pVal == NULL)
return E_POINTER;
if (m_hrDialErr != ERROR_SUCCESS)
{
DWORD dwIDS = RasErrorToIDS(m_hrDialErr);
if (dwIDS != -1 && dwIDS !=0)
{
*pVal = A2BSTR(GetSz((WORD)dwIDS));
}
else
{
*pVal = A2BSTR(GetSz(IDS_PPPRANDOMFAILURE));
}
}
else
{
*pVal = A2BSTR(GetSz(IDS_PPPRANDOMFAILURE));
}
return S_OK;
}
STDMETHODIMP CRefDial::ModemEnum_Reset()
{
m_emModemEnum.ResetIndex();
return S_OK;
}
STDMETHODIMP CRefDial::ModemEnum_Next(BSTR *pDeviceName)
{
if (pDeviceName == NULL)
return E_POINTER;
*pDeviceName = A2BSTR(m_emModemEnum.Next());
return S_OK;
}
STDMETHODIMP CRefDial::get_ModemEnum_NumDevices(long * pVal)
{
if (pVal == NULL)
return E_POINTER;
m_emModemEnum.ReInit();
*pVal = m_emModemEnum.GetNumDevices();
if(m_ISPImport.m_szDeviceName[0]!='\0')
{
//
// Find out what the current device index is
//
for(int l=0; l<(*pVal); l++)
{
if(lstrcmp(m_ISPImport.m_szDeviceName,m_emModemEnum.GetDeviceName(l))==0)
{
m_lCurrentModem = l;
break;
}
}
if(l == (*pVal))
m_lCurrentModem = -1;
}
else
m_lCurrentModem = -1;
return S_OK;
}
STDMETHODIMP CRefDial::get_SupportNumber(BSTR * pVal)
{
USES_CONVERSION;
TCHAR szSupportNumber[MAX_PATH];
if (pVal == NULL)
return E_POINTER;
if (m_SupportInfo.GetSupportInfo(szSupportNumber, m_dwCountryCode))
*pVal = A2BSTR(szSupportNumber);
else
*pVal = NULL;
return S_OK;
}
STDMETHODIMP CRefDial::get_ISPSupportNumber(BSTR * pVal)
{
USES_CONVERSION;
if (pVal == NULL)
return E_POINTER;
if (*m_szISPSupportNumber)
*pVal = A2BSTR(m_szISPSupportNumber);
else
*pVal = NULL;
return S_OK;
}
STDMETHODIMP CRefDial::ShowDialingProperties(BOOL * pbRetVal)
{
HRESULT hr;
DWORD dwNumDev = 0;
*pbRetVal = FALSE;
hr = lineInitialize(&m_hLineApp,_Module.GetModuleInstance(),LineCallback,(LPSTR)NULL,&dwNumDev);
if (hr == ERROR_SUCCESS)
{
LPLINEEXTENSIONID lpExtensionID;
if (m_dwTapiDev == 0xFFFFFFFF)
{
m_dwTapiDev = 0;
}
lpExtensionID = (LPLINEEXTENSIONID)GlobalAlloc(GPTR,sizeof(LINEEXTENSIONID));
if (lpExtensionID)
{
//
// Negotiate version - without this call
// lineTranslateDialog would fail
//
do {
hr = lineNegotiateAPIVersion(m_hLineApp,
m_dwTapiDev,
0x00010004, 0x00010004,
&m_dwAPIVersion,
lpExtensionID);
} while ((hr != ERROR_SUCCESS) && (m_dwTapiDev++ < dwNumDev - 1));
if (m_dwTapiDev >= dwNumDev)
{
m_dwTapiDev = 0;
}
//
// ditch it since we don't use it
//
GlobalFree(lpExtensionID);
lpExtensionID = NULL;
if (hr == ERROR_SUCCESS)
{
hr = lineTranslateDialog(m_hLineApp,
m_dwTapiDev,
m_dwAPIVersion,
GetActiveWindow(),
m_szPhoneNumber);
lineShutdown(m_hLineApp);
m_hLineApp = NULL;
}
}
}
if (hr == ERROR_SUCCESS)
{
GetDisplayableNumber();
*pbRetVal = TRUE;
}
return S_OK;
}
STDMETHODIMP CRefDial::ShowPhoneBook(DWORD dwCountryCode, long newVal, BOOL * pbRetVal)
{
USES_CONVERSION;
DWORD_PTR dwPhoneBook;
HINSTANCE hPHBKDll;
FARPROC fp;
BOOL bBookLoaded = FALSE;
*pbRetVal = FALSE; // Assume Failure
hPHBKDll = LoadLibrary(PHONEBOOK_LIBRARY);
if (hPHBKDll)
{
if (NULL != (fp = GetProcAddress(hPHBKDll,PHBK_LOADAPI)))
{
if (ERROR_SUCCESS == ((PFNPHONEBOOKLOAD)fp)(OLE2A(m_bstrISPFile),&dwPhoneBook))
{
bBookLoaded = TRUE;
m_pSuggestInfo->dwCountryID = dwCountryCode;
// Update the device type so we can distinguish ISDN numbers
TCHAR *pszNewType = m_emModemEnum.GetDeviceType(newVal);
m_ISPImport.m_bIsISDNDevice = (lstrcmpi(pszNewType, RASDT_Isdn) == 0);
m_lpGatherInfo->m_fType = TYPE_SIGNUP_ANY | (m_ISPImport.m_bIsISDNDevice ? MASK_ISDN_BIT:MASK_ANALOG_BIT);
m_lpGatherInfo->m_bMask = MASK_SIGNUP_ANY | (m_ISPImport.m_bIsISDNDevice ? MASK_ISDN_BIT:MASK_ANALOG_BIT);
if (ERROR_SUCCESS == UserPickANumber(GetActiveWindow(),
m_lpGatherInfo,
m_pSuggestInfo,
hPHBKDll,
dwPhoneBook,
&m_szConnectoid[0],
sizeof(m_szConnectoid),
DIALERR_IN_PROGRESS))
{
// Regenerate the displayable number
GetDisplayableNumber();
// Base the Country code on the ras entry, since it was
// directly modified in this case
LPRASENTRY lpRasEntry = NULL;
LPRASDEVINFO lpRasDevInfo = NULL;
DWORD dwRasEntrySize = 0;
DWORD dwRasDevInfoSize = 0;
if (SUCCEEDED(MyRasGetEntryProperties(NULL,
m_szConnectoid,
&lpRasEntry,
&dwRasEntrySize,
&lpRasDevInfo,
&dwRasDevInfoSize)))
{
m_dwCountryCode = lpRasEntry->dwCountryCode;
}
// Set the return code
*pbRetVal = TRUE;
}
}
}
FreeLibrary(hPHBKDll);
}
if (! bBookLoaded)
{
// Give the user a message
MsgBox(IDS_CANTINITPHONEBOOK,MB_MYERROR);
}
return S_OK;
}
BOOL CRefDial::IsSBCSString( TCHAR *sz )
{
Assert(sz);
#ifdef UNICODE
// Check if the string contains only ASCII chars.
int attrib = IS_TEXT_UNICODE_ASCII16 | IS_TEXT_UNICODE_CONTROLS;
return (BOOL)IsTextUnicode(sz, lstrlen(sz), &attrib);
#else
while( NULL != *sz )
{
if (IsDBCSLeadByte(*sz)) return FALSE;
sz++;
}
return TRUE;
#endif
}
TCHAR szValidPhoneCharacters[] = {TEXT("0123456789AaBbCcDdPpTtWw!@$ -.()+*#,&\0")};
STDMETHODIMP CRefDial::ValidatePhoneNumber(BSTR bstrPhoneNumber, BOOL * pbRetVal)
{
USES_CONVERSION;
// Bail if an empty string is passed
if (!bstrPhoneNumber || !wcslen(bstrPhoneNumber))
{
MsgBox(IDS_INVALIDPHONE,MB_MYERROR);
*pbRetVal = FALSE;
return(S_OK);
}
// Check that the phone number only contains valid characters
LPTSTR lpNum, lpValid;
LPTSTR lpszDialNumber = OLE2A(bstrPhoneNumber);
// vyung 03/06/99 Remove Easter egg as requested by NT5
#ifdef ICW_EASTEREGG
if (lstrcmp(lpszDialNumber, c_szCreditsMagicNum) == 0)
{
ShowCredits();
*pbRetVal = FALSE;
return(S_OK);
}
#endif
*pbRetVal = TRUE;
if (!IsSBCSString(lpszDialNumber))
{
MsgBox(IDS_SBCSONLY,MB_MYEXCLAMATION);
*pbRetVal = FALSE;
}
else
{
for (lpNum = lpszDialNumber;*lpNum;lpNum++)
{
for(lpValid = szValidPhoneCharacters;*lpValid;lpValid++)
{
if (*lpNum == *lpValid)
{
break; // p2 for loop
}
}
if (!*lpValid)
{
break; // p for loop
}
}
}
if (*lpNum)
{
MsgBox(IDS_INVALIDPHONE,MB_MYERROR);
*pbRetVal = FALSE;
}
return S_OK;
}
STDMETHODIMP CRefDial::get_HavePhoneBook(BOOL * pVal)
{
USES_CONVERSION;
DWORD_PTR dwPhoneBook;
HINSTANCE hPHBKDll;
FARPROC fp;
if (pVal == NULL)
return E_POINTER;
// Assume failure.
*pVal = FALSE;
// Try to load the phone book
hPHBKDll = LoadLibrary(PHONEBOOK_LIBRARY);
if (hPHBKDll)
{
if (NULL != (fp = GetProcAddress(hPHBKDll,PHBK_LOADAPI)))
{
if (ERROR_SUCCESS == ((PFNPHONEBOOKLOAD)fp)(OLE2A(m_bstrISPFile),&dwPhoneBook))
{
*pVal = TRUE; // Got IT!
}
}
FreeLibrary(hPHBKDll);
}
return S_OK;
}
STDMETHODIMP CRefDial::get_BrandingFlags(long * pVal)
{
if (pVal == NULL)
return E_POINTER;
*pVal = m_lBrandingFlags;
return S_OK;
}
STDMETHODIMP CRefDial::put_BrandingFlags(long newVal)
{
m_lBrandingFlags = newVal;
return S_OK;
}
/**********************************************************************/
//
// FUNCTION: get_CurrentModem
// put_CurrentModem
//
// DESCRIPTION:
// These functions are used to set the current modem
// based on the enumerated modem list, and should only
// be used after taking a snapshot of the modem list
// with the ModemEnum_* functions. The functions are also
// intended to be used with an existing RAS connectoid, not
// to set-up the RefDial object before connecting.
//
// HISTORY:
//
// donsc - 3/11/98 Added these functions to support the dial error
// page in the HTML JavaScript code.
//
/**********************************************************************/
//
// get_CurrentModem will return -1 if the modem list was not enumerated
// or no modem has been selected for this RefDial object
//
STDMETHODIMP CRefDial::get_CurrentModem(long * pVal)
{
if (pVal == NULL)
return E_POINTER;
*pVal = m_lCurrentModem;
return S_OK;
}
STDMETHODIMP CRefDial::put_CurrentModem(long newVal)
{
LPRASENTRY lpRasEntry = NULL;
LPRASDEVINFO lpRasDevInfo = NULL;
DWORD dwRasEntrySize = 0;
DWORD dwRasDevInfoSize = 0;
RNAAPI *pcRNA = NULL;
HRESULT hr = S_OK;
TCHAR *pszNewName = m_emModemEnum.GetDeviceName(newVal);
TCHAR *pszNewType = m_emModemEnum.GetDeviceType(newVal);
if((pszNewName==NULL) || (pszNewType==NULL))
return E_INVALIDARG;
if(m_lCurrentModem == newVal)
return S_OK;
//
// Must have a connectoid already established to set the
// current modem.
//
if(m_szConnectoid[0]=='\0')
return E_FAIL;
// Get the current RAS entry properties
hr = MyRasGetEntryProperties(NULL,
m_szConnectoid,
&lpRasEntry,
&dwRasEntrySize,
&lpRasDevInfo,
&dwRasDevInfoSize);
//
// The MyRas function returns 0 on success, not technically
// an HRESULT
//
if(hr!=0 || NULL == lpRasEntry)
hr = E_FAIL;
lpRasDevInfo = NULL;
dwRasDevInfoSize = 0;
if (SUCCEEDED(hr))
{
//
// Retrieve the dial entry params of the existing entry
//
LPRASDIALPARAMS lpRasDialParams = (LPRASDIALPARAMS)GlobalAlloc(GPTR,sizeof(RASDIALPARAMS));
BOOL bPW = FALSE;
if (!lpRasDialParams)
{
hr = ERROR_NOT_ENOUGH_MEMORY;
goto PutModemExit;
}
lpRasDialParams->dwSize = sizeof(RASDIALPARAMS);
lstrcpyn(lpRasDialParams->szEntryName,m_szConnectoid,ARRAYSIZE(lpRasDialParams->szEntryName));
bPW = FALSE;
hr = MyRasGetEntryDialParams(NULL,lpRasDialParams,&bPW);
if (FAILED(hr))
goto PutModemExit;
//
// Enter the new ras device info.
//
lstrcpy(lpRasEntry->szDeviceName,pszNewName);
lstrcpy(lpRasEntry->szDeviceType,pszNewType);
//
// Set to dial as is
//
pcRNA = new RNAAPI;
if (pcRNA)
{
//
// When changing the actual device, it is not always reliable
// to just set the new properties. We need to remove the
// previous entry and create a new one.
//
pcRNA->RasDeleteEntry(NULL,m_szConnectoid);
if(pcRNA->RasSetEntryProperties(NULL,
m_szConnectoid,
(LPBYTE)lpRasEntry,
dwRasEntrySize,
(LPBYTE)NULL,
0)==0)
{
//
// And set the other dialing parameters
//
if(pcRNA->RasSetEntryDialParams(NULL,lpRasDialParams,!bPW)!=0)
hr = E_FAIL;
}
else
hr = E_FAIL;
delete pcRNA;
}
else
hr = E_FAIL;
GlobalFree(lpRasDialParams);
}
PutModemExit:
if(SUCCEEDED(hr))
{
m_lCurrentModem = newVal;
lstrcpy(m_ISPImport.m_szDeviceName,pszNewName);
lstrcpy(m_ISPImport.m_szDeviceType,pszNewType);
// Get the device name and type in the registry, since ConfigRasEntryDevice
// will use them. ConfigRasEntryDevice is called when the new connectoid
// is being created, so if the user changes the modem, we want that
// reflected in the new connectoid (BUG 20841)
m_ISPImport.SetDeviceSelectedByUser(DEVICENAMEKEY, pszNewName);
m_ISPImport.SetDeviceSelectedByUser (DEVICETYPEKEY, pszNewType);
m_ISPImport.m_bIsISDNDevice = (lstrcmpi(pszNewType, RASDT_Isdn) == 0);
m_lpGatherInfo->m_fType = TYPE_SIGNUP_ANY | (m_ISPImport.m_bIsISDNDevice ? MASK_ISDN_BIT:MASK_ANALOG_BIT);
m_lpGatherInfo->m_bMask = MASK_SIGNUP_ANY | (m_ISPImport.m_bIsISDNDevice ? MASK_ISDN_BIT:MASK_ANALOG_BIT);
}
return hr;
}
STDMETHODIMP CRefDial::get_ISPSupportPhoneNumber(BSTR * pVal)
{
if (pVal == NULL)
return E_POINTER;
*pVal = m_bstrSupportNumber.Copy();
return S_OK;
}
STDMETHODIMP CRefDial::put_ISPSupportPhoneNumber(BSTR newVal)
{
// TODO: Add your implementation code here
m_bstrSupportNumber = newVal;
return S_OK;
}
STDMETHODIMP CRefDial::get_LoggingStartUrl(BSTR * pVal)
{
if(pVal == NULL)
return E_POINTER;
*pVal = m_bstrLoggingStartUrl;
return S_OK;
}
STDMETHODIMP CRefDial::get_LoggingEndUrl(BSTR * pVal)
{
if(pVal == NULL)
return E_POINTER;
*pVal = m_bstrLoggingEndUrl;
return S_OK;
}
void CRefDial::ShowCredits()
{
#ifdef ICW_EASTEREGG
HINSTANCE hinstMSHTML = LoadLibrary(TEXT("MSHTML.DLL"));
if(hinstMSHTML)
{
SHOWHTMLDIALOGFN *pfnShowHTMLDialog;
pfnShowHTMLDialog = (SHOWHTMLDIALOGFN*)GetProcAddress(hinstMSHTML, "ShowHTMLDialog");
if(pfnShowHTMLDialog)
{
IMoniker *pmk;
TCHAR szTemp[MAX_PATH*2];
BSTR bstr;
lstrcpy(szTemp, TEXT("res://"));
GetModuleFileName(_Module.GetModuleInstance(), szTemp + lstrlen(szTemp), ARRAYSIZE(szTemp) - lstrlen(szTemp));
lstrcat(szTemp, TEXT("/CREDITS_RESOURCE"));
bstr = A2BSTR((LPTSTR) szTemp);
CreateURLMoniker(NULL, bstr, &pmk);
if(pmk)
{
HRESULT hr;
VARIANT varReturn;
VariantInit(&varReturn);
hr = (*pfnShowHTMLDialog)(NULL, pmk, NULL, NULL, &varReturn);
pmk->Release();
}
SysFreeString(bstr);
}
FreeLibrary(hinstMSHTML);
}
#endif
}
STDMETHODIMP CRefDial::SelectedPhoneNumber(long newVal, BOOL * pbRetVal)
{
BOOL bSuccess = FALSE;
*pbRetVal = TRUE;
SetupConnectoid(m_pSuggestInfo,
newVal,
&m_szConnectoid[0],
sizeof(m_szConnectoid),
&bSuccess);
if( !bSuccess )
{
m_bQuitWizard = TRUE;
*pbRetVal = FALSE;
}
else
{
// Generate a Displayable number
m_hrDisplayableNumber = GetDisplayableNumber();
}
return S_OK;
}
STDMETHODIMP CRefDial::PhoneNumberEnum_Reset()
{
m_PhoneNumberEnumidx = 0;
return S_OK;
}
#define MAX_PAN_NUMBER_LEN 64
STDMETHODIMP CRefDial::PhoneNumberEnum_Next(BSTR *pNumber)
{
TCHAR szTemp[MAX_PAN_NUMBER_LEN + 1];
PACCESSENTRY pAE;
if (pNumber == NULL)
return E_POINTER;
if (m_PhoneNumberEnumidx > m_pSuggestInfo->wNumber - 1)
m_PhoneNumberEnumidx = m_pSuggestInfo->wNumber -1;
pAE = m_pSuggestInfo->rgpAccessEntry[m_PhoneNumberEnumidx];
wsprintf(szTemp,TEXT("%s (%s) %s"),pAE->szCity,pAE->szAreaCode,pAE->szAccessNumber);
++m_PhoneNumberEnumidx;
*pNumber = A2BSTR(szTemp);
return S_OK;
}
STDMETHODIMP CRefDial::get_PhoneNumberEnum_NumDevices(long * pVal)
{
if (pVal == NULL)
return E_POINTER;
m_PhoneNumberEnumidx = 0;
*pVal = m_pSuggestInfo->wNumber;
return S_OK;
}
STDMETHODIMP CRefDial::get_bIsISDNDevice(BOOL *pVal)
{
if (pVal == NULL)
return E_POINTER;
// NOTE SetupForDialing needs to be called before this API, otherwise the return
// value is really undefined
// Set the return value based on the ISPImport object (that is the object which
// imports the data from the .ISP file, and also selects the RAS device used
// to connect
*pVal = m_ISPImport.m_bIsISDNDevice;
return (S_OK);
}
//+---------------------------------------------------------------------------
//
// Function: get_RasGetConnectStatus
//
// Synopsis: Checks for existing Ras connection
//
//+---------------------------------------------------------------------------
STDMETHODIMP CRefDial::get_RasGetConnectStatus(BOOL *pVal)
{
RNAAPI *pcRNA;
HRESULT hr = E_FAIL;
*pVal = FALSE;
if (NULL != m_hrasconn)
{
RASCONNSTATUS rasConnectState;
rasConnectState.dwSize = sizeof(RASCONNSTATUS);
pcRNA = new RNAAPI;
if (pcRNA)
{
if (0 == pcRNA->RasGetConnectStatus(m_hrasconn,
&rasConnectState))
{
if (RASCS_Disconnected != rasConnectState.rasconnstate)
*pVal = TRUE;
}
delete pcRNA;
pcRNA = NULL;
hr = S_OK;
}
}
return hr;
}