www.pudn.com > afdialer_src.rar > Page2.cpp


/////////////////////////////////////////////////////////////////////// 
// 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. 
/////////////////////////////////////////////////////////////////////// 
 
// Page2.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include  
#include "Afd.h" 
#include "Page2.h" 
#include "RunProgDlg.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
extern CAfdApp theApp; 
 
BOOL strxor(char * key, char * str, size_t len) 
{ 
	int k = 0; 
	int l = strlen(key); 
	for (size_t i = 0; i < len; i++) 
	{ 
		str[i] = str[i] ^ key[k]; 
		k ++; 
		if (k >= l) k = 0; 
	} 
	return TRUE; 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CPage2 property page 
 
IMPLEMENT_DYNCREATE(CPage2, CPropertyPage) 
 
CPage2* CPage2::ziz = NULL; 
CRITICAL_SECTION CPage2::sCriticalSection; 
 
CPage2::CPage2() : CPropertyPage(CPage2::IDD) 
{ 
	//{{AFX_DATA_INIT(CPage2) 
	m_sUserName = _T(""); 
	m_sPassword = _T(""); 
	m_sSoundLogin = _T(""); 
	m_sSoundLogout = _T(""); 
	m_sConnectionName = _T(""); 
	m_bHidePassword = FALSE; 
	//}}AFX_DATA_INIT 
	ziz = this; 
	bThreadExitImmediately = FALSE; 
	iThreadWorkingNow = 0; 
	InitializeCriticalSection(&sCriticalSection); 
	bWindowActivated = FALSE; 
} 
 
CPage2::~CPage2() 
{ 
	DeleteCriticalSection(&sCriticalSection); 
} 
 
void CPage2::DoDataExchange(CDataExchange* pDX) 
{ 
	CPropertyPage::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CPage2) 
	DDX_Control(pDX, IDC_LIST_PROGS, m_listProgs); 
	DDX_Text(pDX, IDC_EDIT_USER_NAME, m_sUserName); 
	DDX_Text(pDX, IDC_EDIT_PASSWORD, m_sPassword); 
	DDX_Text(pDX, IDC_EDIT_SOUND_LOGIN, m_sSoundLogin); 
	DDX_Text(pDX, IDC_EDIT_SOUND_LOGOUT, m_sSoundLogout); 
	DDX_Text(pDX, IDC_STATIC_NAME, m_sConnectionName); 
	DDX_Check(pDX, IDC_HIDEPWD, m_bHidePassword); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CPage2, CPropertyPage) 
	//{{AFX_MSG_MAP(CPage2) 
	ON_WM_DESTROY() 
	ON_WM_TIMER() 
	ON_BN_CLICKED(IDC_LOAD_LOGIN, OnLoadLogin) 
	ON_BN_CLICKED(IDC_LOAD_LOGOUT, OnLoadLogout) 
	ON_BN_CLICKED(IDC_TEST_LOGIN, OnTestLogin) 
	ON_BN_CLICKED(IDC_TEST_LOGOUT, OnTestLogout) 
	ON_EN_KILLFOCUS(IDC_EDIT_PASSWORD, OnKillfocusEditPassword) 
	ON_EN_KILLFOCUS(IDC_EDIT_SOUND_LOGIN, OnKillfocusEditSoundLogin) 
	ON_EN_KILLFOCUS(IDC_EDIT_SOUND_LOGOUT, OnKillfocusEditSoundLogout) 
	ON_EN_KILLFOCUS(IDC_EDIT_USER_NAME, OnKillfocusEditUserName) 
	ON_BN_CLICKED(IDC_BUTTON_PROG_ADD, OnButtonProgAdd) 
	ON_BN_CLICKED(IDC_BUTTON_PROG_EDIT, OnButtonProgEdit) 
	ON_BN_CLICKED(IDC_BUTTON_PROG_DEL, OnButtonProgDel) 
	ON_BN_CLICKED(IDC_HIDEPWD, OnHidepwd) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CPage2 message handlers 
 
