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

📄 calldlg.cpp

📁 三汇CTI示例程序源码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//                               软件授权协议
//1、	杭州三汇信息工程有限公司(以下简称本公司)拥有"本软件及所有附属产品、文件和相关文档"(以下简称本产品)的完全版权。任何单位和个人在使用前须获得本公司的授权。
//2、	本公司授权符合以下全部条件的单位和个人免费使用本产品:
//A、	本产品与通过合法销售渠道购买的本公司硬件产品配合使用时;
//B、	不私自向第三方传播本产品和本产品的任何一部分。
//3、	除符合第2条以外的其他单位和个人需要使用本产品时,必须获得本公司的书面授权。
//4、	获得授权的单位和个人不得转让其获得的授权。
//5、	使用本产品,即表明完全理解本协议的所有条款并全部接受。

// CallDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Call.h"
#include "CallDlg.h"
#include "shpa3api.h"

#include "Big5EditionLab.h"
#include "EnglishEditionLab.h"

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

DWORD	g_dwLanguageConversion	= 0;
DWORD	g_dwCHINESE_SIMPLIFIED	= MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED);
DWORD	g_dwCHINESE_TRADITIONAL = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL);
DWORD	g_dwCHINESE_HONGKONG	= MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_HONGKONG);

void SetEngWinLab(CDialog *pDlg, int item, CString str)
{
	CWnd *pWnd = NULL;
	
	pWnd = pDlg->GetDlgItem(item);
	pWnd->SetWindowText(str);
}

/////////////////////////////////////////////////////////////////////////////
// CCallDlg dialog

CCallDlg::CCallDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCallDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCallDlg)
	m_strErrMsg		= _T("");
	m_bInited		= FALSE;
	m_nIPProtocol	= -1;
	//}}AFX_DATA_INIT
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCallDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCallDlg)
	DDX_Control(pDX, IDC_LIST_IPCH, m_IpChList);
	DDX_Control(pDX, IDC_LIST_ANALOGCH, m_AnalogChList);
	DDX_Control(pDX, IDC_LIST_STATIONCH, m_StationChList);
	DDX_Text(pDX, IDC_ERRMSG, m_strErrMsg);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CCallDlg, CDialog)
	//{{AFX_MSG_MAP(CCallDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_TIMER()
	ON_WM_DESTROY()
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////

// CCallDlg message handlers
BOOL CCallDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	// Init Local Language
	g_dwLanguageConversion = GetThreadLocale();

	if(g_dwLanguageConversion != g_dwCHINESE_SIMPLIFIED)
	{
		if(g_dwLanguageConversion == g_dwCHINESE_TRADITIONAL
			||g_dwLanguageConversion == g_dwCHINESE_HONGKONG)
		{
			SetThreadLocale(MAKELANGID(LANG_CHINESE, SUBLANG_DEFAULT));
		}
		else
		{
			SetThreadLocale(MAKELANGID(LANG_ENGLISH,SUBLANG_DEFAULT));
		}
		
		InitLab();
	}

	if(!InitCtiSystem())			
	{
		PostQuitMessage(0);
		return FALSE;
	}

	ProtocolType();					

	InitAllChannel();			

	InitAnalogChListCtrl();			
	InitStationChListCtrl();
	InitIpChListCtrl();
	
	SetTimer(1000, 50, NULL);	

	return TRUE;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.
void CCallDlg::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();
	}
}

HCURSOR CCallDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

