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

📄 iprouterdlg.cpp

📁 三汇CTI示例程序源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			}
			if(m_H323Ch[i].iDirection == 2)
			{
				strDirection.LoadString(IDS_ROUTER40);
			}
			else
			{
				strDirection = "";
			}
		}
		
		if(m_ChH323List.GetItemText(i,2) != strState)
		{
			m_ChH323List.SetItemText(i, 2, strState);
		}
		
		if(m_ChH323List.GetItemText(i,3) != strDirection)
		{
			m_ChH323List.SetItemText(i, 3,  strDirection);
		}

		char szChId[3];
		if(-1 == m_H323Ch[i].nLinkToCh)
		{
			strcpy(szChId ,"");
		}
		else
		{
			itoa(m_H323Ch[i].nLinkToCh,szChId,10);
		}

		if(m_ChH323List.GetItemText(i, 4) != szChId)
		{
			m_ChH323List.SetItemText(i, 4,  szChId);
		}
		
		if(m_ChH323List.GetItemText(i, 5) != m_H323Ch[i].szCallerTelNumber)
		{
			m_ChH323List.SetItemText(i, 5,  m_H323Ch[i].szCallerTelNumber);
		}
		
		if(m_ChH323List.GetItemText(i, 6) != m_H323Ch[i].szCalleeTelNumber)
		{
			m_ChH323List.SetItemText(i, 6,  m_H323Ch[i].szCalleeTelNumber);
		}
	}
}

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

void CIPRouterDlg::OnExit() 
{
	// TODO: Add your message handler code here
	for(int i = 0; i < m_nTotalSIPCh; i++)
	{
		if(m_SIPCh[i].Step != E_STATE_IP_IDLE)
		{
			SsmHangup(m_SIPCh[i].nChId);
		}
	}
	
	for(int n = 0; n < m_nTotalH323Ch; n++)
	{
		if(m_H323Ch[n].Step != E_STATE_IP_IDLE)
		{
			SsmHangup(m_H323Ch[n].nChId);
		}
	}

	SsmCloseCti();

	
	POSITION pos = m_ChSIPList.GetFirstSelectedItemPosition();
	if (pos == NULL)
		TRACE0("No items were selected!\n");
	else
	{
		while (pos)
		{
			int nItem = m_ChSIPList.GetNextSelectedItem(pos);
			TRACE1("Item %d was selected!\n", nItem);
			if(S_CALL_TALKING == SsmGetChState(m_SIPCh[nItem].nChId))
			{
				SsmHangup(m_SIPCh[nItem].nChId);
			    m_SIPCh[nItem].nChId = E_STATE_IP_IDLE;
			}
		}
	}
	
	pos = m_ChH323List.GetFirstSelectedItemPosition();
	if (pos == NULL)
		TRACE0("No items were selected!\n");
	else
	{
		while (pos)
		{
			int nItem = m_ChH323List.GetNextSelectedItem(pos);
			TRACE1("Item %d was selected!\n", nItem);
			if(S_CALL_TALKING == SsmGetChState(m_H323Ch[nItem].nChId))
			{
				SsmHangup(m_H323Ch[nItem].nChId);
				m_H323Ch[nItem].nChId = E_STATE_IP_IDLE;
			}
		}
	}

	CDialog::OnDestroy();
	CDialog::OnCancel();
}

void CIPRouterDlg::OnAutodial() 
{
	SsmAutoDial(32,"201.123.123.75");
}

int CIPRouterDlg::SearchIdleCh(int protype)
{
	
	int iSearchMode =0;

	if(0 == protype) //0,h323;1,sip
	{
		iSearchMode = 0x200;
	}
	else if(1 == protype)
	{
		iSearchMode = 0x100;
	}
	int nIpCh = SsmSearchIdleCallOutCh(iSearchMode, 0);
	if(nIpCh == -1)
	{
		AppErrorHandler(-1);
		return -1;
	}
	return nIpCh;
}

IPGate* CIPRouterDlg::__GetLinkObject(int chID, int type)
{
	if(type==0)
	{
		for(int i=0; i<m_nTotalH323Ch; i++)
		{
			if(m_H323Ch[i].nChId == chID)
			{
				return &m_H323Ch[i];
			}
		}
	}

	else if(1 == type)
	{
		for(int i=0; i<m_nTotalSIPCh; i++)
		{
			if(m_SIPCh[i].nChId == chID)
			{
				return &m_SIPCh[i];
			}
		}
	}
	return NULL;
}

