⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 page1.cpp

📁 Visual C++ 网络通信编程实用案例精选 的配套光盘
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			sCurrentProvider, "LastPhone", L2S(i));
			bNeedReload = TRUE;
		}
	}
	if (bNeedReload)
	{
		QueryConnections();
		QueryPhones(sCurrentProvider);
	}
	CString s1, s2;
	aaa = sss;
	aaa.MakeUpper();
	i = aaa.Find("/D");
	if (i != -1) OnDial();
	return TRUE;
}

void CPage1::SetButtonsState()
{
	CString sss;
	GetDlgItem(IDC_BUTTON_TEL_ADD)->EnableWindow(!sCurrentProvider.IsEmpty());
	GetDlgItem(IDC_BUTTON_TEL_EDIT)->EnableWindow(bPhone);
	GetDlgItem(IDC_BUTTON_TEL_DEL)->EnableWindow(!bDialing && bPhone);
	GetDlgItem(IDC_BUTTON_PROV_DEL)->EnableWindow(!bDialing);
	UINT pn = atoi(theApp.GetIniString(sCurrentProvider, "Phones", "0"));
	if (pn <= 1) GetDlgItem(IDC_BUTTON_TEL_DEL)->EnableWindow(FALSE);
	GetDlgItem(IDC_COMBO_PROVIDER)->EnableWindow(!bDialing);
	if (!bDialing && bPhone)
	sss.LoadString(IDS_DIAL);
	else
	sss.LoadString(IDS_HANGUP);
	GetDlgItem(IDC_DIAL)->SetWindowText(sss);
	m_ProgressTimeout.ShowWindow(SW_HIDE);
	BOOL m_bMaxWaitTime = atol(theApp.GetIniString(gchMain, gchEnableTimeout, "0"));
	if (m_bMaxWaitTime && bDialing && !bConnected)
	{
		m_ProgressTimeout.ShowWindow(SW_SHOW);
	}
	m_ProgressTimeout.SetPos(0);
}

//载入默认得电话号码
BOOL CPage1::LoadDefautPhoneNumber(CString sEntryName)
{
//
typedef DWORD (WINAPI* RGEPA)
(LPCTSTR lpszPhonebook,		// pointer to full path and filename of 
							// phone-book file
  LPCTSTR lpszEntry,		// pointer to an entry name
  LPRASENTRY lpRasEntry,	// buffer that receives entry information
  LPDWORD lpdwEntryInfoSize,	// size, in bytes, of the lpRasEntry 
								// buffer
  LPBYTE lpbDeviceInfo,			// buffer that receives device-specific 
								// configuration information
  LPDWORD lpdwDeviceInfoSize	// size, in bytes, of the 
								// lpbDeviceInfo buffer
);
// load library
	HINSTANCE hLib = LoadLibrary(_T("RASAPI32.DLL"));
	if (NULL == hLib) return FALSE;
	RGEPA rgepa = (RGEPA) GetProcAddress(hLib, "RasGetEntryPropertiesA");
	if (NULL == rgepa)
	{
		::FreeLibrary(hLib);
		return FALSE;
	}
	RASENTRY RasEntry;
	DWORD dw = sizeof(RASENTRY);
	ZeroMemory(&RasEntry, dw);
	RasEntry.dwSize = dw;
	DWORD ret = rgepa(NULL, sEntryName, &RasEntry, &dw, NULL, NULL);
	::FreeLibrary(hLib);
	if (ret != 0) return FALSE;
	CString phone;
	if (RasEntry.dwfOptions & RASEO_UseCountryAndAreaCodes)
	{
		phone = "8w";
		phone += RasEntry.szAreaCode;
		phone += RasEntry.szLocalPhoneNumber;
	}
	else
	phone = RasEntry.szLocalPhoneNumber;
	UINT pn = 1;
	theApp.SetIniString(sEntryName, "Phones", L2S(pn));
	theApp.SetIniString(sEntryName,"Phone" + L2S(pn), phone);
	return TRUE;
}