///////////////////////////////////////////////////////////////////////////////////////////////
void CCallDlg::OnTimer(UINT nIDEvent) 
{
	ScanAnalogCh();
	UpDateAnalogChListCtrl();

	ScanIpCh();
	UpDateIpChListCtrl();
	
	UpDateStationChListCtrl();
	
	UpdateData(FALSE);
	CDialog::OnTimer(nIDEvent);
}
///////////////////////////////////////////////////////////////////////////////////////////////
void CCallDlg::ScanAnalogCh()
{
	for( int i=0; i< m_nTotalAnalogCh; i++ ) 
	{
		if( !m_AnalogCh[i].bEnCalled ) continue; 
		
		m_AnalogCh[i].iLineState = SsmGetChState(m_AnalogCh[i].iChId);

		if( m_AnalogCh[i].iLineState == S_CALL_PENDING  || m_AnalogCh[i].iLineState == S_CALL_STANDBY) //check if remote station hangup
		{	
			switch( m_AnalogCh[i].Step )
			{
				case E_STATE_ANALOG_CHECK_PLAY_WELCOM:
					{
						SsmStopPlayFileList(m_AnalogCh[i].iChId);
						break;
					}
			
				case E_STATE_ANALOG_CHECK_PLAY_PASSWORD:
				case E_STATE_ANALOG_CHECK_REC_START:
				case E_STATE_ANALOG_CHECK_PLAY_SELECT:
				case E_STATE_ANALOG_CHECK_PLAY_BYEBYE:
					{
						SsmStopPlayIndex(m_AnalogCh[i].iChId);
						break;
					}
			
				case E_STATE_ANALOG_CHECK_REC_END:
					{
						SsmStopRecToFile(m_AnalogCh[i].iChId);
						break;
					}
			
				case E_STATE_ANALOG_CHECK_PLAY_RECORD:
					{
						SsmStopPlayFile(m_AnalogCh[i].iChId);
						break;
					}
			
				case E_STATE_ANALOG_WAIT_STATION_PICKUP:
					{
						SsmStopRing(m_AnalogCh[i].nStationCh);
						SetStationChState(m_AnalogCh[i].nStationCh, E_STATE_STATION_IDLE);
						SetStationChTalkWith(m_AnalogCh[i].nStationCh, -1);
						m_AnalogCh[i].nStationCh = -1;
						break;
					}
			
				case E_STATE_ANALOG_WAIT_STATION_HANGUP:
					{
						SsmStopTalkWith(m_AnalogCh[i].nStationCh,m_AnalogCh[i].iChId);
						SetStationChState(m_AnalogCh[i].nStationCh, E_STATE_STATION_IDLE);
						SetStationChTalkWith(m_AnalogCh[i].nStationCh, -1);
						m_AnalogCh[i].nStationCh = -1;
						break;
					}
			}
			
			SsmHangup(m_AnalogCh[i].iChId);
			m_AnalogCh[i].Step = E_STATE_ANALOG_IDLE;
		}

		switch( m_AnalogCh[i].Step )
		{
			case E_STATE_ANALOG_IDLE:
				{
					if( m_AnalogCh[i].iLineState == S_CALL_RINGING )  //ring detected
					{
						SsmPickup(m_AnalogCh[i].iChId);
						SsmGetCallerId(m_AnalogCh[i].iChId, m_AnalogCh[i].szCallerTelNumber);
						m_AnalogCh[i].ulTimeOutCounter = 0;
						m_AnalogCh[i].Step = E_STATE_ANALOG_WAIT_CONNECT;
					}
					else
					{
						memset(m_AnalogCh[i].szCallerTelNumber,0,64);
					}

					break;
				}

			case E_STATE_ANALOG_WAIT_CONNECT:
				{
					if( m_AnalogCh[i].iLineState == S_CALL_TALKING )
					{
						m_AnalogCh[i].Step = E_STATE_ANALOG_PLAY_WELCOM;
					}
					break;
				}
		
			case E_STATE_ANALOG_PLAY_WELCOM:
				{
					SsmClearFileList(m_AnalogCh[i].iChId);
					if (SsmAddToFileList(i,".\\DemoVoc\\cchi.voc",6,0,-1)==-1 || 
						SsmAddToFileList(i,".\\DemoVoc\\cchi2.voc",6,0,-1)==-1) 
					{
						AppErrorHandler(m_AnalogCh[i].iChId);
					}
					else 
					{
						if(SsmPlayFileList(m_AnalogCh[i].iChId) == -1) 
						{
							AppErrorHandler(m_AnalogCh[i].iChId);
						}
						else 
						{
							m_AnalogCh[i].Step = E_STATE_ANALOG_CHECK_PLAY_WELCOM;
						}
					}
				}
			
			case E_STATE_ANALOG_CHECK_PLAY_WELCOM:
				{
					if( SsmCheckPlay(m_AnalogCh[i].iChId) > 0) //end of playing "welcom"
					{
						m_AnalogCh[i].Step = E_STATE_ANALOG_PLAY_SELECT;
					}
					break;
				}

			case E_STATE_ANALOG_PLAY_SELECT:
				{
					SsmSetDtmfStopPlay(m_AnalogCh[i].iChId,1);	//enable DTMF-Stop-Play function
					if(SsmPlayIndexString(m_AnalogCh[i].iChId, "Menu") == -1)
					{
						AppErrorHandler(m_AnalogCh[i].iChId);
					}
					else
					{
						SsmClearRxDtmfBuf(m_AnalogCh[i].iChId);
						m_AnalogCh[i].ulTimeOutCounter = 0;
						m_AnalogCh[i].Step = E_STATE_ANALOG_CHECK_PLAY_SELECT;
					}
					break;
				}
		
			case E_STATE_ANALOG_CHECK_PLAY_SELECT:
				{
					if(SsmGetRxDtmfLen(m_AnalogCh[i].iChId) >= 1 && (SsmCheckPlay(m_AnalogCh[i].iChId) == 2 || SsmCheckPlay(m_AnalogCh[i].iChId) == 1)) 
					{
						char ch;
						SsmGet1stDtmf(m_AnalogCh[i].iChId,&ch);
						SsmClearRxDtmfBuf(m_AnalogCh[i].iChId);
						switch(ch)
						{
							case '1':			//DTMF=1: record to file "test.voc"
								{
									if(SsmPlayIndexString(m_AnalogCh[i].iChId,"RecPrompt") == -1)	//play "press any key to start, and any key again to stop".
									{
										AppErrorHandler(m_AnalogCh[i].iChId);
									}
									else 
									{
										m_AnalogCh[i].ulTimeOutCounter = 0;
										m_AnalogCh[i].Step = E_STATE_ANALOG_CHECK_REC_START;
									}
									break;
								}

							case '2'://DTMF=2: play recorded file "test.voc"
								{
									CFileFind fileFind;
									if(fileFind.FindFile(".\\DemocVoc\\test.voc", 0) != 0) 
									{
										if(SsmPlayFile(m_AnalogCh[i].iChId,".\\DemocVoc\\test.voc",6,0,0xFFFFFFFF) == -1) 
										{
											AppErrorHandler(m_AnalogCh[i].iChId);
										}
										else
										{
											m_AnalogCh[i].Step = E_STATE_ANALOG_CHECK_PLAY_RECORD;
										}
									}
									else 
									{
										if(SsmPlayIndexString(m_AnalogCh[i].iChId,"FileNotFound") == -1)	//play "file not found" message
										{
											AppErrorHandler(m_AnalogCh[i].iChId);
										}
										else
										{
											m_AnalogCh[i].Step = E_STATE_ANALOG_CHECK_PLAY_RECORD;
										}
									}
									break ;
								}

							case '3':			//DTMF=3: play station's password,some sample digital
								{
									SsmSetDtmfStopPlay(m_AnalogCh[i].iChId,0);	//disable DTMF-Stop-Play function while playing password
									if(SsmPlayIndexString(m_AnalogCh[i].iChId,"YourPasswordIs,1,2,3,4") == -1)	//play "your password is 1234".
									{
										AppErrorHandler(m_AnalogCh[i].iChId);
									}
									else 
									{
										m_AnalogCh[i].Step = E_STATE_ANALOG_CHECK_PLAY_PASSWORD;
									}
									break;
								}
				
							case '4':			//DTMF=4:  connect to an idle station channel
								{
									int nStationCh = SearchIdleStationCh();
									if(nStationCh <= 0)
									{
										m_AnalogCh[i].Step = E_STATE_ANALOG_PLAY_SELECT;
									}
									else
									{
										SsmStartRing(nStationCh);
										SetStationChState(nStationCh, E_STATE_STATION_RINGING );
										SetStationChTalkWith(nStationCh, m_AnalogCh[i].iChId );
										m_AnalogCh[i].nStationCh = nStationCh;
										m_AnalogCh[i].Step = E_STATE_ANALOG_WAIT_STATION_PICKUP;
									}	
									break;
								}
				
							case '0':			//DTMF=0:  end of service,play "Byebye"
								{
									if ( SsmPlayIndexString(m_AnalogCh[i].iChId, "Byebye" )== -1 ) 
									{
										AppErrorHandler(m_AnalogCh[i].iChId);
									}
									else
									{
										m_AnalogCh[i].Step = E_STATE_ANALOG_CHECK_PLAY_BYEBYE;
									}
									break;	
								}
				
							default:	
								break;
							}
					}
					else 
					{
						if( SsmCheckPlay(m_AnalogCh[i].iChId) > 0) // end of playing "Select"
						{
							if(++m_AnalogCh[i].ulTimeOutCounter > 100) // wait DTMF key for maximum 10 seconds 
							{
								if ( SsmPlayIndexString( m_AnalogCh[i].iChId, "Byebye" )== -1 ) 
								{
									AppErrorHandler(m_AnalogCh[i].iChId);
								}
								else
								{
									m_AnalogCh[i].Step = E_STATE_ANALOG_CHECK_PLAY_BYEBYE;
								}
							 }

						} 
					}
					break;
				}

			case E_STATE_ANALOG_CHECK_PLAY_PASSWORD:
				{
					if(SsmCheckPlay(m_AnalogCh[i].iChId) > 0)				//this channel is not playing index now
					{
						m_AnalogCh[i].Step = E_STATE_ANALOG_PLAY_SELECT;
					}
					break ;
				}
		

⌨️ 快捷键说明

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