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