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

📄 form1.cs

📁 三汇CTI示例程序源码
💻 CS
📖 第 1 页 / 共 5 页
字号:
		}

		
		void UpdateChList(int nCh)
		{
			string CNewState="";			//new channel state
			StringBuilder szTmpStr = new StringBuilder (201);		//DTMF buffer
	
			switch(ChInfo[nCh].nStatus)
			{
				case APP_USER_STATUS.USER_IDLE :				CNewState = "Idle";					break;
				case APP_USER_STATUS.USER_LOCAL_RING:			CNewState = "Ringing";					break;
				case APP_USER_STATUS.USER_GET_1STDTMF:			CNewState = "Select call type";			break;
				case APP_USER_STATUS.USER_GET_DTMF:				CNewState = "Wait DTMF";		break;
				case APP_USER_STATUS.USER_REQ_USER:				CNewState = "Wait response";				break;
				case APP_USER_STATUS.USER_RING_BACK:			CNewState = "Ring back";					break;
				case APP_USER_STATUS.USER_REQ_TRUNK:			CNewState = "Station request trunk";			break;
				case APP_USER_STATUS.USER_DIALOUT:				CNewState = "Send Dtmf to trunk";			break;
				case APP_USER_STATUS.USER_WAIT_REMOTE_PICKUP:	CNewState = "Wait called party's answer";			break;
				case APP_USER_STATUS.USER_TALKING:				CNewState = "Talking";					break;
				case APP_USER_STATUS.USER_WAIT_HANGUP:			CNewState = "Wait hangup";				break;
				case APP_USER_STATUS.TRUNK_IDLE:				CNewState = "Idle";					break;
				case APP_USER_STATUS.TRUNK_WAIT_1STNUM:			CNewState = "Wait dialing";				break;
				case APP_USER_STATUS.TRUNK_DIALING:				CNewState = "Dialing";				break;
				case APP_USER_STATUS.TRUNK_WAIT_REMOTE_PICKUP:	CNewState = "Ring back";					break;
				case APP_USER_STATUS.TRUNK_WAIT_ACTUAL_PICKUP:	CNewState = "Ringing";					break;
				case APP_USER_STATUS.TRUNK_WAIT_SELECTION:		CNewState = "Dial extension";				break;
				case APP_USER_STATUS.TRUNK_REQ_USER:			CNewState = "Wait dial-up result";			break;
				case APP_USER_STATUS.TRUNK_RING_BACK:			CNewState = "Play backgroun music";				break;
				case APP_USER_STATUS.TRUNK_CONNECTED:			CNewState = "Talking";					break;
				case APP_USER_STATUS.USER_F_GET_DTMF:			CNewState = "Dial number of extension to be transferred";			break;
				case APP_USER_STATUS.USER_F_REQ_USER:			CNewState = "Wait extension's response";			break;
				case APP_USER_STATUS.USER_F_RING_BACK:			CNewState = "Ring back";					break;
				case APP_USER_STATUS.USER_F_TALKING:			CNewState = "Talking";			break;
				case APP_USER_STATUS.USER_F_OPERATE:			CNewState = "Wait next step";		break;
				case APP_USER_STATUS.USER_F_WAIT_TALK:			CNewState = "Wait connection with destination phone";	break;
				case APP_USER_STATUS.TRUNK_FLASHING:			CNewState = "wait connection with destination phone";	break;
				default:
					break;
			}
	
			//to retrieve DTMF, size of dtmf buffer can be set in configuration file, with default value of 200 characters 
			if(SsmGetDtmfStr(nCh, szTmpStr) == -1)
			{
				MessageBox.Show ("call of functino SsmGetDtmfStr() failed in function UpdateChList()");
			}

			//update channel information in list 
			ChList.set_TextMatrix (ChInfo[nCh].nIndex, 2, CNewState);								//display channel number 
			ChList.set_TextMatrix (ChInfo[nCh].nIndex, 3, ChInfo[nCh].szCallerId.ToString ());		//display CallerId 
			ChList.set_TextMatrix (ChInfo[nCh].nIndex, 4, ChInfo[nCh].szCalleeId.ToString ());		//display CalledId		
			ChList.set_TextMatrix (ChInfo[nCh].nIndex, 5, szTmpStr.ToString ());					//显示DTMFdisplay DTMF

			return;
		}


		
		[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name="FullTrust")]
		protected override void WndProc(ref Message m) 
		{
			int		nEventCode; //event ID
			int		nCh=-1;		//channel ID
			int		nCheckChNum;
			
			if(m.Msg > WM_USER)
			{
				nEventCode = m.Msg - WM_USER;
				switch(nEventCode)
				{
					case (int)Event.E_SYS_TIMEOUT:
						//to identify channel number according to timer ID 
						for(nCheckChNum=0; nCheckChNum<nMaxCh; nCheckChNum++)
						{
							if(m.WParam.ToInt32 ()  == ChInfo[nCheckChNum].nTimer)
							{
								nCh = nCheckChNum;
								
								switch(ChInfo[nCh].nChType)
								{
									case 0:
										TrunkProc(nEventCode, nCh, m.LParam.ToInt32 () );
										UpdateChList(nCh);
										break;
									case 2:
										UserProc(nEventCode, nCh, m.LParam.ToInt32 () );
										UpdateChList(nCh);
										break;
									default:
										break;
								}
								break;
							}
						}
			
						if(nCheckChNum == nMaxCh)
						{
							base.WndProc(ref m); //CDialog::WindowProc(message, wParam, lParam);
						}
						break;
					case (int)Event.E_CHG_HookState:
					case (int)Event.E_CHG_RcvDTMF:
					case (int)Event.E_CHG_FlashCount:
					case (int)Event.E_CHG_ChState:
					case (int)EventMsg.E_US_SEIZURE:
					case (int)EventMsg.E_US_RELEASE:
					case (int)EventMsg.E_US_SEIZURE_ACK_IDLE:
					case (int)EventMsg.E_US_SEIZURE_ACK_BUSY:
					case (int)EventMsg.E_US_PICKUP:
					case (int)EventMsg.E_US_SEIZURE_TK:
					case (int)EventMsg.E_TK_SEIZURE_TK_ACK_IDLE:
					case (int)EventMsg.E_TK_SEIZURE_TK_ACK_BUSY:
					case (int)EventMsg.E_TK_RELEASE:
					case (int)EventMsg.E_US_DTMF2TK:
					case (int)EventMsg.E_TK_DIAL_OK:
					case (int)EventMsg.E_TK_DIAL_FAIL:
					case (int)EventMsg.E_TK_REMOTE_NOANSWER:
					case (int)EventMsg.E_TK_REMOTE_PICKUP:
					case (int)EventMsg.E_MSG_RELEASE:
					case (int)EventMsg.E_MSG_FLASH:
					case (int)EventMsg.E_MSG_CONNECT:
					case (int)EventMsg.E_MSG_HANGUP:
					case (int)EventMsg.F_US_SEIZURE:
						nCh = m.WParam.ToInt32 () ;
						//deal with station and trunk channels
						switch(ChInfo[nCh].nChType)
						{
							case 0:
								TrunkProc(nEventCode, nCh, m.LParam.ToInt32 () );
								UpdateChList(nCh);
								break;
							case 2:
								UserProc(nEventCode, nCh, m.LParam.ToInt32 () );
								UpdateChList(nCh);
								break;
							default:
								break;
						}

						break;
					default:
						base.WndProc(ref m);		
						break;
				}
	


			}
			base.WndProc(ref m);
		}


		

		void UserProc(int event1, int wParam, int lParam)
		{
            int nCh;						//number of station channel
			int dwDtmfLen;					//length of DTMF received
			char dwDtmfNum;					// DTMF received
			int nHook;						//nHook:0---station channel go on-hook; 1---station channel go off-hook 
			int nToneType = -2;				//tone type
			int nToneChResult;				//tone detection result
			int nPlayResult;				//return value of function SsmCheckPlay()

			nCh = wParam;

			switch(event1)
			{
				/*+++++++++driver message+++++++++*/
				case (int)Event.E_CHG_HookState:		//station hook change event
					nHook = lParam;
					if(nHook == 0)			//station channel go on-hook 
					{
						switch(ChInfo[nCh].nStatus)
						{
						case APP_USER_STATUS.USER_GET_1STDTMF:
							//close T1
							if(ShDll.SsmStopTimer(ChInfo[nCh].nTimer) == -1)	
							{
								ShowErrMsg("E_CHG_HookState", "USER_GET_1STDTMF", "SsmStopTimer");
							}
							break;
						case APP_USER_STATUS.USER_GET_DTMF:
							//close T2
							if(ShDll.SsmStopTimer(ChInfo[nCh].nTimer) == -1)	
							{
								ShowErrMsg("E_CHG_HookState", "USER_GET_DTMF", "SsmStopTimer");
							}
							break;
						case APP_USER_STATUS.USER_REQ_USER:
							//send E_US_RELEASE
							SendMessage(hwnd ,WM_USER+(int)EventMsg.E_US_RELEASE, (IntPtr)ChInfo[nCh].nLinkToCh,(IntPtr)nCh);
							break;
						case APP_USER_STATUS.USER_RING_BACK:
							//send E_US_RELEASE to channel Ch-k
							SendMessage(hwnd,WM_USER+(int)EventMsg.E_US_RELEASE, (IntPtr)ChInfo[nCh].nLinkToCh, (IntPtr)nCh);
							break;
						case APP_USER_STATUS.USER_TALKING:
							//tear down bus connection
							if(ShDll.SsmStopTalkWith(nCh, ChInfo[nCh].nLinkToCh) == -1)		
							{
								ShowErrMsg("E_CHG_HookState", "USER_TALKING", "SsmStopSendTone");
							}
							//to send E_MSG_RELEASE to channel connected
							SendMessage(hwnd,WM_USER+(int)EventMsg.E_MSG_RELEASE, (IntPtr)ChInfo[nCh].nLinkToCh, (IntPtr)nCh);
							break;
						case APP_USER_STATUS.USER_WAIT_HANGUP:
							break;
						case APP_USER_STATUS.USER_REQ_TRUNK:
							break;
						case APP_USER_STATUS.USER_DIALOUT:
							//close T3
							if(ShDll.SsmStopTimer(ChInfo[nCh].nTimer) == -1)	
							{
								ShowErrMsg("E_CHG_HookState", "USER_DIALOUT", "SsmStopTimer");
							}
							//send E_TK_RELEASE
							SendMessage(hwnd,WM_USER+(int)EventMsg.E_TK_RELEASE, (IntPtr)ChInfo[nCh].nLinkToCh, (IntPtr)nCh);
							break;
						case APP_USER_STATUS.USER_WAIT_REMOTE_PICKUP:
							//send E_TK_RELEASE
							SendMessage(hwnd,WM_USER+(int)EventMsg.E_TK_RELEASE, (IntPtr)ChInfo[nCh].nLinkToCh, (IntPtr)nCh);
							break;
						case APP_USER_STATUS.USER_F_WAIT_TALK:
							//stop playback of background music 
							nPlayResult = ShDll.SsmCheckPlay(nCh);
							if(nPlayResult != -1)
							{
								if(nPlayResult == 0)
								{
									if(ShDll.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(hwnd,WM_USER+(int)EventMsg.E_MSG_HANGUP, (IntPtr)ChInfo[nCh].nLinkToCh, (IntPtr)nCh);
							break;
						case APP_USER_STATUS.USER_F_GET_DTMF:
							//close T4
							if(ShDll.SsmStopTimer(ChInfo[nCh].nTimer) == -1)	
							{
								ShowErrMsg("E_CHG_HookState", "USER_F_GET_DTMF", "SsmStopTimer");
							}
							//E_MSG_RELEASE→ch0
							if(!ChInfo[nCh].bSubmiteChHookFlag)
							{
								SendMessage(hwnd,WM_USER+(int)EventMsg.E_MSG_RELEASE, (IntPtr)ChInfo[nCh].nSaveSubmiteCh, (IntPtr)nCh);
							}
							break;
							case APP_USER_STATUS.USER_F_REQ_USER:
							//E_MSG_RELEASE→ch0
							if(!ChInfo[nCh].bSubmiteChHookFlag)
							{
								SendMessage(hwnd,WM_USER+(int)EventMsg.E_MSG_RELEASE, (IntPtr)ChInfo[nCh].nSaveSubmiteCh, (IntPtr)nCh);
							}
							break;
						case APP_USER_STATUS.USER_F_RING_BACK:
							//E_US_RELEASE→ch2
							SendMessage(hwnd,WM_USER+(int)EventMsg.E_US_RELEASE, (IntPtr)ChInfo[nCh].nLinkToCh, (IntPtr)nCh);	
							//E_MSG_RELEASE→ch0
							if(!ChInfo[nCh].bSubmiteChHookFlag)
							{
								SendMessage(hwnd,WM_USER+(int)EventMsg.E_MSG_RELEASE, (IntPtr)ChInfo[nCh].nSaveSubmiteCh, (IntPtr)nCh);	
							}
							break;
						case APP_USER_STATUS.USER_F_TALKING:
							//tear down bus connection between ch1 and ch2
							if(ShDll.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(hwnd,WM_USER+(int)EventMsg.E_MSG_CONNECT, (IntPtr)ChInfo[nCh].nSaveSubmiteCh, (IntPtr)ChInfo[nCh].nLinkToCh);

								//to link original calling party and extenion transferred (ch0,ch2)
								if(ShDll.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(hwnd,WM_USER+(int)EventMsg.E_MSG_RELEASE, (IntPtr)ChInfo[nCh].nLinkToCh, (IntPtr)nCh);
							}
							break;
						case APP_USER_STATUS.USER_F_OPERATE:
							if(!ChInfo[nCh].bSubmiteChHookFlag)
							{
								//E_MSG_RELEASE→ch0
								SendMessage(hwnd,WM_USER+(int)EventMsg.E_MSG_RELEASE, (IntPtr)ChInfo[nCh].nSaveSubmiteCh, (IntPtr)nCh);
							}
							break;
						default:
							break;
						}//end of switch for ChInfo[nCh].nStatus

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

						//initialize channel concerned parameters
						ChInfo[nCh].nStatus = APP_USER_STATUS.USER_IDLE;
						ChInfo[nCh].bPressFlag = false;
						ChInfo[nCh].bSubmiteChHookFlag = false;
						ChInfo[nCh].nSaveSubmiteCh = -1;
						ChInfo[nCh].nTimer = -1;
						ChInfo[nCh].nLinkToCh = -1;
						ChInfo[nCh].szCallerId = new StringBuilder (20);		//clear CallerId
						ChInfo[nCh].szCalleeId = new StringBuilder (20);		//clear CalledID		
					}
					else if(nHook == 1)	//station goes off-hook
					{
						switch(ChInfo[nCh].nStatus)
						{
						case APP_USER_STATUS.USER_IDLE:
							ChInfo[nCh].szPhoneNumBuf = new StringBuilder (20);// char[20];
							ChInfo[nCh].nStatus = APP_USER_STATUS.USER_GET_1STDTMF;

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

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

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

						switch(dwDtmfNum)
						{
						case '0':
							ChInfo[nCh].szPhoneNumBuf = new StringBuilder (NUM_LENGTH);// char[NUM_LENGTH];

⌨️ 快捷键说明

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