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

📄 ipgatewaydlg.cpp

📁 三汇CTI示例程序源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:

	lvc.iSubItem = 3;
	cString.LoadString(IDS_GATEWAY24);
	lvc.pszText = (LPTSTR)(LPCTSTR)cString;
	lvc.cx = ColumnWidth[3];
	m_LogList.InsertColumn(3, &lvc);
}

void CIPGatewayDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	ScanAnalogCh();
	UpDateAnalogChListCtrl();

	ScanSS1Ch();
	UpDateSS1ChListCtrl();
	
	ScanIpCh();
	UpDateIpChListCtrl();
	
	UpdateData(FALSE);
	
	CDialog::OnTimer(nIDEvent);
}
///////////////////////////////////////////////////////////////////////////////////////////////

void CIPGatewayDlg::ScanAnalogCh()
{
	for(int i = 0; i < m_nTotalAnalogCh; i++)
	{
		switch(m_AnalogCh[i].Step)
		{
			// unavailable
			case E_STATE_ANALOG_UNAVAILABLE:
				{
					if(S_CALL_STANDBY == SsmGetChState(m_AnalogCh[i].nChId))
					{
						m_AnalogCh[i].Step = E_STATE_ANALOG_IDLE;
						break;
					}
					else if(S_CALL_UNAVAILABLE != SsmGetChState(m_AnalogCh[i].nChId))
					{
						SsmHangup(m_AnalogCh[i].nChId);
						break;
					}
					break;
				}
			// idle
			case E_STATE_ANALOG_IDLE:
				{			
					if(S_CALL_RINGING == SsmGetChState(m_AnalogCh[i].nChId))
					{
						SsmPickup(m_AnalogCh[i].nChId);
						SsmGetCallerId( m_AnalogCh[i].nChId, m_AnalogCh[i].szCallerTelNumber);
						m_AnalogCh[i].Step = E_STATE_ANALOG_WAIT_CALLER_CONNECT;
					}
					else
					{
						m_AnalogCh[i].iDirection = 0;
						m_AnalogCh[i].nIpCh = -1;
						memset(m_AnalogCh[i].szCalleeTelNumber, 0, 64);
						memset(m_AnalogCh[i].szCallerTelNumber, 0, 64);

						if(S_CALL_STANDBY != SsmGetChState(m_AnalogCh[i].nChId))
							SsmHangup(m_AnalogCh[i].nChId);
						
						if(S_CALL_UNAVAILABLE == SsmGetChState(m_AnalogCh[i].nChId))
							m_AnalogCh[i].Step = E_STATE_ANALOG_UNAVAILABLE;
					}
					break;
				}
			// wait for the caller of this Analog channel to connect
			case E_STATE_ANALOG_WAIT_CALLER_CONNECT:
				{
					if(S_CALL_PENDING == SsmGetChState(m_AnalogCh[i].nChId))
					{
						SsmHangup(m_AnalogCh[i].nChId);
						m_AnalogCh[i].Step = E_STATE_ANALOG_IDLE;
					}
					else
					{
						if(S_CALL_TALKING == SsmGetChState(m_AnalogCh[i].nChId))
						{
							m_AnalogCh[i].Step = E_STATE_ANALOG_PLAY_SELECT;
						}
					}
					break;
				}
			// go to play select music
			case E_STATE_ANALOG_PLAY_SELECT:
				{
					if(S_CALL_PENDING == SsmGetChState(m_AnalogCh[i].nChId))
					{
						SsmHangup(m_AnalogCh[i].nChId);
						m_AnalogCh[i].Step = E_STATE_ANALOG_IDLE;
					}
					else
					{
						if(SsmPlayIndexString(m_AnalogCh[i].nChId, _T("Select")) == -1)
						{
							AppErrorHandler(m_AnalogCh[i].nChId);
						}
						else 
						{
							SsmSetDtmfStopPlay(m_AnalogCh[i].nChId,1);	// enable DTMF-Stop-Play function
							SsmClearRxDtmfBuf(m_AnalogCh[i].nChId);
							memset(m_AnalogCh[i].szCalleeTelNumber, 0, 64);
							m_AnalogCh[i].Step = E_STATE_ANALOG_CHECK_PLAY_SELECT;
						}
					}
					break;
				}
			// playing select music
			case E_STATE_ANALOG_CHECK_PLAY_SELECT:
				{
					if(S_CALL_PENDING == SsmGetChState(m_AnalogCh[i].nChId))
					{
						SsmStopPlayIndex(m_AnalogCh[i].nChId);
						SsmHangup(m_AnalogCh[i].nChId);
						m_AnalogCh[i].Step = E_STATE_ANALOG_IDLE;
					}
					else
					{
						if(SsmGetRxDtmfLen(m_AnalogCh[i].nChId) >= 1 && (2 == SsmCheckPlay(m_AnalogCh[i].nChId) || 1 == SsmCheckPlay(m_AnalogCh[i].nChId))) 
						{
							char ch;
							SsmGet1stDtmf(m_AnalogCh[i].nChId, &ch);
							
							for(int a = 0;a < sizeof(m_nIPAddress) / sizeof(m_nIPAddress[0]); a++)
							{
								if(m_nIPAddress[a].nDTMF == ch - 0x30)
								{
									strcpy(m_AnalogCh[i].szCalleeTelNumber, m_nIPAddress[a].szAddress);
									m_AnalogCh[i].Step = E_STATE_ANALOG_WAIT_IP_DIAL;
									break;
								}
							}
						}
					}
					break;
				}
			// wait for the app to dial with IP channel
			case E_STATE_ANALOG_WAIT_IP_DIAL:
				{
					if(S_CALL_PENDING == SsmGetChState(m_AnalogCh[i].nChId))
					{
						SsmHangup(m_AnalogCh[i].nChId);
						m_AnalogCh[i].Step = E_STATE_ANALOG_IDLE;
					}
					else
					{
						if('\0' == m_AnalogCh[i].szCalleeTelNumber[0])
						{
							m_AnalogCh[i].Step = E_STATE_ANALOG_PLAY_SELECT;
						}
						else
						{
							int nIpCh = Session_FindIdleIpCh();
							if(-1 != nIpCh)
							{
								m_AnalogCh[i].nIpCh = nIpCh;
								m_AnalogCh[i].iDirection = 1;
								
								Session_SetIpChDial(nIpCh, 
													m_AnalogCh[i].nChId,
													m_AnalogCh[i].szCallerTelNumber,
													m_AnalogCh[i].szCalleeTelNumber,
													2);
						
								m_AnalogCh[i].Step = E_STATE_ANALOG_WAIT_IP_PICKUP;
							}
						}
					}
					break;
				}
			// wait for the remote ip user to pick up
			case E_STATE_ANALOG_WAIT_IP_PICKUP:
				{
					if(S_CALL_PENDING == SsmGetChState(m_AnalogCh[i].nChId))
					{
						SsmHangup(m_AnalogCh[i].nChId);
						m_AnalogCh[i].Step = E_STATE_ANALOG_IDLE;
					}
					else
					{
						if(Session_IsIpChIdle(m_AnalogCh[i].nIpCh))
						{
							SsmHangup(m_AnalogCh[i].nChId);
							m_AnalogCh[i].Step = E_STATE_ANALOG_IDLE;
						}
						else
						{
							if(Session_IsIpChPickedUp(m_AnalogCh[i].nIpCh))
							{
								SsmTalkWith(m_AnalogCh[i].nChId, m_AnalogCh[i].nIpCh);
								m_AnalogCh[i].Step = E_STATE_ANALOG_WAIT_HANGUP;
							}
						}
					}
					break;
				}
			// remote ip user has picked up,wait for anyone to hang up
			case E_STATE_ANALOG_WAIT_HANGUP:
				{
					if(S_CALL_PENDING == SsmGetChState(m_AnalogCh[i].nChId))
					{
						SsmStopTalkWith(m_AnalogCh[i].nChId, m_AnalogCh[i].nIpCh);
						SsmHangup(m_AnalogCh[i].nChId);
						m_AnalogCh[i].Step = E_STATE_ANALOG_IDLE;
					}
					else
					{
						if(Session_IsIpChIdle(m_AnalogCh[i].nIpCh))
						{
							SsmStopTalkWith(m_AnalogCh[i].nChId, m_AnalogCh[i].nIpCh);
							SsmHangup(m_AnalogCh[i].nChId);
							m_AnalogCh[i].Step = E_STATE_ANALOG_IDLE;
						}
					}
					break;
				}
			// go to dial with this Analog channel
			case E_STATE_ANALOG_CALLOUT:
				{
					if(Session_IsIpChIdle(m_AnalogCh[i].nIpCh))
					{
						SsmHangup(m_AnalogCh[i].nChId);
						m_AnalogCh[i].Step = E_STATE_ANALOG_IDLE;
					}
					else
					{
						SsmPickup(m_AnalogCh[i].nChId);
						if(SsmAutoDial(m_AnalogCh[i].nChId, m_AnalogCh[i].szCalleeTelNumber))
						{
							AppErrorHandler(m_AnalogCh[i].nChId);
						}
						else
						{
							m_AnalogCh[i].Step = E_STATE_ANALOG_WAIT_CALLEE_PICKUP;
						}

					}
					break;
				}
			// wait for the callee of this Analog channel to pickup
			case E_STATE_ANALOG_WAIT_CALLEE_PICKUP:
				{
					if(S_CALL_PENDING == SsmGetChState(m_AnalogCh[i].nChId))
					{
						SsmHangup(m_AnalogCh[i].nChId);
						m_AnalogCh[i].Step = E_STATE_ANALOG_IDLE;
					}
					else
					{
						if(Session_IsIpChIdle(m_AnalogCh[i].nIpCh))
						{
							SsmHangup(m_AnalogCh[i].nChId);
							m_AnalogCh[i].Step = E_STATE_ANALOG_IDLE;
						}
						else
						{
							if(S_CALL_TALKING == SsmGetChState(m_AnalogCh[i].nChId))
							{
								m_AnalogCh[i].Step = E_STATE_ANALOG_CALLEE_PICKEDUP;
							}
						}
					}
					break;
				}
			// the callee of this Analog channel has picked up
			case E_STATE_ANALOG_CALLEE_PICKEDUP:
				{
					if(S_CALL_PENDING == SsmGetChState(m_AnalogCh[i].nChId))
					{
						SsmHangup(m_AnalogCh[i].nChId);
						m_AnalogCh[i].Step = E_STATE_ANALOG_IDLE;
					}
					else
					{
						if(Session_IsIpChIdle(m_AnalogCh[i].nIpCh))
						{
							SsmHangup(m_AnalogCh[i].nChId);
							m_AnalogCh[i].Step = E_STATE_ANALOG_IDLE;
						}
					}
					break;
				}
		}//? end switch
	}//? end if
}


