Click here to Skip to main content
15,891,607 members
Articles / Desktop Programming / MFC

Internet dialup program

Rate me:
Please Sign up or sign in to vote.
3.12/5 (16 votes)
2 Dec 1999 294K   10.7K   45  
A dial-up dialer for connection to Internet providers
///////////////////////////////////////////////////////////////////////
// If this program works, it was written by Alexander Fedorov.
// If not, I don't know who wrote it.
// mailto:lamer2000@hotmail.com
// Home Page: http://members.xoom.com/lamer2000/
// This file is part of Alexf Dialer.
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
///////////////////////////////////////////////////////////////////////

// Page1.cpp : implementation file
//

#include "stdafx.h"
#include "Afd.h"
#include "Page1.h"
#include "PhoneNumberDlg.h"
#include "RunProgDlg.h"

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

extern CAfdApp theApp;

static HRASCONN hRasConn = NULL;

VOID WINAPI RasDialFunc(UINT unMsg, RASCONNSTATE rasconnstate, DWORD dwError)
{
	TRACE("RasDialFunc\n");
	if (unMsg != WM_RASDIALEVENT) TRACE("Strange event!\n");
	theApp.PostDialMessage(WM_DIAL_FUNC, rasconnstate, dwError);
	TRACE("RasDialFunc - exit\n");
}

BOOL SelectLVItem(CListCtrl & list, int item)
{
	LV_ITEM lvi;
	ZeroMemory(&lvi, sizeof(lvi));
	lvi.iItem = item;
	lvi.mask = LVIF_STATE;
	if (!list.GetItem(&lvi)) return FALSE;
	lvi.state |= LVIS_FOCUSED | LVIS_SELECTED;
	lvi.stateMask |= LVIS_FOCUSED | LVIS_SELECTED;
	if (!list.SetItem(&lvi)) return FALSE;
	return list.EnsureVisible(item, FALSE);
}


/////////////////////////////////////////////////////////////////////////////
// CPage1 property page

IMPLEMENT_DYNCREATE(CPage1, CPropertyPage)

CPage1::CPage1() : CPropertyPage(CPage1::IDD)
{
	//{{AFX_DATA_INIT(CPage1)
	m_StatusText = _T("");
	m_LastCallText = _T("");
	//}}AFX_DATA_INIT
}

CPage1::~CPage1()
{
}

void CPage1::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPage1)
	DDX_Control(pDX, IDC_LIST_PHONES, m_PhoneList);
	DDX_Control(pDX, IDC_PROGRESS_TIMEOUT, m_ProgressTimeout);
	DDX_Control(pDX, IDC_COMBO_PROVIDER, m_Providers);
	DDX_Text(pDX, IDC_STATUS, m_StatusText);
	DDX_Text(pDX, IDC_LAST_CALL, m_LastCallText);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CPage1, CPropertyPage)
	//{{AFX_MSG_MAP(CPage1)
	ON_WM_DESTROY()
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BUTTON_PROV_ADD, OnButtonProvAdd)
	ON_BN_CLICKED(IDC_BUTTON_PROV_EDIT, OnButtonProvEdit)
	ON_BN_CLICKED(IDC_BUTTON_PROV_DEL, OnButtonProvDel)
	ON_BN_CLICKED(IDC_BUTTON_TEL_ADD, OnButtonTelAdd)
	ON_BN_CLICKED(IDC_BUTTON_TEL_EDIT, OnButtonTelEdit)
	ON_BN_CLICKED(IDC_BUTTON_TEL_DEL, OnButtonTelDel)
	ON_BN_CLICKED(IDC_DIAL, OnDial)
	ON_CBN_SELCHANGE(IDC_COMBO_PROVIDER, OnSelchangeComboProvider)
	ON_NOTIFY(NM_CLICK, IDC_LIST_PHONES, OnClickListPhones)
	ON_MESSAGE(WM_DIAL_NEXT_PHONE, OnDialNextPhone)
	ON_MESSAGE(WM_DIAL_FUNC, OnDialFunc)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPage1 message handlers

BOOL CPage1::InitPropertyPage()
{
	CString sss;
	sss.LoadString(IDS_LIST1_COL1);
	m_PhoneList.InsertColumn(0, sss, LVCFMT_LEFT, 100);
	sss.LoadString(IDS_LIST1_COL2);
	m_PhoneList.InsertColumn(1, sss, LVCFMT_LEFT, 180);
	DWORD dwStyle = m_PhoneList.SendMessage(LVM_GETEXTENDEDLISTVIEWSTYLE);
	dwStyle |= LVS_EX_FULLROWSELECT;
	m_PhoneList.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM)dwStyle);
	m_ProgressTimeout.SetRange32(0, 100);
	m_ProgressTimeout.ShowWindow(SW_HIDE);
	bPhone = FALSE;
	bDialNow = FALSE;
	bInOnTimer = FALSE;
	bConnected = FALSE;
	bDialing = FALSE;
	bAuthenticationBegin = FALSE;
	bSpeedChecked = FALSE;
	QueryConnections();
	QueryPhones(sCurrentProvider);
   	SetButtonsState();
	UpdateData(FALSE);
	uTimer = SetTimer(1, 1000, NULL);
	CheckExternalConnect();
	return ParseArgs(theApp.m_lpCmdLine);
}

