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

📄 pbxdlg.cpp

📁 三汇CTI示例程序源码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
				m_StationCh[nIndex].nLinkToChId = lParam;
				m_StationCh[nIndex].bPressFlag = TRUE;
				int i = FindIndexByStationChId(m_StationCh[nIndex].nLinkToChId);
				strcpy(m_StationCh[nIndex].szCallerId, m_StationCh[i].szStationNum);
				// 发送E_US_SEIZURE_ACK_IDLE
				SendMessage(WM_USER+E_US_SEIZURE_ACK_IDLE, lParam, m_StationCh[nIndex].nChId);
			}
			else
			{
				// 发送E_US_SEIZURE_ACK_BUSY
				SendMessage(WM_USER+E_US_SEIZURE_ACK_BUSY, lParam, m_StationCh[nIndex].nChId);
			}
			break;
		}
	/*+++++++++自定义模拟通道消息+++++++++*/
	case E_TK_SEIZURE_TK_ACK_IDLE:			// 成功占用外线	
		{
			// 送拨号音
			if(SsmSendTone(m_StationCh[nIndex].nChId, 0) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
			// 启动T3:9秒
			if( (m_StationCh[nIndex].nTimer = SsmStartTimer(9000, 1)) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}

			m_StationCh[nIndex].nLinkToChId =lParam;
			m_StationCh[nIndex].nStatus = STATION_DIALOUT_WITH_ANALOG;
			break;	
		}
	case E_TK_SEIZURE_TK_ACK_BUSY:			// 占用外线失败
		{
			// 放忙音
			if(SsmSendTone(m_StationCh[nIndex].nChId, 1) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}

			m_StationCh[nIndex].nStatus = STATION_WAIT_HANGUP;
			break;
		}
	case E_TK_DIAL_OK:
		{
			// 关闭T3
			if(SsmStopTimer(m_StationCh[nIndex].nTimer) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
			// 放回铃音
			if(SsmSendTone(m_StationCh[nIndex].nChId, 2) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
			
			// 获取被叫号码
			if (SsmGetDtmfStr(m_StationCh[nIndex].nChId,m_StationCh[nIndex].szCalleeId) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}

			m_StationCh[nIndex].nStatus = STATION_WAIT_REMOTE_ANALOG_PICKUP;
			break;
		}
	case E_TK_DIAL_FAIL:
		{
			// 检测是否拨号音
			nToneType = 0;
			nToneChResult = SsmChkSendTone(m_StationCh[nIndex].nChId, &nToneType);
			if(nToneChResult != -1)
			{
				if(nToneChResult == 1)
				{
					if(SsmStopSendTone(m_StationCh[nIndex].nChId) == -1)
					{
						AppErrorHandler(m_StationCh[nIndex].nChId);
					}
				}
			}
			else
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
			// 关闭T3
			if(SsmStopTimer(m_StationCh[nIndex].nTimer) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
			// 放忙音
			if(SsmSendTone(m_StationCh[nIndex].nChId, 1) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
			m_StationCh[nIndex].nStatus = STATION_WAIT_HANGUP;
			break;
		}
	case E_TK_REMOTE_NOANSWER:		// 外线无人应答
		{
			// 停回铃音
			if(SsmStopSendTone(m_StationCh[nIndex].nChId) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}

			// 放忙音
			if(SsmSendTone(m_StationCh[nIndex].nChId, 1) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
			
			m_StationCh[nIndex].nStatus = STATION_WAIT_HANGUP;
			break;
		}
	case E_TK_REMOTE_PICKUP:	// 远程摘机
		{
			switch(m_StationCh[nIndex].nStatus)
			{
			case STATION_DIALOUT_WITH_ANALOG:
				{
					// 关闭T3
					if(SsmStopTimer(m_StationCh[nIndex].nTimer) == -1)
					{
						AppErrorHandler(m_StationCh[nIndex].nChId);
					}
					// 连接座席与外线的总线
					if(SsmTalkWith(m_StationCh[nIndex].nChId, m_StationCh[nIndex].nLinkToChId) == -1)
					{
						AppErrorHandler(m_StationCh[nIndex].nChId);
					}
					m_StationCh[nIndex].nStatus = STATION_TALKING;
					break;
				}
			case STATION_WAIT_REMOTE_ANALOG_PICKUP:
				{
					// 停回铃音
					if(SsmStopSendTone(m_StationCh[nIndex].nChId) == -1)
					{
						AppErrorHandler(m_StationCh[nIndex].nChId);
					}
					// 连接总线
					if(SsmTalkWith(m_StationCh[nIndex].nChId, m_StationCh[nIndex].nLinkToChId) == -1)
					{
						AppErrorHandler(m_StationCh[nIndex].nChId);
					}

					m_StationCh[nIndex].nStatus = STATION_TALKING;
					break;
				}
			default:
				break;
			}
			
			// 获取被叫号码
			if (SsmGetDtmfStr(m_StationCh[nIndex].nChId,m_StationCh[nIndex].szCalleeId) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
			break;
		}
	/*+++++++++自定义IP通道消息+++++++*/
	case E_IP_SEIZURE_IP_ACK_IDLE:			// 成功占用IP通道
		{
			// 送拨号音
			if(SsmSendTone(m_StationCh[nIndex].nChId, 0) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
			// 启动T3:9秒
			if( (m_StationCh[nIndex].nTimer = SsmStartTimer(9000, 1)) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
				
			m_StationCh[nIndex].nLinkToChId =lParam;
			m_StationCh[nIndex].nStatus = STATION_DIALOUT_WITH_IP;
			break;
		}
	case E_IP_SEIZURE_IP_ACK_BUSY:			// 占用IP通道失败
		{
			// 放忙音
			if(SsmSendTone(m_StationCh[nIndex].nChId, 1) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
			
			m_StationCh[nIndex].nStatus = STATION_WAIT_HANGUP;
			break;
		}
	case E_IP_DIAL_OK:
		{
			// 关闭T3
			if(SsmStopTimer(m_StationCh[nIndex].nTimer) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
			// 放回铃音
			if(SsmSendTone(m_StationCh[nIndex].nChId, 2) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
			
			// 获取被叫号码
			if (SsmGetDtmfStr(m_StationCh[nIndex].nChId,m_StationCh[nIndex].szCalleeId) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}

			m_StationCh[nIndex].nStatus = STATION_WAIT_REMOTE_IP_PICKUP;
			break;
		}
	case E_IP_DIAL_FAIL:
		{
			// 检测是否拨号音
			nToneType = 0;
			nToneChResult = SsmChkSendTone(m_StationCh[nIndex].nChId, &nToneType);
			if(nToneChResult != -1)
			{
				if(nToneChResult == 1)
				{
					if(SsmStopSendTone(m_StationCh[nIndex].nChId) == -1)
					{
						AppErrorHandler(m_StationCh[nIndex].nChId);
					}
				}
			}
			else
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
			// 关闭T3
			if(SsmStopTimer(m_StationCh[nIndex].nTimer) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
			// 放忙音
			if(SsmSendTone(m_StationCh[nIndex].nChId, 1) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
			m_StationCh[nIndex].nStatus = STATION_WAIT_HANGUP;
			break;
		}
	case E_IP_REMOTE_NOANSWER:		// 外线无人应答
		{
			// 停回铃音
			if(SsmStopSendTone(m_StationCh[nIndex].nChId) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}

			// 放忙音
			if(SsmSendTone(m_StationCh[nIndex].nChId, 1) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
			
			m_StationCh[nIndex].nStatus = STATION_WAIT_HANGUP;
			break;
		}
	case E_IP_REMOTE_PICKUP:	// 远程摘机
		{
			switch(m_StationCh[nIndex].nStatus)
			{
			case STATION_DIALOUT_WITH_IP:
				{
					// 关闭T3
					if(SsmStopTimer(m_StationCh[nIndex].nTimer) == -1)
					{
						AppErrorHandler(m_StationCh[nIndex].nChId);
					}
					// 连接座席与外线的总线
					if(SsmTalkWith(m_StationCh[nIndex].nChId, m_StationCh[nIndex].nLinkToChId) == -1)
					{
						AppErrorHandler(m_StationCh[nIndex].nChId);
					}
					m_StationCh[nIndex].nStatus = STATION_TALKING;
					break;
				}
			case STATION_WAIT_REMOTE_IP_PICKUP:
				{
					// 停回铃音
					if(SsmStopSendTone(m_StationCh[nIndex].nChId) == -1)
					{
						AppErrorHandler(m_StationCh[nIndex].nChId);
					}
					// 连接总线
					if(SsmTalkWith(m_StationCh[nIndex].nChId, m_StationCh[nIndex].nLinkToChId) == -1)
					{
						AppErrorHandler(m_StationCh[nIndex].nChId);
					}

					m_StationCh[nIndex].nStatus = STATION_TALKING;
					break;
				}
			default:
				break;
			}
			
			// 获取被叫号码
			if (SsmGetDtmfStr(m_StationCh[nIndex].nChId, m_StationCh[nIndex].szCalleeId) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}
			break;
		}
	/*+++++++++自定义公共消息+++++++++*/
	case E_MSG_RELEASE:
		{
			switch(m_StationCh[nIndex].nStatus)
			{
			case STATION_TALKING:
				{
					// 放催挂音
					if(SsmSendTone(m_StationCh[nIndex].nChId, 3) == -1)
					{
						AppErrorHandler(m_StationCh[nIndex].nChId);
					}

					m_StationCh[nIndex].nStatus = STATION_WAIT_HANGUP;
					break;
				}
			case STATION_F_WAIT_TALK:
				{ 
					// 停背景音
					nPlayResult = SsmCheckPlay(m_StationCh[nIndex].nChId);
					if(nPlayResult != -1)
					{
						if(nPlayResult == 0)
						{
							if(SsmStopPlayFile(m_StationCh[nIndex].nChId) == -1)
							{
								AppErrorHandler(m_StationCh[nIndex].nChId);
							}
						}
					}
					else
					{
						AppErrorHandler(m_StationCh[nIndex].nChId);
					}
					
					// 连接方挂机,放催挂音
					if(SsmSendTone(m_StationCh[nIndex].nChId, 3) == -1)
					{
						AppErrorHandler(m_StationCh[nIndex].nChId);
					}
					
					m_StationCh[nIndex].nStatus = STATION_WAIT_HANGUP;
					break;
				}
			case STATION_F_TALKING:
				{
					// 放催挂音
					if(SsmSendTone(m_StationCh[nIndex].nChId, 3) == -1)
					{
						AppErrorHandler(m_StationCh[nIndex].nChId);
					}
					
					m_StationCh[nIndex].nLinkToChId = -1;
					m_StationCh[nIndex].nStatus = STATION_F_OPERATE;
					break;
				}
			default:
				break;
			}
			break;
		}
	case E_MSG_FLASH:
		{
			GetCurrentDirectory(MAX_PATH, szVoicePath);
			strcat(szVoicePath, "\\DemoVoc\\bgmusic.wav");

			// 放背景音乐
			if(SsmPlayFile(m_StationCh[nIndex].nChId, szVoicePath, -1, 0, 0xffffffff) == -1)
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}

			m_StationCh[nIndex].nStatus = STATION_F_WAIT_TALK;
			break;
		}
	case E_MSG_CONNECT:
		{
			m_StationCh[nIndex].nLinkToChId = lParam;
			// 停背景音
			nPlayResult = SsmCheckPlay(m_StationCh[nIndex].nChId);
			if(nPlayResult != -1)
			{
				if(nPlayResult == 0)
				{
					if(SsmStopPlayFile(m_StationCh[nIndex].nChId) == -1)
					{
						AppErrorHandler(m_StationCh[nIndex].nChId);
					}
				}
			}
			else
			{
				AppErrorHandler(m_StationCh[nIndex].nChId);
			}

			m_StationCh[nIndex].nStatus = STATION_TALKING;
			break;
		}
	case E_MSG_HANGUP:
		{
			m_StationCh[nIndex].bSubmiteChHookFlag = TRUE;			// 原通话方已挂机
			break;
		}
	default:
		break;
	}	

}

 void CPBXDlg::AnalogProc(UINT event, int nIndex, LPARAM lParam)
{
	CString cString;
	DWORD dwDtmfLen;				// 收到DTMF码的长度
	UCHAR dwDtmfNum;				// 收到DTMF码
	char szVoicePath[MAX_PATH];		// 声音文件目录
	DWORD nChState;					// 模拟通道当前状态
	int nPlayResult;				// 存放SsmCheckPlay的返回值

	switch(event)
	{
	/*+++++++++驱动消息+++++++++*/
	case E_CHG_ChState:
		nChState = lParam & 0xffff;
		switch(m_AnalogCh[nIndex].nStatus)
		{
		case ANALOG_IDLE:
			if(nChState == S_CALL_RINGING)
			{
				//摘机
				if(SsmPickup(m_AnalogCh[nIndex].nChId) == -1)
				{
					AppErrorHandler(m_AnalogCh[nIndex].nChId);
				}
				//获取主叫号码作为显示用,没有在流程图上表示出来
				if(SsmGetCallerId(m_AnalogCh[nIndex].nChId, m_AnalogCh[nIndex].szCallerId) == -1)
				{
					AppErrorHandler(m_AnalogCh[nIndex].nChId);		
				}
				m_AnalogCh[nIndex].nDirection = 1;
				m_AnalogCh[nIndex].nStatus = ANALOG_WAIT_ACTUAL_PICKUP;

				cString.LoadString(IDS_PBX35);
				LogToList(LOGTYPE_INFORMATION, m_AnalogCh[nIndex].nChId, (LPTSTR)(LPCTSTR)cString,m_AnalogCh[nIndex].nChId, m_AnalogCh[nIndex].szCallerId);
			}
			break;
		case ANALOG_WAIT_ACTUAL_PICKUP:
			if(nChState == S_CALL_TALKING)				//放欢迎提示音乐
			{		
				GetCurrentDir

⌨️ 快捷键说明

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