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

📄 pbxdlg.cpp

📁 三汇CTI示例程序源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				SendMessage(WM_USER+E_TK_RELEASE, ChInfo[nCh].nLinkToCh, nCh);
				break;
			case USER_F_WAIT_TALK:
				//stop playback of background music 
				nPlayResult = SsmCheckPlay(nCh);
				if(nPlayResult != -1)
				{
					if(nPlayResult == 0)
					{
						if(SsmStopPlayFile(nCh) == -1)
						{
							ShowErrMsg("E_CHG_HookState", "USER_F_WAIT_TALK", "SsmStopPlayFile");
						}
					}
				}
				else
				{
					ShowErrMsg("E_CHG_HookState", "USER_F_WAIT_TALK", "SsmCheckPlay");
				}
				//E_MSG_HANGUP→ch1
				SendMessage(WM_USER+E_MSG_HANGUP, ChInfo[nCh].nLinkToCh, nCh);
				break;
			case USER_F_GET_DTMF:
				//close T4
				if(SsmStopTimer(ChInfo[nCh].nTimer) == -1)	
				{
					ShowErrMsg("E_CHG_HookState", "USER_F_GET_DTMF", "SsmStopTimer");
				}
				//E_MSG_RELEASE→ch0
				if(!ChInfo[nCh].bSubmiteChHookFlag)
				{
					SendMessage(WM_USER+E_MSG_RELEASE, ChInfo[nCh].nSaveSubmiteCh, nCh);
				}
				break;
			case USER_F_REQ_USER:
				//E_MSG_RELEASE→ch0
				if(!ChInfo[nCh].bSubmiteChHookFlag)
				{
					SendMessage(WM_USER+E_MSG_RELEASE, ChInfo[nCh].nSaveSubmiteCh, nCh);
				}
				break;
			case USER_F_RING_BACK:
				//masked by wangfeng for sc-1077(闪断接续问题), 2008.06.03
				/*
				//E_US_RELEASE→ch2
				SendMessage(WM_USER+E_US_RELEASE, ChInfo[nCh].nLinkToCh, nCh);	
				//E_MSG_RELEASE→ch0
				if(!ChInfo[nCh].bSubmiteChHookFlag)
				{
					SendMessage(WM_USER+E_MSG_RELEASE, ChInfo[nCh].nSaveSubmiteCh, nCh);	
				}*/
				//masked by wangfeng for sc-1077(闪断接续问题), 2008.06.03
				//added by wangfeng for sc-1077(闪断接续问题), 2008.06.03
				if(!ChInfo[nCh].bSubmiteChHookFlag)
				{
					ChInfo[ChInfo[nCh].nLinkToCh].nLinkToCh = ChInfo[nCh].nSaveSubmiteCh;
					SendMessage(WM_USER+E_MSG_CONNECT,ChInfo[nCh].nSaveSubmiteCh,ChInfo[nCh].nLinkToCh);
					if(SsmTalkWith(ChInfo[nCh].nSaveSubmiteCh, ChInfo[nCh].nLinkToCh) == -1)
					{
						ShowErrMsg("E_CHG_HookState", "USER_F_TALKING", "SsmTalkWith");
					}
					
					ChInfo[ChInfo[nCh].nLinkToCh].bPressFlag = FALSE;
				}
				//added by wangfeng for sc-1077(闪断接续问题), 2008.06.03
				break;
			case USER_F_TALKING:
				//tear down bus connection between ch1 and ch2
				if(SsmStopTalkWith(nCh, ChInfo[nCh].nLinkToCh) == -1)
				{
					ShowErrMsg("E_CHG_HookState", "USER_F_TALKING", "SsmStopTalkWith");
				}
				
				if(!ChInfo[nCh].bSubmiteChHookFlag)	//Ch0 go off-hook, Flag==0?
				{
					ChInfo[ChInfo[nCh].nLinkToCh].nLinkToCh = ChInfo[nCh].nSaveSubmiteCh;
					
					//E_MSG_CONNECT→ch0
					SendMessage(WM_USER+E_MSG_CONNECT, ChInfo[nCh].nSaveSubmiteCh, ChInfo[nCh].nLinkToCh);

					//to link original calling party and extenion transferred (ch0,ch2)
					if(SsmTalkWith(ChInfo[nCh].nSaveSubmiteCh, ChInfo[nCh].nLinkToCh) == -1)
					{
						ShowErrMsg("E_CHG_HookState", "USER_F_TALKING", "SsmTalkWith");
					}

					ChInfo[ChInfo[nCh].nLinkToCh].bPressFlag = FALSE;
				}
				else
				{
					//E_MSG_RELEASE→ch2
					SendMessage(WM_USER+E_MSG_RELEASE, ChInfo[nCh].nLinkToCh, nCh);
				}
				break;
			case USER_F_OPERATE:
				if(!ChInfo[nCh].bSubmiteChHookFlag)
				{
					//E_MSG_RELEASE→ch0
					SendMessage(WM_USER+E_MSG_RELEASE, ChInfo[nCh].nSaveSubmiteCh, nCh);
				}
				break;
			default:
				break;
			}//end of switch for ChInfo[nCh].nStatus

			//clear DTMF buffer 
			if(SsmClearRxDtmfBuf(nCh) == -1)
			{
				ShowErrMsg("E_CHG_HookState", "USER_F_OPERATE", "SsmClearRxDtmfBuf");
			}

			//initialize channel concerned parameters 
			ChInfo[nCh].nStatus = USER_IDLE;
			ChInfo[nCh].bPressFlag = FALSE;
			ChInfo[nCh].bSubmiteChHookFlag = FALSE;
			ChInfo[nCh].nSaveSubmiteCh = -1;
			ChInfo[nCh].nTimer = -1;
			ChInfo[nCh].nLinkToCh = -1;
			memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH);		//clear CallerId
			memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH);		//clear CalledID	
		}
		else if(nHook == 1)	//station goes off-hook
		{
			switch(ChInfo[nCh].nStatus)
			{
			case USER_IDLE:
				memset(ChInfo[nCh].szPhoneNumBuf, '\0', sizeof(char)*NUM_LENGTH);
				ChInfo[nCh].nStatus = USER_GET_1STDTMF;

				//clear DTMF buffer 
				if(SsmClearRxDtmfBuf(nCh) == -1)
				{
					ShowErrMsg("E_CHG_HookState", "USER_IDLE", "SsmClearRxDtmfBuf");
				}

				//start T1: 7 seconds
				if( (ChInfo[nCh].nTimer = SsmStartTimer(7000, 1)) == -1)	
				{
					ShowErrMsg("E_CHG_HookState", "USER_IDLE", "SsmStartTimer");
				}
				break;
			case USER_LOCAL_RING:
				//stop ringing 
				if(SsmStopRing(nCh) == -1)
				{
					ShowErrMsg("E_CHG_HookState", "USER_LOCAL_RING", "SsmStopRing");
				}
				ChInfo[nCh].nStatus = USER_TALKING;
				//send E_US_PICKUP
				SendMessage(WM_USER+E_US_PICKUP, ChInfo[nCh].nLinkToCh, nCh);
				break;
			default:
				break;
			}			
		}
		break;
	case E_CHG_RcvDTMF:		//dtmf event is detected by station channel 
		dwDtmfLen = lParam >> 16;
		dwDtmfNum = lParam & 0xFFFF;
		
		switch(ChInfo[nCh].nStatus)
		{
		case USER_GET_1STDTMF:
			//close T1
			if(SsmStopTimer(ChInfo[nCh].nTimer) == -1)	
			{
				ShowErrMsg("E_CHG_RcvDTMF", "USER_GET_1STDTMF", "SsmStopTimer");
			}
			ChInfo[nCh].nTimer = -1;

			//retrieve first DTMF
			ChInfo[nCh].szPhoneNumBuf[dwDtmfLen-1] = dwDtmfNum;

			switch(dwDtmfNum)
			{
			case '0':
				memset(ChInfo[nCh].szPhoneNumBuf, '\0', sizeof(char)*NUM_LENGTH);
				//search for idle analog trunk channel 
				ChInfo[nCh].nLinkToCh = SsmSearchIdleCallOutCh(1, 0);
				if(ChInfo[nCh].nLinkToCh >= 0)
				{					
					if(SsmClearRxDtmfBuf(nCh) == -1)
					{
						ShowErrMsg("E_CHG_RcvDTMF", "USER_GET_1STDTMF", "SsmClearRxDtmfBuf");
					}
					ChInfo[nCh].nStatus = USER_REQ_TRUNK;
					//send E_US_SEIZURE_TK
					SendMessage(WM_USER+E_US_SEIZURE_TK, ChInfo[nCh].nLinkToCh, nCh);
				}
				else
				{
					//note: if value "-1" is returned by function SsmSearchIdleCallOutCh(), then it is due to failed call of this function or 
					// no idle channel is found 
					if(ChInfo[nCh].nLinkToCh == -1)
					{
						ShowErrMsg("E_CHG_RcvDTMF", "USER_GET_1STDTMF", "SsmSearchIdleCallOutCh");
					}

					if(SsmSendTone(nCh, 1) == -1)
					{
						ShowErrMsg("E_CHG_RcvDTMF", "USER_GET_1STDTMF", "SsmSendTone");
					}
					ChInfo[nCh].nStatus = USER_WAIT_HANGUP;
				}
				break;
			case '2':
				ChInfo[nCh].nStatus = USER_GET_DTMF;
				//start T2:8 seconds
				if( (ChInfo[nCh].nTimer = SsmStartTimer(8000, 1)) == -1)
				{
					ShowErrMsg("E_CHG_RcvDTMF", "USER_GET_1STDTMF", "SsmStartTimer");
				}
				break;
			default:
				//send busy tone to station channel 
				if(SsmSendTone(nCh, 1) == -1)
				{
					ShowErrMsg("E_CHG_RcvDTMF", "USER_GET_1STDTMF", "SsmSendTone");
				}
				ChInfo[nCh].nStatus = USER_WAIT_HANGUP;
				break;
			}
			break;
		case USER_GET_DTMF:
			if(dwDtmfLen == MAX_USER_DTMFLEN)
			{
				ChInfo[nCh].szPhoneNumBuf[dwDtmfLen-1] = dwDtmfNum;
				//close T2
				if(SsmStopTimer(ChInfo[nCh].nTimer) == -1)	
				{
					ShowErrMsg("E_CHG_RcvDTMF", "USER_GET_DTMF", "SsmStopTimer");
				}
			
				ChInfo[nCh].szPhoneNumBuf[MAX_USER_DTMFLEN] = '\0';
				for(int i=0; i<nMaxCh; i++)
				{
					//to identify channel number Ch-k according to extension number 
					if ( (ChInfo[i].nChType == 2)
						&& (strcmp(ChInfo[nCh].szPhoneNumBuf, ChInfo[i].CUserNum) == 0 ) && i != nCh)
					{
						ChInfo[nCh].nLinkToCh = i;
						ChInfo[nCh].nStatus = USER_REQ_USER;
						//send E_US_SEIZURE
						SendMessage(WM_USER+E_US_SEIZURE, ChInfo[nCh].nLinkToCh, nCh);	//send seizure reqest to called party channel	
					}
				}
				
				if(ChInfo[nCh].nLinkToCh == -1)
				{
					//send busy tone to station channel 
					if(SsmSendTone(nCh, 1) == -1)
					{
						ShowErrMsg("E_CHG_RcvDTMF", "USER_GET_DTMF", "SsmSendTone");
					}
					ChInfo[nCh].nStatus = USER_WAIT_HANGUP;
				}
			}//end of first if
			else
			{
				ChInfo[nCh].szPhoneNumBuf[dwDtmfLen-1] = dwDtmfNum;

				//close and restart T2 in order to reset T2 
				if(SsmStopTimer(ChInfo[nCh].nTimer) == -1)	
				{
					ShowErrMsg("E_CHG_RcvDTMF", "USER_GET_DTMF", "SsmStopTimer");
				}
				if( (ChInfo[nCh].nTimer = SsmStartTimer(8000, 1)) == -1)
				{
					ShowErrMsg("E_CHG_RcvDTMF", "USER_GET_DTMF", "SsmStartTimer");
				}
			}
			break;
		case USER_DIALOUT:			
			//close and restart T3 in order to reset T3 
			if(SsmStopTimer(ChInfo[nCh].nTimer) == -1)	
			{
				ShowErrMsg("E_CHG_RcvDTMF", "USER_DIALOUT", "SsmStopTimer");
			}
			if( (ChInfo[nCh].nTimer = SsmStartTimer(18000, 1)) == -1)
			{
				ShowErrMsg("E_CHG_RcvDTMF", "USER_DIALOUT", "SsmStartTimer");
			}
			
			//Send E_US_DTMF2TK
			SendMessage(WM_USER+E_US_DTMF2TK, ChInfo[nCh].nLinkToCh, lParam);		//post dtmf event to trunk channel 
			break;
		case USER_F_GET_DTMF:
			if(dwDtmfLen == MAX_USER_DTMFLEN)
			{
				ChInfo[nCh].szPhoneNumBuf[dwDtmfLen-1] = dwDtmfNum;
				//close T4
				if(SsmStopTimer(ChInfo[nCh].nTimer) == -1)	
				{
					ShowErrMsg("E_CHG_RcvDTMF", "USER_F_GET_DTMF", "SsmStopTimer");
				}

				ChInfo[nCh].szPhoneNumBuf[MAX_USER_DTMFLEN] = '\0';

				for(int i=0; i<nMaxCh; i++)
				{
					//station channel rule judge 
					if( (ChInfo[i].nChType == 2)
						&&(strcmp(ChInfo[nCh].szPhoneNumBuf, ChInfo[i].CUserNum) ==0) && i != nCh )
					{
						ChInfo[nCh].nLinkToCh = i;
						ChInfo[nCh].nStatus = USER_F_REQ_USER;
						//F_US_ SEIZURE→ch2
						SendMessage(WM_USER+F_US_SEIZURE, ChInfo[nCh].nLinkToCh, nCh);	//post seizure event to station channel 
					}
				}
				
				if(ChInfo[nCh].nLinkToCh == -1)
				{
					//send busy tone to station channel 
					if(SsmSendTone(nCh, 1) == -1)
					{
						ShowErrMsg("E_CHG_RcvDTMF", "USER_F_GET_DTMF", "SsmSendTone");
					}

					ChInfo[nCh].nStatus = USER_F_OPERATE;
				}
			}//end of first if
			else
			{
				ChInfo[nCh].szPhoneNumBuf[dwDtmfLen-1] = dwDtmfNum;
				//close and restart T4 in order to reset T4
				if(SsmStopTimer(ChInfo[nCh].nTimer) == -1)	
				{
					ShowErrMsg("E_CHG_RcvDTMF", "USER_F_GET_DTMF", "SsmStopTimer");
				}
				if( (ChInfo[nCh].nTimer = SsmStartTimer(8000, 1)) == -1)
				{
					ShowErrMsg("E_CHG_RcvDTMF", "USER_F_GET_DTMF", "SsmStartTimer");
				}
			}
			break;
		case USER_REQ_USER:
			break;
		case USER_RING_BACK:
			break;
		case USER_TALKING:
			break;
		case USER_WAIT_HANGUP:
			break;
		case USER_LOCAL_RING:
			break;
		case USER_REQ_TRUNK:
			break;
		case USER_WAIT_REMOTE_PICKUP:
			break;
		case USER_F_REQ_USER:
			break;
		case USER_F_RING_BACK:
			break;
		case USER_F_TALKING:
			break;
		case USER_F_OPERATE:
			break;
		default:
			break;
		}
		break;//end of switch for E_CHG_RcvDTMF
	case E_CHG_FlashCount:

		switch(ChInfo[nCh].nStatus)
		{
		case USER_TALKING:
			if(!ChInfo[nCh].bPressFlag)	//flash Flag==0?
			{
				//tear down bus connection between ch0 and ch1
				if(SsmStopTalkWith(nCh, ChInfo[nCh].nLinkToCh) == -1)
				{
					ShowErrMsg("E_CHG_FlashCount", "USER_TALKING", "SsmStopTalkWith");
				}
				//E_MSG _FLASH→ch0
				SendMessage(WM_USER+E_MSG_FLASH, ChInfo[nCh].nLinkToCh, nCh);
				//falsh Flag=1
				ChInfo[nCh].bPressFlag = TRUE;
				//clear DTMF buffer 
				if(SsmClearRxDtmfBuf(nCh) == -1)
				{
					ShowErrMsg("E_CHG_FlashCount", "USER_TALKING", "SsmClearRxDtmfBuf");
				}
				//send dial tone
				if(SsmSendTone(nCh, 0) == -1)
				{
					ShowErrMsg("E_CHG_FlashCount", "USER_TALKING", "SsmSendTone");
				}

				ChInfo[nCh].nSaveSubmiteCh = ChInfo[nCh].nLinkToCh;			
				ChInfo[nCh].nStatus =USER_F_GET_DTMF;
				ChInfo[nCh].nLinkToCh = -1;

				//start T4:8 seconds
				if( (ChInfo[nCh].nTimer = SsmStartTimer(8000, 1)) == -1)
				{
					ShowErrMsg("E_CHG_FlashCount", "USER_TALKING", "SsmStartTimer");
				}
			}
			break;
		case USER_F_GET_DTMF:			
			//close T4
			if(SsmStopTimer(ChInfo[nCh].nTimer) == -1)	
			{
				ShowErrMsg("E_CHG_FlashCount", "USER_F_GET_DTMF", "SsmStopTimer");
			}
			//stop dial tone
			nToneType = -2;
			nToneChResult = SsmChkSendTone(nCh,&nToneType);
			if(nToneChResult == -1)
			{
				ShowErrMsg("E_CHG_FlashCount", "USER_F_GET_DTMF", "SsmChkSendTone");
			}
			else
			{
				if(nToneChResult == 1)
				{
					if(SsmStopSendTone(nCh) == -1)
					{
						ShowErrMsg("E_CHG_FlashCount", "USER_F_GET_DTMF", "SsmStopSendTone");
					}
				}
			}
			
			// on-hook Flag==0? on Ch0
			if(ChInfo[nCh].bSubmiteChHookFlag)
			{
				if(SsmSendTone(nCh, 3) == -1)
				{
					ShowErrMsg("E_CHG_FlashCount", "USER_F_GET_DTMF", "SsmSendTone");
				}
				ChInfo[nCh].nStatus = USER_WAIT_HANGUP;
			}
			else								
			{
				ChInfo[nCh].nStatus = USER_TALKING;	
				ChInfo[nCh].nLinkToCh = ChInfo[nCh].nSaveSubmiteCh;
				//E_MSG_CONNECT→ch0
				SendMessage(WM_USER+E_MSG_CONNECT, ChInfo[nCh].nLinkToCh, nCh);	
				//flash Flag=0
				ChInfo[nCh].bPressFlag = FALSE;
				ChInfo[nCh].nSaveSubmiteCh = -1;
				
				//build bus connection 
				if(SsmTalkWith(nCh, ChInfo[nCh].nLinkToCh) == -1)
				{
					ShowErrMsg("E_CHG_FlashCount", "USER_F_GET_DTMF", "SsmTalkWith");
				}
				//clear DTMF buffer
				if(SsmClearRxDtmfBuf(nCh) == -1)
				{
					ShowErrMsg("E_CHG_FlashCount", "USER_F_GET_DTMF", "SsmClearRxDtmfBuf");
				}
			}
			break;
		case USER_F_REQ_USER:
			//on-hook Flag==0?
			if(ChInfo[nCh].bSubmiteChHookFlag)
			{
				if(SsmSendTone(nCh, 3) == -1)
				{
					ShowErrMsg("E_CHG_FlashCount", "USER_F_REQ_USER", "SsmSendTone");
				}
				ChInfo[nCh].nStatus = USER_WAIT_HANGUP;
			}
			else								
			{
				ChInfo[nCh].nLinkToCh = ChInfo[nCh].nSaveSubmiteCh;
				ChInfo[nCh].nStatus = USER_TALKING;
				//E_MSG_CONNECT→ch0
				SendMessage(WM_USER+E_MSG_CONNECT, ChInfo[nCh].nLinkToCh, nCh);
				//flash Flag=0
				ChInfo[nCh].bPressFlag = FALSE;
				ChInfo[nCh].nSaveSubmiteCh = -1;
				
				//build bus connectin between ch0 and ch1
				if(SsmTalkWith(nCh, ChInfo[nCh].nLinkToCh) == -1)
				{
					ShowErrMsg("E_CHG_FlashCount", "USER_F_REQ_USER", "SsmTalkWith");
				}
				//clear DTMF buffer 
				if(SsmClearRxDtmfBuf(nCh) == -1)
				{
					ShowErrMsg("E_CHG_FlashCount", "USER_F_REQ_USER", "SsmClearRxDtmfBuf");
				}
			}
			break;
		case USER_F_OPERATE:
			if(SsmStopSendTone(nCh) == -1)
			{
				ShowErrMsg("E_CHG_FlashCount", "USER_F_OPERATE", "SsmStopSendTone");
			}
			//on-hook Flag==0? on Ch0
			if(ChInfo[nCh].bSubmiteChHookFlag)
			{
				//play howler tone 
				if(SsmSendTone(nCh, 3) == -1)
				{
					ShowErrMsg("E_CHG_FlashCount", "USER_F_OPERATE", "SsmSendTone");
				}

				ChInfo[nCh].nStatus = USER_WAIT_HANGUP;
			}
			else
			{
				ChInfo[nCh].nLinkToCh = ChInfo[nCh].nSaveSubmiteCh;
				//E_MSG_CONNECT→ch0
				SendMessage(WM_USER+E_MSG_CONNECT, ChInfo[nCh].nLinkToCh, nCh);
				
				//build bus connection between ch0 and ch1
				if(SsmTalkWith(nCh, ChInfo[nCh].nLinkToCh) == -1)
				{
					ShowErrMsg("E_CHG_FlashCount", "USER_F_OPERATE", "SsmTalkWith");
				}
				//clear DTMF
				if(SsmClearRxDtmfBuf(nCh) == -1)
				{
					ShowErrMsg("E_CHG_FlashCount", "USER_F_OPERATE", "SsmClearRxDtmfBuf");
				}
				
				ChInfo[nCh].nStatus = USER_TALKING;
				ChInfo[nCh].nSaveSubmiteCh = -1;
				ChInfo[nCh].bPressFlag = FALSE;
			}
			break;
		case USER_GET_1STDTMF:
			break;
		case USER_GET_DTMF:
			break;
		case USER_REQ_USER:
			break;
		case USER_RING_BACK:
			break;
		case USER_WAIT_HANGUP:
			break;
		case USER_REQ_TRUNK:
			break;
		case USER_DIALOUT:
			break;
		case USER_WAIT_REMOTE_PICKUP:
			break;
		case USER_F_RING_BACK:
			break;
		case USER_F_TALKING:
			break;
		default:
			break;
		}
		break;
	case E_SYS_TIMEOUT:		//timer Timeout event 

⌨️ 快捷键说明

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