www.pudn.com > CP_IVR.zip > CP_IVRDlg.cpp


/********************************************************************* 
 * CP_IVRDlg.cpp: 
 * implementation of the CP_IVRDlg class 
 * 
 ********************************************************************/ 
 
#include "stdafx.h" 
#include "CP_IVR.h" 
#include "CP_IVRDlg.h" 
#include "HDevices.h" 
#include "HSettings.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
/********************************************************************* 
 * Globals & externals 
 ********************************************************************/ 
#define		POS_HEIGHT	185 
extern		CHDevices g_devices; 
extern		CHSettings g_settings; 
extern		CString g_phoneNumber; 
extern		CString g_path; 
 
/********************************************************************* 
 * CAboutDlg dialog used for App About 
 ********************************************************************/ 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
		// No message handlers 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
/********************************************************************* 
 * CCP_IVRDlg dialog 
 ********************************************************************/ 
CCP_IVRDlg::CCP_IVRDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CCP_IVRDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CCP_IVRDlg) 
	m_callerID = _T(""); 
	m_pkUpDelay = _T(""); 
	m_status = _T(""); 
	//}}AFX_DATA_INIT 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CCP_IVRDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CCP_IVRDlg) 
	DDX_Control(pDX, IDC_LOG, m_logList); 
	DDX_Control(pDX, IDC_DEVICE_LIST, m_devList); 
	DDX_Text(pDX, IDC_CALLER_ID, m_callerID); 
	DDX_Text(pDX, IDC_PK_UP_DELAY, m_pkUpDelay); 
	DDX_Text(pDX, IDC_STATUS, m_status); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CCP_IVRDlg, CDialog) 
	//{{AFX_MSG_MAP(CCP_IVRDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_SEE_LOG, OnSeeLog) 
	ON_BN_CLICKED(IDC_START, OnStart) 
	ON_BN_CLICKED(IDC_RESTART, OnRestart) 
	ON_BN_CLICKED(IDC_CLEAR_LOG, OnClearLog) 
	ON_BN_CLICKED(IDC_HOOK_MIC_SPK, OnHookMicSpk) 
	//}}AFX_MSG_MAP 
	ON_MESSAGE (WM_STATUS_CHNGD,OnTAPIStatusChanged) 
END_MESSAGE_MAP() 
 
/********************************************************************* 
 * CCP_IVRDlg impelementation 
 ********************************************************************* 
 * 
 ********************************************************************/ 
 
  
  
/********************************************************************* 
 * Initializing 
 ********************************************************************/ 
BOOL CCP_IVRDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Add "About..." menu item to system menu. 
 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
	 
							 /* Call it once to position log window */ 
	OnSeeLog(); 
									   /* Load application settings */ 
	g_settings.Load(); 
						/* Update UI and display ring count to user */ 
	m_pkUpDelay.Format(_T("%d"),g_settings.m_ringCount); 
 
						/* Get the application exe path, on runtime */ 
	GetModuleFileName(NULL,g_path.GetBuffer(512),512); 
 
						 /* Remove .exe file name to get app folder */ 
	g_path.ReleaseBuffer(512); 
	g_path.FreeExtra(); 
	int index = g_path.ReverseFind('\\'); 
	if (index!=-1) { 
		g_path.Delete(index+1,g_path.GetLength()-index-1); 
	} else { 
		// UNDONE: Any errors? 
	} 
 
	UpdateData(FALSE); 
 
			  /* return TRUE  unless you set the focus to a control */ 
	return TRUE; 
} 
 
/********************************************************************* 
 * Control menu, maximize or minimize ... 
 ********************************************************************/ 
void CCP_IVRDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
/********************************************************************* 
 * Paintings 
 ********************************************************************/ 
void CCP_IVRDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
/********************************************************************* 
 * Drag icon 
 ********************************************************************/ 
HCURSOR CCP_IVRDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
/********************************************************************* 
 * Enter || OK button 
 ********************************************************************/ 
