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

📄 pbxdlg.cpp

📁 三汇CTI示例程序源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_WAIT_ACTUAL_PICKUP", "SsmSetDtmfStopPlay");
				}

				ChInfo[nCh].nTimer = SsmStartTimer(15000,1);
				ChInfo[nCh].nStatus = TRUNK_WAIT_SELECTION;
			}
			else
			{	
				//clear DTMF
				if(SsmClearRxDtmfBuf(nCh) == -1)
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_WAIT_ACTUAL_PICKUP", "SsmClearRxDtmfBuf");
				}
				//go on-hook 
				if(SsmHangup(nCh) == -1)
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_WAIT_ACTUAL_PICKUP", "SsmHangup");
				}
				memset(ChInfo[nCh].szCallerId,'\0',sizeof(char)*NUM_LENGTH);		//clear CallerId
				memset(ChInfo[nCh].szCalleeId,'\0',sizeof(char)*NUM_LENGTH);		//clear CalledId			
				ChInfo[nCh].nStatus = TRUNK_IDLE;
			}
			break;
		case TRUNK_DIALING:
			
			switch(nChState)
			{
			case S_CALL_WAIT_REMOTE_PICKUP:
				//retrieve CalledId
				strcpy(ChInfo[nCh].szCalleeId, ChInfo[nCh].szPhoneNumBuf);

				ChInfo[nCh].nStatus = TRUNK_WAIT_REMOTE_PICKUP;
				//send E_TK_DIAL_OK
				SendMessage(WM_USER+E_TK_DIAL_OK, ChInfo[nCh].nLinkToCh, nCh);
				break;
			case S_CALL_TALKING:
				//retrieve calledId
				strcpy(ChInfo[nCh].szCalleeId, ChInfo[nCh].szPhoneNumBuf);
				ChInfo[nCh].nStatus = TRUNK_CONNECTED;
				//send E_TK_REMOTE_PICKUP
				SendMessage(WM_USER+E_TK_REMOTE_PICKUP, ChInfo[nCh].nLinkToCh, nCh);
				break;
			case S_CALL_PENDING:			
				//send E_TK_DIAL_FAIL
				SendMessage(WM_USER+E_TK_DIAL_FAIL, ChInfo[nCh].nLinkToCh, nCh);
				//go on-hook
				if(SsmHangup(nCh) == -1)
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_DIALING", "SsmHangup");
				}
				//clear DTMF buffer
				if(SsmClearRxDtmfBuf(nCh) == -1)
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_DIALING", "SsmClearRxDtmfBuf");
				}
				memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH);		//clear CallerId
				memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH);		//Clear CalledId
			
				ChInfo[nCh].nStatus = TRUNK_IDLE;
				break;
			default:
				break;
			}
			break;
		case TRUNK_WAIT_REMOTE_PICKUP:
			if(nChState == S_CALL_TALKING)			//called trunk channel answer the call
			{	
				ChInfo[nCh].nStatus = TRUNK_CONNECTED;
				//send E_TK_REMOTE_PICKUP
				SendMessage(WM_USER+E_TK_REMOTE_PICKUP, ChInfo[nCh].nLinkToCh, nCh);
			}
			else									//called trunk channel does not answer the call
			{				
				//clear DTMF buffer
				if(SsmClearRxDtmfBuf(nCh) == -1)
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_WAIT_REMOTE_PICKUP", "SsmClearRxDtmfBuf");
				}
				//go on-hook
				if(SsmHangup(nCh) == -1)
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_WAIT_REMOTE_PICKUP", "SsmHangup");
				}
				//send E_TK_REMOTE_NOANSWER
				SendMessage(WM_USER+E_TK_REMOTE_NOANSWER, ChInfo[nCh].nLinkToCh, nCh);	
				memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH);		//callerId
				memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH);		//CalledId
				ChInfo[nCh].nStatus = TRUNK_IDLE;
			}
			break;
		case TRUNK_REQ_USER:
			if(nChState == S_CALL_PENDING)
			{
				//clear DTmf buffer
				if(SsmClearRxDtmfBuf(nCh) == -1)
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_REQ_USER", "SsmClearRxDtmfBuf");
				}
				//go on-hook
				if(SsmHangup(nCh) == -1)
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_REQ_USER", "SsmHangup");
				}
				
				memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH);		//clear CallerId
				memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH);		//clear CalledId
				
				ChInfo[nCh].nStatus = TRUNK_IDLE;
			}
			break;
		case TRUNK_RING_BACK:
			if(nChState == S_CALL_PENDING)
			{
				//stop background music 
				nPlayResult = SsmCheckPlay(nCh);
				if(nPlayResult != -1)
				{
					if(nPlayResult == 0)
					{
						if(SsmStopPlayFile(nCh) == -1)
						{
							ShowErrMsg("E_CHG_ChState", "TRUNK_RING_BACK", "SsmStopPlayFile");
						}
					}
				}
				else
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_RING_BACK", "SsmCheckPlay");
				}

				//clear DTMF buffer 
				if(SsmClearRxDtmfBuf(nCh) == -1)
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_RING_BACK", "SsmClearRxDtmfBuf");
				}
				//go on-hook
				if(SsmHangup(nCh) == -1)
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_RING_BACK", "SsmHangup");
				}

				//send E_US_RELEASE
				SendMessage(WM_USER+E_US_RELEASE, ChInfo[nCh].nLinkToCh, nCh);

				memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH);		//clear CallerId
				memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH);		//clear CalledId			
				ChInfo[nCh].nStatus = TRUNK_IDLE;				
			}
			break;
		case TRUNK_CONNECTED:
			if(nChState ==S_CALL_PENDING)
			{
				//send E_MSG_RELEASE to channel connected
				SendMessage(WM_USER+E_MSG_RELEASE, ChInfo[nCh].nLinkToCh, nCh);
				//tear down bus connection 
				if(SsmStopTalkWith(nCh, ChInfo[nCh].nLinkToCh) == -1)
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_CONNECTED", "SsmStopTalkWith");
				}
				//clear DTMF buffer
				if(SsmClearRxDtmfBuf(nCh) == -1)
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_CONNECTED", "SsmClearRxDtmfBuf");
				}
				//go on-hook
				if(SsmHangup(nCh) == -1)
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_CONNECTED", "SsmHangup");
				}

				memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH);		//clear CallerId
				memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH);		//clear CalledId

				ChInfo[nCh].nStatus = TRUNK_IDLE;				
			}
			break;
		case TRUNK_WAIT_SELECTION:
			if(nChState ==S_CALL_PENDING)
			{
				//close T1:8 seconds
				if(SsmStopTimer(ChInfo[nCh].nTimer) == -1)
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_WAIT_SELECTION", "SsmStopTimer");
				}
				//clear DTMF buffer
				if(SsmClearRxDtmfBuf(nCh) == -1)
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_WAIT_SELECTION", "SsmClearRxDtmfBuf");
				}
				//go on-hook 
				if(SsmHangup(nCh) == -1)
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_WAIT_SELECTION", "SsmHangup");
				}

				memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH);		//clear CallerId			
				memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH);		//clear CalledId			

				ChInfo[nCh].nStatus = TRUNK_IDLE;
			}
			break;
		case TRUNK_FLASHING:
			if(nChState ==S_CALL_PENDING)
			{
				//stop background music
				nPlayResult = SsmCheckPlay(nCh);
				if(nPlayResult != -1)
				{
					if(nPlayResult == 0)
					{
						if(SsmStopPlayFile(nCh) == -1)
						{
							ShowErrMsg("E_CHG_ChState", "TRUNK_FLASHING", "SsmStopPlayFile");
						}
					}
				}
				else
				{
					ShowErrMsg("E_CHG_ChState", "TRUNK_FLASHING", "SsmCheckPlay");
				}
				
				SendMessage(WM_USER+E_MSG_HANGUP, ChInfo[nCh].nLinkToCh, nCh);
			}
			break;
		default:
			break;
		}
		break;
	case E_CHG_RcvDTMF:
		dwDtmfLen = lParam >> 16;
		dwDtmfNum = lParam & 0xFFFF;

		switch(ChInfo[nCh].nStatus)
		{
		case TRUNK_WAIT_ACTUAL_PICKUP:
			//clear DTMF buffer
			if(SsmClearRxDtmfBuf(nCh) == -1)
			{
				ShowErrMsg("E_CHG_RcvDTMF", "TRUNK_WAIT_ACTUAL_PICKUP", "SsmClearRxDtmfBuf");
			}
			break;
		case TRUNK_WAIT_SELECTION:
			//close T1
			if(SsmStopTimer(ChInfo[nCh].nTimer) == -1)
			{
				ShowErrMsg("E_CHG_RcvDTMF", "TRUNK_WAIT_SELECTION", "SsmStopTimer");
			}
			
			if(dwDtmfLen == MAX_USER_DTMFLEN)
			{
				ChInfo[nCh].szPhoneNumBuf[dwDtmfLen-1] = dwDtmfNum;

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

				for(int i=0; i<nMaxCh; i++)
				{
					if( (ChInfo[i].nChType == 2)
						&& (strcmp(ChInfo[nCh].szPhoneNumBuf, ChInfo[i].CUserNum) == 0) && i != nCh )
					{
						ChInfo[nCh].nLinkToCh = i;
					}				
				}

				if(ChInfo[nCh].nLinkToCh == -1)	//invalid extension number
				{
					//clear DTMF buffer
					if(SsmClearRxDtmfBuf(nCh) == -1)
					{
						ShowErrMsg("E_CHG_RcvDTMF", "TRUNK_WAIT_SELECTION", "SsmClearRxDtmfBuf");
					}
					
					GetCurrentDirectory(MAX_PATH, szVoicePath);
					strcat(szVoicePath, "\\Error.pcm");	
					//play message indicating invalid extension is dialed. 
					if(SsmPlayFile(nCh, szVoicePath, -1, 0, 0xffffffff) == -1)
					{
						ShowErrMsg("E_CHG_RcvDTMF", "TRUNK_WAIT_SELECTION", "SsmPlayFile");
					}
					ChInfo[nCh].nTimer = SsmStartTimer(15000, 1);
					
				}
				else
				{
					ChInfo[nCh].nStatus = TRUNK_REQ_USER;
					SendMessage(WM_USER+E_US_SEIZURE, ChInfo[nCh].nLinkToCh, nCh);
				}
			}
			else	//clear Timer T1 to wait for next number
			{
				ChInfo[nCh].szPhoneNumBuf[dwDtmfLen-1] = dwDtmfNum;

				if( (ChInfo[nCh].nTimer = SsmStartTimer(8000, 1)) == -1)
				{
					ShowErrMsg("E_CHG_RcvDTMF", "TRUNK_WAIT_SELECTION", "SsmStartTimer");
				}
			}
			break;
		case TRUNK_CONNECTED:
			break;
		default:
			break;
		}
		break;
	case E_SYS_TIMEOUT:
		//close T1
		if(SsmStopTimer(ChInfo[nCh].nTimer) == -1)
		{
			ShowErrMsg("E_SYS_TIMEOUT", NULL, "SsmStopTimer");
		}
		//clear DTMF buffer
		if(SsmClearRxDtmfBuf(nCh) == -1)
		{
			ShowErrMsg("E_SYS_TIMEOUT", NULL, "SsmClearRxDtmfBuf");
		}
		//go on-hook
		if(SsmHangup(nCh) == -1)
		{
			ShowErrMsg("E_SYS_TIMEOUT", NULL, "SsmHangup");
		}

		memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH);		//clear CallerId	
		memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH);		//clear CalledId

		ChInfo[nCh].nStatus = TRUNK_IDLE;
		break;
	/*+++++++++define trunk channel message +++++++++*/
	case E_US_SEIZURE_TK:
		ChInfo[nCh].nLinkToCh = lParam;
		//go off-hook successfully?
		if( SsmPickup(nCh) == 0 )
		{			
			//send E_TK_SEIZURE_TK_ACK_IDLE
			SendMessage(WM_USER+E_TK_SEIZURE_TK_ACK_IDLE, ChInfo[nCh].nLinkToCh, nCh);
			ChInfo[nCh].nStatus = TRUNK_WAIT_1STNUM;
		}
		else
		{
			//send E_TK_SEIZURE_TK_ACK_BUSY
			SendMessage(WM_USER+E_TK_SEIZURE_TK_ACK_BUSY, ChInfo[nCh].nLinkToCh, nCh);
		}
		break;
	case E_TK_RELEASE:
		ChInfo[nCh].nLinkToCh = lParam;
		//clear DTMF buffer
		if(SsmClearRxDtmfBuf(nCh) == -1)
		{
			ShowErrMsg("E_TK_RELEASE", NULL, "SsmClearRxDtmfBuf");
		}
		//go on-hook
		if(SsmHangup(nCh) == -1)
		{
			ShowErrMsg("E_TK_RELEASE", NULL, "SsmHangup");
		}

		memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH);		//clear CallerId
		memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH);		//clear CalledId

		ChInfo[nCh].nStatus = TRUNK_IDLE;
		break;
	case E_US_DTMF2TK:
		dwDtmfLen = lParam >> 16;
		dwDtmfNum = lParam & 0xFFFF;
		
		switch(ChInfo[nCh].nStatus)
		{
		case TRUNK_WAIT_1STNUM:			//auto dial
			//clean szPhoneNumBuf
			memset(ChInfo[nCh].szPhoneNumBuf, '\0', sizeof(char)*NUM_LENGTH);	
			//retrieve DTMF
			ChInfo[nCh].szPhoneNumBuf[dwDtmfLen-1] = dwDtmfNum;
			//retrieve length of DTMF
			ChInfo[nCh].nPhoNumLen = dwDtmfLen;

			//audo dial
			if(SsmAutoDial(nCh, ChInfo[nCh].szPhoneNumBuf) == -1)
			{
				ShowErrMsg("E_US_DTMF2TK", "TRUNK_WAIT_1STNUM", "SsmAutoDial");
			}

			ChInfo[nCh].nStatus = TRUNK_DIALING;
			break;
		case TRUNK_DIALING:				
			//retrieve DTMF
			ChInfo[nCh].szPhoneNumBuf[dwDtmfLen-1] = dwDtmfNum;
			ChInfo[nCh].szPhoneNumBuf[dwDtmfLen] = '\0';
			
			if(dwDtmfLen > (DWORD)ChInfo[nCh].nPhoNumLen)			//append number
			{
				//append number 
				if(SsmAppendPhoNum(nCh, &ChInfo[nCh].szPhoneNumBuf[ChInfo[nCh].nPhoNumLen]) == -1)
				{
					ShowErrMsg("E_US_DTMF2TK", "TRUNK_DIALING", "SsmAppendPhoNum");
				}
				ChInfo[nCh].nPhoNumLen = dwDtmfLen;
			}
			break;
		default:
			break;
		}
		break;
	case E_US_SEIZURE_ACK_IDLE:
		ChInfo[nCh].nLinkToCh = lParam;
		GetCurrentDirectory(MAX_PATH, szVoicePath);
		strcat(szVoicePath, "\\bgmusic.wav");	
		
		//play background music
		if(SsmPlayFile(nCh, szVoicePath, -1, 0, 0xffffffff) == -1)
		{
			ShowErrMsg("E_US_SEIZURE_ACK_IDLE", NULL, "SsmPlayFile");
		}

		ChInfo[nCh].nStatus = TRUNK_RING_BACK;
		break;
	case E_US_SEIZURE_ACK_BUSY:
		//clear DTMF buffer 
		if(SsmClearRxDtmfBuf(nCh) == -1)
		{
			ShowErrMsg("E_US_SEIZURE_ACK_BUSY", NULL, "SsmClearRxDtmfBuf");
		}
		//go on-hook 
		if(SsmHangup(nCh) == -1)
		{
			ShowErrMsg("E_US_SEIZURE_ACK_BUSY", NULL, "SsmHangup");
		}

		memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH);		//clear CallerId
		memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH);		//clear CalledId

		ChInfo[nCh].nLinkToCh = -1;
		ChInfo[nCh].nStatus = TRUNK_IDLE;
		break;
	case E_US_PICKUP:			//called station go off-hook
		//stop playback of background music 
		nPlayResult = SsmCheckPlay(nCh);

		if(nPlayResult != -1)
		{
			if(nPlayResult == 0)
			{
				if(SsmStopPlayFile(nCh) == -1)
				{
					ShowErrMsg("E_US_PICKUP", NULL, "SsmStopPlayFile");
				}
			}
		}
		else
		{
			ShowErrMsg("E_US_PICKUP", NULL, "SsmCheckPlay");
		}

		//build bus connection 
		if(SsmTalkWith(nCh, ChInfo[nCh].nLinkToCh) == -1)
		{
			ShowErrMsg("E_US_PICKUP", NULL, "SsmTalkWith");
		}

		ChInfo[nCh].nStatus = TRUNK_CONNECTED;
		break;
	case E_MSG_RELEASE:
		if(ChInfo[nCh].nStatus == TRUNK_FLASHING)
		{
			//stop playback of background music 
			nPlayResult = SsmCheckPlay(nCh);
			
			if(nPlayResult != -1)
			{
				if(nPlayResult == 0)
				{
					if(SsmStopPlayFile(nCh) == -1)
					{
						ShowErrMsg("E_MSG_RELEASE", "TRUNK_FLASHING", "SsmStopPlayFile");
					}
				}
			}
			else
			{
				ShowErrMsg("E_MSG_RELEASE", "TRUNK_FLASHING", "SsmCheckPlay");
			}
		}
		
		//clear DTMF buffer 
		if(SsmClearRxDtmfBuf(nCh) == -1)
		{
			ShowErrMsg("E_MSG_RELEASE", NULL, "SsmClearRxDtmfBuf");
		}
		//go on-hook 
		if(SsmHangup(nCh) == -1)
		{
			ShowErrMsg("E_MSG_RELEASE", NULL, "SsmHangup");
		}

		memset(ChInfo[nCh].szCallerId, '\0', sizeof(char)*NUM_LENGTH);		//clear CallerId
		memset(ChInfo[nCh].szCalleeId, '\0', sizeof(char)*NUM_LENGTH);		//clear CalledId

		ChInfo[nCh].nLinkToCh = -1;
		ChInfo[nCh].nStatus = TRUNK_IDLE;
		break;
	case E_MSG_FLASH:
		GetCurrentDirectory(MAX_PATH, szVoicePath);
		strcat(szVoicePath, "\\bgmusic.wav");
		
		//play background music in call transfer waiting
		if(SsmPlayFile(nCh, szVoicePath, -1, 0, 0xffffffff) == -1)
		{
			ShowErrMsg("E_MSG_FLASH", NULL, "SsmPlayFile");
		}
		
		ChInfo[nCh].nStatus = TRUNK_FLASHING;
		break;
	case E_MSG_CONNECT:
		//stop playback of background music 
		ChInfo[nCh].nLinkToCh = lParam;
		nPlayResult = SsmCheckPlay(nCh);
		
		if(nPlayResult != -1)
		{
			if(nPlayResult == 0)
			{
				if(SsmStopPlayFile(nCh) == -1)
				{
					ShowErrMsg("E_MSG_CONNECT", NULL, "SsmStopPlayFile");
				}
			}
		}
		else
		{
			ShowErrMsg("E_MSG_CONNECT", NULL, "SsmCheckPlay");
		}

		ChInfo[nCh].nStatus = TRUNK_CONNECTED;
		break;
	default:
		break;
	}
}

void CPbxDlg::ShowErrMsg(LPCTSTR lpszEventText, LPCTSTR lpszStatusText, LPCTSTR lpszFunctionText)
{
	char szErrMsg[300];
	if(lpszStatusText == NULL)
	{
		wsprintf(szErrMsg,"In event%s, call of %s failed",lpszEventText,lpszFunctionText);
	}
	else
	{
		wsprintf(szErrMsg,"In event %s, in state %s ,call of %s failed",lpszEventText,lpszStatusText,lpszFunctionText);
	}
	AfxMessageBox(szErrMsg);
}

⌨️ 快捷键说明

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