📄 appserverdlg.cpp
字号:
}
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 + -