www.gusucode.com > VC++超基础的RAS网络拨号端程序-源码程序 > VC++超基础的RAS网络拨号端程序-源码程序\code\Ras.cpp

    // Ras.cpp: implementation of the CRas class.
// Download by http://www.NewXing.com
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "RasDial.h"
#include "Ras.h"
#include "RasDialDlg.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

HANDLE m_gEvent[2];
DWORD g_dwError;
CString str;

#define MESSAGEOUT2(x,y)  str.Empty();str.Format(x,y); \
	m_dlg->TextOut(str);

#define MESSAGEOUT1(x)  m_dlg->TextOut(x)
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CRas::CRas(CRasDialDlg* dlg)
{
	m_gEvent[0] = NULL;
	m_gEvent[1] = NULL;
	m_hRasConn = NULL;
	m_dlg = dlg;
}

CRas::~CRas()
{
	if(m_gEvent[0] != NULL){
		CloseHandle(m_gEvent[0]);
		m_gEvent[0] = NULL;
	}
	if(m_gEvent[1] != NULL){
		CloseHandle(m_gEvent[1]);
		m_gEvent[1] = NULL;
	}
}

BOOL CRas::Dail(LPCTSTR entry, LPCTSTR phone, LPCTSTR user, 
				LPCTSTR pass, LPCTSTR domain)
{
	DWORD			Ret;
	DWORD			tcLast;

	if((m_gEvent[0] = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL){
		TRACE("CreateEvent failed with error %d\n", GetLastError());
		return FALSE;
	}
	if((m_gEvent[1] = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL){
		TRACE("CreateEvent failed with error %d\n", GetLastError());
		return FALSE;
	}

	RasDialParams.dwSize = sizeof(RASDIALPARAMS);
	if(entry != NULL)
		lstrcpy(RasDialParams.szEntryName, entry);
	else
		lstrcpy(RasDialParams.szEntryName, "");
	if(phone != NULL)
		lstrcpy(RasDialParams.szPhoneNumber, phone);
	else
		lstrcpy(RasDialParams.szPhoneNumber, "");
	if(user != NULL)
		lstrcpy(RasDialParams.szUserName, user);
	else
		lstrcpy(RasDialParams.szUserName, "");
	if(pass != NULL)
		lstrcpy(RasDialParams.szPassword, pass);
	else
		lstrcpy(RasDialParams.szPassword, "");
	if(domain != NULL)
		lstrcpy(RasDialParams.szDomain, domain);
	else
		lstrcpy(RasDialParams.szDomain, "");

	if(m_hRasConn != NULL){
		MESSAGEOUT1("Please close the connecting first!\n");
		return FALSE;
	}
	
	if (Ret = RasDial(NULL, NULL, &RasDialParams, 
			0, &RasDialFunc, &m_hRasConn)){
		MESSAGEOUT2("RasDial failed with error %d\n", Ret);
		return FALSE;
	}

	// Wait for RasDial to complete or enter a paused state
	//Ret = WaitForSingleObject(m_gEvent, 50000);
	Ret = WaitForMultipleObjects(2, m_gEvent, FALSE, 50000);
	char szRasString[256];
	switch(Ret)
	{
		case WAIT_TIMEOUT:
			// RasDial timed out
			MESSAGEOUT1("RasDial Timed out...\n");
		case WAIT_OBJECT_0 + 1:
			RasGetErrorString((UINT)g_dwError, szRasString, 256);
			str.Empty();
			str.Format("Error: %d - ", g_dwError);
			str += szRasString;
			str += "\n";
			m_dlg->TextOut(str);
			break;
		case WAIT_OBJECT_0:
			// Normal completion or Ras Error encountered
			MESSAGEOUT1("Will hang up in 5 seconds...\n");
			Sleep(5000);

			MESSAGEOUT1("Calling RasHangUp...\n");
			if (Ret = RasHangUp(m_hRasConn))
			{
				MESSAGEOUT2("RasHangUp failed with error %d\n", Ret);
				return FALSE;
			}
			RasConnStatus.dwSize = sizeof(RASCONNSTATUS);
			tcLast = GetTickCount() + 10000;
			while((RasGetConnectStatus(m_hRasConn, &RasConnStatus) 
				!= ERROR_INVALID_HANDLE) && (tcLast > GetTickCount()))
			{	
				Sleep(50);      
			}

			str.Empty();
			str = "Connection to" +  CString(RasDialParams.szPhoneNumber) + "terminated.\n";
			m_dlg->TextOut(str);

			break;
	}

	return TRUE;
}

void WINAPI RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, 
						DWORD dwError)
{
	char szRasString[256]; // Buffer for storing the error string

	if (dwError)  // Error occurred
	{
		g_dwError = dwError;
		SetEvent(m_gEvent[1]);
		return;
	}

	// Map each of the states of RasDial() and display on the screen
	// the next state that RasDial() is entering
	switch (rasconnstate)
	{
		// Running States
		case RASCS_OpenPort:
			TRACE ("Opening port...\n");
			break;
		case RASCS_PortOpened:
			TRACE ("Port opened.\n");
        	break;
		case RASCS_ConnectDevice: 
			TRACE ("Connecting device...\n");
			break;
		case RASCS_DeviceConnected: 
			TRACE ("Device connected.\n");
			break;
		case RASCS_AllDevicesConnected:
			TRACE ("All devices connected.\n");
			break;
		case RASCS_Authenticate: 
			TRACE ("Authenticating...\n");
			break;
		case RASCS_AuthNotify:
			TRACE ("Authentication notify.\n");
			break;
		case RASCS_AuthRetry: 
			TRACE ("Retrying authentication...\n");
			break;
		case RASCS_AuthCallback:
			TRACE ("Authentication callback...\n");
			break;
		case RASCS_AuthChangePassword: 
			TRACE ("Change password...\n");
			break;
		case RASCS_AuthProject: 
			TRACE ("Projection phase started...\n");
			break;
		case RASCS_AuthLinkSpeed: 
			TRACE ("Negotiating speed...\n");
			break;
		case RASCS_AuthAck: 
			TRACE ("Authentication acknowledge...\n");
			break;
		case RASCS_ReAuthenticate: 
			TRACE ("Retrying Authentication...\n");
			break;
		case RASCS_Authenticated: 
			TRACE ("Authentication complete.\n");
			break;
		case RASCS_PrepareForCallback: 
			TRACE ("Preparing for callback...\n");
			break;
		case RASCS_WaitForModemReset: 
			TRACE ("Waiting for modem reset...\n");
			break;
		case RASCS_WaitForCallback:
			TRACE ("Waiting for callback...\n");
			break;
		case RASCS_Projected:  
			TRACE ("Projection completed.\n");
			break;
	#if (WINVER >= 0x400) 
		case RASCS_StartAuthentication:
			TRACE ("Starting authentication...\n");
            break;
		case RASCS_CallbackComplete: 
			TRACE ("Callback complete.\n");
			break;
		case RASCS_LogonNetwork:
			TRACE ("Logon to the network.\n");
			break;
	#endif 
		case RASCS_SubEntryConnected:
			TRACE ("Subentry connected.\n");
			break;
		case RASCS_SubEntryDisconnected:
			TRACE ("Subentry disconnected.\n");
			break;

		// The RAS Paused States will not occur because
		// we did not use the RASDIALEXTENSIONS structure
		// to set the RDEOPT_PausedState option flag.

		// The Paused States are:

		// RASCS_RetryAuthentication:
		// RASCS_CallbackSetByCaller:
		// RASCS_PasswordExpired:

		// Terminal States
		case RASCS_Connected: 
			TRACE ("Connection completed.\n");
			SetEvent(m_gEvent[0]);
			break;
		case RASCS_Disconnected: 
			TRACE ("Disconnecting...\n");
			SetEvent(m_gEvent[0]);
			break;
		default:
			TRACE ("Unknown Status = %d\n", rasconnstate);
			break;
	}
}