BOOL CPage2::InitPropertyPage() 
{ 
	CString sss; sss.LoadString(IDS_LIST2_COL1); 
	m_listProgs.InsertColumn(0, sss, LVCFMT_LEFT, 70); 
	sss.LoadString(IDS_LIST2_COL2); 
	m_listProgs.InsertColumn(1, sss, LVCFMT_LEFT, 200); 
	DWORD dwStyle = m_listProgs.SendMessage(LVM_GETEXTENDEDLISTVIEWSTYLE); 
	dwStyle |= LVS_EX_FULLROWSELECT; 
	m_listProgs.SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (LPARAM)dwStyle); 
 
	m_bHidePassword = atol(theApp.GetIniString(gchMain, gchHidePassword, "0")); 
	if (m_bHidePassword) 
	((CEdit *)GetDlgItem(IDC_EDIT_PASSWORD))->SetPasswordChar('*'); 
	else 
	((CEdit *)GetDlgItem(IDC_EDIT_PASSWORD))->SetPasswordChar(0); 
	 
	Reload(); 
	bWindowActivated = TRUE; 
	return TRUE; 
} 
 
BOOL CPage2::OnInitDialog()  
{ 
	CPropertyPage::OnInitDialog(); 
	return TRUE; 
} 
 
void CPage2::OnDestroy()  
{ 
//	bThreadExitImmediately = TRUE; 
	EnterCriticalSection(&sCriticalSection); 
	LeaveCriticalSection(&sCriticalSection); 
	CPropertyPage::OnDestroy(); 
} 
 
void CPage2::OnTimer(UINT nIDEvent)  
{ 
	// TODO: Add your message handler code here and/or call default 
	 
	CPropertyPage::OnTimer(nIDEvent); 
} 
 
BOOL CPage2::OnSetActive()  
{ 
	if (!bWindowActivated) return CPropertyPage::OnSetActive(); 
	Reload(); 
	return CPropertyPage::OnSetActive(); 
} 
 
void CPage2::OnLoadLogin()  
{ 
	UpdateData(); 
	CString sss = m_sSoundLogin; 
	if (sss.IsEmpty()) sss = "*.*"; 
	CFileDialog dlg(TRUE, NULL, sss, 
	OFN_EXPLORER | OFN_OVERWRITEPROMPT, "*.wav", NULL); 
	int i = dlg.DoModal(); 
	if (i != IDOK) return; 
	m_sSoundLogin = dlg.GetPathName(); 
	UpdateData(FALSE); 
	SaveCurrentUNP(); 
} 
 
void CPage2::OnLoadLogout()  
{ 
	UpdateData(); 
	CString sss = m_sSoundLogout; 
	if (sss.IsEmpty()) sss = "*.*"; 
	CFileDialog dlg(TRUE, NULL, sss, 
	OFN_EXPLORER | OFN_OVERWRITEPROMPT, "*.wav", NULL); 
	int i = dlg.DoModal(); 
	if (i != IDOK) return; 
	m_sSoundLogout = dlg.GetPathName(); 
	UpdateData(FALSE); 
	SaveCurrentUNP(); 
} 
 
void CPage2::OnTestLogin()  
{ 
	UpdateData(); 
	if (!m_sSoundLogin.IsEmpty()) sndPlaySound(m_sSoundLogin, SND_ASYNC); 
} 
 
void CPage2::OnTestLogout()  
{ 
	UpdateData(); 
	if (!m_sSoundLogout.IsEmpty()) sndPlaySound(m_sSoundLogout, SND_ASYNC); 
} 
 
void CPage2::OnKillfocusEditPassword()  
{ 
	SaveCurrentUNP(); 
} 
 
void CPage2::OnKillfocusEditSoundLogin()  
{ 
	SaveCurrentUNP(); 
} 
 
void CPage2::OnKillfocusEditSoundLogout()  
{ 
	SaveCurrentUNP(); 
} 
 
