#include "StdAfx.h" #include "Subject.h" #include "SubjectHost.h" #include "NetworkAcd.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 ) { // 通知事件到OCX端 CPduEntity cmd(PDU_CMD_ACD_SUBMIT_DATA); cmd.SetDataUInt(0, pEvent->SubData1); cmd.SetDataUInt(1, pEvent->SubData2); cmd.SetDataUInt(2, pEvent->nEventType); cmd.SetDataString(3, pEvent->szData); CNetworkAcd::GetInstance().send2Agent(AgentId, &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 }