Leaked source code of windows server 2003
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

/*-----------------------------------------------------------------------------
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 );
}