📄 page1.cpp
字号:
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;
}
//get active connection's parameter
//Return Values
//如果找到了active connection,则返回true.
//Parameters
//Conn [out]连接的名字;
//Phon 没用;
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);//枚举系统中所有的连接
if(dwRet != ERROR_SUCCESS)
return false;
else
// ERROR_BUFFER_TOO_SMALL
ZeroMemory(&rStatus, sizeof(RASCONNSTATUS));
rStatus.dwSize = sizeof(RASCONNSTATUS);
//循环处理所有的枚举出来的连接
for (dw1 = 0; dw1 < dw2; dw1++)
{
dwRet = RasGetConnectStatus(rcArray[dw1].hrasconn, &rStatus);
//如果此连接的状态是connected,则
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;
}
//检查外部连接情况。此函数的作用大概是:当启动此程序的时候,需要先检测一下系统当前
//是否已经通过拨号连上了Internet,因为并不是用此程序连上的Internet,所以,这种连接就称之为
//“外部连接”,意思就是说,是在此程序之外创建的连接
BOOL CPage1::CheckExternalConnect()
{
CString s1, s2;
//如果获得active connection's 的名称不成功,则返回false
if (!GetActiveConnectionParam(s1, s2)) return FALSE;
//如果获取的名称是空串,则还是返回false
if (s1.IsEmpty()) return FALSE;
sCurrentProvider = s1;
//将获取的名称赋值给类变量
//设置ini文件中Main块中的LastEntry条目的值为“刚获取的active connection's名称”。
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);//将“ADSL”写入szEntryName条目
//从ini文件中的Main块中读取PulseDialing条目的值
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", "");//读取ADSL拨号的用户名
pw = theApp.GetPassword(TRUE);//获取ADSL拨号的用户密码
lstrcpy(rdParams.szUserName, un);
lstrcpy(rdParams.szPassword, pw);
rdParams.szCallbackNumber[0] = '*';
//形成了一个很长的信息串,包含了连接名(ADSL),电话,用户名,口令
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;
//RasDial The RasDial function establishes a RAS connection between a RAS client and a RAS server. The connection data includes callback and user-authentication information.
//Return Values
//If the function succeeds, the immediate return value is zero. In addition, the function stores a handle to the RAS connection into the variable pointed to by lphRasConn.
//If the function fails, the immediate return value is a nonzero error value, either from the set listed in the RAS header file or ERROR_NOT_ENOUGH_MEMORY.
//第4个参数:值为0,表示The lpvNotifier parameter(第5个参数) points to a RasDialFunc callback function.
//第5个参数:[in] Specifies a RasDialFunc callback function to receive RasDial event notifications.
//这个函数是进行拨号连接的关键!
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 + -