void CIPRouterDlg::SIPStateEvent()
{
	 for(int i=0; i<m_nTotalSIPCh; i++)
	 {
		 pCh = &m_SIPCh[i];
		 __StateEvent();
	 }
}

void CIPRouterDlg::H323StateEvent()
{
	for(int i=0; i<m_nTotalH323Ch; i++)
	{
		 pCh = &m_H323Ch[i];
		 __StateEvent();
	}
}

void CIPRouterDlg::__StateEvent()
{
	switch(pCh->Step)
	{
	case E_STATE_IP_IDLE:
		{
			if(S_CALL_RINGING == SsmGetChState(pCh->nChId))
			{
				SsmPickup(pCh->nChId);
				SsmGetCallerId(pCh->nChId, pCh->szCallerTelNumber);
				pCh->Step = E_STATE_IP_WAIT_CONNECT;
			}
			break;
		}
	case E_STATE_IP_WAIT_CONNECT:
		{
			if(S_CALL_STANDBY == SsmGetChState(pCh->nChId) || S_CALL_PENDING == SsmGetChState(pCh->nChId))
			{
				SsmHangup(pCh->nChId);
				pCh->Step = E_STATE_IP_IDLE;
			}
			else
			{
				int nState = SsmGetChState(pCh->nChId);
				if(S_CALL_TALKING == SsmGetChState(pCh->nChId))
				{
					pCh->Step = E_STATE_IP_PLAY_ADDRBOOK;
				}
			}
			break;
		}
	case E_STATE_IP_PLAY_ADDRBOOK:
		{
			if(S_CALL_STANDBY == SsmGetChState(pCh->nChId) || S_CALL_PENDING == SsmGetChState(pCh->nChId))
			{
				SsmHangup(pCh->nChId);
				pCh->Step = E_STATE_IP_IDLE;
			}
			else
			{
				if(SsmPlayIndexString(pCh->nChId,"RUSelect") == -1) 
				{
					AppErrorHandler(pCh->nChId);
				}
				else 
				{
					SsmSetDtmfStopPlay(pCh->nChId,1);	// enable DTMF-Stop-Play function
					SsmClearRxDtmfBuf(pCh->nChId);
					memset(pCh->szCalleeTelNumber, 0, 64);
					m_CurTimer =0;
					pCh->Step = E_STATE_IP_CHECK_PLAY_ADDRBOOK;
				}
			}
			break;
		}
	case E_STATE_IP_CHECK_PLAY_ADDRBOOK:
		{	
			if(S_CALL_STANDBY == SsmGetChState(pCh->nChId)  || S_CALL_PENDING == SsmGetChState(pCh->nChId))
			{
				if( 0 == SsmCheckPlay(pCh->nChId) )
				{
					SsmStopPlayFileList(pCh->nChId);
				}
				SsmClearRxDtmfBuf(pCh->nChId);
				SsmHangup(pCh->nChId);
				pCh->Step = E_STATE_IP_IDLE;
			}

		   if(SsmGetRxDtmfLen(pCh->nChId) >= 3 && (2 == SsmCheckPlay(pCh->nChId) || 1 == SsmCheckPlay(pCh->nChId))) 
		   {
				char ch;
				while(1 == SsmGet1stDtmfClr(pCh->nChId, &ch))
				{
					for(int cur = 0; cur < 63; cur++)
					{
						if('\0' == pCh->szCalleeTelNumber[cur])
						{
							pCh->szCalleeTelNumber[cur] = ch;
							break;
						}
					}
				}

				int m = 0;
				for(m = 0 ; m<m_UserNumber; m++)
				{
					if(m_IPAddress[m].dtmf == atoi(pCh->szCalleeTelNumber))
					{
						strcpy(pCh->szCalleeTelNumber, m_IPAddress[m].ipaddr);
						pCh->nLinkProType = m_IPAddress[m].type;
						pCh->Step = E_STATE_IP_WAIT_LINKDIAL;
						break;
					}
				}
			if(m_UserNumber == m)
			{
				//SsmPlayIndexString(pCh->nChId,"Select");
				SsmClearRxDtmfBuf(pCh->nChId);
				SsmHangup(pCh->nChId);
				pCh->Step = E_STATE_IP_IDLE;
			}
		  }//end if 

		   else 
		   {
			   ++m_CurTimer;
			   if(m_CurTimer >=6000)
			   {
				   //SsmPlayIndexString(pCh->nChId,"Select");
				   SsmClearRxDtmfBuf(pCh->nChId);
				   SsmHangup(pCh->nChId);
				   pCh->Step = E_STATE_IP_IDLE;
			   }
		   }
		   break;
		}
	case E_STATE_IP_WAIT_LINKDIAL:
		{
			if(S_CALL_STANDBY == SsmGetChState(pCh->nChId) || S_CALL_PENDING == SsmGetChState(pCh->nChId))
			{
				SsmHangup(pCh->nChId);
				pCh->Step = E_STATE_IP_IDLE;	
			}
			else if('\0' == pCh->szCalleeTelNumber[0])
			{
				SsmHangup(pCh->nChId);
				pCh->Step = E_STATE_IP_IDLE;
			}
			else
			{
				int nLinkToCh = SearchIdleCh(pCh->nLinkProType); 
				if(-1 == nLinkToCh)
				{
					SsmHangup(pCh->nChId);
					pCh->Step = E_STATE_IP_IDLE;
					break;
				}
				else
				{
					pCh->nLinkToCh = nLinkToCh;
					pCh->iDirection = 1;
					pLinkCh = __GetLinkObject(nLinkToCh, pCh->nLinkProType);
					pLinkCh->nLinkToCh = pCh->nChId;

					pLinkCh->nLinkProType = pCh->ntype; //add 

					strcpy(pLinkCh->szCallerTelNumber, pCh->szCallerTelNumber);
					strcpy(pLinkCh->szCalleeTelNumber, pCh->szCalleeTelNumber);
					pLinkCh->iDirection = pCh->iDirection+1;
					pLinkCh->Step = E_STATE_IP_CALLOUT;
			        SsmSendTone(pCh->nChId, 2); 

					pCh->Step = E_STATE_IP_WAIT_LINKPICK;
				}
			}
			break;
		}
	case E_STATE_IP_WAIT_LINKPICK:
		{
			pLinkCh = __GetLinkObject(pCh->nLinkToCh, pCh->nLinkProType);
			if(S_CALL_STANDBY == SsmGetChState(pCh->nChId) || S_CALL_PENDING == SsmGetChState(pCh->nChId))
			{
				memset(pCh->szCallerTelNumber,0,64);
				memset(pCh->szCalleeTelNumber,0,64);
				SsmHangup(pCh->nChId);
				pCh->Step = E_STATE_IP_IDLE;
			}
			else if(E_STATE_IP_IDLE == pLinkCh->Step)
			{
				SsmHangup(pCh->nChId);
				pCh->Step = E_STATE_IP_IDLE;
			}
			else
			{
				SsmStopSendTone(pCh->nChId);
				int ret=0;
				ret = SsmTalkWith(pCh->nChId, pCh->nLinkToCh);
				pCh->Step = E_STATE_IP_WAIT_HANGUP;
			}
			break;
		}
	case E_STATE_IP_WAIT_HANGUP:
		{
			pLinkCh = __GetLinkObject(pCh->nLinkToCh, pCh->nLinkProType);
			if(S_CALL_STANDBY == SsmGetChState(pCh->nChId) || S_CALL_PENDING == SsmGetChState(pCh->nChId))
			{
				SsmStopTalkWith(pCh->nChId, pCh->nLinkToCh);
				SsmHangup(pCh->nChId);
				pCh->Step = E_STATE_IP_IDLE;
			}
			else if(S_CALL_STANDBY == SsmGetChState(pLinkCh->nChId) || S_CALL_PENDING == SsmGetChState(pLinkCh->nChId))
			{
				SsmStopTalkWith(pCh->nChId, pCh->nLinkToCh);
				SsmHangup(pCh->nChId);
				pCh->Step = E_STATE_IP_IDLE;
			}
			break;
		}
		
		///////////////////////////////////////////////////////////////////////////////////////////
	case E_STATE_IP_CALLOUT:
		{
			pLinkCh = __GetLinkObject(pCh->nLinkToCh, pCh->nLinkProType);
			if(E_STATE_IP_IDLE == pLinkCh->Step)
			{
				SsmHangup(pCh->nChId);
				pCh->Step = E_STATE_IP_IDLE;
			}
			else
			{
				int result = SsmAutoDial(pCh->nChId, pCh->szCalleeTelNumber);
				if(-1 == result)
				{
					result = SsmGetAutoDialFailureReason(pCh->nChId);
					AppErrorHandler(pCh->nChId);
				}
				else
				{
					pCh->Step = E_STATE_IP_WAIT_CALLEE_PICKUP;
				}
			}
			break;
		}
	case E_STATE_IP_WAIT_CALLEE_PICKUP:
		{
			pLinkCh = __GetLinkObject(pCh->nLinkToCh, pCh->nLinkProType);
			
			if(S_CALL_STANDBY == SsmGetChState(pCh->nChId) || S_CALL_PENDING == SsmGetChState(pCh->nChId))
			{
				SsmHangup(pCh->nChId);
				pCh->Step = E_STATE_IP_IDLE;
			}
			else if(E_STATE_IP_IDLE == pLinkCh->Step)
			{
				SsmHangup(pCh->nChId);
				pCh->Step = E_STATE_IP_IDLE;
			}
			else if(S_CALL_TALKING == SsmGetChState(pCh->nChId))
			{
				pCh->Step = E_STATE_IP_WAIT_HANGUP;
			}
			break;
		}
	}//end switch
}//end for

