| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- #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
- }
|