void CCP_IVRDlg::OnOK()  
{ 
//	CDialog::OnOK(); 
} 
 
/********************************************************************* 
 * Reposition (Show / Hide) Log box 
 ********************************************************************/ 
void CCP_IVRDlg::OnSeeLog() 
{ 
									   /* Get status to reverse it! */ 
	CRect rc; 
	CString str; 
											   /* Get current label */ 
	GetDlgItem(IDC_SEE_LOG)->GetWindowText(str); 
													/* Get position */ 
	GetWindowRect(rc); 
 
													 /* re position */ 
	if ( str ==_T("v") ) {					  /* Close the log view */ 
		SetWindowPos(0,0,0,rc.Width(), 
			rc.Height()+POS_HEIGHT,SWP_NOMOVE|SWP_NOZORDER); 
												   /* Reverse label */ 
		GetDlgItem(IDC_SEE_LOG)->SetWindowText(_T("^")); 
	} else {									   /* Open log view */ 
		SetWindowPos(0,0,0,rc.Width(), 
			rc.Height()-POS_HEIGHT,SWP_NOMOVE|SWP_NOZORDER); 
		GetDlgItem(IDC_SEE_LOG)->SetWindowText(_T("v")); 
	} 
} 
 
/********************************************************************* 
 * Start TAPI operations 
 ********************************************************************/ 
void CCP_IVRDlg::OnStart() 
{ 
	CString str; 
												 /* Shall we start? */ 
	GetDlgItem(IDC_START)->GetWindowText(str); 
	if (str==_T("Start")) { 
		try { 
			TRACE(_T("\n Initializing...\n")); 
			m_manager.SetParent(this); 
			m_manager.WakeUp(); 
									   /* Button should be stop now */ 
			GetDlgItem(IDC_START)->SetWindowText(_T("Stop")); 
			GetDlgItem(IDC_RESTART)->EnableWindow(TRUE); 
 
								  /* Is there any known exceptions? */ 
		} catch (CTapiObj::TEx e) { 
			CString sz; 
			sz.Format(_T("Err: [code:%d], [date:%s],") 
				_T("[time:%s], [reason:%s]\n"), 
				e.code,e.date,e.time,e.result); 
										 /* Log error in errors.log */ 
			CHErrLogger::LogError(sz); 
 
								/* Is there any Unknown exceptions? */ 
		} catch ( ... ) { 
			CString sz; 
			sz.Format(_T("Err: (Unhandled exeption) ") 
				_T("Unknown reason, DaliaDlg - Line:607\n")); 
										 /* Log error in errors.log */ 
			CHErrLogger::LogError(sz); 
		} 
	} else { 
											  /* If we have to Stop */ 
 
		m_manager.SleepAll();						   /* Stop TAPI */ 
		GetDlgItem(IDC_START)->SetWindowText(_T("Start")); 
		GetDlgItem(IDC_RESTART)->EnableWindow(FALSE); 
	} 
} 
 
/********************************************************************* 
 * Our manager class event handler 
 ********************************************************************* 
 * This is the event that Central manager use it to inform us from 
 * TAPI Events, events of the line, or phone. 
 * In this sample I just use them to display a text, that displays 
 * current status of the operation. 
 ********************************************************************/ 
