/************************************************************************* 【文件名】 CallSession.h 【功能模块和目的】 呼叫会话类头文件 【开发者及日期】 郑石诺 2015/03/31 【版本】 V1.0.0 【版权信息】 Copyright (C)2015 河南华谊网络科技有限公司 【更改记录】 *************************************************************************/ #pragma once #include"../Public/GlobalDef/TemplateTimer.h" class CSubSession; class CMC; class CProxyShell; /************************************************************************* 【类名】 CCallSession 【功能】 【接口说明】 呼叫会话类 【开发者及日期】 郑石诺 2015/03/31 【版本】 V1.0.0 【版权信息】 Copyright (C)2015 河南华谊网络科技有限公司 【更改记录】 *************************************************************************/ class CCallSession { public: CCallSession(long SessionId); ~CCallSession(void); // 属性相关 long id(void) const { return m_Id; } // 会话ID UINT lineCount(void) const { return m_LineMap.GetCount(); } // 当前会话中活动线路的个数 DEV_RES_ID getPeerLine(CRDRID LineId); // 获取当前线路关联的对端线路 bool isExist(CRDRID LineId, CALL_PARTY_TYPE PartyType); // 指定职责的线路是否在会话中 // 线路操作相关 bool insertLine(CRDRID LineId, CALL_PARTY_TYPE PartyType, bool IsLink); // 添加线路到会话 bool insertLine(CRDRID LineId, UINT SessionId, bool IsLink); // 添加待定线路到会话 bool insertLine(CRDRID HostLineId, CRDRID SrcLineId, bool IsLink); // 添加监听线路到会话 void removeLine(CRDRID LineId, CALL_PARTY_TYPE PartyType, PENDING_CALL_TYPE CallType = PENDING_CALL_DIRECT); // 从会话中删除指定线路 // 逻辑处理 bool trans2Meeting(CRDRID HostLineId); // 将当前会话转换为会议 // 事件响应 void onLineStateChanged(CRDRID LineId, VIRTUAL_LINE_STATE LineState, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum); // 线路状态事件 void onRecordStop(CRDRID LineId, UINT TaskId); // 录音停止事件 // 业务逻辑操作调用 bool setupPendingCall(long& SubCall, PendingCallInfo* pInfo); // 启动待处理呼叫 bool lineLeave(CRDRID LineId); // 指定线路退出会话且挂机 bool lineInstead(CRDRID HostLine, CRDRID PeerLine, UINT ExtNum); // 代接指定线路 bool lineIntercept(CRDRID HostLine, CRDRID PeerLine); // 替换通话中的线路 bool lineInsert(CRDRID HostLine, CRDRID PeerLine); // 插入线路到会话 bool lineListen(CRDRID HostLine, CRDRID PeerLine); // 监听线路 bool lineRecord(CRDRID HostLine, LPCTSTR lpFileName); // 线路录音启动 bool lineLeaveWord(CRDRID HostLine, RecordContent* pContent); // 留言启动 bool lineMute(CRDRID HostLine, bool IsOn); // 静音控制 bool lineConsultConfirm(CRDRID PeerLine, UINT Type); // 协商呼叫确认 bool line2Meeting(DEV_RES_ID LineId, CALL_PARTY_TYPE Party); // 通话线路转入会议 private: // 呼叫相关 CALL_PARTY_TYPE __isLineMine(CRDRID LineId); // 指定线路是否属于当前会话 void __detachListen(CRDRID HostLine); // 解除指定线路的监听 CSubSession* __getSubSession(CRDRID PendingLine); // 通过待处理线路ID查找子呼叫 void __clearSubSession(void); // 释放所有子会话 void __notifySubSessionLineFree(CRDRID LineId); // 通知子会话相关线路空闲 // 通话相关 bool __line2Link(CRDRID LineId, CRDRID LinePeer); // 线路进入双向通话 bool __lineRecord(CRDRID HostLine, LPCTSTR lpFileName); // 执行录音操作 bool __lineMute(CRDRID HostLine, bool IsOn); // 线路静音操作 bool __meetingMute(CRDRID HostLine, bool IsOn); // 会议静音操作 // 对线路状态进行分类处理 void __onLineStateFree(CRDRID LineId, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum); void __onLineStateRingBack(CRDRID LineId, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum); void __onLineStateAlerting(CRDRID LineId, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum); void __onLineStateProgressing(CRDRID LineId, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum); void __onLineStateTalking(CRDRID LineId, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum); private: // 业务属性 long m_Id; // 会话ID UINT m_SubCallIndex; // 要生成的子呼叫的基础索引值 MeetingInfo m_MeetingId; // 会话关联的会议ID(0 -> 未关联会议) // 线路属性 DEV_RES_ID m_LineHost; // 会话的主控线路 DEV_RES_ID m_LinePeer; // 通话的对端线路 CMap m_PendingLineMap; // 正在进行操作处理的线路(Key = 被操作线路, Value = 子会话ID) CMap m_ListenLineMap; // 正在监听通话的线路(Key = 监听线路, Value = 被监听线路) CMap m_RecordMap; // 当前会话中的录音索引表 CMap m_LineMap; // 保存所有在会话中的线路 // 当前呼叫中子会话索引表 CMap m_SubCallMap; // 保存所有子会话(Key = 子会话ID, Value = 子会话) TTimer m_SessionTimer; // 会话定时器 void __onTimerPostProcessing(void); // 到时处理 void __setTimer(UINT TimmerId, UINT Elapse); void __killTimer(UINT TimmerId); };