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

📄 pbxdlg.cpp

📁 三汇CTI示例程序源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			case PEND_SsxUnusable:
				wsprintf(cNewStat,"Unavailable");	
				break;

			case PEND_CircuitReset:
				wsprintf(cNewStat,"-1");
				break;

			case SS1OUT_TALKING_REMOTE_HANGUPED:
				wsprintf(cNewStat,"CalleeHangup");
				break;
			
			case SS1OUT_NOANSWER:
				wsprintf(cNewStat,"WaitCalleeHangupTimeOut");
				break;
			
			case SS1OUT_NOBWDACK:
				wsprintf(cNewStat,"WaitSeizureAnswerTimeOut");
				break;
			
			case SS1OUT_DIALING_BWD_HANGUP:
				wsprintf(cNewStat,"Backward disconnect Signal Received");
				break;
			
			case SS1OUT_BWD_A5:
				wsprintf(cNewStat,"A=5(UNN)Received");
				break;
			
			case SS1OUT_BWD_KB5:
				wsprintf(cNewStat,"KB=5(UNN)Received");
				break;
			
			case SS1OUT_BWD_KB2:
				wsprintf(cNewStat,"Subscriber, local busy");
				break;
			
			case SS1OUT_BWD_KB3:
				wsprintf(cNewStat,"subscriber, toll busy");
				break;
			
			case SS1OUT_BWD_A4:
				wsprintf(cNewStat,"Key congested");
				break;
			
			case SS1OUT_BWD_KB4:
				wsprintf(cNewStat,"KB=4 (key congested) received");
				break;
			
			case SS1OUT_TIMEOUT_BWD_A:
				wsprintf(cNewStat,"wait for backward group A signal is overtime");
				break;
			
			case SS1OUT_TIMEOUT_BWD_A_STOP:
				wsprintf(cNewStat,"Wait for backward group A to be stopped is overtime ");
				break;
			
			case SS1OUT_TIMEOUT_BWD_KB:
				wsprintf(cNewStat,"Wait for backward KB signal is overtime");
				break;
			
			case SS1OUT_TIMEOUT_BWD_KB_STOP:
				wsprintf(cNewStat,"Wait for KB signal to be stopped is overtime ");
				break;
			
			case SS1OUT_TIMEOUT_CALLERID_BWD_A1:
				wsprintf(cNewStat,"undefined backward group A singal received ");
				break;
			
			case SS1OUT_TIMEOUT_CALLERID_BWD_A1_STOP:
				wsprintf(cNewStat,"wait for backward Group A signal to be stopped in transmission of CallerId is overtime ");
				break;
			
			case SS1OUT_UNDEFINED_CALLERID_BWD_A:
				wsprintf(cNewStat,"undefined backward Group A received in transmission of CallerId ");
				break;
			
			case SS1OUT_UNDEFINED_BWD_A:
				wsprintf(cNewStat,"undefined backward Group A received ");
				break;
			
			case SS1OUT_UNDEFINED_BWD_KB:
				wsprintf(cNewStat,"undefined KB received ");
				break;
			case ISDN_CALLOVER:				
				wsprintf(cNewStat,"ISDN: remote end take on-hook");
				break;
			case ISDN_WAIT_RELEASE:				
				wsprintf(cNewStat,"ISDN: wait for release");
				break;
			case ISDN_HANGING:					
				wsprintf(cNewStat,"ISDN: disconnecting");
				break;
			case ISDN_RELEASING:				
				wsprintf(cNewStat,"ISDN:in release");
				break;

			case ISDN_UNALLOCATED_NUMBER:		
				wsprintf(cNewStat,"ISDN:unallocated number received");
				break;
			case ISDN_NETWORK_BUSY:				
				wsprintf(cNewStat,"ISDN: network busy");
				break;
			case ISDN_CIRCUIT_NOT_AVAILABLE:		
				wsprintf(cNewStat,"ISDN:unavailable circuit ");
				break;
			case ISUP_HardCircuitBlock:		
				wsprintf(cNewStat,"ISUP:hardware blocked");
				break;
			case ISUP_RemoteSuspend:		
				wsprintf(cNewStat,"ISUP: remote subscriber take on-hook");
				break;
			}
			m_ChList.GetItemText(ch, ITEM_PendReason, cOldStat ,600);
			if( strcmp(cOldStat,cNewStat) )
			{
				m_ChList.SetItemText( ch, ITEM_PendReason, cNewStat );
			}
		}
		else
		{
		
		}

		switch(nNewChState)
		{
		case S_CALL_STANDBY:
			if(ChInfo[ch].nChType == 2)
			{
				switch( ChInfo[ch].Step )
				{
				case USER_TALKING: // user channel hangup first
					nToTrkCh = ChInfo[ch].nToTrkCh;
					SsmStopTalkWith(nToTrkCh, ch);
					SsmHangup(nToTrkCh);					
					ChInfo[ch].Step = USER_IDLE;
					ChInfo[ ChInfo[ch].nToTrkCh ].nToUserCh = -1;
  					ChInfo[ch].nToTrkCh = -1;
					break;
					
				case USER_WAIT_HANGUP: // SS7 channel wait user channel hangup
					SsmStopSendTone(ch);		//stop sending busy tone
					SsmClearRxDtmfBuf(ch);
					ChInfo[ch].InUse = 0;
					ChInfo[ ChInfo[ch].nToTrkCh ].nToUserCh = -1;
					ChInfo[ch].nToTrkCh = -1;
					ChInfo[ch].Step = USER_IDLE;
					break;
				
				case USER_WAIT_PICKUP:
					break;

				case USER_DIALING:
				case USER_WAIT_REMOTE_PICKUP:
					nToTrkCh = ChInfo[ch].nToTrkCh;
					SsmHangup(nToTrkCh);					
					ChInfo[ch].Step = USER_IDLE;
					ChInfo[ ChInfo[ch].nToTrkCh ].nToUserCh = -1;
					ChInfo[ch].nToTrkCh = -1;
					break;


				default:
					if( ChInfo[ch].Step != USER_IDLE)
					{
						SsmStopSendTone(ch);
						SsmClearRxDtmfBuf(ch);
						ChInfo[ch].Step = USER_IDLE;
					}
					break;
				}
			}
			else 
			{
				if(ChInfo[ch].nToUserCh !=-1)
				{
					SsmStopRing(ChInfo[ch].nToUserCh);
					//SsmStopSendTone(ChInfo[ch].nToUserCh);					//send ring-echo tone
					ChInfo[ChInfo[ch].nToUserCh].nToTrkCh = -1;
					ChInfo[ch].nToUserCh = -1;					
				}
			}
			break;

		case S_CALL_RINGING: // SS7 channel is call in : ring
			SsmGetPhoNumStr( ch, szPhoNum);//add by wj
			SsmGetCallerId(ch, ChInfo[ch].pCallerId.GetBuffer(50));//add by yxd
			if( (nToUserCh = PhoNumToUserCh(szPhoNum)) != -1)
			{
				if(ChInfo[ch].Step == USER_IDLE )
				{
					//SsmPickup(ch);
					SsmStartRing(nToUserCh);
					SsmSendTone(ch,2);					//send ring-echo tone
					ChInfo[nToUserCh].Step = USER_WAIT_PICKUP; // call in: wait user chanbel pickup
					ChInfo[nToUserCh].nToTrkCh = ch;
					ChInfo[ch].nToUserCh = nToUserCh;	
				}
			}
			else SsmHangup(ch);//end by wj
			break;
			
		case S_CALL_PICKUPED:
			if(SsmGetChType(ch) == 2 )
			{
				switch( ChInfo[ch].Step )
				{
				case USER_WAIT_PICKUP:					
					SsmStopRing(ch);
					SsmPickup(ChInfo[ch].nToTrkCh);
					SsmStopSendTone(ChInfo[ch].nToTrkCh);
					ChInfo[ch].Step = USER_CONNECT;
					break;

				case USER_IDLE:				
					strcpy(ChInfo[ch].pPhoNumBuf,"");
					SsmSendTone(ch,0);					//send dial tone
					ChInfo[ch].dwTimeOut = 0;
					ChInfo[ch].Step = USER_GET_PHONE_NUM_0;
//					m_ChList.SetItemText( ch, ITEM_PendReason, "" );//yxd
					break;

				case USER_GET_PHONE_NUM_0:
					if( SsmGetRxDtmfLen(ch) >= 1 )						//dtmf key detected
					{
						SsmStopSendTone(ch);						//stop sending dial tone
						ChInfo[ch].dwTimeOut = 0;
						ChInfo[ch].Step = USER_GET_PHONE_NUM_2;
					}
					else if(++ChInfo[ch].dwTimeOut > 200)				// 10 second time out, no key detected
					{
						SsmStopSendTone(ch);						//stop sending dial tone
						SsmSendTone(ch,1);						//send busy tone
						ChInfo[ch].dwTimeOut = 0;
						ChInfo[ch].Step = USER_WAIT_HANGUP;
					}
					break;
		
				case USER_GET_PHONE_NUM_2:
					SsmGetDtmfStr(ch,ChInfo[ch].pPhoNumBuf);		//retrieve phone num					
					ChInfo[ch].PhoNumLen = SsmGetRxDtmfLen(ch); 
					ChInfo[ch].pPhoNumBuf[ ChInfo[ch].PhoNumLen ] = '\0';
					if((nToTrkCh=SsmSearchIdleCallOutCh(62,0)) == -1)		//no idle trunk channel available
					{
						SsmSendTone(ch,1);				
						ChInfo[ch].Step = USER_WAIT_HANGUP;
					}
					else 
					{
						SsmPickup(nToTrkCh);
						SsmSetTxCallerId(nToTrkCh, ChInfo[ch].szUserNumber);
						SsmAutoDial(nToTrkCh, ChInfo[ch].pPhoNumBuf);
						ChInfo[ch].nToTrkCh = nToTrkCh; 
						ChInfo[nToTrkCh].nToUserCh = ch;
						ChInfo[ch].Step = USER_DIALING;
					}
					
					break;
					
				case USER_DIALING:					
					nDialResult = SsmChkAutoDial(ChInfo[ch].nToTrkCh);
					switch(nDialResult)
					{
					case 1:		//dialing 
						SsmGetDtmfStr(ch,ChInfo[ch].pPhoNumBuf);		//retrieve phone num
						nPhoNumLen = SsmGetRxDtmfLen(ch);
						ChInfo[ch].pPhoNumBuf[nPhoNumLen] = '\0';
						if(nPhoNumLen > ChInfo[ch].PhoNumLen )
						{
							SsmAppendPhoNum(ChInfo[ch].nToTrkCh,
								&ChInfo[ch].pPhoNumBuf[ChInfo[ch].PhoNumLen] );
							ChInfo[ch].PhoNumLen = nPhoNumLen;
						}
						break;

					case 2:		//ringback tone detected and channel is still in autodial state 
						SsmSendTone(ch,2);
//						ChInfo[ch].Step = USER_WAIT_REMOTE_PICKUP;						
						break;

					case -1:	//failed call of the function 
					case 0:		//idle channel which is not in autodial state 
					case 3:		//no dial tone 
					case 4:		//busy tone detected
					case 5:		//silence after ringback tone 
					case 6: 	//silence detected on the line 
					case 10:	//no answer 
						/*
						SsmSendTone(ch,1); // send busy tone
						SsmPickup(ChInfo[ch].nToTrkCh);
						ChInfo[ch].Step = USER_WAIT_HANGUP;*/
						break;

					case 7:  	//Voice is detected and autodial is complete. 
					case 8:  	//answer signal of F1 frequency is detected and autodail is complete.
					case 9:  	//answer signal of F2 frequency is detected and autodail is complete. 
						//Info[ch].Step = USER_CONNECT;
						break;					
					}
					
					nChState = SsmGetChState(ChInfo[ch].nToTrkCh );
					if( nChState == S_CALL_TALKING )
					{
						SsmStopSendTone(ch);
						ChInfo[ch].Step = USER_CONNECT;
					}
					break;
							

				case USER_CONNECT:
					SsmTalkWith(ChInfo[ch].nToTrkCh, ch);					
					SsmClearRxDtmfBuf(ch);
					ChInfo[ch].Step = USER_TALKING;
					break;
				}
			}
			break;
			
		case S_CALL_TALKING:			
			break;	
			
		case S_CALL_PENDING:
			if ( SsmGetChType(ch) == 8 )
			{
				nToUserCh = ChInfo[ch].nToUserCh;
				if( nToUserCh != -1 )
				{
					switch( ChInfo[nToUserCh].Step)
					{
					case USER_TALKING :
						SsmHangup(ch);
						SsmStopTalkWith(ch,nToUserCh);
						SsmSendTone(nToUserCh,1);		//send busy tone
						ChInfo[nToUserCh].Step = USER_WAIT_HANGUP;
						break;
					
					case USER_WAIT_PICKUP:
						SsmHangup(ch);
						SsmStopSendTone(ch);
						SsmStopRing(nToUserCh);
						break;
					
					case USER_DIALING:
						SsmHangup(ch);
						SsmSendTone(nToUserCh,1);		//send busy tone
						ChInfo[nToUserCh].Step = USER_WAIT_HANGUP;
						break;
					}
				}
			}
			switch( SsmGetPendingReason(ch) )
			{
			case PEND_WaitBckStpMsg:
				SsmGetPhoNumStr( ch, szPhoNum);
				if( (nToUserCh = PhoNumToUserCh(szPhoNum)) != -1)
				{
					if(ChInfo[ch].Step == USER_IDLE )
					{
						//SsmPickup(ch);
						SsmStartRing(nToUserCh);
						SsmSendTone(ch,2);					//send ring-echo tone
 						ChInfo[nToUserCh].Step = USER_WAIT_PICKUP; // call in: wait user chanbel pickup
						ChInfo[nToUserCh].nToTrkCh = ch;
						ChInfo[ch].nToUserCh = nToUserCh;	
						SsmSetKB(ch,6);
					}
					SsmSetKB(ch,2);
				}
				else SsmSetKB(ch,5);
				break;

			case ANALOGOUT_NO_DIALTONE:
			case ANALOGOUT_BUSYTONE:
			case ANALOGOUT_ECHO_NOVOICE:
			case ANALOGOUT_NOANSWER:
			case ANALOGOUT_TALKING_REMOTE_HANGUPED:
			case ANALOGOUT_NOVOICE:

			

			case SS1IN_BWD_KB5:
			case PEND_RemoteHangupOnTalking:			

			case PEND_AutoDialFailed:					
			case PEND_SsxUnusable:					
			case PEND_CircuitReset:					

			case SS1OUT_TALKING_REMOTE_HANGUPED:		
			case SS1OUT_NOANSWER:					
			case SS1OUT_NOBWDACK:						
			case SS1OUT_DIALING_BWD_HANGUP:				
			case SS1OUT_BWD_A5:						
			case SS1OUT_BWD_KB5:							
			case SS1OUT_BWD_KB2:						
			case SS1OUT_BWD_KB3:							
			case SS1OUT_BWD_A4:						
			case SS1OUT_BWD_KB4:							
			case SS1OUT_TIMEOUT_BWD_A:					
			case SS1OUT_TIMEOUT_BWD_A_STOP:				
			case SS1OUT_TIMEOUT_BWD_KB:					
			case SS1OUT_TIMEOUT_BWD_KB_STOP:			
			case SS1OUT_TIMEOUT_CALLERID_BWD_A1:			
			case SS1OUT_TIMEOUT_CALLERID_BWD_A1_STOP:	
			case SS1OUT_UNDEFINED_CALLERID_BWD_A:		
			case SS1OUT_UNDEFINED_BWD_A:					
			case SS1OUT_UNDEFINED_BWD_KB:				
			case ISDN_CALLOVER:					
			case ISDN_WAIT_RELEASE:			
			case ISDN_HANGING:					
			case ISDN_RELEASING:			

			case ISDN_UNALLOCATED_NUMBER:		
			case ISDN_NETWORK_BUSY:				
			case ISDN_CIRCUIT_NOT_AVAILABLE:	
			case ISUP_HardCircuitBlock:
			case ISUP_RemoteSuspend:
				nToUserCh = ChInfo[ch].nToUserCh;
				if( nToUserCh != -1 )
				{
					switch( ChInfo[nToUserCh].Step)
					{
					case USER_TALKING :
						SsmHangup(ch);
						SsmStopTalkWith(ch,nToUserCh);
						SsmSendTone(nToUserCh,1);		//send busy tone
						ChInfo[nToUserCh].Step = USER_WAIT_HANGUP;
						break;
					
					case USER_WAIT_PICKUP:
						SsmHangup(ch);
						SsmStopSendTone(ch);
						SsmStopRing(nToUserCh);
						break;
					
					case USER_DIALING:
						SsmHangup(ch);
						SsmSendTone(nToUserCh,1);		//send busy tone
						ChInfo[nToUserCh].Step = USER_WAIT_HANGUP;
						break;
					}
				}
				break;
			}			
			break;
			
		case S_CALL_WAIT_REMOTE_PICKUP:
			break;
			
		case S_CALL_LocalBlock:
			break;
			
		case S_CALL_RemoteBlock:
			break;

		case S_CALL_UNAVAILABLE:
			nToUserCh = ChInfo[ch].nToUserCh;
			if( nToUserCh != -1 )
			{
				switch( ChInfo[nToUserCh].Step)
				{
				case USER_TALKING :
					SsmHangup(ch);
					SsmStopTalkWith(ch,nToUserCh);
					SsmSendTone(nToUserCh,1);		//send busy tone
					ChInfo[nToUserCh].Step = USER_WAIT_HANGUP;
					break;
				
				case USER_WAIT_PICKUP:
					SsmHangup(ch);
					SsmStopSendTone(ch);
					SsmStopRing(nToUserCh);
					break;
				
				case USER_DIALING:
					SsmHangup(ch);
					SsmStopSendTone(ch);
					SsmStopRing(nToUserCh);
					break;
				}
			}
			break;
		}
	}

	CDialog::OnTimer(nIDEvent);
}