void CPage2::OnKillfocusEditUserName()  
{ 
	SaveCurrentUNP(); 
} 
 
BOOL CPage2::SaveCurrentUNP() 
{ 
	if (!bWindowActivated) return TRUE; 
	CString Provider = theApp.GetCurrentProviderName(); 
	UpdateData(); 
	theApp.SetIniString(Provider, "UserName", m_sUserName); 
	theApp.SetIniString(Provider, "Password", ""); 
	theApp.SetIniString(Provider, "Pwd", ""); 
	if (!m_sPassword.IsEmpty()) 
	{ 
		char aaa[1024]; ZeroMemory(&aaa, 1024); 
		char bbb[1024]; ZeroMemory(&bbb, 1024); 
		char ccc[1024]; ZeroMemory(&ccc, 1024); 
		if (!m_sUserName.IsEmpty()) strcpy(aaa, m_sUserName); 
		else strcpy(aaa, "z"); 
		if (!m_sPassword.IsEmpty()) strcpy(bbb, m_sPassword); 
		size_t len = strlen(bbb); 
		strxor(aaa, bbb, len); 
		aaa[0] = 0; 
		for (UINT i = 0; i < len; i++) 
		{ 
			sprintf(ccc,"%s%03u", aaa, (unsigned char) bbb[i]); 
			strcpy(aaa, ccc); 
		} 
		theApp.SetIniString(Provider, "Pwd", aaa); 
	} 
 
	theApp.SetIniString(Provider, "Sound01", m_sSoundLogin); 
	theApp.SetIniString(Provider, "Sound02", m_sSoundLogout); 
	return TRUE; 
} 
 
BOOL CPage2::LoadCurrentUNP() 
{ 
	BOOL bNeedRemoveOldPwd = FALSE; 
	CString Provider = theApp.GetCurrentProviderName(); 
	m_sUserName		= theApp.GetIniString(Provider, "UserName", ""); 
	m_sPassword		= theApp.GetIniString(Provider, "Password", ""); 
	if (!m_sPassword.IsEmpty()) bNeedRemoveOldPwd = TRUE; 
	else 
	{ 
		m_sPassword = theApp.GetIniString(Provider, "Pwd", ""); 
		if (!m_sPassword.IsEmpty()) 
		{ 
			char aaa[1024]; ZeroMemory(&aaa, 1024); 
			char bbb[1024]; ZeroMemory(&bbb, 1024); 
			char ccc[1024]; ZeroMemory(&ccc, 1024); 
			int len = 0; 
			for (int i = 0; i < m_sPassword.GetLength(); i+=3) 
			{ 
				bbb[len] = (char) atol(m_sPassword.Mid(i, 3)); 
				len++; 
			} 
			if (!m_sUserName.IsEmpty()) strcpy(aaa, m_sUserName); 
			else strcpy(aaa, "z"); 
			strxor(aaa, bbb, len); 
			m_sPassword = bbb; 
		} 
	} 
	m_sSoundLogin	= theApp.GetIniString(Provider, "Sound01", ""); 
	m_sSoundLogout	= theApp.GetIniString(Provider, "Sound02", ""); 
// load list of programs 
	LoadPrograms(Provider); 
	UpdateData(FALSE); 
	if (bNeedRemoveOldPwd) 
	{ 
		BOOL bb = bWindowActivated; 
		bWindowActivated = TRUE; 
		SaveCurrentUNP(); 
		bWindowActivated = bb; 
	} 
	return TRUE; 
} 
 
BOOL CPage2::Reload() 
{ 
	LoadCurrentUNP(); 
	m_sConnectionName = theApp.GetCurrentProviderName(); 
	return TRUE; 
} 
 