//挂断拨号
BOOL CPage1::HangUp(BOOL bExitApp)
{
	DWORD dwRet;
	RASCONNSTATUS rStatus;
	ZeroMemory(&rStatus, sizeof(RASCONNSTATUS));
	rStatus.dwSize = sizeof(RASCONNSTATUS);
	dwRet = RasGetConnectStatus(hRasConn, &rStatus);
	if ((dwRet != ERROR_INVALID_HANDLE) || (bDialNow))
	{
		bDialNow = FALSE;
		theApp.FinishSession();
		//挂断连接
		RasHangUp(hRasConn);
		dwRet = RasGetConnectStatus(hRasConn, &rStatus);
		m_StatusText.LoadString(IDS_TERMINATING_CONN);
		UpdateData(FALSE);
		//获得当前时间
		CTime t1 = CTime::GetCurrentTime();
		CTimeSpan ts;
		MSG msg;
		while (dwRet != ERROR_INVALID_HANDLE)
		{
			while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
			dwRet = RasGetConnectStatus(hRasConn, &rStatus);
			ts = CTime::GetCurrentTime() - t1;
			if (!bExitApp)
			if (ts.GetTotalSeconds() > 3) break;
		}
		//设定日志
		theApp.LOG("HangUp.");
		m_StatusText.LoadString(IDS_PAUSE);
		UpdateData(FALSE);
		if (bConnected) theApp.RunProgramsOnEvent(RUN_HANGUP);
	}
	Sleep(500);
	m_StatusText.Empty();
	UpdateData(FALSE);
	bConnected = FALSE;
	return TRUE;
}

BOOL CPage1::PublicOnDial()
{
	OnDial();
	return TRUE;
}


LRESULT CPage1::OnDialFunc(WPARAM w, LPARAM l)
{

	char szMessage[256];

	m_StatusText = GetRasConnState((RASCONNSTATE) w);
	UpdateData(FALSE);
	if (l)  // 错误产生
	{
		if (RasGetErrorString((UINT) l, szMessage, 256) != 0)
		{
			CString sss; sss.LoadString(IDS_RASCS_25);
			wsprintf((LPSTR)szMessage, sss);
		}
		m_LastCallText = szMessage;
		TRACE(CString("External error ") + CString(szMessage) + "\n");
		HangUp(FALSE);
		theApp.LOG(m_LastCallText);
		OnDialNextPhone();
	}
	else if (RASCS_DONE & w)
	{
		bConnected = TRUE;
		m_StatusText.LoadString(IDS_ONLINE);
		theApp.LOG("On line.");
		theApp.StartSession();
		theApp.RunProgramsOnEvent(RUN_ONLINE);
		SetButtonsState();
	}
	UpdateData(FALSE);
	return 0;
}

//拨下一个号码
void CPage1::OnDialNextPhone()
{
	int nItems = m_PhoneList.GetItemCount();
	for (int i = 0; i < nItems; i++)
	{
		UINT state = m_PhoneList.GetItemState(i, LVIS_SELECTED);
		if (LVIS_SELECTED == state)
		{
				m_PhoneList.SetItemState(i, 0, LVIS_SELECTED);
				if (i + 1 < nItems) i++;
				else i = 0;
				SelectLVItem(m_PhoneList, i);
				GetPhoneListSelection();
				return;
		}
	}
	SelectLVItem(m_PhoneList, 0);
	GetPhoneListSelection();
}

//设置拨号名称
CString CPage1::GetPhoneListSelection()
{
	CString sss;
	for (int i = 0; i < m_PhoneList.GetItemCount(); i++)
	{
		if (LVIS_SELECTED == m_PhoneList.GetItemState(i, LVIS_SELECTED))
		{
				sss = m_PhoneList.GetItemText(i, 0);
				theApp.SetIniString(sCurrentProvider, "LastPhone", L2S(i + 1));
				return sss;
		}
	}
	SelectLVItem(m_PhoneList, 0);
	theApp.SetIniString(sCurrentProvider, "LastPhone", "1");
	return sss;
}

BOOL CPage1::GetActiveConnectionParam(CString & Conn, CString & Phon)
{
	RASCONN rcArray[100];
	RASCONNSTATUS rStatus;
	DWORD dwRet;
	DWORD dw1 = sizeof(rcArray);
	DWORD dw2;
	ZeroMemory(rcArray, dw1);
	rcArray[0].dwSize = sizeof(RASCONN);
	dwRet = RasEnumConnections(rcArray, & dw1, & dw2);
//	ERROR_BUFFER_TOO_SMALL 
	ZeroMemory(&rStatus, sizeof(RASCONNSTATUS));
	rStatus.dwSize = sizeof(RASCONNSTATUS);
	for (dw1 = 0; dw1 < dw2; dw1++)
	{
		dwRet = RasGetConnectStatus(rcArray[dw1].hrasconn, &rStatus);
		if (RASCS_Connected == rStatus.rasconnstate)
		{
			Conn = rcArray[dw1].szEntryName;
			hRasConn = rcArray[dw1].hrasconn;
			return TRUE;
		}
	}
	return FALSE;
}