BOOL CPage1::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();
	return TRUE;
}

void CPage1::OnDestroy() 
{
	KillTimer(uTimer);
	BOOL bTerminateWhenExit = atol(theApp.GetIniString(gchMain, gchEnableTerminateWhenExit, "1"));
	if (bTerminateWhenExit) HangUp(TRUE);
	CPropertyPage::OnDestroy();
}

void CPage1::OnTimer(UINT nIDEvent) 
{
	CPropertyPage::OnTimer(nIDEvent);
	// ��� �����
	if (bInOnTimer) return;
	bInOnTimer = TRUE;
	// ������ �� ������ ������ �� ������ - ����� ����� ������
	if (!bDialing)
	{
		if ((!bDialNow) && (!bConnected)) CheckExternalConnect();
		bInOnTimer = FALSE;
		return;
	}
	// ��������� �� ������ �������
	if (bConnected)
	{
		CheckingConnected();
		bInOnTimer = FALSE;
		return;
	}
	if (bDialNow) CheckingDialing();
	else
// ! bConnected ! bDialNow + bDialing
	StartDial();

//	TRACE("Leave OnTimer\n");
	bInOnTimer = FALSE;
}

BOOL CPage1::OnSetActive() 
{
	return CPropertyPage::OnSetActive();
}

void CPage1::OnButtonProvAdd() 
{
	RasCreatePhonebookEntry(GetSafeHwnd(), sCurrentProvider);
	QueryConnections();
}

void CPage1::OnButtonProvEdit() 
{
	RasEditPhonebookEntry(GetSafeHwnd(), NULL, sCurrentProvider);
	QueryConnections();
}

void CPage1::OnButtonProvDel() 
{
	int i = AfxMessageBox(IDS_DELETE_CONNECTION, MB_YESNO | MB_ICONQUESTION);
	if (i != IDYES) return;
//
typedef DWORD (WINAPI* RDE)
(LPCTSTR lpszPhonebook,  // pointer to full path and filename of 
						  // phone-book file
  LPCTSTR lpszEntry	   // pointer to an entry name to delete
);
// load library
	HINSTANCE hLib = LoadLibrary(_T("RASAPI32.DLL"));
	if (NULL == hLib) return;
	RDE rde = (RDE) GetProcAddress(hLib, "RasDeleteEntryA");
	if (rde != NULL)
	{
		rde(NULL, sCurrentProvider);
		QueryConnections();
		QueryPhones(sCurrentProvider);
	}
	::FreeLibrary(hLib);
}

void CPage1::OnButtonTelAdd() 
{
	CPhoneNumberDlg dlg;
	int nResponse = dlg.DoModal();
	if (nResponse != IDOK) return;
	UINT pn = atoi(theApp.GetIniString(sCurrentProvider, "Phones", "0"));
	pn++;
	theApp.SetIniString(sCurrentProvider, "Phones", L2S(pn));
	theApp.SetIniString(sCurrentProvider,"Phone" + L2S(pn), dlg.m_sNumber);
	theApp.SetIniString(sCurrentProvider,"Comment" + L2S(pn), dlg.m_sComments);
	theApp.SetIniString(sCurrentProvider,"LastPhone", L2S(pn));
	QueryPhones(sCurrentProvider);
}

void CPage1::OnButtonTelEdit() 
{
	CPhoneNumberDlg dlg;
	dlg.m_sNumber = GetPhoneListSelection();
	UINT lph = atoi(theApp.GetIniString(sCurrentProvider, "LastPhone", "1"));
	dlg.m_sComments = theApp.GetIniString(sCurrentProvider, "Comment" + L2S(lph), "");
	int nResponse = dlg.DoModal();
	if (nResponse != IDOK) return;
	UINT pn = atoi(theApp.GetIniString(sCurrentProvider, "Phones", "0"));
	CString sss;
	for (UINT i = 0; i < pn; i++)
	{
		sss = theApp.GetIniString(sCurrentProvider, "Phone" + L2S(i + 1), "-");
		if (sss != GetPhoneListSelection()) continue;
		sss = dlg.m_sNumber;
		theApp.SetIniString(sCurrentProvider, "Phone" + L2S(i + 1), sss);
		sss = dlg.m_sComments;
		theApp.SetIniString(sCurrentProvider, "Comment" + L2S(i + 1), sss);
		break;
	}
	QueryPhones(sCurrentProvider);
}

