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

📄 appserverdlg.cpp

📁 用过恒迅达交换机的人都知道。恒迅达交换机是需要在交换机内部运行中间程序来给脚本提供数据接口并且监控机器运行状态的。本程序即是完成以上功能!用C++开发、调用了数据库(sqlserver2000)存储过
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	}

	if (pHXDMessage->m_nMessageId == D_MSG_CANCELAUTODIAL)//自动呼出失败(通道忙)
	{
		m_nTestCallCanceled ++;
		WAITTABLE *pWaitTable;

		INT nChannel = pHXDMessage->m_nChannel;

		if (m_mapWaitTable.Lookup(nChannel, pWaitTable) == TRUE)
		{
			m_wqWaitCall.Update(nChannel, PAUSETIMEOUT);
		}
		return TRUE;
	}
	//查找数据包的目的座席,注意D_MSG_ADDCONF和D_MSG_DELCONF不发向座席
	SEATSTATE *pSeatState = GetSeat(pHXDMessage->m_nChannel, FALSE);
	if(pHXDMessage->m_nMessageId == D_MSG_STAT_DATA)
	{
		int kkkkk = 0;
	}
	if (pSeatState == NULL && pHXDMessage->m_nMessageId != D_MSG_ADDCONF 
		&& pHXDMessage->m_nMessageId != D_MSG_DELCONF	 )
	{
		return TRUE;
	}

	//处理不同的消息,更新座席状态结构和显示
	CString strTime=this->GetFormatTime ();
	CString strMsg;
	BOOL bUpdate = TRUE;
	switch (pHXDMessage->m_nMessageId)
	{
	case D_MSG_LOGON:
	case D_MSG_CANCELDIAL:
	case D_MSG_ONHOOK:
		pSeatState->nState = SEAT_IDLE;
		pSeatState->sCalledID.Empty();
		pSeatState->sCallerID.Empty();
		break;

	case D_MSG_LOGOFF:
		{
			pSeatState->nState = SEAT_DISABLE;
			strMsg.Format ("%s 注销座席 座席通道号%d",strTime,pHXDMessage->m_nChannel );
			this->AddListMessage (3,strMsg);
			//str.Format ("
		}
		break;

	case D_MSG_DIALING:
		{
			pSeatState->nState = SEAT_DIAL;
			strMsg.Format ("%s 座席呼出成功 座席通道号%d",strTime,pHXDMessage->m_nChannel );
			this->AddListMessage (3,strMsg);
		}
		break;

	case D_MSG_RELEASE:
		//自动应答HXD服务器U_MSG_HANGON消息
		pHXDMessage->m_nMessageId = U_MSG_HANGON;
		SendToHXDServer(pHXDMessage);

		return TRUE;

	case D_MSG_CALLIN:
		pSeatState->nState = SEAT_RING;
		if (*((SHORT *)(pHXDMessage->m_pMessage)) == 1)
		{
			pSeatState->sCallerID = (LPCTSTR)(&(pHXDMessage->m_pMessage[4]));
			pSeatState->sCalledID = (LPCTSTR)(&(pHXDMessage->m_pMessage[24]));
		}
		else
		{
			pSeatState->sCallerID.Format(_T("座席%d"), *((SHORT *)(&(pHXDMessage->m_pMessage[2]))));
			pSeatState->sCalledID.Format(_T("座席%d"), pHXDMessage->m_nChannel);
		}
		if ( m_bAutoAnswer )
		{
			HXDMESSAGE HxdMessage;

			HxdMessage.m_nHeader = HXD_MESSAGE_HEADER;
			HxdMessage.m_nChannel = pHXDMessage->m_nChannel;
			HxdMessage.m_nMessageId = U_MSG_HANGOFF;
			HxdMessage.m_nLength = 0;
//			Sleep(100);
			if (SendToHXDServer(&HxdMessage) == TRUE)
			{
				;
			}

			Sleep( 200 );
			HxdMessage.m_nMessageId = U_MSG_ONHOOK;
			SendToHXDServer(&HxdMessage);
			Sleep( 100 );
			HxdMessage.m_nMessageId = U_MSG_ONHOOK;
			SendToHXDServer(&HxdMessage);
		}
		break;

	case D_MSG_CONNECT:
		{
			pSeatState->nState = SEAT_CONNECT;
			strMsg.Format ("%s 接通座席 座席通道号%d",strTime,pHXDMessage->m_nChannel );
			this->AddListMessage (3,strMsg);
		}
		break;

	case D_MSG_OFFHOOK:
		{
			pSeatState->nState = SEAT_OFFHOOK;
			strMsg.Format ("%s 座席摘机 座席通道号%d",strTime,pHXDMessage->m_nChannel );
			this->AddListMessage (3,strMsg);
		}
		break;

	case D_MSG_DELCONF:
	case D_MSG_ADDCONF:
		//中继退出会议和加入会议,未处理
		//process meeting.....
		//break;
	case D_MSG_GETSN:
	case D_MSG_SILENCE:
	case D_MSG_STOPSILENCE:
	case D_MSG_LISTEN:
	case D_MSG_STOPLISTEN:
	case D_MSG_RECORD:
	case D_MSG_STOPRECORD:
	case D_MSG_HOLDMEETING:
	case D_MSG_CLOSEMEETING:
	case D_MSG_PLAYEND:
	case D_MSG_BEGINPLAY:
	case D_MSG_USERDEF:
		{
		bUpdate = FALSE;
		short ievID;
		memcpy(&ievID,pHXDMessage->m_pMessage,2);
		CString str;
		str.Format("id=%d",ievID);

		if(ievID==10015)
		{
			AddListMessage(3,"有人举报");
		}
		else AddListMessage(3,str);
		//
		}
		break;
	case D_MSG_OVER_LOAD:
	case D_MSG_QUEUE_LENGTH:
		bUpdate = FALSE;
		break;
	//case 10015:
//		this->AddListMessage(3,"有人举报");
		break;
	default:
		return TRUE;
	}

	if (bUpdate)
	{
		UpdateSeatItem(pSeatState);
		if (pSeatState && pSeatState->nState == SEAT_DISABLE)
		{
			pSeatState->nSeatID = 0;
		}
	}

	//将数据包转发给座席

	if ( pSeatState && m_bAutoAnswer == 0 )
	{
		SendToSeat(pHXDMessage, pSeatState->nSocketID);
	}

	return TRUE;
}