//获得连接状态,根据不同情况,设定不同的状态
CString CPage1::GetRasConnState(RASCONNSTATE rasconn)
{
	CString sss;
	switch(rasconn)
	{
		case RASCS_OpenPort:
			sss.LoadString(IDS_RASCS_1); break;
		case RASCS_PortOpened:
			sss.LoadString(IDS_RASCS_2); break;
		case RASCS_ConnectDevice:
			sss.LoadString(IDS_RASCS_3); break;
		case RASCS_DeviceConnected:
			sss.LoadString(IDS_RASCS_4); break;
		case RASCS_AllDevicesConnected:
			sss.LoadString(IDS_RASCS_5); break;
		case RASCS_Authenticate:
			sss.LoadString(IDS_RASCS_6); break;
		case RASCS_AuthNotify:
			sss.LoadString(IDS_RASCS_7); break;
		case RASCS_AuthRetry:
			sss.LoadString(IDS_RASCS_8); break;
		case RASCS_AuthCallback:
			sss.LoadString(IDS_RASCS_9); break;
		case RASCS_AuthChangePassword:
			sss.LoadString(IDS_RASCS_10); break;
		case RASCS_AuthProject:
			sss.LoadString(IDS_RASCS_11); break;
		case RASCS_AuthLinkSpeed:
			sss.LoadString(IDS_RASCS_12); break;
		case RASCS_AuthAck:
			sss.LoadString(IDS_RASCS_13); break;
		case RASCS_ReAuthenticate:
			sss.LoadString(IDS_RASCS_14); break;
		case RASCS_Authenticated:
			sss.LoadString(IDS_RASCS_15); break;
		case RASCS_PrepareForCallback:
			sss.LoadString(IDS_RASCS_16); break;
		case RASCS_WaitForModemReset:
			sss.LoadString(IDS_RASCS_17); break;
		case RASCS_WaitForCallback:
			sss.LoadString(IDS_RASCS_18); break;
		case RASCS_Interactive:
			sss.LoadString(IDS_RASCS_19); break;
		case RASCS_RetryAuthentication:
			sss.LoadString(IDS_RASCS_20); break;
		case RASCS_CallbackSetByCaller:
			sss.LoadString(IDS_RASCS_21); break;
		case RASCS_PasswordExpired:
			sss.LoadString(IDS_RASCS_22); break;
		case RASCS_Connected:
			sss.LoadString(IDS_RASCS_23); break;
		case RASCS_Disconnected:
			sss.LoadString(IDS_RASCS_24); break;
		default:
			sss.LoadString(IDS_RASCS_25); break;
	}
	return sss;
}

CString CPage1::GetIPAddress()
{
	CString sss;
	if (!bConnected) return sss;
	RASPPPIP pppip;
	DWORD dw = sizeof(pppip);
	ZeroMemory(& pppip, dw);
	pppip.dwSize = dw;
	//通过RasGetProjectionInfo获得IP地址
	DWORD ret =	RasGetProjectionInfo(hRasConn, RASP_PppIp, & pppip, & dw);
	if (ERROR_SUCCESS == ret) sss = pppip.szServerIpAddress;
	return sss;
}

//检查扩展连接
BOOL CPage1::CheckExternalConnect()
{
	CString s1, s2;
	if (!GetActiveConnectionParam(s1, s2)) return FALSE;
	if (s1.IsEmpty())  return FALSE;
	sCurrentProvider = s1;
	theApp.SetIniString(gchMain,"LastEntry", sCurrentProvider);
	bDialing = TRUE;
	bDialNow = TRUE;
	bConnected = TRUE;
	QueryConnections();
	QueryPhones(sCurrentProvider);
	SetButtonsState();
	m_StatusText.LoadString(IDS_EXTERN_ONLINE);
	theApp.LOG("External On line.");
	UpdateData(FALSE);
	theApp.StartSession();
	theApp.RunProgramsOnEvent(RUN_ONLINE);
	return TRUE;
}

