/************************************************************************* 【文件名】 SessionShell.h 【功能模块和目的】 会话管理类头文件 【开发者及日期】 郑石诺 2015/03/26 【版本】 V1.0.0 【版权信息】 Copyright (C)2015 河南华谊网络科技有限公司 【更改记录】 *************************************************************************/ #pragma once class CCallSession; /************************************************************************* 【类名】 CSessionShell 【功能】 【接口说明】 会话管理类 【开发者及日期】 郑石诺 2015/03/26 【版本】 V1.0.0 【版权信息】 Copyright (C)2015 河南华谊网络科技有限公司 【更改记录】 *************************************************************************/ class CSessionShell { SINGLETON_DECLARE(CSessionShell) public: ~CSessionShell(void); void start(void); void stop(void); // LineReq接口 bool procReqDialSetup(long &SubCall, PendingCallInfo* pInfo); // 启动临时呼叫 bool procReqLeave(long Call, CRDRID LineId); // 指定线路退出会话且挂机 bool procReqInstead(long Call, CRDRID HostLine, CRDRID PeerLine, UINT ExtNum); // 代接指定线路 bool procReqIntercept(long Call, CRDRID HostLine, CRDRID PeerLine); // 通话线路替换 bool procReqInsert(long Call, CRDRID HostLine, CRDRID PeerLine); // 插入通话线路 bool procReqListen(long Call, CRDRID HostLine, CRDRID PeerLine); // 监听通话线路 bool procReqRecord(long Call, CRDRID HostLine, LPCTSTR lpFileName); // 线路录音启动 bool procReqLeaveWord(long Call, CRDRID HostLine, RecordContent* pContent); // 留言录音启动 bool procReqMute(long Call, CRDRID HostLine, bool IsOn); // 静音控制 bool procReqConsultConfirm(long Call, CRDRID HostLine, CRDRID PeerLine, int Type); // 协商呼叫确认 // 设备侧接口 void onDevResourceNew(CRDRID Id); // 线路初始化 void onDevResourceDel(CRDRID Id); // 线路删除 void onLineStateChanged(CRDRID Id, long Session, VIRTUAL_LINE_STATE State, LPCTSTR Caller, LPCTSTR Callee); // 线路状态变化事件接口 bool onLineChannelEvent(CRDRID Id, long Session, DEV_CH_EVT_TYPE EvtType, LPCTSTR lpContent, UINT ExtenId = 0); // 线路向上层发送的设备主动事件 // 检测当前分机号是否存在 private: CSessionShell(void); UINT __procLineStatus(void); // 线路状态事件处理接口,供线程函数调用 void __wait(void); // 待处理内容为空时阻塞等待 static UINT __dispatchLineState(LPVOID pParam); // 处理线路状态事件队列的线程函数 // 线路状态相关 void __pushLineState(LineState* pState); LineState* __popLineState(int& LeftCount); void __freeAllLineState(void); // 会话相关 CCallSession* __createCall(CRDRID HostLineId); // 生成新会话 void __delCall(long CallId); // 删除会话 CCallSession* __getCall(long CallId); // 查找指定的会话 void __freeAllCall(void); private: volatile bool m_Stop; CWinThread* m_pThreadObj; long m_nBaseCallId; // 基础会话ID CEvent m_ThreadWaitFlag; // 消息分发线程睡眠的信号事件 CCriticalSection m_Cs4LineStateEvent; // 线路状态事件的互斥对象 CCriticalSection m_Cs4Session; // 会话创建的互斥对象 CMap m_mapCall; // 活动呼叫列表 CList m_listLineStatus; // 线路状态事件缓冲区队列 };