//
//分析与座席通信接收缓冲,如果有完整的数据包,处理第一个数据包
//
//返回:TRUE ——数据缓冲中还有数据需要分析
//		FALSE——数据缓冲中没有数据需要分析
//
BOOL CAppServerDlg::AnalysisSeatMessage(INT nSocketID)
{
	INT nInReadPtr = m_nSeatInReadPtr[nSocketID];
	INT nLength;
	char chOutHeader[8];
	char chOutID[8];
	char chOutChannel[8];
	char chOutLength[8];
//	char chOutMessage[2048];
	//尝试提取完整的数据包,过程与AnalysisHXDServerMessage类似
	while (nInReadPtr != m_nSeatInWritePtr[nSocketID])
	{
		if (m_sSeatInBuffer[nSocketID][nInReadPtr] == LOBYTE(HXD_MESSAGE_HEADER))
		{
			m_nSeatInReadPtr[nSocketID] = nInReadPtr;
			nInReadPtr ++;
			if (nInReadPtr == MAX_INBUFFER_CACHE)
			{
				nInReadPtr = 0;
			}
			if (nInReadPtr == m_nSeatInWritePtr[nSocketID])
			{
				return FALSE;
			}
			if (m_sSeatInBuffer[nSocketID][nInReadPtr] == HIBYTE(HXD_MESSAGE_HEADER))
			{
				if (m_nSeatInWritePtr[nSocketID] > m_nSeatInReadPtr[nSocketID])
				{
					nLength = m_nSeatInWritePtr[nSocketID] - m_nSeatInReadPtr[nSocketID];
				}
				else
				{
					nLength = m_nSeatInWritePtr[nSocketID] + MAX_INBUFFER_CACHE - m_nSeatInReadPtr[nSocketID];
				}
				if (nLength >= 8)
				{
					break;
				}
				else
				{
					return FALSE;
				}
			}
		}

		nInReadPtr ++;
		if (nInReadPtr == MAX_INBUFFER_CACHE)
		{
			nInReadPtr = 0;
		}
	}
	if (nInReadPtr == m_nSeatInWritePtr[nSocketID])
	{
		m_nSeatInReadPtr[nSocketID] = nInReadPtr;
		return FALSE;
	}

	HXDMESSAGE *pHXDMessage = (HXDMESSAGE *)(&m_sSeatInBuffer[nSocketID][m_nSeatInReadPtr[nSocketID]]);
	if (nLength - 8 < pHXDMessage->m_nLength)
	{
		return FALSE;
	}
	m_nSeatInReadPtr[nSocketID] += pHXDMessage->m_nLength + 8;
	if (m_nSeatInReadPtr[nSocketID] >= MAX_INBUFFER_CACHE)
	{
		m_nSeatInReadPtr[nSocketID] -= MAX_INBUFFER_CACHE;
	}

	SEATSTATE *pSeatState = GetSeat(nSocketID);
	//座席登录的时候,可能尚未与座席状态结构建立对应关系
	if (pSeatState == NULL && pHXDMessage->m_nMessageId != U_MSG_LOGON)
	{
		return TRUE;
	}


	CString strTime=this->GetFormatTime();
	CString strMsg;

	SEATSTATE *pOtherSeat;
	switch (pHXDMessage->m_nMessageId)
	{
	case U_MSG_LOGON:
		//如果该分机座席已经登录,将先前登录的注销
		pOtherSeat = GetSeat(pHXDMessage->m_nChannel, FALSE);
		if (pOtherSeat && pOtherSeat != pSeatState)
		{
			LogoffSeat(pOtherSeat);
		}
		//如果未分配座席状态结构,分配一个
		if (pSeatState == NULL)
		{
			pSeatState = AddSeat(nSocketID);
		}
		if (pSeatState == NULL)
		{
			return TRUE;
		}
		pSeatState->nSeatID = pHXDMessage->m_nChannel;
		pSeatState->sOperatorID = (LPCTSTR)(&(pHXDMessage->m_pMessage[12]));
		DeleteSeatItem(pSeatState->nSeatID);
		break;

	case U_MSG_CALLOUT:
		pSeatState->nState = SEAT_DIAL;
		if (*((SHORT *)(pHXDMessage->m_pMessage)) == 1)
		{
			pSeatState->sCallerID = (LPCTSTR)(&(pHXDMessage->m_pMessage[4]));
			pSeatState->sCalledID = (LPCTSTR)(&(pHXDMessage->m_pMessage[24]));
		}
		else
		{
			pSeatState->sCallerID.Format(_T("座席%d"), pHXDMessage->m_nChannel);
			pSeatState->sCalledID.Format(_T("座席%d"), *((SHORT *)(&(pHXDMessage->m_pMessage[2]))));
		}
		UpdateSeatItem(pSeatState);
		break;

	case U_MSG_GETSN:/*得到序列号*/
	case U_MSG_HANGOFF://座席振铃摘机
		{
			strMsg.Format("%s 座席振铃摘机 座席通道号%d",strTime,pHXDMessage->m_nChannel);
		}
		break;
	case U_MSG_REJECT:
		{
			strMsg.Format("%s 座席拒绝 座席通道号%d",strTime,pHXDMessage->m_nChannel);
		}
		break;
	case U_MSG_SILENCEON:
		{
			strMsg.Format("%s 座席设置静音 座席通道号%d",strTime,pHXDMessage->m_nChannel);
		}
		break;
	case U_MSG_SILENCEOFF:
		{
			strMsg.Format("%s 座席取消静音 座席通道号%d",strTime,pHXDMessage->m_nChannel);
		}
		break;
	case U_MSG_KEEP:
		{
			strMsg.Format("%s 座席保留来话 座席通道号%d",strTime,pHXDMessage->m_nChannel);
		}
		break;
	case U_MSG_ENJOY:
		{
			strMsg.Format("%s 座席收听语音 座席通道号%d",strTime,pHXDMessage->m_nChannel);
		}
		break;
	case U_MSG_STOPENJOY:
		{
			strMsg.Format("%s 座席停止收听语音 座席通道号%d",strTime,pHXDMessage->m_nChannel);
		}
		break;
	case U_MSG_OFFHOOK:
		{
			strMsg.Format("%s 座席主动摘机 座席通道号%d",strTime,pHXDMessage->m_nChannel);
		}
		break;
	case U_MSG_ONHOOK:
		{
			strMsg.Format("%s 座席主动挂机 座席通道号%d",strTime,pHXDMessage->m_nChannel);
		}
		break;
	case U_MSG_LOGOFF:
	case U_MSG_CUT:
	case U_MSG_CHRESET:
	case U_MSG_LISTEN:
	case U_MSG_STOPLISTEN:
	case U_MSG_SEPERATE:
	case U_MSG_HOLDMEETING:
	case U_MSG_CLOSEMEETING:
	case U_MSG_ADDMEETING:
	case U_MSG_QUITMEETING:
	case U_MSG_PLAY:
	case U_MSG_MEMORIZE:
	case U_MSG_EXCHANGE:
	case U_MSG_USER1:
	case U_MSG_USER2:
	case U_MSG_USER3:
	case U_MSG_USER4:
	case U_MSG_USER5:
	case U_MSG_USER6:
	case U_MSG_GET_QUEUE_LENGTH:	//0x4df/*  需要验证  */
	case U_MSG_BEG_THREE_CALL:	//0x504/*  需要验证  */
	case U_MSG_END_THREE_CALL:	//0x505/*  需要验证  */
	case U_MSG_ALLASLRESET:
		break;

	default:
		return TRUE;
	}
	this->AddListMessage(2,strMsg);

	// 将数据包转发到HXD服务器
	itoa(pHXDMessage->m_nHeader, chOutHeader, 16);
	itoa(pHXDMessage->m_nMessageId, chOutID, 16);
	itoa(pHXDMessage->m_nChannel, chOutChannel, 10);
	itoa(pHXDMessage->m_nLength, chOutLength, 10);
	
	if (m_bRecvFromSeat)
	{
		m_RecvSeatFile.WriteString(chOutHeader);
		m_RecvSeatFile.WriteString(_T("          "));
		m_RecvSeatFile.WriteString(chOutID);
		m_RecvSeatFile.WriteString(_T("             "));
		m_RecvSeatFile.WriteString(chOutChannel);
		m_RecvSeatFile.WriteString(_T("             "));
		m_RecvSeatFile.WriteString(chOutLength);
		m_RecvSeatFile.WriteString(_T("\n"));
	}
	SendToHXDServer(pHXDMessage);
	return TRUE;
}


