You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1607 lines
44 KiB
1607 lines
44 KiB
/*-----------------------------------------------------------------------------
|
|
dialerr.cpp
|
|
|
|
This file implements the Could Not Connect dialog
|
|
|
|
Copyright (C) 1996 Microsoft Corporation
|
|
All rights reserved
|
|
|
|
Authors:
|
|
ChrisK Chris Kauffman
|
|
|
|
Histroy:
|
|
7/22/96 ChrisK Cleaned and formatted
|
|
8/19/96 ValdonB Added ability to edit phone number
|
|
Fixed some memory leaks
|
|
|
|
-----------------------------------------------------------------------------*/
|
|
|
|
#include "pch.hpp"
|
|
#include "globals.h"
|
|
|
|
#if defined(WIN16)
|
|
#include <string.h>
|
|
#include <ietapi.h>
|
|
#endif
|
|
|
|
TCHAR szBuf256[256];
|
|
TCHAR szValidPhoneCharacters[] = {TEXT("0123456789AaBbCcDdPpTtWw!@$ -.()+*#,&\0")};
|
|
|
|
#ifdef WIN16
|
|
#define g_iMyMaxPhone 36
|
|
#else
|
|
int g_iMyMaxPhone = 0;
|
|
#define MAXPHONE_NT 80
|
|
#define MAXPHONE_95 36
|
|
#endif
|
|
|
|
|
|
PDIALERR g_pcDialErr = NULL;
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
// Keyboard hook
|
|
static HHOOK hKeyHook = NULL; // our key hook
|
|
static HOOKPROC hpKey = NULL; // hook proc
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: ProcessDBCS
|
|
//
|
|
// Synopsis: Converts control to use DBCS compatible font
|
|
// Use this at the beginning of the dialog procedure
|
|
//
|
|
// Note that this is required due to a bug in Win95-J that prevents
|
|
// it from properly mapping MS Shell Dlg. This hack is not needed
|
|
// under winNT.
|
|
//
|
|
// Arguments: hwnd - Window handle of the dialog
|
|
// cltID - ID of the control you want changed.
|
|
//
|
|
// Returns: ERROR_SUCCESS
|
|
//
|
|
// History: 4/31/97 a-frankh Created
|
|
// 5/13/97 jmazner Stole from CM to use here
|
|
//----------------------------------------------------------------------------
|
|
void ProcessDBCS(HWND hDlg, int ctlID)
|
|
{
|
|
#if defined(WIN16)
|
|
return;
|
|
#else
|
|
HFONT hFont = NULL;
|
|
|
|
if( IsNT() )
|
|
{
|
|
return;
|
|
}
|
|
|
|
hFont = (HFONT) GetStockObject(DEFAULT_GUI_FONT);
|
|
if (hFont == NULL)
|
|
hFont = (HFONT) GetStockObject(SYSTEM_FONT);
|
|
if (hFont != NULL)
|
|
SendMessage(GetDlgItem(hDlg,ctlID), WM_SETFONT, (WPARAM) hFont, MAKELPARAM(TRUE, 0));
|
|
#endif
|
|
}
|
|
|
|
|
|
|
|
HRESULT ShowDialErrDialog(PGATHEREDINFO pGI, HRESULT hrErr,
|
|
LPTSTR pszConnectoid, HINSTANCE hInst,
|
|
HWND hwnd)
|
|
{
|
|
int iRC;
|
|
// CDialErrDlg *pcDED = NULL;
|
|
|
|
g_pcDialErr = (PDIALERR)GlobalAlloc(GPTR,sizeof(DIALERR));
|
|
if (!g_pcDialErr)
|
|
{
|
|
MessageBox(hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_APPLMODAL | MB_ICONERROR);
|
|
iRC = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto ShowDialErrDialogExit;
|
|
}
|
|
|
|
g_pcDialErr->m_pszConnectoid = (LPTSTR)GlobalAlloc(GPTR,RAS_MaxEntryName+1);
|
|
if (!g_pcDialErr->m_pszConnectoid)
|
|
{
|
|
iRC = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto ShowDialErrDialogExit;
|
|
}
|
|
lstrcpy(g_pcDialErr->m_pszConnectoid,pszConnectoid);
|
|
g_pcDialErr->m_pGI = pGI;
|
|
g_pcDialErr->m_hrError = hrErr;
|
|
g_pcDialErr->m_hInst = hInst;
|
|
|
|
#if defined(WIN16)
|
|
#define DLGPROC16 DLGPROC // Identify as only cast for Win16
|
|
DLGPROC dlgprc;
|
|
dlgprc = (DLGPROC16) MakeProcInstance((FARPROC)DialErrDlgProc,
|
|
g_pcDialErr->m_hInst);
|
|
iRC = DialogBoxParam(g_pcDialErr->m_hInst,
|
|
MAKEINTRESOURCE(IDD_DIALERR),
|
|
hwnd, dlgprc, (LPARAM)g_pcDialErr);
|
|
FreeProcInstance((FARPROC) dlgprc);
|
|
#else
|
|
iRC = (HRESULT)DialogBoxParam(g_pcDialErr->m_hInst,MAKEINTRESOURCE(IDD_DIALERR),
|
|
hwnd, DialErrDlgProc,
|
|
(LPARAM)g_pcDialErr);
|
|
#endif
|
|
|
|
ShowDialErrDialogExit:
|
|
if (g_pcDialErr->m_pszConnectoid) GlobalFree(g_pcDialErr->m_pszConnectoid);
|
|
if (g_pcDialErr->m_pszDisplayable) GlobalFree(g_pcDialErr->m_pszDisplayable);
|
|
if (g_pcDialErr->m_lprasdevinfo) GlobalFree(g_pcDialErr->m_lprasdevinfo);
|
|
g_pcDialErr->m_lprasdevinfo = NULL;
|
|
if (g_pcDialErr) GlobalFree(g_pcDialErr);
|
|
g_pcDialErr = NULL;
|
|
return iRC;
|
|
}
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function LclSetEntryScriptPatch
|
|
//
|
|
// Synopsis Softlink to RasSetEntryPropertiesScriptPatch
|
|
//
|
|
// Arguments see RasSetEntryPropertiesScriptPatch
|
|
//
|
|
// Returns see RasSetEntryPropertiesScriptPatch
|
|
//
|
|
// Histroy 10/3/96 ChrisK Created
|
|
//
|
|
//-----------------------------------------------------------------------------
|
|
|
|
BOOL LclSetEntryScriptPatch(LPTSTR lpszScript,LPTSTR lpszEntry)
|
|
{
|
|
HINSTANCE hinst = NULL;
|
|
LCLSETENTRYSCRIPTPATCH fp = NULL;
|
|
BOOL bRC = FALSE;
|
|
|
|
hinst = LoadLibrary(TEXT("ICWDIAL.DLL"));
|
|
if (hinst)
|
|
{
|
|
fp = (LCLSETENTRYSCRIPTPATCH)GetProcAddress(hinst,"RasSetEntryPropertiesScriptPatch");
|
|
if (fp)
|
|
bRC = (fp)(lpszScript,lpszEntry);
|
|
FreeLibrary(hinst);
|
|
hinst = NULL;
|
|
fp = NULL;
|
|
}
|
|
return bRC;
|
|
}
|
|
|
|
// ############################################################################
|
|
// HelpKybdHookProc
|
|
//
|
|
// Keyboard hook proc - check for F1, and if detected, fake a Help button
|
|
// hit to the main dialog.
|
|
//
|
|
// Paramters:
|
|
// iCode Windows message code
|
|
// wParam Windows wParam (contains virtual key code)
|
|
// lParam Windows lParam
|
|
//
|
|
// History:
|
|
// 8/26/96 ValdonB Adapted from IEDIAL.C
|
|
//
|
|
// ############################################################################
|
|
#if defined(WIN16)
|
|
LRESULT CALLBACK _export HelpKybdHookProc
|
|
#else
|
|
LRESULT WINAPI HelpKybdHookProc
|
|
#endif
|
|
(
|
|
int iCode,
|
|
WPARAM wParam,
|
|
LPARAM lParam
|
|
)
|
|
{
|
|
LRESULT lRet = 0;
|
|
|
|
Assert(g_pcDialErr->m_hwnd);
|
|
if ((iCode != HC_NOREMOVE && iCode >= 0) &&
|
|
(GetActiveWindow() == g_pcDialErr->m_hwnd))
|
|
{
|
|
// HC_NOREMOVE indicates that message is being
|
|
// retrieved using PM_NOREMOVE from peek message,
|
|
// if iCode < 0, then we should not process... dont
|
|
// know why, but sdk says so.
|
|
if (wParam == VK_F1 && !(lParam & 0x80000000L))
|
|
{
|
|
// bit 32 == 1 if key is being release, else 0 if
|
|
// key is being pressed
|
|
PostMessage(g_pcDialErr->m_hwnd, WM_COMMAND, (WPARAM)IDC_CMDHELP, 0);
|
|
}
|
|
}
|
|
if (hKeyHook)
|
|
{
|
|
lRet = CallNextHookEx(hKeyHook, iCode, wParam, lParam);
|
|
}
|
|
return(lRet);
|
|
}
|
|
|
|
// ############################################################################
|
|
// HelpInit
|
|
//
|
|
// Install a windows hook proc to launch help on F1
|
|
//
|
|
// History:
|
|
// 8/26/96 ValdonB Adapted from IEDIAL.C
|
|
//
|
|
// ############################################################################
|
|
static void HelpInit()
|
|
{
|
|
// now install the hook for the keyboard filter
|
|
hpKey = (HOOKPROC)MakeProcInstance((FARPROC)HelpKybdHookProc,
|
|
g_pcDialErr->m_hInst);
|
|
if (hpKey)
|
|
{
|
|
hKeyHook = SetWindowsHookEx(WH_KEYBOARD, hpKey, g_pcDialErr->m_hInst,
|
|
#if defined(WIN16)
|
|
GetCurrentTask());
|
|
#else
|
|
GetCurrentThreadId());
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
// ############################################################################
|
|
// HelpShutdown
|
|
//
|
|
// Shutdown the keyboard hook
|
|
//
|
|
// History:
|
|
// 8/26/96 ValdonB Adapted from IEDIAL.C
|
|
//
|
|
// ############################################################################
|
|
static void HelpShutdown()
|
|
{
|
|
// remove the hook
|
|
if (hKeyHook)
|
|
{
|
|
UnhookWindowsHookEx(hKeyHook);
|
|
}
|
|
|
|
// dump the thunk
|
|
if (hpKey)
|
|
{
|
|
FreeProcInstance((FARPROC)hpKey);
|
|
}
|
|
}
|
|
|
|
|
|
extern "C" INT_PTR CALLBACK FAR PASCAL DialErrDlgProc(HWND hwnd,
|
|
UINT uMsg,
|
|
WPARAM wparam,
|
|
LPARAM lparam)
|
|
{
|
|
BOOL bRes = TRUE;
|
|
HRESULT hr;
|
|
//LPLINEEXTENSIONID lpExtensionID;
|
|
#if !defined(WIN16)
|
|
DWORD dwNumDev;
|
|
#endif
|
|
//RNAAPI *pcRNA = NULL;
|
|
WORD wIDS;
|
|
LRESULT idx;
|
|
LPRASENTRY lpRasEntry = NULL;
|
|
LPRASDEVINFO lpRasDevInfo = NULL;
|
|
DWORD dwRasEntrySize;
|
|
DWORD dwRasDevInfoSize;
|
|
HINSTANCE hRasDll = NULL;
|
|
FARPROC fp = NULL;
|
|
LPTSTR lpszDialNumber = NULL;
|
|
static BOOL bCheckDisplayable = FALSE;
|
|
static BOOL bInitComplete = FALSE; // if we initialize the dialog - MKarki
|
|
static BOOL bDlgPropEnabled = TRUE; //this flags holds state of Dialing Properties PushButton MKarki - (5/3/97/) Fix for Bug#3393
|
|
#if defined(WIN16)
|
|
RECT MyRect;
|
|
RECT DTRect;
|
|
#endif
|
|
|
|
RNAAPI *pRnaapi = NULL;
|
|
|
|
static BOOL fUserEditedNumber = FALSE;
|
|
|
|
switch(uMsg)
|
|
{
|
|
case WM_INITDIALOG:
|
|
g_pcDialErr->m_hwnd = hwnd;
|
|
|
|
#if defined(WIN16)
|
|
//
|
|
// 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
|
|
|
|
// Set limit on phone number length
|
|
// Note: this should really be RAS_MaxPhoneNumber (128), but RAS is choking on
|
|
// anything longer than 100 bytes, so we'll have to limit it to that.
|
|
//
|
|
// 6/3/97 jmazner Olympus #4851
|
|
// RAS has different limits on w95 and NT
|
|
//
|
|
#ifndef WIN16
|
|
if( IsNT() )
|
|
{
|
|
g_iMyMaxPhone = MAXPHONE_NT;
|
|
}
|
|
else
|
|
{
|
|
g_iMyMaxPhone = MAXPHONE_95;
|
|
}
|
|
#endif
|
|
AssertSz( (sizeof(g_pcDialErr->m_szPhoneNumber) >= g_iMyMaxPhone), "Maximum phone number is greater than m_szPhoneNumber" );
|
|
|
|
SendDlgItemMessage(hwnd,IDC_TEXTNUMBER,EM_SETLIMITTEXT,g_iMyMaxPhone,0);
|
|
|
|
// Show the phone number
|
|
//
|
|
hr = DialErrGetDisplayableNumber();
|
|
if (hr != ERROR_SUCCESS)
|
|
{
|
|
bCheckDisplayable = FALSE;
|
|
SetDlgItemText(hwnd,IDC_TEXTNUMBER,g_pcDialErr->m_szPhoneNumber);
|
|
} else {
|
|
bCheckDisplayable = TRUE;
|
|
SetDlgItemText(hwnd,IDC_TEXTNUMBER,g_pcDialErr->m_pszDisplayable);
|
|
}
|
|
|
|
MakeBold(GetDlgItem(hwnd,IDC_LBLTITLE),TRUE,FW_BOLD);
|
|
|
|
// Fill in error message
|
|
//
|
|
wIDS = (WORD)RasErrorToIDS(g_pcDialErr->m_hrError);
|
|
AssertSz(wIDS != -1,"RasErrorToIDS got an error message it did not understand");
|
|
|
|
if (wIDS != -1 && wIDS !=0)
|
|
SetDlgItemText(hwnd,IDC_LBLERRMSG,GetSz(wIDS));
|
|
|
|
ProcessDBCS(hwnd,IDC_CMBMODEMS);
|
|
ProcessDBCS(hwnd,IDC_TEXTNUMBER);
|
|
|
|
FillModems();
|
|
|
|
// Set the focus to the Modems selection list
|
|
//
|
|
SetFocus(GetDlgItem(hwnd,IDC_CMBMODEMS));
|
|
|
|
// hook the keyboard for F1 help
|
|
HelpInit();
|
|
|
|
bRes = FALSE;
|
|
|
|
//
|
|
// we should disable the Dialing Properites PushButton
|
|
// if we have changed the phone number once
|
|
// MKarki (5/3/97) - Fix for Bug#3393
|
|
//
|
|
if (FALSE == bDlgPropEnabled)
|
|
{
|
|
EnableWindow (
|
|
GetDlgItem (hwnd, IDC_CMDDIALPROP),
|
|
FALSE
|
|
);
|
|
}
|
|
|
|
//
|
|
// This shows the INIT for the error dialog is complete
|
|
// and we can start processing changes to Ph No. TEXTBOX
|
|
// MKarki (4/24/97) - Fix for Bug#3511
|
|
//
|
|
bInitComplete = TRUE;
|
|
|
|
break;
|
|
|
|
#if defined(WIN16)
|
|
case WM_SYSCOLORCHANGE:
|
|
Ctl3dColorChange();
|
|
break;
|
|
#endif
|
|
case WM_DESTROY:
|
|
ReleaseBold(GetDlgItem(hwnd,IDC_LBLTITLE));
|
|
#ifdef WIN16
|
|
DeleteDlgFont(hwnd);
|
|
#endif
|
|
// Shutdown the keyboard hook
|
|
HelpShutdown();
|
|
|
|
bRes = FALSE;
|
|
break;
|
|
|
|
case WM_CLOSE:
|
|
//if (MessageBox(hwnd,GetSz(IDS_WANTTOEXIT),GetSz(IDS_TITLE),
|
|
// MB_APPLMODAL | MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2) == IDYES)
|
|
// EndDialog(hwnd,ERROR_USERCANCEL);
|
|
EndDialog(hwnd,ERROR_USERCANCEL);
|
|
break;
|
|
|
|
#if !defined(WIN16)
|
|
case WM_HELP:
|
|
//
|
|
// Chrisk Olympus 5130 5/27/97
|
|
// Added support for F1 Help Key
|
|
//
|
|
WinHelp(hwnd,TEXT("connect.hlp>proc4"),HELP_CONTEXT,(DWORD)ICW_TRB);
|
|
#endif
|
|
|
|
case WM_COMMAND:
|
|
switch(LOWORD(wparam))
|
|
{
|
|
//
|
|
// We now processes changes to ph no. EDIT BOX
|
|
// If there is anychange in the phone number we
|
|
// disable to Dialing Properties Push Button
|
|
// MKarki (3/22/97) - Fix for Bug #3511
|
|
//
|
|
case IDC_TEXTNUMBER:
|
|
TCHAR lpszTempNumber[RAS_MaxPhoneNumber +1];
|
|
|
|
if ((HIWORD (wparam) == EN_CHANGE) && (bInitComplete == TRUE))
|
|
{
|
|
if ((GetDlgItemText (
|
|
hwnd,
|
|
IDC_TEXTNUMBER,
|
|
lpszTempNumber,
|
|
RAS_MaxPhoneNumber
|
|
)) &&
|
|
(0 != lstrcmp(
|
|
lpszTempNumber,
|
|
bCheckDisplayable ? g_pcDialErr->m_pszDisplayable :g_pcDialErr->m_szPhoneNumber)))
|
|
{
|
|
//
|
|
// number has been modified by the user
|
|
// hide the Dialing Properties Push Button
|
|
//
|
|
EnableWindow (
|
|
GetDlgItem (hwnd, IDC_CMDDIALPROP),
|
|
FALSE
|
|
);
|
|
//
|
|
// save the state of the Dialing Properties PushButton
|
|
// MKarki (5/3/97) - Fix for Bug#3393
|
|
//
|
|
bDlgPropEnabled = FALSE;
|
|
|
|
//
|
|
// 7/17/97 jmazner Olympus #8234
|
|
//
|
|
fUserEditedNumber = TRUE;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case IDC_CMBMODEMS:
|
|
if (HIWORD(wparam) == CBN_SELCHANGE)
|
|
{
|
|
|
|
idx = SendDlgItemMessage(hwnd,IDC_CMBMODEMS,CB_GETCURSEL,0,0);
|
|
//
|
|
// ChrisK Olympus 245 5/25/97
|
|
// Get index of modem
|
|
//
|
|
idx = SendDlgItemMessage(hwnd,IDC_CMBMODEMS,CB_GETITEMDATA,idx,0);
|
|
if (idx == CB_ERR) break;
|
|
|
|
// Get the connectoid
|
|
//
|
|
|
|
/***** this code is made obsolete by the call to MyRasGetEntryProperties below
|
|
#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)
|
|
{
|
|
MessageBox(hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_APPLMODAL | MB_ICONERROR);
|
|
break;
|
|
}
|
|
|
|
lpRasDevInfo = (LPRASDEVINFO)GlobalAlloc(GPTR,sizeof(RASDEVINFO));
|
|
if (!lpRasDevInfo)
|
|
{
|
|
MessageBox(hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_APPLMODAL | MB_ICONERROR);
|
|
break;
|
|
}
|
|
dwRasEntrySize = sizeof(RASENTRY);
|
|
dwRasDevInfoSize = sizeof(RASDEVINFO);
|
|
|
|
lpRasEntry->dwSize = dwRasEntrySize;
|
|
lpRasDevInfo->dwSize = dwRasDevInfoSize;
|
|
*******/
|
|
|
|
/* hRasDll = LoadLibrary(RASAPI_LIBRARY);
|
|
if (!hRasDll)
|
|
{
|
|
hr = GetLastError();
|
|
break;
|
|
}
|
|
fp =GetProcAddress(hRasDll,"RasGetEntryPropertiesA");
|
|
if (!fp)
|
|
{
|
|
FreeLibrary(hRasDll);
|
|
hRasDll = LoadLibrary(TEXT("RNAPH.DLL"));
|
|
if (!hRasDll)
|
|
{
|
|
hr = GetLastError();
|
|
break;
|
|
}
|
|
fp = GetProcAddress(hRasDll,"RasGetEntryPropertiesA");
|
|
if (!fp)
|
|
{
|
|
hr = GetLastError();
|
|
break;
|
|
}
|
|
}
|
|
*/
|
|
|
|
/****** this call has been replaced with MyRasGetEntryProperties
|
|
hr = RasGetEntryProperties(NULL,g_pcDialErr->m_pszConnectoid,
|
|
#if defined(WIN16)
|
|
(LPBYTE)
|
|
#endif
|
|
lpRasEntry,
|
|
&dwRasEntrySize,
|
|
(LPBYTE)lpRasDevInfo,
|
|
&dwRasDevInfoSize);
|
|
****/
|
|
|
|
// these two pointers should not have memory allocated to them
|
|
// See MyRasGetEntryProperties function comment for details.
|
|
if( lpRasEntry )
|
|
{
|
|
GlobalFree( lpRasEntry );
|
|
lpRasEntry = NULL;
|
|
}
|
|
if( lpRasDevInfo )
|
|
{
|
|
GlobalFree( lpRasDevInfo );
|
|
lpRasDevInfo = NULL;
|
|
}
|
|
hr = MyRasGetEntryProperties( NULL,
|
|
g_pcDialErr->m_pszConnectoid,
|
|
&lpRasEntry,
|
|
&dwRasEntrySize,
|
|
&lpRasDevInfo,
|
|
&dwRasDevInfoSize);
|
|
|
|
if (hr != ERROR_SUCCESS)
|
|
{
|
|
break;
|
|
}
|
|
|
|
|
|
//
|
|
// Replace the device with a new one
|
|
//
|
|
lstrcpyn(lpRasEntry->szDeviceType,g_pcDialErr->m_lprasdevinfo[idx].szDeviceType,RAS_MaxDeviceType+1);
|
|
lstrcpyn(lpRasEntry->szDeviceName,g_pcDialErr->m_lprasdevinfo[idx].szDeviceName,RAS_MaxDeviceName+1);
|
|
if (lpRasDevInfo) GlobalFree(lpRasDevInfo);
|
|
lpRasDevInfo = NULL;
|
|
// DANGER!! Don't call GlobalFree on lpRasDevInfo after we set it below!!!!!!! --jmazner
|
|
lpRasDevInfo = &g_pcDialErr->m_lprasdevinfo[idx];
|
|
dwRasDevInfoSize = sizeof(RASDEVINFO);
|
|
|
|
//hr = pcRNA->RasSetEntryProperties(NULL,g_pcDialErr->m_pszConnectoid,(LPBYTE)lpRasEntry,dwRasEntrySize,(LPBYTE)lpRasDevInfo,dwRasDevInfoSize);
|
|
/*fp = GetProcAddress(hRasDll,"RasSetEntryPropertiesA");
|
|
if (!fp)
|
|
{
|
|
hr = GetLastError();
|
|
break;
|
|
}*/
|
|
|
|
// softlink to RasSetEntryProperties for simultaneous Win95/NT compatability
|
|
if( !pRnaapi )
|
|
{
|
|
pRnaapi = new RNAAPI;
|
|
if( !pRnaapi )
|
|
{
|
|
hr = ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
}
|
|
hr = pRnaapi->RasSetEntryProperties(NULL,g_pcDialErr->m_pszConnectoid,
|
|
(LPBYTE)lpRasEntry,
|
|
dwRasEntrySize,
|
|
(LPBYTE)lpRasDevInfo,
|
|
dwRasDevInfoSize);
|
|
#if !defined(WIN16)
|
|
LclSetEntryScriptPatch(lpRasEntry->szScript,g_pcDialErr->m_pszConnectoid);
|
|
#endif // !win16
|
|
|
|
// Now that we're done with lpRasDevInfo, set it to NULL, but DON'T free it,
|
|
// because it points to memory owned by g_pcDialErr->m_lprasdevinfo
|
|
lpRasDevInfo = NULL;
|
|
|
|
if (hr != ERROR_SUCCESS)
|
|
{
|
|
MessageBox(hwnd,GetSz(IDS_CANTSAVEKEY),GetSz(IDS_TITLE),MB_MYERROR);
|
|
break;
|
|
}
|
|
|
|
/*FreeLibrary(hRasDll);
|
|
hRasDll = NULL;
|
|
fp = NULL;*/
|
|
|
|
}
|
|
break;
|
|
case IDC_CMDHELP:
|
|
#if defined(WIN16)
|
|
WinHelp(hwnd,"connect.hlp",HELP_CONTEXT,(DWORD)1001);
|
|
#else
|
|
WinHelp(hwnd,TEXT("connect.hlp>proc4"),HELP_CONTEXT,(DWORD)1001);
|
|
#endif
|
|
break;
|
|
|
|
case IDC_CMDNEXT:
|
|
// NOTE: This button is actually labeled "Redial"
|
|
//
|
|
lpszDialNumber = (LPTSTR)GlobalAlloc(GPTR, (RAS_MaxPhoneNumber + 1) * sizeof(TCHAR));
|
|
if (NULL == lpszDialNumber)
|
|
{
|
|
MessageBox(hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_MYERROR);
|
|
break;
|
|
}
|
|
// If the user has altered the phone number, make sure it can be used
|
|
//
|
|
if (fUserEditedNumber &&
|
|
(GetDlgItemText(hwnd, IDC_TEXTNUMBER, lpszDialNumber, RAS_MaxPhoneNumber)) &&
|
|
(0 != lstrcmp(lpszDialNumber, bCheckDisplayable ? g_pcDialErr->m_pszDisplayable : g_pcDialErr->m_szPhoneNumber)))
|
|
{
|
|
// Check that the phone number only contains valid characters
|
|
//
|
|
LPTSTR lpNum, lpValid;
|
|
|
|
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)
|
|
{
|
|
MessageBox(hwnd,GetSz(IDS_INVALIDPHONE),GetSz(IDS_TITLE),MB_MYERROR);
|
|
//
|
|
// Set the focus back to the phone number field
|
|
//
|
|
SetFocus(GetDlgItem(hwnd,IDC_TEXTNUMBER));
|
|
break; // switch statement
|
|
}
|
|
|
|
/**** replaced by call to MyRasGetEntryProperties below
|
|
#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)
|
|
{
|
|
MessageBox(hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_MYERROR);
|
|
break;
|
|
}
|
|
|
|
lpRasDevInfo = (LPRASDEVINFO)GlobalAlloc(GPTR,sizeof(RASDEVINFO));
|
|
if (!lpRasDevInfo)
|
|
{
|
|
MessageBox(hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_MYERROR);
|
|
break;
|
|
}
|
|
|
|
dwRasEntrySize = sizeof(RASENTRY);
|
|
dwRasDevInfoSize = sizeof(RASDEVINFO);
|
|
|
|
lpRasEntry->dwSize = dwRasEntrySize;
|
|
lpRasDevInfo->dwSize = dwRasDevInfoSize;
|
|
|
|
hr = RasGetEntryProperties(NULL,g_pcDialErr->m_pszConnectoid,
|
|
#if defined(WIN16)
|
|
(LPBYTE)
|
|
#endif
|
|
lpRasEntry,
|
|
&dwRasEntrySize,
|
|
(LPBYTE)lpRasDevInfo,
|
|
&dwRasDevInfoSize);
|
|
****/
|
|
|
|
// these two pointers should not have memory allocated to them
|
|
// See MyRasGetEntryProperties function comment for details.
|
|
if( lpRasEntry )
|
|
{
|
|
GlobalFree( lpRasEntry );
|
|
lpRasEntry = NULL;
|
|
}
|
|
if( lpRasDevInfo )
|
|
{
|
|
GlobalFree( lpRasDevInfo );
|
|
lpRasDevInfo = NULL;
|
|
}
|
|
|
|
dwRasEntrySize = dwRasDevInfoSize = 0;
|
|
|
|
hr = MyRasGetEntryProperties( NULL,
|
|
g_pcDialErr->m_pszConnectoid,
|
|
&lpRasEntry,
|
|
&dwRasEntrySize,
|
|
&lpRasDevInfo,
|
|
&dwRasDevInfoSize);
|
|
|
|
|
|
if (hr != ERROR_SUCCESS)
|
|
{
|
|
break;
|
|
}
|
|
|
|
// Replace the phone number with the new one
|
|
//
|
|
lstrcpy(lpRasEntry->szLocalPhoneNumber, lpszDialNumber);
|
|
lpRasEntry->dwCountryID = 0;
|
|
lpRasEntry->dwCountryCode = 0;
|
|
lpRasEntry->szAreaCode[0] = '\0';
|
|
|
|
// Set to dial as is
|
|
//
|
|
lpRasEntry->dwfOptions &= ~RASEO_UseCountryAndAreaCodes;
|
|
|
|
// softlink to RasSetEntryProperties for simultaneous Win95/NT compatability
|
|
if( !pRnaapi )
|
|
{
|
|
pRnaapi = new RNAAPI;
|
|
if( !pRnaapi )
|
|
{
|
|
hr = ERROR_NOT_ENOUGH_MEMORY;
|
|
break;
|
|
}
|
|
}
|
|
hr = pRnaapi->RasSetEntryProperties(NULL,g_pcDialErr->m_pszConnectoid,
|
|
(LPBYTE)lpRasEntry,
|
|
dwRasEntrySize,
|
|
(LPBYTE)lpRasDevInfo,
|
|
dwRasDevInfoSize);
|
|
#if !defined(WIN16)
|
|
LclSetEntryScriptPatch(lpRasEntry->szScript,g_pcDialErr->m_pszConnectoid);
|
|
#endif // !win16
|
|
if (hr != ERROR_SUCCESS)
|
|
{
|
|
MessageBox(hwnd,GetSz(IDS_CANTSAVEKEY),GetSz(IDS_TITLE),MB_MYERROR);
|
|
break;
|
|
}
|
|
}
|
|
|
|
EndDialog(hwnd,ERROR_USERNEXT);
|
|
break;
|
|
|
|
case IDC_CMDCANCEL:
|
|
//if (MessageBox(hwnd,GetSz(IDS_WANTTOEXIT),GetSz(IDS_TITLE),
|
|
// MB_APPLMODAL | MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2) == IDYES)
|
|
// EndDialog(hwnd,ERROR_USERCANCEL);
|
|
EndDialog(hwnd,ERROR_USERCANCEL);
|
|
break;
|
|
|
|
|
|
case IDC_CMDDIALPROP:
|
|
// 12/4/96 jmazner Normandy #10294
|
|
//ShowWindow(hwnd,SW_HIDE);
|
|
EnableWindow(hwnd, FALSE);
|
|
#if defined(WIN16)
|
|
hr = IETapiTranslateDialog(hwnd,
|
|
g_pcDialErr->m_szPhoneNumber,
|
|
NULL);
|
|
#else
|
|
// 10/24/96 jmazner Normandy #10185/7019
|
|
if (g_pdevice->dwTapiDev == 0xFFFFFFFF) g_pdevice->dwTapiDev = 0;
|
|
|
|
hr = lineInitialize(&g_pcDialErr->m_hLineApp,g_pcDialErr->m_hInst,
|
|
LineCallback,NULL,&dwNumDev);
|
|
if (hr == ERROR_SUCCESS)
|
|
{
|
|
hr = lineTranslateDialog(g_pcDialErr->m_hLineApp,
|
|
g_pdevice->dwTapiDev,
|
|
g_pcDialErr->m_dwAPIVersion,
|
|
hwnd,g_pcDialErr->m_szPhoneNumber);
|
|
#endif
|
|
|
|
hr = DialErrGetDisplayableNumber();
|
|
if (hr != ERROR_SUCCESS)
|
|
{
|
|
bCheckDisplayable = FALSE;
|
|
SetDlgItemText(hwnd,IDC_TEXTNUMBER,g_pcDialErr->m_szPhoneNumber);
|
|
} else {
|
|
bCheckDisplayable = TRUE;
|
|
SetDlgItemText(hwnd,IDC_TEXTNUMBER,g_pcDialErr->m_pszDisplayable);
|
|
}
|
|
#if !defined(WIN16)
|
|
lineShutdown(g_pcDialErr->m_hLineApp);
|
|
g_pcDialErr->m_hLineApp = NULL;
|
|
}
|
|
#endif
|
|
// 12/4/96 jmazner Normandy #10294
|
|
//ShowWindow(hwnd,SW_SHOW);
|
|
EnableWindow(hwnd, TRUE);
|
|
|
|
//
|
|
// 6/6/97 jmazner Olympus #4759
|
|
//
|
|
SetFocus(GetDlgItem(hwnd,IDC_CMDNEXT));
|
|
|
|
break;
|
|
}
|
|
break;
|
|
|
|
|
|
default:
|
|
bRes = FALSE;
|
|
break;
|
|
}
|
|
|
|
if (lpRasEntry) GlobalFree(lpRasEntry);
|
|
if (lpRasDevInfo) GlobalFree(lpRasDevInfo);
|
|
if (lpszDialNumber) GlobalFree(lpszDialNumber);
|
|
if (pRnaapi) delete pRnaapi;
|
|
|
|
return bRes;
|
|
}
|
|
|
|
|
|
|
|
|
|
HRESULT FillModems()
|
|
{
|
|
//RNAAPI *pcRNA = NULL;
|
|
HRESULT hr = ERROR_SUCCESS;
|
|
//LPRASDEVINFO lprasdevinfo;
|
|
DWORD dwSize;
|
|
DWORD dwNumDev;
|
|
DWORD idx;
|
|
DWORD dwTempNumEntries;
|
|
//HINSTANCE hRasDll=NULL;
|
|
//FARPROC fp=NULL;
|
|
|
|
LPRASENTRY lpRasEntry=NULL;
|
|
LPRASDEVINFO lpRasDevInfo=NULL;
|
|
DWORD dwRasEntrySize = 0;
|
|
DWORD dwRasDevInfoSize = 0;
|
|
LRESULT lLast = 0;
|
|
|
|
RNAAPI *pRnaapi = NULL;
|
|
|
|
|
|
|
|
// Get the connectoid
|
|
//
|
|
|
|
/******* This code has been obsoleted by the call to MyRasGetEntryProperties below
|
|
#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)
|
|
{
|
|
MessageBox(g_pcDialErr->m_hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_APPLMODAL | MB_ICONERROR);
|
|
goto FillModemExit;
|
|
}
|
|
|
|
lpRasDevInfo = (LPRASDEVINFO)GlobalAlloc(GPTR,sizeof(RASDEVINFO));
|
|
if (!lpRasDevInfo)
|
|
{
|
|
MessageBox(g_pcDialErr->m_hwnd,GetSz(IDS_OUTOFMEMORY),GetSz(IDS_TITLE),MB_APPLMODAL | MB_ICONERROR);
|
|
goto FillModemExit;
|
|
}
|
|
dwRasEntrySize = sizeof(RASENTRY);
|
|
dwRasDevInfoSize = sizeof(RASDEVINFO);
|
|
|
|
lpRasEntry->dwSize = dwRasEntrySize;
|
|
lpRasDevInfo->dwSize = dwRasDevInfoSize;
|
|
*********/
|
|
|
|
/* fp = NULL;
|
|
hRasDll = LoadLibrary(RASAPI_LIBRARY);
|
|
if (hRasDll)
|
|
{
|
|
fp = GetProcAddress(hRasDll,RASAPI_RASGETENTRY);
|
|
if (!fp)
|
|
{
|
|
FreeLibrary(hRasDll);
|
|
hRasDll = LoadLibrary(RNAPH_LIBRARY);
|
|
if (hRasDll)
|
|
{
|
|
fp = GetProcAddress(hRasDll,RASAPI_RASGETENTRY);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!fp)
|
|
{
|
|
hr = GetLastError();
|
|
goto FillModemExit;
|
|
}
|
|
*/
|
|
|
|
/****** This call has been replaced by MyRasGetEntryProperties below
|
|
|
|
hr = RasGetEntryProperties(NULL,g_pcDialErr->m_pszConnectoid,
|
|
#if defined(WIN16)
|
|
(LPBYTE)
|
|
#endif
|
|
lpRasEntry,
|
|
&dwRasEntrySize,(LPBYTE)lpRasDevInfo,
|
|
&dwRasDevInfoSize);
|
|
********/
|
|
|
|
// these two pointers should not have memory allocated to them
|
|
// See MyRasGetEntryProperties function comment for details.
|
|
if( lpRasEntry )
|
|
{
|
|
GlobalFree( lpRasEntry );
|
|
lpRasEntry = NULL;
|
|
}
|
|
if( lpRasDevInfo )
|
|
{
|
|
GlobalFree( lpRasDevInfo );
|
|
lpRasDevInfo = NULL;
|
|
}
|
|
hr = MyRasGetEntryProperties( NULL,
|
|
g_pcDialErr->m_pszConnectoid,
|
|
&lpRasEntry,
|
|
&dwRasEntrySize,
|
|
&lpRasDevInfo,
|
|
&dwRasDevInfoSize);
|
|
|
|
if( ERROR_SUCCESS != hr )
|
|
{
|
|
goto FillModemExit;
|
|
}
|
|
|
|
/*FreeLibrary(hRasDll);
|
|
hRasDll = NULL;
|
|
fp = NULL; */
|
|
|
|
|
|
// Get devices from RAS/RNA
|
|
//
|
|
|
|
if (!g_pcDialErr->m_lprasdevinfo)
|
|
g_pcDialErr->m_lprasdevinfo = (LPRASDEVINFO)GlobalAlloc(GPTR,sizeof(RASDEVINFO));
|
|
if (!g_pcDialErr->m_lprasdevinfo)
|
|
{
|
|
hr = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto FillModemExit;
|
|
}
|
|
|
|
g_pcDialErr->m_lprasdevinfo->dwSize = sizeof(RASDEVINFO);
|
|
dwSize = sizeof(RASDEVINFO);
|
|
dwNumDev = 0;
|
|
|
|
/*hRasDll = LoadLibrary(RASAPI_LIBRARY);
|
|
if (!hRasDll)
|
|
{
|
|
hr = GetLastError();
|
|
goto FillModemExit;
|
|
}
|
|
fp =GetProcAddress(hRasDll,"RasEnumDevicesA");
|
|
if (!fp)
|
|
{
|
|
FreeLibrary(hRasDll);
|
|
hRasDll = LoadLibrary(TEXT("RNAPH.DLL"));
|
|
if (!hRasDll)
|
|
{
|
|
hr = GetLastError();
|
|
goto FillModemExit;
|
|
}
|
|
fp = GetProcAddress(hRasDll,"RasEnumDevicesA");
|
|
if (!fp)
|
|
{
|
|
hr = GetLastError();
|
|
goto FillModemExit;
|
|
}
|
|
}*/
|
|
|
|
// soft link to RasEnumDevices to allow for simultaneous Win95/NT compatability
|
|
pRnaapi = new RNAAPI;
|
|
if( !pRnaapi )
|
|
{
|
|
hr = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto FillModemExit;
|
|
}
|
|
|
|
hr = pRnaapi->RasEnumDevices(g_pcDialErr->m_lprasdevinfo,&dwSize,&dwNumDev);
|
|
if (hr == ERROR_BUFFER_TOO_SMALL)
|
|
{
|
|
GlobalFree(g_pcDialErr->m_lprasdevinfo);
|
|
g_pcDialErr->m_lprasdevinfo = (LPRASDEVINFO)GlobalAlloc(GPTR, (size_t)dwSize);
|
|
if (!g_pcDialErr->m_lprasdevinfo)
|
|
{
|
|
hr = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto FillModemExit;
|
|
}
|
|
g_pcDialErr->m_lprasdevinfo->dwSize = sizeof(RASDEVINFO);
|
|
hr = pRnaapi->RasEnumDevices(g_pcDialErr->m_lprasdevinfo,&dwSize,&dwNumDev);
|
|
}
|
|
|
|
/*FreeLibrary(hRasDll);
|
|
hRasDll = NULL;
|
|
fp = NULL;*/
|
|
|
|
if (hr != ERROR_SUCCESS)
|
|
goto FillModemExit;
|
|
|
|
// Fill in combo box
|
|
//
|
|
dwTempNumEntries = dwNumDev;
|
|
|
|
if (dwNumDev != 0)
|
|
{
|
|
for (idx=0;idx<dwTempNumEntries;idx++)
|
|
{
|
|
//
|
|
// ChrisK Olympus 4560 do not add VPN's to list of modems
|
|
// Vyung only add isdn and modem type devices
|
|
//
|
|
if ((0 == lstrcmpi(TEXT("MODEM"),g_pcDialErr->m_lprasdevinfo[idx].szDeviceType)) &&
|
|
(0 == lstrcmpi(TEXT("ISDN"),g_pcDialErr->m_lprasdevinfo[idx].szDeviceType)))
|
|
{
|
|
lLast = SendDlgItemMessage(g_pcDialErr->m_hwnd,IDC_CMBMODEMS,CB_ADDSTRING,0,(LPARAM)&g_pcDialErr->m_lprasdevinfo[idx].szDeviceName[0]);
|
|
//
|
|
// ChrisK Olympus 245 5/25/97
|
|
// Save index of modem
|
|
//
|
|
SendDlgItemMessage(g_pcDialErr->m_hwnd,IDC_CMBMODEMS,CB_SETITEMDATA,(WPARAM)lLast,(LPARAM)idx);
|
|
if (lstrcmp(g_pcDialErr->m_lprasdevinfo[idx].szDeviceName,lpRasEntry->szDeviceName) == 0)
|
|
SendDlgItemMessage(g_pcDialErr->m_hwnd,IDC_CMBMODEMS,CB_SETCURSEL,(WPARAM)lLast,0);
|
|
}
|
|
else
|
|
{
|
|
dwNumDev--;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (dwNumDev == 1)
|
|
SendDlgItemMessage(g_pcDialErr->m_hwnd,IDC_CMBMODEMS,CB_SETCURSEL,0,0);
|
|
|
|
// UNDONE: select default device
|
|
|
|
FillModemExit:
|
|
//if (g_pcDialErr->m_lprasdevinfo) GlobalFree(g_pcDialErr->m_lprasdevinfo);
|
|
//if (pcRNA) delete pcRNA;
|
|
if (lpRasEntry) GlobalFree(lpRasEntry);
|
|
if (lpRasDevInfo) GlobalFree(lpRasDevInfo);
|
|
if( pRnaapi ) delete pRnaapi;
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
HRESULT DialErrGetDisplayableNumber()
|
|
{
|
|
#if !defined(WIN16)
|
|
DWORD dwNumDev;
|
|
LPLINETRANSLATEOUTPUT lpOutput2;
|
|
LPLINEEXTENSIONID lpExtensionID = NULL;
|
|
#endif
|
|
|
|
HRESULT hr;
|
|
LPRASENTRY lpRasEntry = NULL;
|
|
LPRASDEVINFO lpRasDevInfo = NULL;
|
|
DWORD dwRasEntrySize = 0;
|
|
DWORD dwRasDevInfoSize = 0;
|
|
LPLINETRANSLATEOUTPUT lpOutput1 = NULL;
|
|
HINSTANCE hRasDll = NULL;
|
|
FARPROC fp = NULL;
|
|
|
|
#if !defined(WIN16)
|
|
// Normandy 13024 - ChrisK 12/31/96
|
|
// In all cases we have to get the TAPI version number, because the dialing properies
|
|
// button will not work on NT if the version is 0.
|
|
|
|
//
|
|
// Initialize TAPIness
|
|
//
|
|
dwNumDev = 0;
|
|
hr = lineInitialize(&g_pcDialErr->m_hLineApp,g_pcDialErr->m_hInst,LineCallback,NULL,&dwNumDev);
|
|
|
|
if (hr != ERROR_SUCCESS)
|
|
goto GetDisplayableNumberExit;
|
|
|
|
if (g_pdevice->dwTapiDev == 0xFFFFFFFF)
|
|
g_pdevice->dwTapiDev = 0;
|
|
|
|
// Get TAPI version number
|
|
lpExtensionID = (LPLINEEXTENSIONID )GlobalAlloc(GPTR,sizeof(LINEEXTENSIONID));
|
|
if (!lpExtensionID)
|
|
{
|
|
hr = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto GetDisplayableNumberExit;
|
|
}
|
|
|
|
do {
|
|
hr = lineNegotiateAPIVersion(g_pcDialErr->m_hLineApp, g_pdevice->dwTapiDev, 0x00010004, 0x00010004,
|
|
&g_pcDialErr->m_dwAPIVersion, lpExtensionID);
|
|
} while (hr && g_pdevice->dwTapiDev++ < dwNumDev-1);
|
|
|
|
// delete ExtenstionID since we don't use it
|
|
if (lpExtensionID) GlobalFree(lpExtensionID);
|
|
if (hr != ERROR_SUCCESS)
|
|
goto GetDisplayableNumberExit;
|
|
#endif // !WIN16
|
|
|
|
//RNAAPI * pcRNA;
|
|
|
|
// Get phone number from connectoid
|
|
//
|
|
|
|
/* ---replaced by call to MyRasGetEntryProperties below
|
|
#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);
|
|
*/
|
|
|
|
|
|
/* hRasDll = LoadLibrary(RASAPI_LIBRARY);
|
|
if (!hRasDll)
|
|
{
|
|
hr = GetLastError();
|
|
goto GetDisplayableNumberExit;
|
|
}
|
|
fp =GetProcAddress(hRasDll,"RasGetEntryPropertiesA");
|
|
if (!fp)
|
|
{
|
|
FreeLibrary(hRasDll);
|
|
hRasDll = LoadLibrary(TEXT("RNAPH.DLL"));
|
|
if (!hRasDll)
|
|
{
|
|
hr = GetLastError();
|
|
goto GetDisplayableNumberExit;
|
|
}
|
|
fp = GetProcAddress(hRasDll,"RasGetEntryPropertiesA");
|
|
if (!fp)
|
|
{
|
|
hr = GetLastError();
|
|
goto GetDisplayableNumberExit;
|
|
}
|
|
}
|
|
*/
|
|
|
|
|
|
// lpRasEntry and lpRasDevInfo should not have memory allocated to them, and should be NULL
|
|
// See MyRasGetEntryProperties function comment for details.
|
|
hr = MyRasGetEntryProperties( NULL,
|
|
g_pcDialErr->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
|
|
//
|
|
if (!(lpRasEntry->dwfOptions & RASEO_UseCountryAndAreaCodes))
|
|
{
|
|
if (g_pcDialErr->m_pszDisplayable) GlobalFree(g_pcDialErr->m_pszDisplayable);
|
|
g_pcDialErr->m_pszDisplayable = (LPTSTR)GlobalAlloc(GPTR, lstrlen(lpRasEntry->szLocalPhoneNumber)+1);
|
|
if (!g_pcDialErr->m_pszDisplayable)
|
|
{
|
|
hr = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto GetDisplayableNumberExit;
|
|
}
|
|
lstrcpy(g_pcDialErr->m_szPhoneNumber, lpRasEntry->szLocalPhoneNumber);
|
|
lstrcpy(g_pcDialErr->m_pszDisplayable, lpRasEntry->szLocalPhoneNumber);
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// If there is no area code, don't use parentheses
|
|
//
|
|
if (lpRasEntry->szAreaCode[0])
|
|
wsprintf(g_pcDialErr->m_szPhoneNumber,TEXT("+%lu (%s) %s\0"),lpRasEntry->dwCountryCode,
|
|
lpRasEntry->szAreaCode,lpRasEntry->szLocalPhoneNumber);
|
|
else
|
|
wsprintf(g_pcDialErr->m_szPhoneNumber,TEXT("+%lu %s\0"),lpRasEntry->dwCountryCode,
|
|
lpRasEntry->szLocalPhoneNumber);
|
|
|
|
|
|
#if defined(WIN16)
|
|
char szBuffer[1024];
|
|
LONG lRetCode;
|
|
|
|
memset(&szBuffer[0], 0, sizeof(szBuffer));
|
|
lpOutput1 = (LPLINETRANSLATEOUTPUT) & szBuffer[0];
|
|
lpOutput1->dwTotalSize = sizeof(szBuffer);
|
|
|
|
lRetCode = IETapiTranslateAddress(NULL, g_pcDialErr->m_szPhoneNumber,
|
|
0L, 0L, lpOutput1);
|
|
|
|
if (0 != lRetCode)
|
|
{
|
|
//
|
|
// TODO: Set the correct error code
|
|
//
|
|
hr = GetLastError();
|
|
goto GetDisplayableNumberExit;
|
|
}
|
|
if (g_pcDialErr->m_pszDisplayable) GlobalFree(g_pcDialErr->m_pszDisplayable);
|
|
g_pcDialErr->m_pszDisplayable = (LPTSTR)GlobalAlloc(GPTR,
|
|
((size_t)lpOutput1->dwDisplayableStringSize+1));
|
|
if (!g_pcDialErr->m_pszDisplayable)
|
|
{
|
|
hr = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto GetDisplayableNumberExit;
|
|
}
|
|
|
|
lstrcpy(g_pcDialErr->m_pszDisplayable,
|
|
&szBuffer[lpOutput1->dwDisplayableStringOffset]);
|
|
|
|
|
|
#else //WIN16
|
|
|
|
/* Normandy 13024 this code was moved up
|
|
//
|
|
// Initialize TAPIness
|
|
//
|
|
dwNumDev = 0;
|
|
hr = lineInitialize(&g_pcDialErr->m_hLineApp,g_pcDialErr->m_hInst,LineCallback,NULL,&dwNumDev);
|
|
|
|
if (hr != ERROR_SUCCESS)
|
|
goto GetDisplayableNumberExit;
|
|
|
|
//Normandy #7019 jmazner
|
|
//all devices should share the same dialing properties
|
|
//(at least, this is what icwdial\dialerr.cpp appears to assume, and it works right ;)
|
|
// if (g_pdevice->dwTapiDev == 0xFFFFFFFF)
|
|
// {
|
|
// if (dwNumDev == 1)
|
|
// g_pdevice->dwTapiDev = 0;
|
|
// //else
|
|
// // UNDONE: Tell the user to select a modem
|
|
// // DO NOT EXIT UNTIL THEY PICK ONE
|
|
// }
|
|
|
|
|
|
if (g_pdevice->dwTapiDev == 0xFFFFFFFF) g_pdevice->dwTapiDev = 0;
|
|
|
|
lpExtensionID = (LPLINEEXTENSIONID )GlobalAlloc(GPTR,sizeof(LINEEXTENSIONID));
|
|
if (!lpExtensionID)
|
|
{
|
|
hr = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto GetDisplayableNumberExit;
|
|
}
|
|
|
|
hr = lineNegotiateAPIVersion(g_pcDialErr->m_hLineApp, g_pdevice->dwTapiDev, 0x00010004, 0x00010004,
|
|
&g_pcDialErr->m_dwAPIVersion, lpExtensionID);
|
|
|
|
// ditch it since we don't use it
|
|
//
|
|
if (lpExtensionID) GlobalFree(lpExtensionID);
|
|
if (hr != ERROR_SUCCESS)
|
|
goto GetDisplayableNumberExit;
|
|
Normandy 13024 (see comments above) */
|
|
|
|
// 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_pcDialErr->m_hLineApp,g_pdevice->dwTapiDev,
|
|
g_pcDialErr->m_dwAPIVersion,
|
|
g_pcDialErr->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_pcDialErr->m_hLineApp,g_pdevice->dwTapiDev,
|
|
g_pcDialErr->m_dwAPIVersion,
|
|
g_pcDialErr->m_szPhoneNumber,0,
|
|
LINETRANSLATEOPTION_CANCELCALLWAITING,
|
|
lpOutput1);
|
|
}
|
|
|
|
if (hr != ERROR_SUCCESS)
|
|
{
|
|
goto GetDisplayableNumberExit;
|
|
}
|
|
|
|
if (g_pcDialErr->m_pszDisplayable) GlobalFree(g_pcDialErr->m_pszDisplayable);
|
|
g_pcDialErr->m_pszDisplayable = (LPTSTR)GlobalAlloc(GPTR, (size_t) lpOutput1->dwDisplayableStringSize+1);
|
|
if (!g_pcDialErr->m_pszDisplayable)
|
|
{
|
|
hr = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto GetDisplayableNumberExit;
|
|
}
|
|
|
|
lstrcpyn(g_pcDialErr->m_pszDisplayable,
|
|
(LPTSTR)&((LPBYTE)lpOutput1)[lpOutput1->dwDisplayableStringOffset],
|
|
(size_t)lpOutput1->dwDisplayableStringSize);
|
|
#endif // WIN16
|
|
}
|
|
|
|
GetDisplayableNumberExit:
|
|
if (lpRasEntry) GlobalFree(lpRasEntry);
|
|
if (lpRasDevInfo) GlobalFree(lpRasDevInfo);
|
|
|
|
#if !defined(WIN16)
|
|
if (lpOutput1) GlobalFree(lpOutput1);
|
|
if (g_pcDialErr->m_hLineApp) lineShutdown(g_pcDialErr->m_hLineApp);
|
|
#endif
|
|
return hr;
|
|
|
|
}
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// 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_pszConnectoid,
|
|
// &lpRasEntry,
|
|
// &dwRasEntrySize,
|
|
// &lpRasDevInfo,
|
|
// &dwRasDevInfoSize);
|
|
//
|
|
//
|
|
// if (hr != ERROR_SUCCESS)
|
|
// {
|
|
// //handle errors here
|
|
// } else
|
|
// {
|
|
// //continue processing
|
|
// }
|
|
//
|
|
//
|
|
// History: 9/10/96 JMazner Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
HRESULT MyRasGetEntryProperties(LPTSTR lpszPhonebookFile,
|
|
LPTSTR lpszPhonebookEntry,
|
|
LPRASENTRY *lplpRasEntryBuff,
|
|
LPDWORD lpdwRasEntryBuffSize,
|
|
LPRASDEVINFO *lplpRasDevInfoBuff,
|
|
LPDWORD lpdwRasDevInfoBuffSize)
|
|
{
|
|
HRESULT hr;
|
|
RNAAPI *pRnaapi = NULL;
|
|
|
|
DWORD dwOldDevInfoBuffSize;
|
|
|
|
|
|
Assert( NULL != lplpRasEntryBuff );
|
|
Assert( NULL != lpdwRasEntryBuffSize );
|
|
Assert( NULL != lplpRasDevInfoBuff );
|
|
Assert( NULL != lpdwRasDevInfoBuffSize );
|
|
|
|
*lpdwRasEntryBuffSize = 0;
|
|
*lpdwRasDevInfoBuffSize = 0;
|
|
|
|
// Use reference variables internaly to make notation easier
|
|
LPRASENTRY &reflpRasEntryBuff = *lplpRasEntryBuff;
|
|
LPRASDEVINFO &reflpRasDevInfoBuff = *lplpRasDevInfoBuff;
|
|
|
|
|
|
Assert( NULL == reflpRasEntryBuff );
|
|
Assert( NULL == reflpRasDevInfoBuff );
|
|
|
|
// need to softlink for simultaneous compatability with win95 and winnt
|
|
pRnaapi = new RNAAPI;
|
|
if( !pRnaapi )
|
|
{
|
|
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 = pRnaapi->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 defined(WIN16)
|
|
//
|
|
// Allocate extra 256 bytes to workaround memory overrun bug in RAS
|
|
//
|
|
reflpRasEntryBuff = (LPRASENTRY)GlobalAlloc(GPTR,*lpdwRasEntryBuffSize + 256);
|
|
#else
|
|
reflpRasEntryBuff = (LPRASENTRY)GlobalAlloc(GPTR,*lpdwRasEntryBuffSize);
|
|
#endif
|
|
|
|
if (!reflpRasEntryBuff)
|
|
{
|
|
hr = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto MyRasGetEntryPropertiesErrExit;
|
|
}
|
|
|
|
//
|
|
// 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) );
|
|
reflpRasDevInfoBuff = (LPRASDEVINFO)GlobalAlloc(GPTR,*lpdwRasDevInfoBuffSize);
|
|
if (!reflpRasDevInfoBuff)
|
|
{
|
|
hr = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto MyRasGetEntryPropertiesErrExit;
|
|
}
|
|
} else
|
|
{
|
|
reflpRasDevInfoBuff = NULL;
|
|
}
|
|
|
|
// 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
|
|
|
|
reflpRasEntryBuff->dwSize = sizeof(RASENTRY);
|
|
if( reflpRasDevInfoBuff )
|
|
{
|
|
reflpRasDevInfoBuff->dwSize = sizeof(RASDEVINFO);
|
|
}
|
|
|
|
|
|
// now we're ready to make the actual call...
|
|
|
|
// jmazner see below for why this is needed
|
|
dwOldDevInfoBuffSize = *lpdwRasDevInfoBuffSize;
|
|
|
|
|
|
hr = pRnaapi->RasGetEntryProperties(lpszPhonebookFile, lpszPhonebookEntry,
|
|
(LPBYTE)reflpRasEntryBuff,
|
|
lpdwRasEntryBuffSize,
|
|
(LPBYTE)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;
|
|
}
|
|
|
|
delete pRnaapi;
|
|
pRnaapi = NULL;
|
|
|
|
return( hr );
|
|
|
|
MyRasGetEntryPropertiesErrExit:
|
|
|
|
if(reflpRasEntryBuff)
|
|
{
|
|
GlobalFree(reflpRasEntryBuff);
|
|
reflpRasDevInfoBuff = NULL;
|
|
}
|
|
if(reflpRasDevInfoBuff)
|
|
{
|
|
GlobalFree(reflpRasDevInfoBuff);
|
|
reflpRasDevInfoBuff = NULL;
|
|
}
|
|
if (pRnaapi)
|
|
{
|
|
delete pRnaapi;
|
|
pRnaapi = NULL;
|
|
}
|
|
|
|
*lpdwRasEntryBuffSize = 0;
|
|
*lpdwRasDevInfoBuffSize = 0;
|
|
|
|
return( hr );
|
|
|
|
}
|