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

924 lines
22 KiB
C++

//+---------------------------------------------------------------------------
// File name: dialdlg.cpp
//
// This file impelements the dialing and download progress dialog
//
// Copyright (C) 1996 Microsoft Corporation
// All rights reserved
//
// Authors:
// ChrisK Chris Kauffman
// VetriV Vellore Vetrivelkumaran
//
// History:
// 7/22/96 ChrisK Cleaned and formatted
// 8/5/96 VetriV Added WIN16 code
// 8/19/96 ValdonB Added "dial as is" support
// Fixed some memory leaks
//
// -----------------------------------------------------------------------------*/
#include "pch.hpp"
#include "globals.h"
#if defined(WIN16)
#include "ietapi.h"
#include <comctlie.h>
#include <string.h>
static FARPROC lpfnCallback = (FARPROC) NULL;
#endif
#define MAX_EXIT_RETRIES 10
#define WM_DIAL WM_USER+3
#define MAX_RETIES 3
PMYDEVICE g_pdevice = NULL;
PDIALDLG g_pcPDLG = NULL;
// ############################################################################
void CALLBACK LineCallback(DWORD hDevice,
DWORD dwMessage,
DWORD dwInstance,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwParam3)
{
}
#if defined(WIN16)
static BOOL g_bFirstTime = TRUE;
#endif
HWND g_hDialDlgWnd = NULL;
// ############################################################################
HRESULT ShowDialingDialog(LPTSTR pszConnectoid, PGATHEREDINFO pGI, LPTSTR szUrl, HINSTANCE hInst, HWND hwnd, LPTSTR szINSFile)
{
int iRC;
HINSTANCE hDialDLL = NULL;
#if !defined(WIN16)
PFNDDDlg pfnDDDlg = NULL;
DIALDLGDATA ddData;
#endif
if (!g_pdevice) g_pdevice = (PMYDEVICE)GlobalAlloc(GPTR,sizeof(MYDEVICE));
if (!g_pdevice)
{
MessageBox(hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_APPLMODAL | MB_ICONERROR);
iRC = ERROR_NOT_ENOUGH_MEMORY;
goto ShowDialingDialogExit;
}
g_pdevice->dwTapiDev = 0xffffffff;
#if defined(WIN16)
if (!g_pcPDLG) g_pcPDLG = (PDIALDLG)GlobalAlloc(GPTR,sizeof(DIALDLG));
if (!g_pcPDLG)
{
MessageBox(hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_APPLMODAL | MB_ICONERROR);
iRC = ERROR_NOT_ENOUGH_MEMORY;
goto ShowDialingDialogExit;
}
g_pcPDLG->m_pszConnectoid = (LPTSTR)GlobalAlloc(GPTR,lstrlen(pszConnectoid)+1);
if (!g_pcPDLG->m_pszConnectoid)
{
iRC = ERROR_NOT_ENOUGH_MEMORY;
goto ShowDialingDialogExit;
}
lstrcpy(g_pcPDLG->m_pszConnectoid,pszConnectoid);
g_pcPDLG->m_pGI = pGI;
g_pcPDLG->m_szUrl = szUrl;
g_pcPDLG->g_hInst = hInst;
g_bProgressBarVisible = FALSE;
#define DLGPROC16 DLGPROC // Identify as only cast for Win16
DLGPROC dlgprc;
dlgprc = (DLGPROC16) MakeProcInstance((FARPROC)DialDlgProc, g_pcPDLG->g_hInst);
iRC = DialogBoxParam(g_pcPDLG->g_hInst,
MAKEINTRESOURCE(IDD_DIALING),
hwnd, dlgprc, (LPARAM)g_pcPDLG);
FreeProcInstance((FARPROC) dlgprc);
ShowDialingDialogExit:
if (g_pcPDLG->m_pszConnectoid) GlobalFree(g_pcPDLG->m_pszConnectoid);
if (g_pcPDLG->m_pszDisplayable) GlobalFree(g_pcPDLG->m_pszDisplayable);
if (g_pcPDLG) GlobalFree(g_pcPDLG);
g_pcPDLG = NULL;
return iRC;
#else
//
// Fill in data structure
//
ZeroMemory(&ddData,sizeof(ddData));
ddData.dwSize = sizeof(ddData);
StrDup(&ddData.pszMessage,GetSz(IDS_DOWNLOAD_SW));
StrDup(&ddData.pszRasEntryName,pszConnectoid);
StrDup(&ddData.pszMultipartMIMEUrl,pszSetupClientURL);
ddData.pfnStatusCallback = StatusMessageCallback;
ddData.hInst = hInst;
ddData.bSkipDial = (0 == uiSetupClientNewPhoneCall);
//
// ChrisK 8/20/97
// Pass .ins file to dialer so that the dialer can find the password
//
StrDup(&ddData.pszDunFile,szINSFile);
//
// Load API
//
hDialDLL = LoadLibrary(AUTODIAL_LIBRARY);
if (!hDialDLL)
{
AssertSz(0,"Can't load icwdial.\r\n");
iRC = GetLastError();
goto ShowDialingDialogExit;
}
pfnDDDlg = (PFNDDDlg)GetProcAddress(hDialDLL,"DialingDownloadDialog");
if (!pfnDDDlg)
{
AssertSz(0,"Can find DialingDownloadDialog.\r\n");
iRC = GetLastError();
goto ShowDialingDialogExit;
}
//
// Display Dialog
//
iRC = pfnDDDlg(&ddData);
//
// Free memory and clean up
//
if (hDialDLL) FreeLibrary(hDialDLL);
if (ddData.pszMessage) GlobalFree(ddData.pszMessage);
if (ddData.pszRasEntryName) GlobalFree(ddData.pszRasEntryName);
if (ddData.pszMultipartMIMEUrl) GlobalFree(ddData.pszMultipartMIMEUrl);
ShowDialingDialogExit:
return iRC;
#endif
}
// ############################################################################
extern "C" INT_PTR CALLBACK FAR PASCAL DialDlgProc(HWND hwnd,
UINT uMsg,
WPARAM wparam,
LPARAM lparam)
{
static UINT unRasEvent = 0;
#if defined(WIN16)
static BOOL bUserCancelled = FALSE;
#endif
HRESULT hr;
//BOOL bPW;
WORD wIDS;
//LPRASDIALPARAMS lpRasDialParams;
HINSTANCE hDLDLL;
FARPROC fp;
#if !defined(WIN16)
DWORD dwThreadResults;
#endif
INT iRetries;
#if defined(WIN16)
RECT MyRect;
RECT DTRect;
#endif
BOOL bRes = TRUE;
switch(uMsg)
{
case WM_DESTROY:
ReleaseBold(GetDlgItem(hwnd,IDC_LBLTITLE));
#ifdef WIN16
DeleteDlgFont(hwnd);
#endif
bRes = FALSE;
break;
#if defined(WIN16)
case WM_SYSCOLORCHANGE:
Ctl3dColorChange();
break;
#endif
case WM_INITDIALOG:
g_hDialDlgWnd = hwnd;
#if defined(WIN16)
g_bFirstTime = TRUE;
bUserCancelled = FALSE;
//
// Move the window to the center of the screen
//
GetWindowRect(hwnd, &MyRect);
GetWindowRect(GetDesktopWindow(), &DTRect);
MoveWindow(hwnd, (DTRect.right - MyRect.right) / 2, (DTRect.bottom - MyRect.bottom) /2,
MyRect.right, MyRect.bottom, FALSE);
SetNonBoldDlg(hwnd);
#endif
ShowWindow(GetDlgItem(hwnd,IDC_PROGRESS),SW_HIDE);
g_pcPDLG->m_hwnd = hwnd;
SPParams.hwnd = hwnd;
#if !defined(WIN16)
unRasEvent = RegisterWindowMessageA( RASDIALEVENT );
#endif
if (unRasEvent == 0) unRasEvent = WM_RASDIALEVENT;
MakeBold(GetDlgItem(hwnd,IDC_LBLTITLE),TRUE,FW_BOLD);
// Do not make a call. We are already connected
//
if (uiSetupClientNewPhoneCall == FALSE)
{
PostMessage(hwnd,unRasEvent,(WPARAM)RASCS_Connected,0);
break;
}
// Show number to be dialed
//
hr = GetDisplayableNumberDialDlg();
if (hr != ERROR_SUCCESS)
{
SetDlgItemText(hwnd,IDC_LBLNUMBER,g_pcPDLG->m_szPhoneNumber);
} else {
SetDlgItemText(hwnd,IDC_LBLNUMBER,g_pcPDLG->m_pszDisplayable);
}
PostMessage(hwnd,WM_DIAL,0,0);
break;
case WM_DIAL:
hr = DialDlg();
#if defined(DEBUG)
if (0 != hr)
{
TCHAR szTempBuf[255];
RasGetErrorString((UINT)hr, szTempBuf, 254);
Dprintf("CONNECT: Ras error string is <%s>\n", szTempBuf);
}
#endif
if (hr != ERROR_SUCCESS)
EndDialog(hwnd,(int)hr);
break;
case WM_CLOSE:
if (dwDownLoad)
{
hDLDLL = LoadLibrary(DOWNLOAD_LIBRARY);
if (hDLDLL)
{
fp = GetProcAddress(hDLDLL,DOWNLOADCANCEL);
if(fp && dwDownLoad)
((PFNDOWNLOADCANCEL)fp)(dwDownLoad);
FreeLibrary(hDLDLL);
}
}
if (uiSetupClientNewPhoneCall)
{
if (g_pcPDLG->m_hrasconn)
{
RasHangUp(g_pcPDLG->m_hrasconn);
WaitForConnectionTermination(g_pcPDLG->m_hrasconn);
}
g_pcPDLG->m_hrasconn = NULL;
}
EndDialog(hwnd,ERROR_USERCANCEL);
break;
case WM_COMMAND:
switch(LOWORD(wparam))
{
case IDC_CMDCANCEL:
if (dwDownLoad)
{
hDLDLL = LoadLibrary(DOWNLOAD_LIBRARY);
if (hDLDLL)
{
fp = GetProcAddress(hDLDLL,DOWNLOADCANCEL);
if(fp && dwDownLoad)
((PFNDOWNLOADCANCEL)fp)(dwDownLoad);
FreeLibrary(hDLDLL);
}
#if !defined(WIN16)
} else {
PostMessage(hwnd,unRasEvent,RASCS_Disconnected,ERROR_USER_DISCONNECTION);
#endif //!WIN16
}
if (uiSetupClientNewPhoneCall)
{
if (g_pcPDLG->m_hrasconn)
{
RasHangUp(g_pcPDLG->m_hrasconn);
WaitForConnectionTermination(g_pcPDLG->m_hrasconn);
}
g_pcPDLG->m_hrasconn = NULL;
}
break;
}
#if defined(WIN16)
bUserCancelled = TRUE;
#endif
EndDialog(hwnd,ERROR_USERCANCEL);
break;
case WM_DOWNLOAD_DONE:
#if !defined(WIN16)
dwThreadResults = STILL_ACTIVE;
#endif
iRetries = 0;
if (uiSetupClientNewPhoneCall)
{
if (g_pcPDLG->m_hrasconn)
{
RasHangUp(g_pcPDLG->m_hrasconn);
WaitForConnectionTermination(g_pcPDLG->m_hrasconn);
}
}
#if !defined(WIN16)
do {
if (!GetExitCodeThread(g_pcPDLG->m_hThread,&dwThreadResults))
{
AssertSz(0,"CONNECT:GetExitCodeThread failed.\n");
}
iRetries++;
if (dwThreadResults == STILL_ACTIVE) Sleep(500);
} while (dwThreadResults == STILL_ACTIVE && iRetries < MAX_EXIT_RETRIES);
if (dwThreadResults == ERROR_SUCCESS)
EndDialog(hwnd,ERROR_USERNEXT);
else
EndDialog(hwnd, dwThreadResults);
#else
EndDialog(hwnd, ERROR_USERNEXT);
#endif //!WIN16
break;
default:
bRes = FALSE;
if (uMsg == unRasEvent)
{
Dprintf(TEXT("CONNECT2: Ras event %u error code (%ld)\n"),wparam,lparam);
#if defined(DEBUG)
if (0 != lparam)
{
TCHAR szTempBuf[255];
RasGetErrorString((UINT)lparam, szTempBuf, 254);
Dprintf("CONNECT2: Ras error string is <%s>\n", szTempBuf);
}
#endif
#if !defined(WIN16)
TCHAR dzRasError[10];
wsprintf(dzRasError,TEXT("%d %d"),wparam,lparam);
RegSetValue(HKEY_LOCAL_MACHINE,TEXT("Software\\Microsoft\\iSignUp"),REG_SZ,dzRasError,lstrlen(dzRasError));
#endif
#if defined(WIN16)
//
// Work around for WIN16 RAS bug - if status code to > 0x4000
// adjust it to the correct value
//
if (wparam >= 0x4000)
wparam -= 0x4000;
#endif
wIDS = 0;
switch(wparam)
{
case RASCS_OpenPort:
wIDS = IDS_RAS_OPENPORT;
break;
case RASCS_PortOpened:
wIDS = IDS_RAS_PORTOPENED;
break;
case RASCS_ConnectDevice:
wIDS = IDS_RAS_DIALING;
break;
#if defined(WIN16)
case RASCS_AllDevicesConnected:
wIDS = IDS_RAS_CONNECTED;
break;
#else
case RASCS_DeviceConnected:
wIDS = IDS_RAS_CONNECTED;
break;
#endif
case RASCS_StartAuthentication:
case RASCS_LogonNetwork:
wIDS = IDS_RAS_LOCATING;
break;
// case RASCS_CallbackComplete:
// wIDS = IDS_RAS_CONNECTED;
// break;
/* ETC...
RASCS_AllDevicesConnected,
RASCS_Authenticate,
RASCS_AuthNotify,
RASCS_AuthRetry,
RASCS_AuthCallback,
RASCS_AuthChangePassword,
RASCS_AuthProject,
RASCS_AuthLinkSpeed,
RASCS_AuthAck,
RASCS_ReAuthenticate,
RASCS_Authenticated,
RASCS_PrepareForCallback,
RASCS_WaitForModemReset,
RASCS_WaitForCallback,
RASCS_Projected,
RASCS_Interactive = RASCS_PAUSED,
RASCS_RetryAuthentication,
RASCS_CallbackSetByCaller,
RASCS_PasswordExpired,
*/
case RASCS_Connected:
#if !defined(WIN16)
MinimizeRNAWindow(g_pcPDLG->m_pszConnectoid, g_pcPDLG->g_hInst);
#endif // !WIN16
//
// The connection is open and ready. Start the download.
//
g_pcPDLG->m_dwThreadID = 0;
#if defined(WIN16)
if (ThreadInit() != ERROR_SUCCESS)
g_pcPDLG->m_hThread = NULL;
else
g_pcPDLG->m_hThread = 1;
#else
g_pcPDLG->m_hThread = CreateThread(NULL,0,
(LPTHREAD_START_ROUTINE)ThreadInit,
NULL,0,
&g_pcPDLG->m_dwThreadID);
#endif
if (!g_pcPDLG->m_hThread)
{
if (uiSetupClientNewPhoneCall)
{
if (g_pcPDLG->m_hrasconn)
{
RasHangUp(g_pcPDLG->m_hrasconn);
WaitForConnectionTermination(g_pcPDLG->m_hrasconn);
}
g_pcPDLG->m_hrasconn = NULL;
}
hr = GetLastError();
#if defined(WIN16)
if (bUserCancelled)
hr = ERROR_USERCANCEL;
#endif
EndDialog(hwnd,(int)hr);
break;
}
break;
case RASCS_Disconnected:
//if (FShouldRetry(lparam))
// PostMessage(hwnd,WM_DIAL,0,0);
//else
if (uiSetupClientNewPhoneCall)
{
if (g_pcPDLG->m_hrasconn)
{
RasHangUp(g_pcPDLG->m_hrasconn);
WaitForConnectionTermination(g_pcPDLG->m_hrasconn);
}
g_pcPDLG->m_hrasconn = NULL;
}
EndDialog(hwnd, (int)lparam);
break;
//EndDialog(hwnd,lparam);
//break;
}
if (wIDS)
SetDlgItemText(hwnd,IDC_LBLSTATUS,GetSz(wIDS));
}
}
return bRes;
}
// ############################################################################
HRESULT GetDisplayableNumberDialDlg()
{
HRESULT hr;
LPRASENTRY lpRasEntry = NULL;
LPRASDEVINFO lpRasDevInfo = NULL;
DWORD dwRasEntrySize;
DWORD dwRasDevInfoSize;
LPLINETRANSLATEOUTPUT lpOutput1 = NULL;
HINSTANCE hRasDll = NULL;
FARPROC fp = NULL;
#if !defined(WIN16)
DWORD dwNumDev;
LPLINETRANSLATEOUTPUT lpOutput2;
LPLINEEXTENSIONID lpExtensionID = NULL;
#endif
//
// Get phone number from connectoid
//
/*#if defined(WIN16)
//
// Allocate extra 256 bytes to workaround memory overrun bug in RAS
//
lpRasEntry = (LPRASENTRY)GlobalAlloc(GPTR,sizeof(RASENTRY)+256);
#else
lpRasEntry = (LPRASENTRY)GlobalAlloc(GPTR,sizeof(RASENTRY));
#endif
if (!lpRasEntry)
{
hr = ERROR_NOT_ENOUGH_MEMORY;
goto GetDisplayableNumberExit;
}
lpRasDevInfo = (LPRASDEVINFO)GlobalAlloc(GPTR,sizeof(RASDEVINFO));
if (!lpRasDevInfo)
{
hr = ERROR_NOT_ENOUGH_MEMORY;
goto GetDisplayableNumberExit;
}
dwRasEntrySize = sizeof(RASENTRY);
dwRasDevInfoSize = sizeof(RASDEVINFO);
lpRasEntry->dwSize = dwRasEntrySize;
lpRasDevInfo->dwSize = dwRasDevInfoSize;
*/
/*hRasDll = LoadLibrary(RASAPI_LIBRARY);
if (!hRasDll)
{
hr = GetLastError();
goto GetDisplayableNumberExit;
}
fp =GetProcAddress(hRasDll,"RasGetEntryProperties");
if (!fp)
{
FreeLibrary(hRasDll);
hRasDll = LoadLibrary("RNAPH.DLL");
if (!hRasDll)
{
hr = GetLastError();
goto GetDisplayableNumberExit;
}
fp = GetProcAddress(hRasDll,"RasGetEntryProperties");
if (!fp)
{
hr = GetLastError();
goto GetDisplayableNumberExit;
}
}*/
/*
hr = RasGetEntryProperties(NULL,g_pcPDLG->m_pszConnectoid,
#if defined(WIN16)
(LPBYTE)
#endif
lpRasEntry,
&dwRasEntrySize,
(LPBYTE)lpRasDevInfo,&dwRasDevInfoSize);
*/
hr = MyRasGetEntryProperties( NULL,
g_pcPDLG->m_pszConnectoid,
&lpRasEntry,
&dwRasEntrySize,
&lpRasDevInfo,
&dwRasDevInfoSize);
if (hr != ERROR_SUCCESS)
{
goto GetDisplayableNumberExit;
}
//FreeLibrary(hRasDll);
//
// If this is a dial as is number, just get it from the structure
//
g_pcPDLG->m_bDialAsIs = !(lpRasEntry->dwfOptions & RASEO_UseCountryAndAreaCodes);
if (g_pcPDLG->m_bDialAsIs)
{
if (g_pcPDLG->m_pszDisplayable) GlobalFree(g_pcPDLG->m_pszDisplayable);
g_pcPDLG->m_pszDisplayable = (LPTSTR)GlobalAlloc(GPTR, lstrlen(lpRasEntry->szLocalPhoneNumber)+1);
if (!g_pcPDLG->m_pszDisplayable)
{
hr = ERROR_NOT_ENOUGH_MEMORY;
goto GetDisplayableNumberExit;
}
lstrcpy(g_pcPDLG->m_szPhoneNumber, lpRasEntry->szLocalPhoneNumber);
lstrcpy(g_pcPDLG->m_pszDisplayable, lpRasEntry->szLocalPhoneNumber);
}
else
{
//
// If there is no area code, don't use parentheses
//
if (lpRasEntry->szAreaCode[0])
wsprintf(g_pcPDLG->m_szPhoneNumber,TEXT("+%lu (%s) %s\0"),lpRasEntry->dwCountryCode,
lpRasEntry->szAreaCode,lpRasEntry->szLocalPhoneNumber);
else
wsprintf(g_pcPDLG->m_szPhoneNumber,TEXT("+%lu %s\0"),lpRasEntry->dwCountryCode,
lpRasEntry->szLocalPhoneNumber);
#if defined(WIN16)
TCHAR szBuffer[1024];
LONG lRetCode;
memset(&szBuffer[0], 0, sizeof(szBuffer));
lpOutput1 = (LPLINETRANSLATEOUTPUT) & szBuffer[0];
lpOutput1->dwTotalSize = sizeof(szBuffer);
lRetCode = IETapiTranslateAddress(NULL, g_pcPDLG->m_szPhoneNumber,
0L, 0L, lpOutput1);
if (0 != lRetCode)
{
//
// TODO: Set the correct error code
//
hr = GetLastError();
goto GetDisplayableNumberExit;
}
g_pcPDLG->m_pszDisplayable = (LPTSTR)GlobalAlloc(GPTR,
((size_t)lpOutput1->dwDisplayableStringSize+1));
if (!g_pcPDLG->m_pszDisplayable)
{
hr = ERROR_NOT_ENOUGH_MEMORY;
goto GetDisplayableNumberExit;
}
lstrcpy(g_pcPDLG->m_pszDisplayable,
&szBuffer[lpOutput1->dwDisplayableStringOffset]);
#else //WIN16
//
// Initialize TAPIness
//
dwNumDev = 0;
hr = lineInitialize(&g_pcPDLG->m_hLineApp,g_pcPDLG->g_hInst,LineCallback,NULL,&dwNumDev);
if (hr != ERROR_SUCCESS)
goto GetDisplayableNumberExit;
if (g_pdevice->dwTapiDev == 0xFFFFFFFF)
{
g_pdevice->dwTapiDev = 0;
}
lpExtensionID = (LPLINEEXTENSIONID )GlobalAlloc(GPTR,sizeof(LINEEXTENSIONID));
if (!lpExtensionID)
{
hr = ERROR_NOT_ENOUGH_MEMORY;
goto GetDisplayableNumberExit;
}
do {
hr = lineNegotiateAPIVersion(g_pcPDLG->m_hLineApp, g_pdevice->dwTapiDev, 0x00010004, 0x00010004,
&g_pcPDLG->m_dwAPIVersion, lpExtensionID);
} while (hr && g_pdevice->dwTapiDev++ < dwNumDev-1);
// ditch it since we don't use it
//
if (lpExtensionID) GlobalFree(lpExtensionID);
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(g_pcPDLG->m_hLineApp,g_pdevice->dwTapiDev,
g_pcPDLG->m_dwAPIVersion,
g_pcPDLG->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(g_pcPDLG->m_hLineApp,g_pdevice->dwTapiDev,
g_pcPDLG->m_dwAPIVersion,
g_pcPDLG->m_szPhoneNumber,0,
LINETRANSLATEOPTION_CANCELCALLWAITING,
lpOutput1);
}
if (hr != ERROR_SUCCESS)
{
goto GetDisplayableNumberExit;
}
g_pcPDLG->m_pszDisplayable = (LPTSTR)GlobalAlloc(GPTR, (size_t)lpOutput1->dwDisplayableStringSize+1);
if (!g_pcPDLG->m_pszDisplayable)
{
hr = ERROR_NOT_ENOUGH_MEMORY;
goto GetDisplayableNumberExit;
}
lstrcpyn(g_pcPDLG->m_pszDisplayable,
(LPTSTR)&((LPBYTE)lpOutput1)[lpOutput1->dwDisplayableStringOffset],
lpOutput1->dwDisplayableStringSize / sizeof(TCHAR) );
#endif // WIN16
}
GetDisplayableNumberExit:
if (lpRasEntry) GlobalFree(lpRasEntry);
if (lpRasDevInfo) GlobalFree(lpRasDevInfo);
#if !defined(WIN16)
if (lpOutput1) GlobalFree(lpOutput1);
if (g_pcPDLG->m_hLineApp) lineShutdown(g_pcPDLG->m_hLineApp);
#endif
return hr;
}
#if defined(WIN16)
//////////////////////////////////////////////////////////////////////////
// The callback proc is called during the connection process. Display
// the connection progress status in the dialer window. When connection
// is complete, change the Cancel button to Disconnect, and change the
// state to connected.
extern "C" void CALLBACK __export DialCallback(UINT uiMsg,
RASCONNSTATE rasState,
DWORD dwErr)
{
if (TRUE == g_bFirstTime)
{
g_bFirstTime = FALSE;
if (RASCS_Disconnected == rasState)
return;
}
//
// WIN 3.1 does not send disconnect event on error!!!
//
if (0 != dwErr)
rasState = RASCS_Disconnected;
PostMessage(g_hDialDlgWnd, WM_RASDIALEVENT, (WPARAM) rasState,
(LPARAM)dwErr);
}
#endif
HRESULT DialDlg()
{
LPRASDIALPARAMS lpRasDialParams = NULL;
LPRASDIALEXTENSIONS lpRasDialExtentions = NULL;
HRESULT hr = ERROR_SUCCESS;
BOOL bPW;
// 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,g_pcPDLG->m_pszConnectoid,
ARRAYSIZE(lpRasDialParams->szEntryName));
bPW = FALSE;
hr = RasGetEntryDialParams(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
//
GetPrivateProfileString(
INFFILE_USER_SECTION,INFFILE_PASSWORD,
NULLSZ,lpRasDialParams->szPassword,PWLEN + 1,pszINSFileName);
#if defined(WIN16)
if (g_pcPDLG->m_bDialAsIs)
{
Dprintf("CONNECT: Dialing as is <%s>\n", g_pcPDLG->m_szPhoneNumber);
lstrcpy(lpRasDialParams->szPhoneNumber, g_pcPDLG->m_szPhoneNumber);
}
else
{
//
// Translate the number in canonical format to a dialable string
//
TCHAR szBuffer[1024];
LONG lRetCode;
LPLINETRANSLATEOUTPUT lpLine;
memset(&szBuffer[0], 0, sizeof(szBuffer));
lpLine = (LPLINETRANSLATEOUTPUT) & szBuffer[0];
lpLine->dwTotalSize = sizeof(szBuffer);
lRetCode = IETapiTranslateAddress(NULL, g_pcPDLG->m_szPhoneNumber,
0L, 0L, lpLine);
Dprintf("CONNECT2: Dialable string retured by IETAPI is <%s>\n",
(LPTSTR) &szBuffer[lpLine->dwDialableStringOffset]);
lstrcpy(lpRasDialParams->szPhoneNumber,
&szBuffer[lpLine->dwDialableStringOffset]);
}
#endif
// Dial connectoid
//
g_pcPDLG->m_hrasconn = NULL;
#if defined(WIN16)
lpfnCallback = MakeProcInstance((FARPROC)DialCallback, g_pcPDLG->g_hInst);
hr = RasDial(lpRasDialExtentions, NULL,lpRasDialParams,0,
(LPVOID)lpfnCallback,
&g_pcPDLG->m_hrasconn);
#else
hr = RasDial(lpRasDialExtentions,NULL,lpRasDialParams,0xFFFFFFFF,
(LPVOID)g_pcPDLG->m_hwnd,
&g_pcPDLG->m_hrasconn);
#endif
if (hr != ERROR_SUCCESS)
{
if (g_pcPDLG->m_hrasconn)
{
RasHangUp(g_pcPDLG->m_hrasconn);
}
goto DialExit;
}
DialExit:
if (lpRasDialParams) GlobalFree(lpRasDialParams);
if (lpRasDialExtentions) GlobalFree(lpRasDialExtentions);
return hr;
}