void CPage1::OnButtonTelDel() 
{
	int j = AfxMessageBox(IDS_DELETE_PHONE, MB_YESNO | MB_ICONQUESTION);
	if (j != IDYES) return;
	UINT pn = atoi(theApp.GetIniString(sCurrentProvider, "Phones", "0"));
	UINT lph = atoi(theApp.GetIniString(sCurrentProvider, "LastPhone", "1"));
	CString sss;
	for (UINT i = 0; i < pn; i++)
	{
		sss = theApp.GetIniString(sCurrentProvider, "Phone" + L2S(i + 1), "-");
		if (sss != GetPhoneListSelection()) continue;
		sss = theApp.GetIniString(sCurrentProvider, "Phone" + L2S(pn), "-");
		theApp.SetIniString(sCurrentProvider,"Phone" + L2S(i + 1), sss);
		pn--;
		if (lph > pn) lph = pn;
		theApp.SetIniString(sCurrentProvider, "Phones", L2S(pn));
		theApp.SetIniString(sCurrentProvider, "LastPhone", L2S(lph));
		break;
	}
	QueryPhones(sCurrentProvider);
}

void CPage1::OnDial() 
{
	if (!bDialing)
	{
		bDialing = TRUE;
		theApp.LOG(CString("Dial:<" + sCurrentProvider) +
		CString("> using phone:<" + GetPhoneListSelection()) + ">.");
	}
	else
	{
		TRACE("OnHangup()\n");
		theApp.LOG("Hang Up button pressed.");
		bDialing = FALSE;
		HangUp(FALSE);
	}
   	SetButtonsState();
}

void CPage1::OnSelchangeComboProvider() 
{
	m_Providers.GetLBText(m_Providers.GetCurSel(), sCurrentProvider);
	m_StatusText = sCurrentProvider;
// ������� ���� � ����������
	theApp.SetIniString(gchMain, "LastEntry", sCurrentProvider);
	QueryPhones(sCurrentProvider);
	UpdateData(FALSE);
	theApp.NotifyProviderChanged();
}

void CPage1::OnClickListPhones(NMHDR* pNMHDR, LRESULT* pResult) 
{
	GetPhoneListSelection();
	*pResult = 0;
}

BOOL CPage1::QueryConnections()
{
	LPRASENTRYNAME lpRasEntry;
	DWORD cbBuf;
	DWORD cEntry;
	DWORD dwRet;
	UINT  ndx;
	char  szMessage[256];
	m_Providers.ResetContent();
	sCurrentProvider = theApp.GetIniString(gchMain, "LastEntry", "");
	cbBuf = sizeof(RASENTRYNAME);
	lpRasEntry = (LPRASENTRYNAME) new char[cbBuf];
	if (NULL == lpRasEntry) return FALSE;
	ZeroMemory(lpRasEntry, cbBuf);
	lpRasEntry->dwSize = sizeof(cbBuf);
	dwRet = RasEnumEntries(NULL, NULL, lpRasEntry, &cbBuf, &cEntry);
	if (ERROR_BUFFER_TOO_SMALL == dwRet)
	{
		delete lpRasEntry;
		lpRasEntry = NULL;
		lpRasEntry = (LPRASENTRYNAME) new char[cbBuf];
		if (NULL != lpRasEntry)
		{
			ZeroMemory(lpRasEntry, cbBuf);
			lpRasEntry->dwSize = cbBuf;
			dwRet = RasEnumEntries(NULL, NULL, lpRasEntry, &cbBuf, &cEntry);
		}
		else
			dwRet = ERROR_NOT_ENOUGH_MEMORY;
	}
	if (0 != dwRet) // other error
	{
		if (0 != RasGetErrorString((UINT)dwRet, szMessage, 256))
		{
			CString sss; sss.LoadString(IDS_RASCS_25);
			wsprintf((LPSTR)szMessage, sss);
		}
		m_StatusText = szMessage;
		UpdateData(FALSE);
	}
	if (0 == cEntry)
	{
		delete lpRasEntry ;
		return FALSE;
	}
	BOOL bSet = FALSE;
	if (0 == dwRet)  // No errors
	{
		for (ndx = 0; ndx < cEntry; ndx++)
		{
			m_Providers.InsertString(ndx, lpRasEntry[ndx].szEntryName);
			// ����� ������� ����������
			if (lpRasEntry[ndx].szEntryName == sCurrentProvider)
			{
				m_Providers.SetCurSel(ndx);
				bSet = TRUE;
			}
		}
		// ��������� ������-������ ���������� �� ���������
		if (!bSet)
		{
			m_Providers.SetCurSel(0);
			sCurrentProvider = lpRasEntry[0].szEntryName;
		}
	}
	delete lpRasEntry ;
	return TRUE;
}