//
//获得与指定座席号或Socket序号对应的座席状态结构
//
//参数:bSocketID = TRUE ——nID表示Socket序号
//				  = FALSE——nID表示座席分机号
//
SEATSTATE * CAppServerDlg::GetSeat(INT nID, BOOL bSocketID)
{
	for (INT i = 0; i < MAX_SEAT_SUPPORTED; i ++)
	{
		if ((bSocketID == TRUE && m_SeatState[i].nSocketID == nID) ||
			(bSocketID == FALSE && m_SeatState[i].nSeatID == nID))
		{
			return &m_SeatState[i];
		}
	}

	return NULL;
}

//分配座席状态结构给指定的座席Socket
SEATSTATE * CAppServerDlg::AddSeat(INT nSocketID)
{
	for (INT i = 0; i < MAX_SEAT_SUPPORTED; i ++)
	{
		if (m_SeatState[i].nSocketID == -1)
		{
			m_SeatState[i].nSocketID = nSocketID;
			m_SeatState[i].nSeatID = 0;
			m_SeatState[i].nMeetingID = 0;
			m_SeatState[i].nListIndex = -1;
			m_SeatState[i].nState = SEAT_DISABLE;
			m_SeatState[i].sCalledID.Empty();
			m_SeatState[i].sCallerID.Empty();
			m_SeatState[i].sOperatorID.Empty();

			return &m_SeatState[i];
		}
	}

	return NULL;
}

//在列表框中寻找指定座席行
INT CAppServerDlg::FindSeatItem(INT nSeatID)
{
	INT nCount = m_lstSeat.GetItemCount();
	for (INT i = 0; i < nCount; i ++)
	{
		if (nSeatID == (INT)m_lstSeat.GetItemData(i))
		{
			return i;

⌨️ 快捷键说明

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