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

📄 ipgatewaydlg.cpp

📁 三汇CTI示例程序源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			case E_STATE_SS1_CALLEE_PICKEDUP:
				{
					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;
						}
					}
					break;
				}
		}//? end switch
	}//? end if
}

void CIPGatewayDlg::ScanIpCh()
{
	for(int i = 0; i < m_nTotalIpCh; i++)
	{
		switch(m_IpCh[i].Step)
		{
			// unavailable
			case E_STATE_IP_UNAVAILABLE:
				{
					if(S_CALL_STANDBY == SsmGetChState(m_IpCh[i].nChId))
					{
						m_IpCh[i].Step = E_STATE_IP_IDLE;
						break;
					}
					else if(S_CALL_UNAVAILABLE != SsmGetChState(m_IpCh[i].nChId))
					{
						SsmHangup(m_IpCh[i].nChId);
						break;
					}
					break;
				}
			// idle
			case E_STATE_IP_IDLE:
				{
					if(S_CALL_RINGING == SsmGetChState(m_IpCh[i].nChId))
					{
						SsmPickup(m_IpCh[i].nChId);
						SsmGetCallerId( m_IpCh[i].nChId, m_IpCh[i].szCallerTelNumber);
						m_IpCh[i].Step = E_STATE_IP_WAIT_CALLER_CONNECT;
					}
					else
					{
						m_IpCh[i].iDirection = 0;
						m_IpCh[i].nLinkCh = -1;
						memset(m_IpCh[i].szCalleeTelNumber, 0, 64);
						memset(m_IpCh[i].szCallerTelNumber, 0, 64);

						if(S_CALL_UNAVAILABLE == SsmGetChState(m_IpCh[i].nChId))
							m_IpCh[i].Step = E_STATE_IP_UNAVAILABLE;
					}
					break;
				}
			// wait for the caller of this IP channel to connect
			case E_STATE_IP_WAIT_CALLER_CONNECT:
				{
					if(S_CALL_STANDBY == SsmGetChState(m_IpCh[i].nChId) || S_CALL_PENDING == SsmGetChState(m_IpCh[i].nChId))
					{
						SsmHangup(m_IpCh[i].nChId);
						m_IpCh[i].Step = E_STATE_IP_IDLE;
					}
					else
					{
						if(S_CALL_TALKING == SsmGetChState(m_IpCh[i].nChId))
						{
							m_IpCh[i].Step = E_STATE_IP_PLAY_SELECT1;
						}
					}
					break;
				}

			// go to play select1 music
			case E_STATE_IP_PLAY_SELECT1:
				{
					if(S_CALL_STANDBY == SsmGetChState(m_IpCh[i].nChId) || S_CALL_PENDING == SsmGetChState(m_IpCh[i].nChId))
					{
						SsmHangup(m_IpCh[i].nChId);
						m_IpCh[i].Step = E_STATE_IP_IDLE;
					}
					else
					{
						if(SsmPlayIndexString(m_IpCh[i].nChId, _T("Select1")) == -1) 
						{
							AppErrorHandler(m_IpCh[i].nChId);
						}
						else 
						{
							SsmSetDtmfStopPlay(m_IpCh[i].nChId,1);	// enable DTMF-Stop-Play function
							SsmClearRxDtmfBuf(m_IpCh[i].nChId);
							memset(m_IpCh[i].szCalleeTelNumber, 0, 64);
							m_IpCh[i].Step = E_STATE_IP_CHECK_PLAY_SELECT1;
						}
					}
					break;
				}
			
			// playing select1 music
			case E_STATE_IP_CHECK_PLAY_SELECT1:
				{
					if(S_CALL_STANDBY == SsmGetChState(m_IpCh[i].nChId) || S_CALL_PENDING == SsmGetChState(m_IpCh[i].nChId))
					{
						SsmStopPlayIndex(m_IpCh[i].nChId);
						SsmHangup(m_IpCh[i].nChId);
						m_IpCh[i].Step = E_STATE_IP_IDLE;
					}
					else
					{
						if(SsmGetRxDtmfLen(m_IpCh[i].nChId) >= 1 && (2 == SsmCheckPlay(m_IpCh[i].nChId) || 1 == SsmCheckPlay(m_IpCh[i].nChId))) 
						{
							char ch;
							while(1 == SsmGet1stDtmfClr(m_IpCh[i].nChId, &ch))
							{
								if('1' == ch)
									m_IpCh[i].nLinkType= LINK_WITH_ANALOG;
								else if ('2' == ch)
									m_IpCh[i].nLinkType = LINK_WITH_SS1;
								else
								{
									SsmHangup(m_IpCh[i].nChId);
									m_IpCh[i].Step = E_STATE_IP_IDLE;
									break;
								}
								m_IpCh[i].Step = E_STATE_IP_PLAY_SELECT2;
							}
						}
					}
					break;
				}

			// go to play select2 music
			case E_STATE_IP_PLAY_SELECT2:
				{
					if(S_CALL_STANDBY == SsmGetChState(m_IpCh[i].nChId) || S_CALL_PENDING == SsmGetChState(m_IpCh[i].nChId))
					{
						SsmHangup(m_IpCh[i].nChId);
						m_IpCh[i].Step = E_STATE_IP_IDLE;
					}
					else
					{
						if(-1 == SsmPlayIndexString(m_IpCh[i].nChId, _T("Select2"))) 
						{
							AppErrorHandler(m_IpCh[i].nChId);
						}
						else 
						{
							SsmSetDtmfStopPlay(m_IpCh[i].nChId,1);	// enable DTMF-Stop-Play function
							SsmClearRxDtmfBuf(m_IpCh[i].nChId);
							memset(m_IpCh[i].szCalleeTelNumber, 0, 64);
							m_IpCh[i].Step = E_STATE_IP_CHECK_PLAY_SELECT2;
						}
					}
					break;
				}
			// playing select2 music
			case E_STATE_IP_CHECK_PLAY_SELECT2:
				{
					if(S_CALL_STANDBY == SsmGetChState(m_IpCh[i].nChId) || S_CALL_PENDING == SsmGetChState(m_IpCh[i].nChId))
					{
						SsmStopPlayIndex(m_IpCh[i].nChId);
						SsmHangup(m_IpCh[i].nChId);
						m_IpCh[i].Step = E_STATE_IP_IDLE;
					}
					else
					{
						if(SsmGetRxDtmfLen(m_IpCh[i].nChId) >= 1 && (2 == SsmCheckPlay(m_IpCh[i].nChId) || 1 == SsmCheckPlay(m_IpCh[i].nChId))) 
						{
							char ch;
							while(1 == SsmGet1stDtmfClr(m_IpCh[i].nChId, &ch))
							{
								if('#' == ch)
								{
									m_IpCh[i].Step = E_STATE_IP_WAIT_LINKCH_DIAL;
								}
								else
								{
									for(int m = 0; m < 63; m++)
									{
										if('\0' == m_IpCh[i].szCalleeTelNumber[m])
										{
											m_IpCh[i].szCalleeTelNumber[m] = ch;
											break;
										}
									}
								}
							}
						}
					}
					break;
				}
			// wait for the app to dial with linked channel
			case E_STATE_IP_WAIT_LINKCH_DIAL:
				{
					if(S_CALL_STANDBY == SsmGetChState(m_IpCh[i].nChId) || S_CALL_PENDING == SsmGetChState(m_IpCh[i].nChId))
					{
						SsmHangup(m_IpCh[i].nChId);
						m_IpCh[i].Step = E_STATE_IP_IDLE;
					}
					else
					{
						if('\0' == m_IpCh[i].szCalleeTelNumber[0])
						{
							m_IpCh[i].Step = E_STATE_IP_PLAY_SELECT2;
						}
						else
						{
							int nLinkCh = Session_FindIdleIPLinkCh(m_IpCh[i].nLinkType);
							if(-1 != nLinkCh)
							{
								m_IpCh[i].nLinkCh = nLinkCh;
								m_IpCh[i].iDirection = 1;
								Session_SetIPLinkChDial(m_IpCh[i].nLinkCh,
														m_IpCh[i].nLinkType,
														m_IpCh[i].nChId,
														m_IpCh[i].szCallerTelNumber,
														m_IpCh[i].szCalleeTelNumber,
														2);
						
								m_IpCh[i].Step = E_STATE_IP_WAIT_LINKCH_PICKUP;
							}
							else
							{
								SsmHangup(m_IpCh[i].nChId);
								m_IpCh[i].Step = E_STATE_IP_IDLE;
							}
						}
					}
					break;
				}
			// wait for the remote user to pick up
			case E_STATE_IP_WAIT_LINKCH_PICKUP:
				{
					if(S_CALL_STANDBY == SsmGetChState(m_IpCh[i].nChId)|| S_CALL_PENDING == SsmGetChState(m_IpCh[i].nChId))
					{
						memset(m_IpCh[i].szCallerTelNumber, 0, 64);
						memset(m_IpCh[i].szCalleeTelNumber, 0, 64);
						SsmHangup(m_IpCh[i].nChId);
						m_IpCh[i].Step = E_STATE_IP_IDLE;
					}
					else
					{
						if(Session_IsIPLinkChIdle(m_IpCh[i].nLinkCh, m_IpCh[i].nLinkType))
						{
							SsmHangup(m_IpCh[i].nChId);
							m_IpCh[i].Step = E_STATE_IP_IDLE;
						}
						else
						{
							if(Session_IsIPLinkChPickedUp(m_IpCh[i].nLinkCh, m_IpCh[i].nLinkType))
							{
								SsmTalkWith(m_IpCh[i].nChId, m_IpCh[i].nLinkCh);
								m_IpCh[i].Step = E_STATE_IP_WAIT_HANGUP;
							}
						}
					}
					break;
				}
	
			// the remote user has picked up, wait for anyone to hang up 
			case E_STATE_IP_WAIT_HANGUP:
				{
					if(S_CALL_STANDBY == SsmGetChState(m_IpCh[i].nChId) || S_CALL_PENDING == SsmGetChState(m_IpCh[i].nChId))
					{
						SsmStopTalkWith(m_IpCh[i].nChId, m_IpCh[i].nLinkCh);
						SsmHangup(m_IpCh[i].nChId);
						m_IpCh[i].Step = E_STATE_IP_IDLE;
					}
					else
					{
						if(Session_IsIPLinkChIdle(m_IpCh[i].nLinkCh, m_IpCh[i].nLinkType))
						{
							SsmStopTalkWith(m_IpCh[i].nChId, m_IpCh[i].nLinkCh);
							SsmHangup(m_IpCh[i].nChId);
							m_IpCh[i].Step = E_STATE_IP_IDLE;
						}
					}
					break;
				}
			// go to dial with this IP channel
			case E_STATE_IP_CALLOUT:
				{
					if(Session_IsIPLinkChIdle(m_IpCh[i].nLinkCh, m_IpCh[i].nLinkType))
					{
						SsmHangup(m_IpCh[i].nChId);
						m_IpCh[i].Step = E_STATE_IP_IDLE;
					}
					else
					{
						if(SsmAutoDial(m_IpCh[i].nChId, m_IpCh[i].szCalleeTelNumber))
						{
							AppErrorHandler(m_IpCh[i].nChId);
						}
						else
						{
							m_IpCh[i].Step = E_STATE_IP_WAIT_CALLEE_PICKUP;
						}

					}
					break;
				}
			// wait for the callee of this IP channel to pick up
			case E_STATE_IP_WAIT_CALLEE_PICKUP:
				{
					if(S_CALL_STANDBY == SsmGetChState(m_IpCh[i].nChId) || S_CALL_PENDING == SsmGetChState(m_IpCh[i].nChId))
					{
						SsmHangup(m_IpCh[i].nChId);
						m_IpCh[i].Step = E_STATE_IP_IDLE;
					}
					else
					{
						if(Session_IsIPLinkChIdle(m_IpCh[i].nLinkCh, m_IpCh[i].nLinkType))
						{
							SsmHangup(m_IpCh[i].nChId);
							m_IpCh[i].Step = E_STATE_IP_IDLE;
						}
						else
						{
							if(S_CALL_TALKING == SsmGetChState(m_IpCh[i].nChId))
							{
								m_IpCh[i].Step = E_STATE_IP_CALLEE_PICKEDUP;
							}
						}
					}
					break;
				}
			// the callee of this IP channel has picked up
			case E_STATE_IP_CALLEE_PICKEDUP:
				{
					if(S_CALL_STANDBY == SsmGetChState(m_IpCh[i].nChId) || S_CALL_PENDING == SsmGetChState(m_IpCh[i].nChId))
					{
						SsmHangup(m_IpCh[i].nChId);
						m_IpCh[i].Step = E_STATE_IP_IDLE;
					}
					else
					{
						if(Session_IsIPLinkChIdle(m_IpCh[i].nLinkCh, m_IpCh[i].nLinkType))
						{
							SsmHangup(m_IpCh[i].nChId);
							m_IpCh[i].Step = E_STATE_IP_IDLE;
						}
					}
					break;
				}
		}//? end switch
	}//? end if
}

void CIPGatewayDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	for(int i = 0; i < m_nTotalAnalogCh; i++)
	{
		if(m_AnalogCh[i].Step != E_STATE_ANALOG_IDLE)
		{
			SsmHangup(m_AnalogCh[i].nChId);
		}
	}

	for(int m = 0; m < m_nTotalSS1Ch; m++)
	{
		if(m_SS1Ch[m].Step != E_STATE_SS1_IDLE)
		{
			SsmHangup(m_SS1Ch[m].nChId);
		}
	}
	
	for(int n = 0; n < m_nTotalIpCh; n++)
	{
		if(m_IpCh[n].Step != E_STATE_IP_IDLE)
		{
			SsmHangup(m_IpCh[n].nChId);
		}
	}
	
	SsmCloseCti();	
}

void CIPGatewayDlg::OnDisconnect() 
{
	// TODO: Add your control notification handler code here
	// search selected Analog channel
	POSITION pos = m_AnalogChList.GetFirstSelectedItemPosition();
	if (pos == NULL)
		TRACE0("No items were selected!\n");
	else
	{
		while (pos)
		{
			int nItem = m_AnalogChList.GetNextSelectedItem(pos);
			TRACE1("Item %d was selected!\n", nItem);
			if(S_CALL_TALKING == SsmGetChState(m_AnalogCh[nItem].nChId))
			{
				SsmHangup(m_AnalogCh[nItem].nChId);
				Session_SetAnalogChState(m_AnalogCh[nItem].nChId, E_STATE_ANALOG_IDLE);
			}
		}
	}
	
	// search selected SS1 channel
	pos = m_SS1ChList.GetFirstSelectedItemPosition();
	if (pos == NULL)
		TRACE0("No items were selected!\n");
	else
	{
		while (pos)
		{
			int nItem = m_SS1ChList.GetNextSelectedItem(pos);
			TRACE1("Item %d was selected!\n", nItem);
			if(S_CALL_TALKING == SsmGetChState(m_SS1Ch[nItem].nChId))
			{
				SsmHangup(m_SS1Ch[nItem].nChId);
				Session_SetSS1ChState(m_SS1Ch[nItem].nChId, E_STATE_SS1_IDLE);
			}
		}
	}

	// search selected IP channel
	pos = m_IpChList.GetFirstSelectedItemPosition();
	if (pos == NULL)
		TRACE0("No items were selected!\n");
	else
	{
		while (pos)
		{
			int nItem = m_IpChList.GetNextSelectedItem(pos);
			TRACE1("Item %d was selected!\n", nItem);
			if(S_CALL_TALKING == SsmGetChState(m_IpCh[nItem].nChId))
			{
				SsmHangup(m_IpCh[nItem].nChId);
			}
		}
	}
}