LRESULT CCP_IVRDlg::OnTAPIStatusChanged (WPARAM wParam, LPARAM lParam) 
{ 
				 /* Define all possible states that TAPI might be in*/ 
	CString tmp; 
	CString stat[] = {	_T("Ready") , _T("Initializing"),  
						_T("Opening line"), _T("Restarting"),  
						_T("Ready"), _T("Busy"),  
						_T("Shutting down"), _T("(( Ring ))"),  
						_T("Picked up"), _T("Failed"),  
						_T("New DTMF Detected"),  
						_T("CallerID received")	}; 
	int i=0; 
 
	switch (lParam) { 
									   /* Line is being initialized */ 
	case ST_INIT: 
		break; 
											  /* Line is being open */ 
	case ST_OPEN: { 
		m_devList.ResetContent(); 
		for (i=0;iEnableWindow(TRUE); 
	} 
		break; 
 
											  /* Line is restarting */ 
	case ST_RESTART:	 
		break; 
								 /* Line is ready to receive a call */ 
	case ST_READY: 
		break; 
				/* Line is busy, communicating or restarting or ... */ 
	case ST_BUSY: 
		break; 
										  /* Shutting down the line */ 
	case ST_SHUTDN:	 
		break; 
											 /* Some one is ringing */ 
	case ST_RING: 
		break; 
								  /* Line just picked up (Answered) */ 
	case ST_PICKED_UP: 
		GetDlgItem(IDC_RESTART)->EnableWindow(FALSE); 
		break; 
 
							/* Somthing failed! refer to errors.log */ 
	case ST_FAILED: 
		GetDlgItem(IDC_RESTART)->EnableWindow(FALSE); 
		GetDlgItem(IDC_START)->SetWindowText(_T("Start")); 
		break; 
										 /* New key pressed by user */ 
	case ST_DTMF: 
		tmp.Format(_T(" [%d]"),wParam); 
		m_status = stat[lParam]; 
		m_status += tmp; 
		 
		m_logList.AddString(m_status); 
		UpdateData(FALSE); 
 
		m_logList.SetCurSel(m_logList.GetCount()-1); 
								  /* Force status to show all messages! */ 
		GetDlgItem(IDC_STATUS)->UpdateWindow(); 
		GetDlgItem(IDC_LOG)->UpdateWindow(); 
 
		return 0; 
		break; 
 
									 /* Caller ID became available! */ 
	case ST_CALLER_ID: 
		 
		m_callerID = g_phoneNumber; 
		UpdateData(FALSE); 
		GetDlgItem(IDC_CALLER_ID)->UpdateWindow(); 
		break; 
	} 
						 /* This is the main part, I used to display a  
										   text regarding any event */ 
	m_status = stat[lParam]; 
	m_logList.AddString(stat[lParam]); 
	UpdateData(FALSE); 
						/* Move current record down by each message */ 
	m_logList.SetCurSel(m_logList.GetCount()-1); 
							  /* Force status to show all messages! */ 
	GetDlgItem(IDC_STATUS)->UpdateWindow(); 
	GetDlgItem(IDC_LOG)->UpdateWindow(); 
	return 0; 
} 
 
/********************************************************************* 
 * Restart the device 
 ********************************************************************/ 
void CCP_IVRDlg::OnRestart()  
{ 
	// UNDONE: Here we don't give true device id to the restart! 
	// Restart will correct this.									(( WARNING )) 
	UpdateData(TRUE); 
 
	UINT index = m_devList.GetCurSel(); 
	if (index==CB_ERR) { 
		AfxMessageBox(_T("Invalid Device ID.")); 
		return; 
	} 
 
	g_settings.m_deviceId = g_devices.GetItemId(index); 
	g_settings.m_ringCount = _wtoi(m_pkUpDelay); 
	m_manager.Restart(); 
} 
 
/********************************************************************* 
 * Clear log box 
 ********************************************************************/ 
void CCP_IVRDlg::OnClearLog()  
{ 
	m_logList.ResetContent(); 
} 
 
/********************************************************************* 
 * Switch between AutoAnswer and Speaker/phone. Good for headset! 
 ********************************************************************/ 
void CCP_IVRDlg::OnHookMicSpk()  
{ 
	m_manager.EnableSpeakerHook(); 
} 
 
/********************************************************************* 
 * Exit the App. 
 ********************************************************************/ 
void CCP_IVRDlg::OnCancel()  
{ 
	m_manager.SleepAll(); 
	PostQuitMessage(0); 
	//CDialog::OnCancel(); 
}