| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- #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;
- return;
- } // end if
- } // end while
- }
- /*****************************************************************
- **【函数名称】 _dispatchEvent
- **【函数功能】 发送事件到指定座席
- **【参数】 pEvent: 事件内容
- AgentId: 目标座席工号
- **【返回值】
- ****************************************************************/
- void CSubject::_dispatchEvent( EventSubject* pEvent, UINT AgentId )
- {
- // 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;
- }
-
- CHAR szAgentState[EVENT_SUBJECT_BUF_LEN] = { 0 };
- strcpy_s(szAgentState, pEvent->szData);
- sprintf_s(pEvent->szData, "%s|%d|%s|%s|%d", szAgentState, pExten->state(), pExten->GetCallerNum(), pExten->GetCalleeNum(), AgentId);
- 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
- cmd.SetDataUInt(5, AgentId);
- }
- else
- {
- // 通知事件到OCX端
- cmd.SetDataUInt(0, pEvent->SubData1);
- cmd.SetDataUInt(1, pEvent->SubData2);
- cmd.SetDataUInt(2, pEvent->nEventType);
- cmd.SetDataString(3, pEvent->szData);
- cmd.SetDataUInt(5, AgentId);
- }
- //CNetworkAcd::GetInstance().send2Agent(AgentId, &cmd);
- CNetworkAcd::GetInstance().send2Server(&cmd);
- }
- /*****************************************************************
- **【函数名称】 onEvent
- **【函数功能】 订阅事件响应
- **【参数】 pEvent: 事件内容
- **【返回值】
- ****************************************************************/
- void CSubject::onEvent( EventSubject* pEvent )
- {
- // 通知所有的事件观查者
- POSITION pos = m_HostList.GetHeadPosition();
- while(pos != NULL)
- {
- CSubjectHost* pHost = m_HostList.GetNext(pos);
- if(_isHostEvent(pEvent, pHost))
- _dispatchEvent(pEvent, pHost->id());
- } // 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
- }
|