BOOL CPage2::LoadPrograms(CString Provider) 
{ 
// load list of programs 
	m_listProgs.DeleteAllItems(); 
	CString sss, s1, s2; 
	UINT i = 0; 
	while(true) 
	{ 
		sprintf(sss.GetBuffer(1024), "Program%02ld_Condition", i + 1); 
		sss.ReleaseBuffer(); 
		s1 = theApp.GetIniString(Provider, sss, "online"); 
		if (s1.IsEmpty()) break; 
		sprintf(sss.GetBuffer(1024), "Program%02ld", i + 1); 
		sss.ReleaseBuffer(); 
		s2 = theApp.GetIniString(Provider, sss, ""); 
		if (s2.IsEmpty()) break; 
		m_listProgs.InsertItem(i, s1); 
		LV_ITEM lvi; 
		lvi.mask = LVIF_TEXT; 
		lvi.iItem = i; 
		lvi.iSubItem = 1; 
		lvi.pszText = s2.GetBuffer(1024); 
		m_listProgs.SetItem(&lvi); 
		s2.ReleaseBuffer(); 
		i++; 
	} 
	return TRUE; 
} 
 
void CPage2::OnButtonProgAdd()  
{ 
	CRunProgDlg dlg; 
	int nResponse = dlg.DoModal(); 
	if (nResponse != IDOK) return; 
	CString s1, s2, sss; 
	s1 = dlg.m_sName; 
	if (s1.IsEmpty()) return; 
	int i = m_listProgs.GetItemCount(); 
	s2 = RunConditionI2S(dlg.m_iRadio); 
	sprintf(sss.GetBuffer(1024), "Program%02ld_Condition", i + 1); 
	sss.ReleaseBuffer(); 
	CString Provider = theApp.GetCurrentProviderName(); 
	theApp.SetIniString(Provider, sss, s2); 
	sprintf(sss.GetBuffer(1024), "Program%02ld", i + 1); 
	sss.ReleaseBuffer(); 
	theApp.SetIniString(Provider, sss, s1); 
	LoadPrograms(Provider); 
} 
 
void CPage2::OnButtonProgEdit()  
{ 
	CString s1, s2, sss; 
	for (int i = 0; i < m_listProgs.GetItemCount(); i++) 
	{ 
		if (LVIS_SELECTED == m_listProgs.GetItemState(i, LVIS_SELECTED)) 
		{ 
				s1 = m_listProgs.GetItemText(i, 1); 
				s2 = m_listProgs.GetItemText(i, 0); 
				break; 
		} 
	} 
	if (s2.IsEmpty()) return; 
	CRunProgDlg dlg; 
	dlg.m_sName = s1; 
	dlg.m_iRadio = RunConditionS2I(s2); 
	int nResponse = dlg.DoModal(); 
	if (nResponse != IDOK) return; 
	s1 = dlg.m_sName; 
	if (s1.IsEmpty()) return; 
	s2 = RunConditionI2S(dlg.m_iRadio); 
	sprintf(sss.GetBuffer(1024), "Program%02ld_Condition", i + 1); 
	sss.ReleaseBuffer(); 
	CString Provider = theApp.GetCurrentProviderName(); 
	theApp.SetIniString(Provider, sss, s2); 
	sprintf(sss.GetBuffer(1024), "Program%02ld", i + 1); 
	sss.ReleaseBuffer(); 
	theApp.SetIniString(Provider, sss, s1); 
	LoadPrograms(Provider); 
} 
 
