www.pudn.com > RAS_dial.rar > RasClient.cpp
// RasClient.cpp
// Copyright© 1998 Qing Zhang (qzhang7@tfn.net)
// 8/10/98 Create on Win95
// 8/19/98, 11/4/98 Modify on NT4
// You are free to use and distribute this source, as long as there is
// no change, and this comment stays intact.
#include "stdafx.h"
#include "RasClient.h"
CRasClient::CRasClient()
{
ZeroMemory(&m_rasStatus, sizeof(m_rasStatus));
m_rasStatus.dwSize = sizeof(m_rasStatus);
m_ConnectionHandle = NULL;
}
CRasClient::~CRasClient()
{
}
long CRasClient::GetDeviceCount()
{
DWORD dwSize = 0;
DWORD dwNumOfDevices = 0;
RasEnumDevices(NULL, &dwSize, &dwNumOfDevices);
return dwNumOfDevices;
}
BOOL CRasClient::GetDeviceNameType(int nIndex,
CString& strName, CString& strType)
{
BOOL bResult = FALSE;
DWORD dwSize = 0;
DWORD dwNumOfDevices = 0;
DWORD dwRV = RasEnumDevices(NULL, &dwSize, &dwNumOfDevices);
if(nIndex >= (int)dwNumOfDevices &&
nIndex < 0)
{
TRACE("BAD DEVICE INDEX!");
return FALSE;
}
RASDEVINFO *lpRdi = new RASDEVINFO[dwNumOfDevices];
lpRdi->dwSize = sizeof(*lpRdi);
dwRV = RasEnumDevices(lpRdi, &dwSize, &dwNumOfDevices);
if(dwRV == 0)
{
strName = lpRdi[nIndex].szDeviceName;
strType = lpRdi[nIndex].szDeviceType;
bResult = TRUE;
}
delete []lpRdi;
return bResult;
}
BOOL CRasClient::GetModemName(CString* strModemNameArray)
{
DWORD dwSize = 0;
DWORD dwNumOfDevices = 0;
DWORD dwRV = RasEnumDevices(NULL, &dwSize, &dwNumOfDevices);
RASDEVINFO *lpRdi = new RASDEVINFO[dwNumOfDevices];
lpRdi->dwSize = sizeof(*lpRdi);
dwRV = RasEnumDevices(lpRdi, &dwSize, &dwNumOfDevices);
if(dwRV != 0)
{
delete []lpRdi;
return FALSE;
}
CString strType;
int j = 0;
for(int i = 0; i < (int)dwNumOfDevices; i++)
{
strType = lpRdi[i].szDeviceType;
if(strType.CompareNoCase("MODEM") == 0) // = "RASDT_Modem";
{
strModemNameArray[j] = lpRdi[i].szDeviceName;
j++;
}
}
delete []lpRdi;
return TRUE;
}
long CRasClient::GetModemCount()
{
DWORD dwSize = 0;
DWORD dwNumOfDevices = 0;
DWORD dwRV = RasEnumDevices(NULL, &dwSize, &dwNumOfDevices);
RASDEVINFO *lpRdi = new RASDEVINFO[dwNumOfDevices];
lpRdi->dwSize = sizeof(*lpRdi);
dwRV = RasEnumDevices(lpRdi, &dwSize, &dwNumOfDevices);
if(dwRV != 0)
{
delete []lpRdi;
return -1;
}
CString strType;
int nModemCount = 0;
for(int i = 0; i < (int)dwNumOfDevices; i++)
{
strType = lpRdi[i].szDeviceType;
if(strType.CompareNoCase("MODEM") == 0) // = "RASDT_Modem";
nModemCount++;
}
delete []lpRdi;
return nModemCount;
}
DWORD CRasClient::ChangeEntryName(CString strOldName, CString strNewName)
{
LPTSTR lpszEntry = strOldName.GetBuffer(1);
strOldName.ReleaseBuffer();
if(RasValidateEntryName(NULL, lpszEntry) != ERROR_ALREADY_EXISTS)
{
// GET ENTRY
BYTE bDeviceInfo = NULL;
DWORD dwDeviceInfoSize = sizeof(bDeviceInfo);
DWORD dwEntrySize = 0;
DWORD dwRV;
RASENTRY entry;
entry.dwSize = sizeof(entry);
dwRV = RasGetEntryProperties(NULL, lpszEntry, &entry, &dwEntrySize,
&bDeviceInfo, &dwDeviceInfoSize); // GET 603
dwRV = RasGetEntryProperties(NULL, lpszEntry, &entry, &dwEntrySize,
&bDeviceInfo, &dwDeviceInfoSize); // GET 0
if(dwRV == 0)
{
LPTSTR lpszNewName = strNewName.GetBuffer(1);
strNewName.ReleaseBuffer();
dwRV = RasSetEntryProperties(NULL, (char*)lpszNewName, &entry,
sizeof(entry), NULL, 0);
return dwRV;
}
else
return dwRV;
}
return ERROR_ENTRY_NO_FOUND;
}
DWORD CRasClient::CreateNewEntry(CString strEntry,
CString strDeviceType,
CString strDeviceName,
DWORD dwfNetProtocols, DWORD dwFrameProtocal,
CString strLocalPhone,
CString strPhoneBook /*=NULL*/)
{
LPTSTR lpszEntry = strEntry.GetBuffer(1);
strEntry.ReleaseBuffer();
LPTSTR lpszPhoneBook = strPhoneBook.GetBuffer(1);
if(strPhoneBook == _T(""))
lpszPhoneBook = NULL;
strPhoneBook.ReleaseBuffer();
if(RasValidateEntryName(lpszPhoneBook, lpszEntry) != ERROR_ALREADY_EXISTS)
{
RASENTRY rasEntry;
::ZeroMemory(&rasEntry, sizeof(rasEntry));
rasEntry.dwSize = sizeof(rasEntry);
strcpy(rasEntry.szLocalPhoneNumber, strLocalPhone);
rasEntry.dwfNetProtocols = dwfNetProtocols;
rasEntry.dwFramingProtocol = dwFrameProtocal;
// DON'T USE "RASDT_Modem", use "modem", otherwise dwRV = 87
strcpy(rasEntry.szDeviceType, strDeviceType);
strcpy(rasEntry.szDeviceName, strDeviceName);
rasEntry.dwfOptions=RASEO_RemoteDefaultGateway|RASEO_ModemLights|RASEO_SwCompression;//ָʾ£«ÈíѹËõ//Ô¶³ÌĬÈÏÍø¹Ø
DWORD dwRV = RasSetEntryProperties(lpszPhoneBook, (char*)lpszEntry, &rasEntry,
sizeof(rasEntry), NULL, 0);
return dwRV;
}
return ERROR_ALREADY_EXISTS;
}
DWORD CRasClient::SetEntryOption(CString strEntry, DWORD dwfOptions,
BOOL bSet, CString strPhoneBook /*=_T("")*/)
{
LPTSTR lpszEntry = strEntry.GetBuffer(1);
strEntry.ReleaseBuffer();
LPTSTR lpszPhoneBook = strPhoneBook.GetBuffer(1);
if(strPhoneBook == _T(""))
lpszPhoneBook = NULL;
strPhoneBook.ReleaseBuffer();
RASENTRY entry;
DWORD dwRV = GetEntryProperties(strEntry, &entry, lpszPhoneBook);
if(dwRV == 0)
{
if(bSet)
entry.dwfOptions |= dwfOptions;
else
entry.dwfOptions &= ~dwfOptions;
dwRV = RasSetEntryProperties(lpszPhoneBook, (char*)lpszEntry, &entry,
sizeof(entry), NULL, 0);
}
return dwRV;
}
DWORD CRasClient::SetEntryServerProtocal(CString strEntry,
DWORD dwfNetProtocols, CString strPhoneBook /*=_T("")*/)
{
LPTSTR lpszEntry = strEntry.GetBuffer(1);
strEntry.ReleaseBuffer();
LPTSTR lpszPhoneBook = strPhoneBook.GetBuffer(1);
if(strPhoneBook == _T(""))
lpszPhoneBook = NULL;
strPhoneBook.ReleaseBuffer();
RASENTRY entry;
DWORD dwRV = GetEntryProperties(strEntry, &entry, lpszPhoneBook);
if(dwRV == 0)
{
entry.dwfNetProtocols = dwfNetProtocols;
dwRV = RasSetEntryProperties(lpszPhoneBook, (char*)lpszEntry, &entry,
sizeof(entry), NULL, 0);
}
return dwRV;
}
DWORD CRasClient::SetEntryIPAddress(CString strEntry, int nIPType,
BYTE a, BYTE b, BYTE c, BYTE d, CString strPhoneBook /*= _T("")*/)
{
LPTSTR lpszEntry = strEntry.GetBuffer(1);
strEntry.ReleaseBuffer();
LPTSTR lpszPhoneBook = strPhoneBook.GetBuffer(1);
if(strPhoneBook == _T(""))
lpszPhoneBook = NULL;
strPhoneBook.ReleaseBuffer();
RASENTRY entry;
DWORD dwRV = GetEntryProperties(strEntry, &entry, lpszPhoneBook);
if(dwRV == 0)
{
RASIPADDR ipDns;
ipDns.a = a;
ipDns.b = b;
ipDns.c = c;
ipDns.d = d;
switch(nIPType)
{
case IPADDRESS :
entry.dwfOptions |= RASEO_SpecificIpAddr;
entry.ipaddr = ipDns;
break;
case IPADDRESS_DNS:
entry.dwfOptions |= RASEO_SpecificNameServers;
entry.ipaddrDns = ipDns;
break;
case IPADDRESS_DNS_ALT:
entry.dwfOptions |= RASEO_SpecificNameServers;
entry.ipaddrDnsAlt = ipDns;
break;
case IPADDRESS_WINS:
entry.dwfOptions |= RASEO_SpecificNameServers;
entry.ipaddrWins = ipDns;
break;
case IPADDRESS_WINS_ALT:
entry.dwfOptions |= RASEO_SpecificNameServers;
entry.ipaddrWinsAlt = ipDns;
break;
}
dwRV = RasSetEntryProperties(lpszPhoneBook, (char*)lpszEntry, &entry,
sizeof(entry), NULL, 0);
}
return dwRV;
}
DWORD CRasClient::GetEntryProperties(CString strEntry, RASENTRY* lpRasEntry
, LPTSTR lpszPhoneBook)
{
LPTSTR lpszEntry = strEntry.GetBuffer(1);
strEntry.ReleaseBuffer();
if(RasValidateEntryName(lpszPhoneBook, lpszEntry) == ERROR_ALREADY_EXISTS)
{
BYTE bDeviceInfo = NULL;
DWORD dwDeviceInfoSize = sizeof(bDeviceInfo);
DWORD dwEntrySize = 0;
DWORD dwRV;
lpRasEntry->dwSize = sizeof(*lpRasEntry);
dwRV = RasGetEntryProperties(lpszPhoneBook, lpszEntry, lpRasEntry, &dwEntrySize,
&bDeviceInfo, &dwDeviceInfoSize); // GET 603
dwRV = RasGetEntryProperties(lpszPhoneBook, lpszEntry, lpRasEntry, &dwEntrySize,
&bDeviceInfo, &dwDeviceInfoSize); // GET 0
return dwRV;
}
else
return ERROR_ENTRY_NO_FOUND;
}
DWORD CRasClient::RasDialSyn(CString strEntry, CString strPhoneNumber,
CString strUserName, CString strPassword, CString strDomain,
CString strPhoneBook)
{
LPTSTR lpszPhoneBook = NULL;
if(strPhoneBook != _T(""))
{
lpszPhoneBook = strPhoneBook.GetBuffer(1);
strPhoneBook.ReleaseBuffer();
}
RASDIALPARAMS dialParams;
::ZeroMemory(&dialParams, sizeof(dialParams) );
dialParams.dwSize = sizeof(dialParams);
strcpy(dialParams.szEntryName, strEntry);
strcpy(dialParams.szPhoneNumber, strPhoneNumber);
strcpy(dialParams.szUserName, strUserName);
strcpy(dialParams.szPassword, strPassword);
strcpy(dialParams.szDomain, strDomain);
m_ConnectionHandle = NULL;
DWORD dwError = RasDial(NULL, lpszPhoneBook, &dialParams, NULL,
NULL, &m_ConnectionHandle);
return dwError;
}
DWORD CRasClient::RasDialAsynCallback1(CString strEntry, LPVOID lpvNotifier, CString strPhoneNumber,
CString strUserName, CString strPassword, CString strDomain,
CString strPhoneBook)
{
LPTSTR lpszPhoneBook = NULL;
if(strPhoneBook != _T(""))
{
lpszPhoneBook = strPhoneBook.GetBuffer(1);
strPhoneBook.ReleaseBuffer();
}
RASDIALPARAMS dialParams;
::ZeroMemory(&dialParams, sizeof(dialParams) );
dialParams.dwSize = sizeof(dialParams);
strcpy(dialParams.szEntryName, strEntry);
strcpy(dialParams.szPhoneNumber, strPhoneNumber);
strcpy(dialParams.szUserName, strUserName);
strcpy(dialParams.szPassword, strPassword);
strcpy(dialParams.szDomain, strDomain);
m_ConnectionHandle = NULL;
DWORD dwError = RasDial(NULL, lpszPhoneBook, &dialParams, 1,
lpvNotifier, &m_ConnectionHandle);
return dwError;
}
DWORD CRasClient::RasDialAsyn(CString strEntry, LPVOID lpvNotifier, CString strPhoneNumber,
CString strUserName, CString strPassword, CString strDomain,
CString strPhoneBook)
{
LPTSTR lpszPhoneBook = NULL;
if(strPhoneBook != _T(""))
{
lpszPhoneBook = strPhoneBook.GetBuffer(1);
strPhoneBook.ReleaseBuffer();
}
RASDIALPARAMS dialParams;
::ZeroMemory(&dialParams, sizeof(dialParams) );
dialParams.dwSize = sizeof(dialParams);
strcpy(dialParams.szEntryName, strEntry);
strcpy(dialParams.szPhoneNumber, strPhoneNumber);
strcpy(dialParams.szUserName, strUserName);
strcpy(dialParams.szPassword, strPassword);
strcpy(dialParams.szDomain, strDomain);
m_ConnectionHandle = NULL;
DWORD dwError = RasDial(NULL, lpszPhoneBook, &dialParams, 0xFFFFFFFF,
lpvNotifier, &m_ConnectionHandle);
return dwError;
}
DWORD CRasClient::GetRasErrorString(CString &strError)
{
strError = _T("Fail to get error string");
if(m_rasStatus.dwError != 0)
{
LPTSTR lpszErr = strError.GetBuffer(256);
DWORD dwRV = RasGetErrorString(m_rasStatus.dwError, lpszErr, 256);
strError.ReleaseBuffer();
return dwRV;
}
else
return ERROR_NO_RASSTATUS;
}
DWORD CRasClient::GetRasErrorStringByErrorCode(DWORD dwError,
DWORD dwExtendError, CString &strError)
{
strError = "Fail to get error string";
if(dwError != 0)
{
LPTSTR lpszErr = strError.GetBuffer(256);
DWORD dwRV = RasGetErrorString(dwError, lpszErr, 256);
strError.ReleaseBuffer();
if(dwExtendError != 0)
{
CString strExtend;
strExtend.Format(" Extended Error Code: %d", dwExtendError);
strError = strError + strExtend;
}
return dwRV;
}
else
return ERROR_NO_RASSTATUS;
}
BOOL CRasClient::GetRasStatusString(CString &strStatus, BOOL& bConnected)
{
bConnected = FALSE;
RasGetConnectStatus(m_ConnectionHandle, &m_rasStatus);
switch(m_rasStatus.rasconnstate)
{
case RASCS_Connected:
strStatus = "Connect to remote server successfully!\n"
"Please wait...";
bConnected = TRUE;
return TRUE;
case RASCS_Disconnected:
strStatus = "Disconnected";
return TRUE;
case RASCS_OpenPort:
strStatus = "Opening the port...";
break;
case RASCS_PortOpened:
strStatus = "Port has been opened successfully";
break;
case RASCS_ConnectDevice:
strStatus = "Connecting to the device...";
break;
case RASCS_DeviceConnected:
strStatus = "The device has connected successfully.";
break;
case RASCS_AllDevicesConnected:
strStatus = "All devices in the device chain have successfully connected.";
break;
case RASCS_Authenticate:
strStatus = "Verifying the user name and password...";
break;
case RASCS_AuthNotify:
strStatus = "An authentication event has occurred.";
break;
case RASCS_AuthRetry:
strStatus = "Requested another validation attempt with a new user.";
break;
case RASCS_AuthCallback:
strStatus = "Server has requested a callback number.";
break;
case RASCS_AuthChangePassword:
strStatus = "The client has requested to change the password";
break;
case RASCS_AuthProject:
// strStatus = "The projection phase is starting...";
strStatus = "Registering your computer on the network...";
break;
case RASCS_AuthLinkSpeed:
strStatus = "The link-speed calculation phase is starting...";
break;
case RASCS_AuthAck:
strStatus = "An authentication request is being acknowledged.";
break;
case RASCS_ReAuthenticate:
strStatus = "Reauthentication (after callback) is starting. ";
break;
case RASCS_Authenticated:
strStatus = "The client has successfully completed authentication.";
break;
case RASCS_PrepareForCallback:
strStatus = "The line is about to disconnect for callback.";
break;
case RASCS_WaitForModemReset:
strStatus = "Delaying to give the modem time to reset for callback.";
break;
case RASCS_WaitForCallback:
strStatus = "Waiting for an incoming call from server.";
break;
case RASCS_Projected:
strStatus = "Projection result information is available.";
break;
case RASCS_StartAuthentication:
strStatus = "User authentication is being initiated or retried.";
break;
case RASCS_CallbackComplete:
strStatus = "Client has been called back and is about to resume authentication.";
break;
case RASCS_LogonNetwork:
strStatus = "Logging on to the network...";
break;
case RASCS_SubEntryConnected:
strStatus = "Subentry has been connected";
break;
case RASCS_SubEntryDisconnected:
strStatus = "Subentry has been disconnected";
break;
case RASCS_Interactive:
strStatus = "Terminal state supported by RASPHONE.EXE.";
break;
case RASCS_RetryAuthentication:
strStatus = "Retry authentication state supported by RASPHONE.EXE.";
break;
case RASCS_CallbackSetByCaller:
strStatus = "Callback state supported by RASPHONE.EXE.";
break;
case RASCS_PasswordExpired:
strStatus = "Change password state supported by RASPHONE.EXE.";
break;
}
//if(m_rasStatus.dwError != 0) // 9/14/98 FOR WIN95/98
// return TRUE;
//else
return FALSE;
}
BOOL CRasClient::HangUpConnection(CString strEntryName)
{
if(m_ConnectionHandle == NULL)
{
HRASCONN hrasConn;
if(GetRasConnection(strEntryName, hrasConn))
{
if(RasHangUp(hrasConn) == 0)
return TRUE;
else
return FALSE;
}
else
return FALSE;
}
else
{
if(RasHangUp(m_ConnectionHandle) == 0)
return TRUE;
else
return FALSE;
}
}
BOOL CRasClient::GetRasConnection(CString strEntryName, HRASCONN & hrasConn)
{
BOOL bFind = FALSE;
CString strEntry;
DWORD dwSizeBuf = 0;
DWORD dwConnections = 0;
RASCONN rasConn;
rasConn.dwSize = sizeof(rasConn);
DWORD dw = RasEnumConnections(&rasConn, &dwSizeBuf, &dwConnections);
if(dwConnections <= 0)
return FALSE;
RASCONN *lpRasConn = new RASCONN[dwConnections];
lpRasConn->dwSize = sizeof(*lpRasConn);
RasEnumConnections(lpRasConn, &dwSizeBuf, &dwConnections);
for(DWORD i = 0; i < dwConnections; i++)
{
strEntry = lpRasConn[i].szEntryName;
if(strEntry.CompareNoCase(strEntryName) == 0)
{
hrasConn = lpRasConn[i].hrasconn;
bFind = TRUE;
}
}
delete []lpRasConn;
if(bFind)
return TRUE;
else
return FALSE;
}