| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- #include "StdAfx.h"
- #include "SessionHolder.h"
- #include "Config.h"
- #include "CallSession.h"
- #include "LogicLine.h"
- #include "StatisticsMgr.h"
- SINGLETON_IMPLEMENT(CSessionHolder)
- CSessionHolder::CSessionHolder(void)
- {
- m_SessionMap.InitHashTable(MAX_LENGTH_HASH);
- m_CallIdSeed = CConfig::GetInstance().queryLastCallId();
- }
- CSessionHolder::~CSessionHolder(void)
- {
- }
- /*****************************************************************
- **【函数名称】 creatSession
- **【函数功能】 创建Call会话
- **【参数】 pLineHost:触发会话创建的线路实体
- **【返回值】 会话对象
- ****************************************************************/
- CCallSession* CSessionHolder::createSession( CLogicLine* pLineHost )
- {
- ASSERT(pLineHost != NULL);
- // 获取CallId并更新数据库
- m_CallIdSeed++;
- CConfig::GetInstance().updateCallId(m_CallIdSeed);
- // 创建CallNode并保存
- CCallSession* pSession = new CCallSession(m_CallIdSeed);
- m_SessionMap.SetAt(m_CallIdSeed, pSession);
- // 添加主控线路到会话
- pSession->addLine(pLineHost);
- // 显示日志
- ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Session}: 创建会话, SessionCallId = %d, HostLine = %lu,CallId=%lu,caller=%s,callee=%s"),
- m_CallIdSeed, pLineHost->lineId(), pLineHost->callId(), pLineHost->callerNum(), pLineHost->calleeNum());
- return pSession;
- }
- /*****************************************************************
- **【函数名称】 findSession
- **【函数功能】 通过CallId获取CCallSession
- **【参数】 CallId: 指定Call ID
- **【返回值】 会话对象
- ****************************************************************/
- CCallSession* CSessionHolder::findSession( ULONG CallId )
- {
- CCallSession* pSession = NULL;
- m_SessionMap.Lookup(CallId, pSession);
- return pSession;
- }
- /*****************************************************************
- **【函数名称】 onLineStatusUpdated
- **【函数功能】 处理线路状态变化
- **【参数】 pLine: 状态变化的线路
- **【返回值】
- ****************************************************************/
- void CSessionHolder::onLineStatusUpdated( CLogicLine* pLine )
- {
- ASSERT(pLine != NULL);
- UINT Status = (HELD_STATE_FILTER_MASK & pLine->status());
- UINT OpType = pLine->opType();
- if (OpType == PDU_CMD_AGENT_TRANSTALK || OpType == PDU_CMD_AGENT_THREETALK)
- {
- if (Status == INNER_STATE_FREE)
- {
- pLine->opType() = PDU_CMD_UNKNOWN;
- return;
- }
- if (Status == INNER_STATE_TALKING)
- {
- pLine->opType() = PDU_CMD_UNKNOWN;
- }
- }
- // 当前会话处理线路状态
- CCallSession* pSession = findSession(pLine->callId());
- if(pSession == NULL)
- return;
- pSession->onLineStatusUpdated(pLine);
- // 如果会话中线路数量小于一条,销毁会话
- if(pSession->lineCount() < 1)
- {
- // 统计(会话销毁)
- CStatisticsMgr::GetInstance().onCallDetail(pSession->callId(), REP_EVENT_END_CALL, 0, NULL);
- // 销毁会话
- m_SessionMap.RemoveKey(pSession->callId());
- // 显示日志
- ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{SessionHolder}: 销毁会话, CallId = %d"), pSession->callId());
- delete pSession;
- }
- }
|