void CPage2::OnButtonProgDel()  
{ 
	CString s1, s2; 
	for (int i = 0; i < m_listProgs.GetItemCount(); i++) 
	{ 
		if (LVIS_SELECTED == m_listProgs.GetItemState(i, LVIS_SELECTED)) 
		{ 
				s1 = m_listProgs.GetItemText(i, 1); 
				s2 = m_listProgs.GetItemText(i, 0); 
				break; 
		} 
	} 
	if (s2.IsEmpty()) return; 
	int j = AfxMessageBox(IDS_DELETE_PROGRAM, MB_YESNO | MB_ICONQUESTION); 
	if (j != IDYES) return; 
	CString p1, p2; 
	CString Provider = theApp.GetCurrentProviderName(); 
	for (j = i + 1; j < m_listProgs.GetItemCount() + 1; j++) 
	{ 
		sprintf(p1.GetBuffer(1024), "Program%02ld_Condition", j + 1); p1.ReleaseBuffer(); 
		sprintf(p2.GetBuffer(1024), "Program%02ld", j + 1); p2.ReleaseBuffer(); 
		s1 = theApp.GetIniString(Provider, p1, ""); 
		s2 = theApp.GetIniString(Provider, p2, ""); 
		theApp.SetIniString(Provider, p1, ""); 
		theApp.SetIniString(Provider, p2, ""); 
		sprintf(p1.GetBuffer(1024), "Program%02ld_Condition", j); p1.ReleaseBuffer(); 
		sprintf(p2.GetBuffer(1024), "Program%02ld", j); p2.ReleaseBuffer(); 
		theApp.SetIniString(Provider, p1, s1); 
		theApp.SetIniString(Provider, p2, s2); 
	} 
	LoadPrograms(Provider); 
} 
 
CString CPage2::RunConditionI2S(int i) 
{ 
	switch (i) 
	{ 
		case RUN_HANGUP: 
			return "hangup"; 
		case RUN_CONNECT: 
			return "connect"; 
		case RUN_ONLINE: 
		default: 
			return "online"; 
	} 
	return ""; 
} 
 
int CPage2::RunConditionS2I(CString s) 
{ 
	if (s == "online")  return RUN_ONLINE; 
	if (s == "hangup")  return RUN_HANGUP; 
	if (s == "connect") return RUN_CONNECT; 
	return -1; 
} 
 
UINT CPage2::RunPrograms(LPVOID lpThreadParameter) 
{ 
	EnterCriticalSection(&sCriticalSection); 
	SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); 
	if (!ziz) 
	{ 
		LeaveCriticalSection(&sCriticalSection); 
		return 0; 
	} 
	BOOL bRun = (BOOL) lpThreadParameter; 
	ziz->iThreadWorkingNow++; 
	int i = 0; 
	CString s1, s2, sss; 
	CString Provider = theApp.GetCurrentProviderName(); 
	while (!ziz->bThreadExitImmediately) 
	{ 
		sprintf(sss.GetBuffer(1024), "Program%02ld_Condition", i + 1); 
		sss.ReleaseBuffer(); 
		s1 = theApp.GetIniString(Provider, sss, ""); 
		if (s1.IsEmpty()) break; 
		sprintf(sss.GetBuffer(1024), "Program%02ld", i + 1); 
		sss.ReleaseBuffer(); 
		s2 = theApp.GetIniString(Provider, sss, ""); 
		if (s2.IsEmpty()) break; 
		if (bRun == ziz->RunConditionS2I(s1)) 
		{ 
			ShellExecute(0,"open", s2, NULL, NULL, SW_SHOW); 
		} 
		i++; 
	} 
	ziz->iThreadWorkingNow--; 
	LeaveCriticalSection(&sCriticalSection); 
	return 0; 
} 
 
BOOL CPage2::DestroyWindow()  
{ 
	EnterCriticalSection(&sCriticalSection); 
	LeaveCriticalSection(&sCriticalSection); 
	return CPropertyPage::DestroyWindow(); 
} 
 
void CPage2::OnHidepwd()  
{ 
	UpdateData(); 
	UpdateData(FALSE); 
	if (m_bHidePassword) 
	((CEdit *)GetDlgItem(IDC_EDIT_PASSWORD))->SetPasswordChar('*'); 
	else 
	((CEdit *)GetDlgItem(IDC_EDIT_PASSWORD))->SetPasswordChar(0); 
	((CEdit *)GetDlgItem(IDC_EDIT_PASSWORD))->RedrawWindow(); 
	theApp.SetIniString(gchMain, gchHidePassword, L2S(m_bHidePassword)); 
} 
 
CString CPage2::GetPassword(BOOL b) 
{ 
	if (b) return m_sPassword; 
	if (! m_bHidePassword) return m_sPassword; 
	return "*****"; 
}