BOOL CPage1::QueryPhones(CString sEntryName)
{
	m_PhoneList.DeleteAllItems();
	UINT pn = atoi(theApp.GetIniString(sEntryName, "Phones", "0"));
	if (0 == pn)
	{
		bPhone = LoadDefautPhoneNumber(sEntryName);
		pn = 1;
	}
	else
		bPhone = FALSE;
	if (!bPhone) return FALSE;
	CString sss;
	for (UINT i = 0; i < pn; i++)
	{
		sss = theApp.GetIniString(sEntryName, "Phone" + L2S(i + 1), "-");
		if (sss.IsEmpty()) continue;
		m_PhoneList.InsertItem(i, sss);
		sss = theApp.GetIniString(sEntryName, "Comment" + L2S(i + 1), "");
		if (!sss.IsEmpty())
		{
			LV_ITEM lvi;
			lvi.mask = LVIF_TEXT;
			lvi.iItem = i;
			lvi.iSubItem = 1;
			lvi.pszText = sss.GetBuffer(512);
			m_PhoneList.SetItem(&lvi);
			sss.ReleaseBuffer();
		}
	}
	UINT lpn = atoi(theApp.GetIniString(sEntryName, "LastPhone", "1"));
	if (lpn > pn) lpn = pn;
	SelectLVItem(m_PhoneList, lpn - 1);
	SetButtonsState();
	return TRUE;
}

BOOL CPage1::ParseArgs(CString sss)
{
	int i;
	CString aaa;
	BOOL bNeedReload = FALSE;
// /?
	aaa = sss;
	aaa.MakeUpper();
	i = aaa.Find("/?");
	if (i != -1)
	{
		AfxMessageBox(IDS_ARG_HELP);
	}
// ���������� ����������
	aaa = sss;
	aaa.MakeUpper();
	i = aaa.Find("/C\"");
	if (i != -1)
	{
		aaa = sss.Mid(i + 3, sss.GetLength());
		i = aaa.Find("\"");
		if (i > 0)
		{
			aaa = aaa.Mid(0, i);
			theApp.SetIniString(gchMain,"LastEntry", aaa);
			bNeedReload = TRUE;
		}
	}
// ���������� ����� ��������
	aaa = sss;
	aaa.MakeUpper();
	i = aaa.Find("/P");
	if (i != -1)
	{
		aaa = sss.Mid(i + 2, sss.GetLength());
		i = atol(aaa);
		if (i != 0)
		{
			theApp.SetIniString(
			sCurrentProvider, "LastPhone", L2S(i));
			bNeedReload = TRUE;
		}
	}
	if (bNeedReload)
	{
		QueryConnections();
		QueryPhones(sCurrentProvider);
	}
// ����� ������ ������
	CString s1, s2;
//	if (GetActiveConnectionParam(s1, s2)) return TRUE;
	aaa = sss;
	aaa.MakeUpper();
	i = aaa.Find("/D");
	if (i != -1) OnDial();
	return TRUE;
}

void CPage1::SetButtonsState()
{
	CString sss;
	GetDlgItem(IDC_DIAL)->EnableWindow(bPhone);
	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;
		TRACE("����� ������\n");
		theApp.FinishSession();
		RasHangUp(hRasConn);
		TRACE("RasHangUp ������\n");
		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);
			}
//		Sleep(100);
			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)
{
	TRACE("OnDialFunc\n");
	char szMessage[256];
	m_StatusText = GetRasConnState((RASCONNSTATE) w);
	UpdateData(FALSE);
	if (l)  // error occurred
	{
		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)
	{
		TRACE("�����������\n");
		bConnected = TRUE;
		m_StatusText.LoadString(IDS_ONLINE);
		theApp.LOG("On line.");
		theApp.StartSession();
		theApp.RunProgramsOnEvent(RUN_ONLINE);
		TRACE("������� �������\n");
		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;
	DWORD ret =	RasGetProjectionInfo(hRasConn, RASP_PppIp, & pppip, & dw);
//	if (ERROR_SUCCESS == ret) sss = pppip.szIpAddress;
	if (ERROR_SUCCESS == ret) sss = pppip.szServerIpAddress;
//	else PrintError();
	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);
	TRACE(m_StatusText + "\n");
	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)
		TRACE(CString("Internal error ") + CString(szBuf) + "\n");
		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;
	}
	// �������� �������� (1 ���)
	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();
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer SEO
Russian Federation Russian Federation
AlexF's Blog in Russian
Owner Spy competition analysis
Rating Burner Rating of blogs

Comments and Discussions