void CIPGatewayDlg::ProtocalType()
{
	int nProtocol = GetPrivateProfileInt(_T("CONFIG"), _T("IPProtocol"), 0, _T(".\\IPGateway.ini"));
	switch (nProtocol)
	{
	case 0:
		{
			m_nIPProtocol = PROTOCOL_H323;
			break;
		}
	case 1:
		{
			m_nIPProtocol = PROTOCOL_SIP;
			break;
		}
	default:
		{
			m_nIPProtocol = -1;
			break;
		}
	}
}

void CIPGatewayDlg::ReadIPAddress()
{
	CString strFile;
	CString strSection;
	CString strKey;
	
	for(int a = 0; a < ARRAY_SIZE(m_nIPAddress); a++)
	{
		memset(m_nIPAddress[a].szAddress, 0, sizeof(m_nIPAddress[a].szAddress));
	}
	
	strFile = _T(".\\IPGateway.ini");
	strSection = _T("CONFIG");
	strKey = _T("TotalAddress");
	
	int nTotal = GetPrivateProfileInt(strSection, strKey, 0, strFile);
	if(nTotal > ARRAY_SIZE(m_nIPAddress))
	{
		nTotal = ARRAY_SIZE(m_nIPAddress);
	}
	
	for(int i = 0; i < nTotal; i++)
	{
		strSection.Format(_T("ADDRESS_%i"), i);
		
		strKey = _T("dtmf");
		m_nIPAddress[i].nDTMF = GetPrivateProfileInt(strSection, strKey, 0, strFile);
		
		strKey = _T("ipaddress");
		GetPrivateProfileString(strSection, strKey, _T(""), m_nIPAddress[i].szAddress, sizeof(m_nIPAddress[i]) - 1 , strFile);
	}
}