//开始拨号
BOOL CPage1::StartDial()
{
	bDialNow = TRUE;
	bAuthenticationBegin = FALSE;
	bSpeedChecked = FALSE;
	hRasConn = NULL;
	tBeginDial = CTime::GetCurrentTime();
	RASDIALPARAMS rdParams;
	char  szBuf[256] = "";
	ZeroMemory(&rdParams, sizeof(RASDIALPARAMS));
	rdParams.dwSize = sizeof(RASDIALPARAMS);
	lstrcpy(rdParams.szEntryName, sCurrentProvider);
	int pd = atoi(theApp.GetIniString(gchMain, gchPulseDialing, "1"));
	if (1 == pd) lstrcpy(rdParams.szPhoneNumber, CString("P") + GetPhoneListSelection());
	else lstrcpy(rdParams.szPhoneNumber, GetPhoneListSelection());
	CString un, pw;
	un = theApp.GetIniString(sCurrentProvider, "UserName", "");
	pw = theApp.GetPassword(TRUE);
	lstrcpy(rdParams.szUserName, un);
	lstrcpy(rdParams.szPassword, pw);
	rdParams.szCallbackNumber[0] = '*';
	rdParams.szDomain[0] = '*';
	m_StatusText = CString("Dial:<" + sCurrentProvider) +
	CString("> Phone:<") + CString(rdParams.szPhoneNumber) +
	CString("> User Name:<" + un) + CString("> Password:<" + theApp.GetPassword()) + ">";
	theApp.LOG(m_StatusText);
	UpdateData(FALSE);
	Sleep(400);
	DWORD dwRet;
	dwRet = RasDial(NULL, NULL, &rdParams, 0L, (LPVOID)RasDialFunc, &hRasConn);
	if (dwRet)
	{
		if (RasGetErrorString((UINT)dwRet, (LPSTR)szBuf, 256) != 0)
		m_LastCallText = szBuf;
		theApp.LOG(m_LastCallText);
		UpdateData(FALSE);
		HangUp(FALSE);
		OnDialNextPhone();
	}
	return TRUE;
}

//检查拨号
BOOL CPage1::CheckingDialing()
{
	RASCONNSTATUS rStatus;
	DWORD dwRet;
	ZeroMemory(&rStatus, sizeof(RASCONNSTATUS));
	rStatus.dwSize = sizeof(RASCONNSTATUS);
	dwRet = RasGetConnectStatus(hRasConn, &rStatus);
	RASCONNSTATE rcs = rStatus.rasconnstate;
	if (!bConnected)
	{
		BOOL m_bMaxWaitTime = atol(theApp.GetIniString(gchMain, gchEnableTimeout, "0"));
		if (m_bMaxWaitTime)
		{
			CString sss = theApp.GetIniString(gchMain, gchMaxWaitTime, "60");
			CTimeSpan tst = CTime::GetCurrentTime() - tBeginDial;
			m_ProgressTimeout.SetPos(100 * tst.GetTotalSeconds() / atol(sss));
			if (tst.GetTotalSeconds() > atol(sss))
			{
				m_LastCallText.LoadString(IDS_TIME_OUT);
				theApp.LOG("Time out.");
				UpdateData(FALSE);
				HangUp(FALSE);
			}
		}
		if ((RASCS_Authenticate == rcs) && (FALSE == bAuthenticationBegin))
		{
			bAuthenticationBegin = TRUE;
			theApp.RunProgramsOnEvent(RUN_CONNECT);
		}
	}
	return TRUE;
}

BOOL CPage1::CheckingConnected()
{
	RASCONNSTATUS rStatus;
	DWORD dwRet;
	ZeroMemory(&rStatus, sizeof(RASCONNSTATUS));
	rStatus.dwSize = sizeof(RASCONNSTATUS);
	dwRet = RasGetConnectStatus(hRasConn, &rStatus);
	RASCONNSTATE rcs = rStatus.rasconnstate;
	if (ERROR_INVALID_HANDLE == dwRet)
	{
		HangUp(FALSE);
		m_LastCallText.LoadString(IDS_LOST_OF_CARRIER);
		theApp.LOG("Lost of carrier.");
		UpdateData(FALSE);
		BOOL bbb = atol(theApp.GetIniString(gchMain, gchRedialWhenHangUp, "1"));
		if (!bbb) OnDial();
		TRACE("RedialWhenHangUp = FALSE\n");
		return TRUE;
	}
	if (!bSpeedChecked)
	{
		bSpeedChecked = TRUE;
		BOOL m_bMinSpeed = atol(theApp.GetIniString(gchMain, gchEnableMinSpeed, "0"));
		if (m_bMinSpeed)
		{
			DWORD dwBPS = atol(theApp.GetIniString(gchMain, gchMinSpeed, "2400"));
			DWORD dwMaxSpeed;
			dwMaxSpeed = theApp.pPerf[PERF_ConnectSpeed]->GetData();
			if (dwBPS > dwMaxSpeed)
			{
				CString sss = "Low speed disconnect. Min Speed <";
				sss += L2S(dwBPS) + "> Current Speed <";
				sss += L2S(dwMaxSpeed) + ">.";
				m_LastCallText = sss;
				theApp.LOG(sss);
				UpdateData(FALSE);
				HangUp(FALSE);
			}
		}
	}
	return TRUE;
}

void CPage1::OnOK() 
{
	return;	
	CPropertyPage::OnOK();
}

//void CPage1::OnButtonDial() 
//{
	// TODO: Add your control notification handler code here
//	StartDial();
	
//}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -