#include "StdAfx.h" #include "Subject.h" #include "SubjectHost.h" #include "NetworkAcd.h" #include "AcdCore.h" #include "Exten.h" CSubject::CSubject(CSubjectRepository* pParent) : m_pParent(pParent) { } /***************************************************************** **【函数名称】 __getHost **【函数功能】 得到指定ID的观查者 **【参数】 AgentId: 观查者座席工号 **【返回值】 ****************************************************************/ CSubjectHost* CSubject::__getHost( UINT AgentId ) { POSITION pos = m_HostList.GetHeadPosition(); while(pos != NULL) { CSubjectHost* pHost = m_HostList.GetNext(pos); if(pHost->id() == AgentId) return pHost; } // end while return NULL; } /***************************************************************** **【函数名称】 __removeHost **【函数功能】 删除指定ID的观查者 **【参数】 AgentId: 观查者座席工号 **【返回值】 ****************************************************************/ void CSubject::__removeHost( UINT AgentId ) { POSITION pos = m_HostList.GetHeadPosition(); while(pos != NULL) { POSITION posPrev = pos; CSubjectHost* pHost = m_HostList.GetNext(pos); if(pHost->id() == AgentId) { m_HostList.RemoveAt(posPrev); delete pHost; pHost = NULL; return; } // end if } // end while } /***************************************************************** **【函数名称】 _dispatchEvent **【函数功能】 发送事件到指定座席 **【参数】 pEvent: 事件内容 AgentId: 目标座席工号 **【返回值】 ****************************************************************/ void CSubject::_dispatchEvent( EventSubject* pEvent, UINT AgentId, CString szData) { // ych 2018.5.18 CPduEntity cmd(PDU_CMD_ACD_SUBMIT_DATA); if (pEvent->nEventType == SUBJECT_AGENT_STATUS) // 座席状态变化 { CExten* pExten = CAcdCore::GetInstance().getExtenCtrl().getExten(pEvent->SubData2); // 获取指定分机 if (pExten == NULL) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{CSubject::_dispatchEvent}: pExten指针为NULL")); return; } szData.Format("%s|%d|%s|%s|%d", szData, pExten->state(), pExten->GetCallerNum(), pExten->GetCalleeNum(), AgentId); std::string strData; strData = szData.GetBuffer(0); szData.ReleaseBuffer(); cmd.SetDataUInt(0, pEvent->SubData1); // AgentID cmd.SetDataUInt(1, pEvent->SubData2); // ExtID cmd.SetDataUInt(2, pEvent->nEventType); // SUBJECT_TYPE //cmd.SetDataString(3, pEvent->szData); // State // 2023-03-24 超过最大长度使用rcf if (strData.length() >= 511) { pushSubmitData(pEvent->SubData1,pEvent->nEventType, strData); strData = strData.substr(0, 511); } cmd.SetDataString(3, strData.c_str()); cmd.SetDataUInt(5, AgentId); cmd.SetDataString(6, pEvent->szGroup); } else { // 通知事件到OCX端 cmd.SetDataUInt(0, pEvent->SubData1); cmd.SetDataUInt(1, pEvent->SubData2); cmd.SetDataUInt(2, pEvent->nEventType); //cmd.SetDataString(3, pEvent->szData); std::string strData; strData = szData.GetBuffer(0); szData.ReleaseBuffer(); // 2023-03-24 超过最大长度使用rcf if (strData.length() >= 511) { pushSubmitData(pEvent->SubData1, pEvent->nEventType, strData); strData = strData.substr(0, 511); } cmd.SetDataString(3, strData.c_str()); cmd.SetDataUInt(5, AgentId); } //CNetworkAcd::GetInstance().send2Agent(AgentId, &cmd); CNetworkAcd::GetInstance().send2Server(&cmd); } /***************************************************************** **【函数名称】 onEvent **【函数功能】 订阅事件响应 **【参数】 pEvent: 事件内容 **【返回值】 ****************************************************************/ void CSubject::onEvent( EventSubject* pEvent, CString& szData) { // 通知所有的事件观查者 POSITION pos = m_HostList.GetHeadPosition(); while(pos != NULL) { CSubjectHost* pHost = m_HostList.GetNext(pos); //if(_isHostEvent(pEvent, pHost)) if (pHost != NULL && _isHostEvent(pEvent, pHost)) // 2022-05-07 _dispatchEvent(pEvent, pHost->id(),szData); } // end while } /***************************************************************** **【函数名称】 registObserver **【函数功能】 注册订阅 **【参数】 AgentId: 观查者座席工号 Data: 订阅参数 Type: 订阅类型 **【返回值】 ****************************************************************/ void CSubject::registObserver( UINT AgentId, int Data, SUBJECT_TYPE Type ) { CSubjectHost* pHost = __getHost(AgentId); if(pHost == NULL) { pHost = new CSubjectHost(AgentId); m_HostList.AddTail(pHost); } // end if // 追加定阅数据 _insertData(Data, pHost, Type); } /***************************************************************** **【函数名称】 removeObserver **【函数功能】 取消订阅 **【参数】 AgentId: 观查者座席工号 Data: 取消订阅参数 **【返回值】 ****************************************************************/ void CSubject::removeObserver( UINT AgentId, int Data ) { CSubjectHost* pHost = __getHost(AgentId); if(pHost != NULL) { _deleteData(Data, pHost); // 移除订阅数据 if(pHost->isEmpty()) __removeHost(AgentId); // 如果已取消订阅了所有信息,移除订阅者 } // end if }