void CIPGatewayDlg::AppErrorHandler(int ch)
{
	CString cString;
	char szErrMsg[124];
	
	SsmGetLastErrMsg(szErrMsg);
	
	cString.LoadString(IDS_GATEWAY51);
	
	m_strErrMsg.Format(cString, szErrMsg, ch);
	
	UpdateData(FALSE);
}

void CIPGatewayDlg::InitLab()
{
	if(g_dwLanguageConversion == g_dwCHINESE_TRADITIONAL
		||g_dwLanguageConversion == g_dwCHINESE_HONGKONG)
	{
		SetWindowText(BIG5GATEWAY1);

		SetEngWinLab(this,	IDC_STATIC_ANALOG,	BIG5GATEWAY2);
		SetEngWinLab(this,	IDC_STATIC_SS1,		BIG5GATEWAY2);
		SetEngWinLab(this,	IDC_STATIC_IP,		BIG5GATEWAY3);
		SetEngWinLab(this,	ID_DISCONNECT,		BIG5GATEWAY4);
		SetEngWinLab(this,	IDOK,				BIG5GATEWAY5);
	}
	else
	{
		SetWindowText(GATEWAY1);

		SetEngWinLab(this,	IDC_STATIC_ANALOG,	GATEWAY2);
		SetEngWinLab(this,	IDC_STATIC_SS1,		GATEWAY2);

⌨️ 快捷键说明

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