/************************************************************************* 【文件名】 TapiLine.h 【功能模块和目的】 TAPI线路类头文件 【开发者及日期】 郑石诺 2016/03/23 【版本】 V1.0.0 【版权信息】 Copyright (C)2016 河南华谊网络科技有限公司 【更改记录】 *************************************************************************/ #pragma once #include class CTapiOpBase; /************************************************************************* 【类名】 CTapiLine 【功能】 【接口说明】 TAPI线路类 【开发者及日期】 郑石诺 2016/03/23 【版本】 V1.0.0 【版权信息】 Copyright (C)2016 河南华谊网络科技有限公司 【更改记录】 *************************************************************************/ class CTapiLine { public: CTapiLine(DWORD DevID, HLINE Handle, DWORD ApiVersion, CString ExtID, HLINEAPP LineApp); virtual ~CTapiLine(void); // 关联属性 const CString& extenID(void) const { return m_ExtenID; } HCALL activeCall(void) const { return m_ActiveCall; } HCALL& heldCall(void) { return m_HeldCall; } HCALL heldCall(void) const { return m_HeldCall; } CTapiOpBase*& currTapiOp(void) { return m_pCurrTapiOp; } CTapiOpBase* currTapiOp(void) const { return m_pCurrTapiOp; } int status(void) const { return m_LineStatus; } bool& listenerFlag(void) { return m_IsListener; } bool listenerFlag(void) const { return m_IsListener; } bool isFree(void) const { return (m_LineStatus == INNER_STATE_FREE && m_pCurrTapiOp == NULL); } // 线路是否空闲 // 相关操作 virtual void redoCallStatus(HCALL CallId, DWORD CallState, DWORD CallStateDetail) = 0; // 强制重新处理线路状态 virtual void setDevLinkHeldId(const int DevLinkCallId) = 0; virtual void setDevLinkCallId(const int DevLinkCallId) = 0; DWORD getCallStatus(const HCALL CallId); // 读取呼叫信息 bool isAssoDevLinkCallId(int DevLinkCallId); // DevLinkCallId是否与当前线路有关联 // TAPI线路事件 void onTapiEvent(DWORD nDevice, DWORD nMsg, DWORD Param1, DWORD Param2, DWORD Param3); // TAPI线路事件入口函数 virtual void regist(void) = 0; // 注册线路 // DevLink线路事件 virtual void onDevLinkEventS(DevLinkInfoS* pInfoS); // DEV Link S 事件响应 virtual void onDevLinkEventA(int DevLinkCallId); // DEV Link A 事件响应 virtual void onDevLinkEventD(int DevLinkCallId); // DEV Link D 事件响应 // 电话控制 bool lineReopen(void); // 线路重新打开 bool lineMakeCall(LPCTSTR pszDest, HCALL& WaitingCall); // 线路外呼 bool lineAnswerCall(HCALL CallId); // 应答呼叫 bool lineDropCall(HCALL CallId); // 终止呼叫 bool lineHold(HCALL CallId); // 保持呼叫 bool lineTakeBack(HCALL CallId); // 接回呼叫 bool lineListen(LPCTSTR pszDest); // 监听 bool lineDial(HCALL CallId, LPCTSTR pszDest); // 呼叫 bool lineRedirectCall(HCALL CallId, LPCTSTR pszDest); // 重定向呼叫 bool lineInsert(LPCTSTR pszDest); // 强插 bool linePickupCall(LPHCALL lphWaitingCall, LPCTSTR pszDest); // 代接 bool lineSetupTransfer(LPHCALL lphTransferCall); // 启动转移 bool lineCompleteTransfer(HCALL HeldCall, HCALL TransferCall); // 完成转移 bool lineCompleteConference(HCALL HeldCall, HCALL ConferenceCall); // 完成三方会议 bool lineGenerateDigit(HCALL CallId, LPCTSTR pszDigits); // 生成按键 bool lineReset(void); // 线路重置 bool linePark(HCALL CallId, LPCTSTR pszAddress); // 呼叫停靠 bool lineUnPark(HCALL& CallId, LPCTSTR pszAddress); // 停靠接回 protected: virtual void _procDevLinkEventS(DevLinkInfoS* pInfoS) = 0; // DevLink S事件后续处理 virtual void _procDevLinkEventD(int DevLinkCallId) = 0; // DevLink D事件后续处理 virtual void _procLineInitStatus(HCALL CallId, DWORD CallState, DWORD CallStateDetail, DWORD CallPrivilege) = 0; // 初始化线路状态处理 INNER_STATE _mapTapiCallState(DWORD CallState); // 映射呼叫状态到线路状态 private: // 通用事件响应操作 void __onReply(LONG RequestID, HRESULT Result); // 线路操作异步返回事件 void __onNewCall(DWORD AddressID, HCALL CallId, DWORD CallPrivilege); // 新建呼叫事件响应 void __onCallState(HCALL CallId, DWORD CallState, DWORD CallStateDetail, DWORD CallPrivilege); // 呼叫状态变化事件响应 void __onCallInfo(HCALL CallId, DWORD CallInfoState); // 呼叫信息变化事件响应 // 线路内部操作(TAPI) HRESULT __loopLineGetCallInfo(HCALL CallId, LINECALLINFO* &pCallInfo); // 获取呼叫信息 HRESULT __loopLineGetCallStatus(HCALL CallId, DWORD& CallStatus); // 获取呼叫状态 // 其它操作 void __updateHCall(HCALL CallId, DWORD CallState, DWORD CallStateDetail); // 更新相关呼叫句柄 protected: const static DWORD LINE_DEV_STATE_ALL = 0x01FFFFFF; // 线路状态事件过滤标志 const static DWORD LINE_ADDRESS_STATE_ALL = 0x000001FF; // 线路地址状态事件过滤标志 // 设备参数 const DWORD m_DevID; // 线路的设备ID const DWORD m_ApiVersion; // 线路API版本号 const CString m_ExtenID; // 线路分机号 const HLINEAPP m_LineApp; // TAPI主控应用句柄 // 呼叫控制句柄 HLINE m_Handle; // 线路控制句柄 HCALL m_ActiveCall; // 当前的活动呼叫 HCALL m_PendingCall; // 呼叫操作中待处理的呼叫 HCALL m_HeldCall; // 当前被保持的呼叫 int m_DevLinkCallId; // 当前线路关联的活动 DevLinkCallId ( -1 表示没有关联呼叫, -2 表示暂时不接收DevLink事件 ) int m_DevLinkHeldId; // 当前线路关联的保持 DevLinkCallId bool m_IsListener; // 线路是否为监听线路 // 控制参数 int m_LineStatus; // 线路当前状态 CTapiOpBase*m_pCurrTapiOp; // 当前正在进行的相关操作 time_t m_InitTime; // 线路初始化起始时间 // 用于同步DevLink事件和Tapi事件的临界区 CCriticalSection m_LockSection; };