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

📄 pbxdlg.cpp

📁 三汇CTI示例程序源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	lvc.iSubItem = 2;
	cString.LoadString(IDS_PBX20);
	lvc.pszText = (LPTSTR)(LPCTSTR)cString;
	lvc.cx = ColumnWidth[2];
	m_StationChList.InsertColumn(2, &lvc);
	
	lvc.iSubItem = 3;
	cString.LoadString(IDS_PBX21);
	lvc.pszText = (LPTSTR)(LPCTSTR)cString;
	lvc.cx = ColumnWidth[3];
	m_StationChList.InsertColumn(3, &lvc);

	lvc.iSubItem = 4;
	cString.LoadString(IDS_PBX22);
	lvc.pszText = (LPTSTR)(LPCTSTR)cString;
	lvc.cx = ColumnWidth[4];
	m_StationChList.InsertColumn(4, &lvc);
	
	char szChId[3];
	for(int i=0; i<m_nTotalStationCh; i++)
	{
		m_StationChList.InsertItem(i, _itoa(m_StationCh[i].nChId, szChId, 10));
		m_StationChList.SetItemText(i, 1, m_StationCh[i].szStationNum);

		cString.LoadString(IDS_PBX23);
		m_StationChList.SetItemText(i, 2, cString);
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////
// 函数说明:初始化日志列表控件
///////////////////////////////////////////////////////////////////////////////////////////////
void CPBXDlg::InitLogListCtrl()
{
	CString cString;
	m_LogList.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);  
	
	COLORREF cr = 0x000000;
	m_LogList.SetBkColor(cr);
	m_LogList.SetTextBkColor(cr);
	
	COLORREF cr1 = 0x00ff00;
	m_LogList.SetTextColor(cr1);
	
	int ColumnWidth[4] = {70, 80, 130, 750};
	LV_COLUMN lvc;
	lvc.mask =  LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
	
	lvc.iSubItem = 0;
	cString.LoadString(IDS_PBX24);
	lvc.pszText = (LPTSTR)(LPCTSTR)cString;
	lvc.cx = ColumnWidth[0];
	m_LogList.InsertColumn(0, &lvc);
	
	lvc.iSubItem = 1;
	cString.LoadString(IDS_PBX25);
	lvc.pszText = (LPTSTR)(LPCTSTR)cString;
	lvc.cx = ColumnWidth[1];
	m_LogList.InsertColumn(1, &lvc);
	
	lvc.iSubItem = 2;
	cString.LoadString(IDS_PBX26);
	lvc.pszText = (LPTSTR)(LPCTSTR)cString;
	lvc.cx = ColumnWidth[2];
	m_LogList.InsertColumn(2, &lvc);
	
	lvc.iSubItem = 3;
	cString.LoadString(IDS_PBX27);
	lvc.pszText = (LPTSTR)(LPCTSTR)cString;
	lvc.cx = ColumnWidth[3];
	m_LogList.InsertColumn(3, &lvc);
}
///////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////
// 函数说明:程序退出时卸载板卡
///////////////////////////////////////////////////////////////////////////////////////////////
void CPBXDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	SsmCloseCti();
}
///////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////
// 函数说明:消息处理函数,接收底层通道状态信息和自定义消息
///////////////////////////////////////////////////////////////////////////////////////////////
LRESULT CPBXDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	CString cString;
	int nIndex = -1;	// 在相应通道数组中的索引值
	int nEventCode;		// 事件号
	
	if(message > WM_USER)
	{
		nEventCode = message - WM_USER;		// 取得事件代码
		
		switch(nEventCode)
		{
		case E_SYS_TIMEOUT:					// 定时器超时事件
			{
				int i;
				// 根据定时器标识号搜索模拟通道数组
				for(i = 0; i < m_nTotalAnalogCh; i++)
				{
					if(wParam == (WPARAM)m_AnalogCh[i].nTimer)
					{
						nIndex = i;
						AnalogProc(nEventCode, nIndex, lParam);
						UpdateAnalogChListCtrl(nIndex);
						break;
					}
				}
				// 如果在模拟通道数组中没搜到,继续搜索IP通道
				if(nIndex == -1)
				{
					// 根据定时器标识号搜索IP通道数组
					for(i = 0; i < m_nTotalIpCh; i++)
					{
						if(wParam == (WPARAM)m_IpCh[i].nTimer)
						{
							nIndex = i;
							IpProc(nEventCode, nIndex, lParam);
							UpdateIpChListCtrl(nIndex);
							break;
						}
					}
				}
				// 如果在模拟通道和IP通道都没搜到,则搜索座席通道
				if(nIndex == -1)
				{
					// 根据定时器标识号搜索座席通道数组
					for(i = 0; i < m_nTotalStationCh; i++)
					{
						if(wParam == (WPARAM)m_StationCh[i].nTimer)
						{
							nIndex = i;
							StationProc(nEventCode, nIndex, lParam);
							UpdateStationChListCtrl(nIndex);
							break;
						}
					}
				}
				ASSERT(nIndex != -1);
				break;
			}
		case E_CHG_HookState:
		case E_CHG_RcvDTMF:
		case E_CHG_FlashCount:
		case E_CHG_ChState:
		case E_US_SEIZURE:
		case E_US_RELEASE:
		case E_US_SEIZURE_ACK_IDLE:
		case E_US_SEIZURE_ACK_BUSY:
		case E_US_PICKUP:
		case E_US_SEIZURE_TK:
		case E_TK_SEIZURE_TK_ACK_IDLE:
		case E_TK_SEIZURE_TK_ACK_BUSY:
		case E_TK_RELEASE:
		case E_US_DTMF2TK:
		case E_TK_DIAL_OK:
		case E_TK_DIAL_FAIL:
		case E_TK_REMOTE_NOANSWER:
		case E_TK_REMOTE_PICKUP:
		case E_US_SEIZURE_IP:
		case E_IP_SEIZURE_IP_ACK_IDLE:
		case E_IP_SEIZURE_IP_ACK_BUSY:
		case E_IP_RELEASE:
		case E_US_DTMF2IP:
		case E_IP_DIAL_OK:
		case E_IP_DIAL_FAIL:
		case E_IP_REMOTE_NOANSWER:
		case E_IP_REMOTE_PICKUP:
		case E_MSG_RELEASE:
		case E_MSG_FLASH:
		case E_MSG_CONNECT:
		case E_MSG_HANGUP:
		case F_US_SEIZURE:
			{
				int nChId = wParam;						// 通道号
				int nType = SsmGetChType(nChId);		// 通道类型
				switch(nType)
				{
				// 模拟通道
				case 0:
					{
						nIndex = FindIndexByAnalogChId(nChId);
						ASSERT(nIndex != -1);
						AnalogProc(nEventCode, nIndex, lParam);
						UpdateAnalogChListCtrl(nIndex);
						break;
					}
				// 座席通道
				case 2:
					{
						nIndex = FindIndexByStationChId(nChId);
						ASSERT(nIndex != -1);
						StationProc(nEventCode, nIndex, lParam);
						UpdateStationChListCtrl(nIndex);
						break;
					}
				// IP通道
				case PROTOCOL_H323:
				case PROTOCOL_SIP:
					{
						nIndex = FindIndexByIpChId(nChId);
						ASSERT(nIndex != -1);
						IpProc(nEventCode, nIndex, lParam);
						UpdateIpChListCtrl(nIndex);
						break;
					}
				default:
					{
						cString.LoadString(IDS_PBX28);
						LogToList(LOGTYPE_INFORMATION, m_StationCh[nIndex].nChId, (LPTSTR)(LPCTSTR)cString);
						break;
					}
			}
			break;
		}
	default:
		return CDialog::WindowProc(message, wParam, lParam);
		break;
		}	
	}
	return CDialog::WindowProc(message, wParam, lParam);
}
///////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////
// 函数说明:处理座席通道消息
///////////////////////////////////////////////////////////////////////////////////////////////
void CPBXDlg::StationProc(UINT event, int nIndex, LPARAM lParam)
{
	CString cString;
	DWORD dwDtmfLen;				// 收到DTMF码的长度
	UCHAR dwDtmfNum;				// 收到DTMF码
	LONG  nHook;					// nHook:0 表示座席挂机;1 表示座席摘机
	char  szVoicePath[MAX_PATH];	// 声音文件目录
	int   nToneType = -2;			// 信号音类型
	int   nToneChResult;			// 信号音检测结果
	int   nPlayResult;				// 存放SsmCheckPlay的返回值

	switch(event)
	{
	/*+++++++++驱动消息+++++++++*/
	case E_CHG_HookState:		// 座席摘挂机事件
		{
			nHook = lParam;
			if(nHook == 0)			// 座席挂机
			{	
				cString.LoadString(IDS_PBX29);
				LogToList(LOGTYPE_INFORMATION, m_StationCh[nIndex].nChId, (LPTSTR)(LPCTSTR)cString, m_StationCh[nIndex].szStationNum);
			
				switch(m_StationCh[nIndex].nStatus)
				{
				case STATION_GET_1STDTMF:
					{
						// 关闭T1
						if(SsmStopTimer(m_StationCh[nIndex].nTimer) == -1)	
						{
							AppErrorHandler(m_StationCh[nIndex].nChId);
						}
						break;
					}
				case STATION_GET_DTMF:
					{
						// 关闭T2
						if(SsmStopTimer(m_StationCh[nIndex].nTimer) == -1)	
						{
							AppErrorHandler(m_StationCh[nIndex].nChId);
						}
						break;
					}
				case STATION_REQ_STATION:
					{
						// 发送E_US_RELEASE
						SendMessage(WM_USER+E_US_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
						break;
					}
				case STATION_RING_BACK:
					{
						// 向Ch-k通道发送E_US_RELEASE
						SendMessage(WM_USER+E_US_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
						break;
					}
				case STATION_TALKING:
					{
						// 断开总线
						if(SsmStopTalkWith(m_StationCh[nIndex].nChId, m_StationCh[nIndex].nLinkToChId) == -1)		
						{
							AppErrorHandler(m_StationCh[nIndex].nChId);
						}
						// 向连接方发送E_MSG_RELEASE
						SendMessage(WM_USER+E_MSG_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
						break;
					}
				case STATION_WAIT_HANGUP:
					break;
				case STATION_REQ_ANALOG:
					break;
				case STATION_DIALOUT_WITH_ANALOG:
					{
						//关闭T3
						if(SsmStopTimer(m_StationCh[nIndex].nTimer) == -1)	
						{
							AppErrorHandler(m_StationCh[nIndex].nChId);
						}
						// 外线模拟通道发送E_TK_RELEASE
						SendMessage(WM_USER+E_TK_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
						break;
					}
				case STATION_WAIT_REMOTE_ANALOG_PICKUP:
					{
						// 外线模拟通道,发送E_TK_RELEASE
						SendMessage(WM_USER+E_TK_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
						break;
					}
				case STATION_DIALOUT_WITH_IP:
					{
						// 关闭T3
						if(SsmStopTimer(m_StationCh[nIndex].nTimer) == -1)	
						{
							AppErrorHandler(m_StationCh[nIndex].nChId);
						}
						// IP通道,发送E_IP_RELEASE
						SendMessage(WM_USER+E_IP_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
						break;
					}
				case STATION_WAIT_REMOTE_IP_PICKUP:
					{
						// IP通道,则发送E_IP_RELEASE
						SendMessage(WM_USER+E_IP_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
						break;
					}
				case STATION_REQ_IP:
					{
						// 是否还在播放选择语音
						int iRet = SsmCheckPlay(m_StationCh[nIndex].nChId);
						if(iRet == -1)
						{
							AppErrorHandler(m_StationCh[nIndex].nChId);
						}
					
						if(!iRet)
						{
							if(SsmStopPlay(m_StationCh[nIndex].nChId) == -1)
							{
								AppErrorHandler(m_StationCh[nIndex].nChId);
							}
						}
						break;
					}
				case STATION_F_WAIT_TALK:
					{
						// 停背景音乐
						nPlayResult = SsmCheckPlay(m_StationCh[nIndex].nChId);
						if(nPlayResult != -1)
						{
							if(nPlayResult == 0)
							{
								if(SsmStopPlayFile(m_StationCh[nIndex].nChId) == -1)
								{
									AppErrorHandler(m_StationCh[nIndex].nChId);
								}
							}
						}
						else
						{
							AppErrorHandler(m_StationCh[nIndex].nChId);
						}
						// E_MSG_HANGUP→ch1
						SendMessage(WM_USER+E_MSG_HANGUP, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
						break;
					}
				case STATION_F_GET_DTMF:
					{
						// 关闭T4
						if(SsmStopTimer(m_StationCh[nIndex].nTimer) == -1)	
						{
							AppErrorHandler(m_StationCh[nIndex].nChId);
						}
						// E_MSG_RELEASE→ch0
						if(!m_StationCh[nIndex].bSubmiteChHookFlag)
						{
							SendMessage(WM_USER+E_MSG_RELEASE, m_StationCh[nIndex].nSaveSubmiteCh, m_StationCh[nIndex].nChId);
						}
						break;
					}
				case STATION_F_REQ_STATION:
					{
						// E_MSG_RELEASE→ch0
						if(!m_StationCh[nIndex].bSubmiteChHookFlag)
						{
							SendMessage(WM_USER+E_MSG_RELEASE, m_StationCh[nIndex].nSaveSubmiteCh, m_StationCh[nIndex].nChId);
						}
						break;
					}
				case STATION_F_RING_BACK:
					{
						// E_US_RELEASE→ch2
						SendMessage(WM_USER+E_US_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);	
						// E_MSG_RELEASE→ch0
						if(!m_StationCh[nIndex].bSubmiteChHookFlag)
						{
							SendMessage(WM_USER+E_MSG_RELEASE, m_StationCh[nIndex].nSaveSubmiteCh, m_StationCh[nIndex].nChId);	
						}
						break;
					}
				case STATION_F_TALKING:
					{
						// 断开总线(ch1,ch2)
						if(SsmStopTalkWith(m_StationCh[nIndex].nChId, m_StationCh[nIndex].nLinkToChId) == -1)
						{
							AppErrorHandler(m_StationCh[nIndex].nChId);
						}

						if(!m_StationCh[nIndex].bSubmiteChHookFlag)	// Ch0挂机Flag==0?
						{
							// 找到Ch1连接方的索引号,也就是 Ch2的索引号
							int ch2Index = FindIndexByStationChId(m_StationCh[nIndex].nLinkToChId);
							// 将Ch2的连接方设置为Ch0
							m_StationCh[ch2Index].nLinkToChId = m_StationCh[nIndex].nSaveSubmiteCh;
					
							// E_MSG_CONNECT→ch0 给Ch0发送重新连接信息
							SendMessage(WM_USER+E_MSG_CONNECT, m_StationCh[nIndex].nSaveSubmiteCh, m_StationCh[nIndex].nLinkToChId);

							// 连接原通话方和转移目标方(ch0,ch2)
							if(SsmTalkWith(m_StationCh[nIndex].nSaveSubmiteCh, m_StationCh[nIndex].nLinkToChId) == -1)
							{
								AppErrorHandler(m_StationCh[nIndex].nChId);
							}

							m_StationCh[ch2Index].bPressFlag = FALSE;
						}
						else
						{
							// E_MSG_RELEASE→ch2,如果Ch0 已经挂机,则指示Ch2也挂机
							SendMessage(WM_USER+E_MSG_RELEASE, m_StationCh[nIndex].nLinkToChId, m_StationCh[nIndex].nChId);
						}
						break;
					}
				case STATION_F_OPERATE:
					{
						if(!m_StationCh[nIndex].bSubmiteChHookFlag)
						{
							// E_MSG_RELEASE→ch0
							SendMessage(WM_USER+E_MSG_RELEASE, m_StationCh[nIndex].nSaveSubmiteCh, m_StationCh[nIndex].nChId);
						}
						break;
					}
				default:
					break;
				}// end of switch for m_StationCh[nIndex].nStatus

				// 清空通道DTMF缓冲区

⌨️ 快捷键说明

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