void CIPGatewayDlg::ScanSS1Ch()
{
	for(int i = 0; i < m_nTotalSS1Ch; i++)
	{
		switch(m_SS1Ch[i].Step)
		{
			// unavailable
			case E_STATE_SS1_UNAVAILABLE:
				{
					if(S_CALL_STANDBY == SsmGetChState(m_SS1Ch[i].nChId))
					{
						m_SS1Ch[i].Step = E_STATE_SS1_IDLE;
						break;
					}
					else if(S_CALL_UNAVAILABLE != SsmGetChState(m_SS1Ch[i].nChId))
					{
						SsmHangup(m_SS1Ch[i].nChId);
						break;
					}
					break;
				}

			// idle
			case E_STATE_SS1_IDLE:
				{			
					if(S_CALL_RINGING == SsmGetChState(m_SS1Ch[i].nChId))
					{
						SsmPickup(m_SS1Ch[i].nChId);
						SsmGetCallerId(m_SS1Ch[i].nChId, m_SS1Ch[i].szCallerTelNumber);
						m_SS1Ch[i].Step = E_STATE_SS1_WAIT_CALLER_CONNECT;
					}
					else
					{
						m_SS1Ch[i].iDirection = 0;
						m_SS1Ch[i].nIpCh = -1;
						memset(m_SS1Ch[i].szCalleeTelNumber, 0, 64);
						memset(m_SS1Ch[i].szCallerTelNumber, 0, 64);

						if(S_CALL_UNAVAILABLE == SsmGetChState(m_SS1Ch[i].nChId))
							m_SS1Ch[i].Step = E_STATE_SS1_UNAVAILABLE;
					}
					break;
				}
			// wait for the caller of this SS1 channel to connect
			case E_STATE_SS1_WAIT_CALLER_CONNECT:
				{
					if(S_CALL_PENDING == SsmGetChState(m_SS1Ch[i].nChId))
					{
						SsmHangup(m_SS1Ch[i].nChId);
						m_SS1Ch[i].Step = E_STATE_SS1_IDLE;
					}
					else
					{
						if(S_CALL_TALKING == SsmGetChState(m_SS1Ch[i].nChId))
						{
							m_SS1Ch[i].Step = E_STATE_SS1_PLAY_SELECT;
						}
					}
					break;
				}
			// go to play select music
			case E_STATE_SS1_PLAY_SELECT:
				{
					if(S_CALL_PENDING == SsmGetChState(m_SS1Ch[i].nChId))
					{
						SsmHangup(m_SS1Ch[i].nChId);
						m_SS1Ch[i].Step = E_STATE_SS1_IDLE;
					}
					else
					{
						if(SsmPlayIndexString(m_SS1Ch[i].nChId, _T("Select1")) == -1)
						{
							AppErrorHandler(m_SS1Ch[i].nChId);
						}
						else 
						{
							SsmSetDtmfStopPlay(m_SS1Ch[i].nChId,1);	// enable DTMF-Stop-Play function
							SsmClearRxDtmfBuf(m_SS1Ch[i].nChId);
							memset(m_SS1Ch[i].szCalleeTelNumber, 0, 64);
							m_SS1Ch[i].Step = E_STATE_SS1_CHECK_PLAY_SELECT;
						}
					}
					break;
				}
			// playing select music
			case E_STATE_SS1_CHECK_PLAY_SELECT:
				{
					if(S_CALL_PENDING == SsmGetChState(m_SS1Ch[i].nChId))
					{
						SsmStopPlayIndex(m_SS1Ch[i].nChId);
						SsmHangup(m_SS1Ch[i].nChId);
						m_SS1Ch[i].Step = E_STATE_SS1_IDLE;
					}
					else
					{
						if(SsmGetRxDtmfLen(m_SS1Ch[i].nChId) >= 1 && (2 == SsmCheckPlay(m_SS1Ch[i].nChId) || 1 == SsmCheckPlay(m_SS1Ch[i].nChId))) 
						{
							char ch;
							SsmGet1stDtmf(m_SS1Ch[i].nChId, &ch);
							
							for(int a = 0;a < sizeof(m_nIPAddress) / sizeof(m_nIPAddress[0]); a++)
							{
								if(m_nIPAddress[a].nDTMF == ch - 0x30)
								{
									strcpy(m_SS1Ch[i].szCalleeTelNumber, m_nIPAddress[a].szAddress);
									m_SS1Ch[i].Step = E_STATE_SS1_WAIT_IP_DIAL;
									break;
								}
							}
						}
					}
					break;
				}
			// wait for the app to dial with IP channel
			case E_STATE_SS1_WAIT_IP_DIAL:
				{
					if(S_CALL_PENDING == SsmGetChState(m_SS1Ch[i].nChId))
					{
						SsmHangup(m_SS1Ch[i].nChId);
						m_SS1Ch[i].Step = E_STATE_SS1_IDLE;
					}
					else
					{
						if('\0' == m_SS1Ch[i].szCalleeTelNumber[0])
						{
							m_SS1Ch[i].Step = E_STATE_SS1_PLAY_SELECT;
						}
						else
						{
							int nIpCh = Session_FindIdleIpCh();
							if(-1 != nIpCh)
							{
								m_SS1Ch[i].nIpCh = nIpCh;
								m_SS1Ch[i].iDirection = 1;
								
								Session_SetIpChDial(nIpCh, 
													m_SS1Ch[i].nChId,
													m_SS1Ch[i].szCallerTelNumber,
													m_SS1Ch[i].szCalleeTelNumber,
													2);
						
								m_SS1Ch[i].Step = E_STATE_SS1_WAIT_IP_PICKUP;
							}
						}
					}
					break;
				}
			// wait for the remote ip user to pick up
			case E_STATE_SS1_WAIT_IP_PICKUP:
				{
					if(S_CALL_PENDING == SsmGetChState(m_SS1Ch[i].nChId))
					{
						SsmHangup(m_SS1Ch[i].nChId);
						m_SS1Ch[i].Step = E_STATE_SS1_IDLE;
					}
					else
					{
						if(Session_IsIpChIdle(m_SS1Ch[i].nIpCh))
						{
							SsmHangup(m_SS1Ch[i].nChId);
							m_SS1Ch[i].Step = E_STATE_SS1_IDLE;
						}
						else
						{
							if(Session_IsIpChPickedUp(m_SS1Ch[i].nIpCh))
							{
								SsmTalkWith(m_SS1Ch[i].nChId, m_SS1Ch[i].nIpCh);
								m_SS1Ch[i].Step = E_STATE_SS1_WAIT_HANGUP;
							}
						}
					}
					break;
				}
			// remote ip user has picked up,wait for anyone to hang up
			case E_STATE_SS1_WAIT_HANGUP:
				{
					if(S_CALL_PENDING == SsmGetChState(m_SS1Ch[i].nChId))
					{
						SsmStopTalkWith(m_SS1Ch[i].nChId, m_SS1Ch[i].nIpCh);
						SsmHangup(m_SS1Ch[i].nChId);
						m_SS1Ch[i].Step = E_STATE_SS1_IDLE;
					}
					else
					{
						if(Session_IsIpChIdle(m_SS1Ch[i].nIpCh))
						{
							SsmStopTalkWith(m_SS1Ch[i].nChId, m_SS1Ch[i].nIpCh);
							SsmHangup(m_SS1Ch[i].nChId);
							m_SS1Ch[i].Step = E_STATE_SS1_IDLE;
						}
					}
					break;
				}
			// go to dial with this SS1 channel
			case E_STATE_SS1_CALLOUT:
				{
					if(Session_IsIpChIdle(m_SS1Ch[i].nIpCh))
					{
						SsmHangup(m_SS1Ch[i].nChId);
						m_SS1Ch[i].Step = E_STATE_SS1_IDLE;
					}
					else
					{
						SsmPickup(m_SS1Ch[i].nChId);
						if(SsmAutoDial(m_SS1Ch[i].nChId, m_SS1Ch[i].szCalleeTelNumber))
						{
							AppErrorHandler(m_SS1Ch[i].nChId);
						}
						else
						{
							m_SS1Ch[i].Step = E_STATE_SS1_WAIT_CALLEE_PICKUP;
						}

					}
					break;
				}
			// wait for the callee of this SS1 channel to pick up
			case E_STATE_SS1_WAIT_CALLEE_PICKUP:
				{
					if(S_CALL_PENDING == SsmGetChState(m_SS1Ch[i].nChId))
					{
						SsmHangup(m_SS1Ch[i].nChId);
						m_SS1Ch[i].Step = E_STATE_SS1_IDLE;
					}
					else
					{
						if(Session_IsIpChIdle(m_SS1Ch[i].nIpCh))
						{
							SsmHangup(m_SS1Ch[i].nChId);
							m_SS1Ch[i].Step = E_STATE_SS1_IDLE;
						}
						else
						{
							if(S_CALL_TALKING == SsmGetChState(m_SS1Ch[i].nChId))
							{
								m_SS1Ch[i].Step = E_STATE_SS1_CALLEE_PICKEDUP;
							}
						}
					}
					break;
				}
			// the callee of this SS1 channel has picked up

⌨️ 快捷键说明

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