void CIPRouterDlg::__ReadIndexINI(const char* lpFile)
{
	LPCTSTR	 lpSec;
	lpSec = "IpRouter";	
	m_UserNumber = GetPrivateProfileInt(lpSec,"UserNumber",0,lpFile);

	char dtmf[50] = {'\0'};
	char ipaddr[50] = {'\0'};
	char type[50]   = {'\0'};

	char ss[10];

	char* szipaddr="";

	for(int i =1; i< m_UserNumber+1; i++)
	{
		strcpy(dtmf,"dtmf_");
		strcpy(ipaddr,"ipaddr_");
		strcpy(type,"type_");

		itoa(i,ss,10);
		strcat(dtmf,ss);
		strcat(ipaddr,ss);
		strcat(type,ss);

		m_IPAddress[i].dtmf = GetPrivateProfileInt(lpSec,dtmf,0,lpFile);

		char ipaddr0[50];
		GetPrivateProfileString(lpSec,ipaddr,"0.0.0.0", ipaddr0, 50,lpFile);
		strcpy(m_IPAddress[i].ipaddr, ipaddr0);

		m_IPAddress[i].type = GetPrivateProfileInt(lpSec,type,0,lpFile);
	}
}

BOOL CIPRouterDlg::CheckConfigFile(LPSTR lpstrSrc, LPCSTR lpcstrDefault, LPSTR lpstrActual)
{
		if( lstrlen(lpstrSrc) == 0 )
		{
			GetWindowsDirectory(lpstrActual,MAX_PATH);
			lstrcat(lpstrActual,"\\");
			lstrcat(lpstrActual, lpcstrDefault);
		}
		else
		{
			if (strchr(lpstrSrc,':')) lstrcpy(lpstrActual,lpstrSrc);
			else
			{
				GetCurrentDirectory(MAX_PATH,lpstrActual);
				lstrcat(lpstrActual,"\\");
				lstrcat(lpstrActual,lpstrSrc);
			}
		}
		return TRUE;
}

void CIPRouterDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	
	// TODO: Add your message handler code here
	// TODO: Add your message handler code here
	for(int i = 0; i < m_nTotalSIPCh; i++)
	{
		if(m_SIPCh[i].Step != E_STATE_IP_IDLE)
		{
			SsmHangup(m_SIPCh[i].nChId);
		}
	}
	
	for(int n = 0; n < m_nTotalH323Ch; n++)
	{
		if(m_H323Ch[n].Step != E_STATE_IP_IDLE)
		{
			SsmHangup(m_H323Ch[n].nChId);
		}
	}
	
	SsmCloseCti();
	
	
	POSITION pos = m_ChSIPList.GetFirstSelectedItemPosition();
	if (pos == NULL)
		TRACE0("No items were selected!\n");
	else
	{
		while (pos)
		{
			int nItem = m_ChSIPList.GetNextSelectedItem(pos);
			TRACE1("Item %d was selected!\n", nItem);
			if(S_CALL_TALKING == SsmGetChState(m_SIPCh[nItem].nChId))
			{
				SsmHangup(m_SIPCh[nItem].nChId);
				m_SIPCh[nItem].nChId = E_STATE_IP_IDLE;
			}
		}
	}
	
	pos = m_ChH323List.GetFirstSelectedItemPosition();
	if (pos == NULL)
		TRACE0("No items were selected!\n");
	else
	{
		while (pos)
		{
			int nItem = m_ChH323List.GetNextSelectedItem(pos);
			TRACE1("Item %d was selected!\n", nItem);
			if(S_CALL_TALKING == SsmGetChState(m_H323Ch[nItem].nChId))
			{
				SsmHangup(m_H323Ch[nItem].nChId);
				m_H323Ch[nItem].nChId = E_STATE_IP_IDLE;
			}
		}
	}
}

⌨️ 快捷键说明

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