int CPbxDlg::ReadConfigFile(char *fnConfig)
{
	CFileFind ff;
	LPCTSTR lpAppName = "PBX";
	char KeyName[50];
	int i,ch;

	
	char szConfig[200];
	GetCurrentDirectory(200,szConfig);
	strcat(szConfig,"\\");
	strcat(szConfig,fnConfig);

	if(ff.FindFile(fnConfig,0) == 0)
	{
		for( i=0,ch = 0; ch < nMaxCh; ch++)	
		{
			if( SsmGetChType(ch ) != 2 ) continue;
			wsprintf(KeyName,"20%02d",i);
			strcpy(PhoNumList[i].szPhoNum ,KeyName);
			PhoNumList[i++].nCh = ch;
		}
	}	
	else
	{		
		for( i=0,ch = 0; ch < nMaxCh; ch++)	
		{
			if( SsmGetChType(ch ) != 2 ) continue;
			wsprintf(KeyName,"UserChPhoNum[%d]",i);
			GetPrivateProfileString(lpAppName, KeyName, "XXXXXXXX", PhoNumList[i].szPhoNum, 16, szConfig);
			PhoNumList[i++].nCh = ch;
		}
	} 
	return 1;
}

void CPbxDlg::OnOK() 
{
	CDialog::OnOK();
}

void CPbxDlg::OnDestroy() 
{
	
	CDialog::OnDestroy();
	SsmCloseCti();
	
}

⌨️ 快捷键说明

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