多数据源中间件标准版1.0

VoipChannel.h 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /*************************************************************************
  2. 【文件名】 VoipChannel.h
  3. 【功能模块和目的】 VOIP通道类头文件
  4. 【开发者及日期】 郑石诺 2015/04/08
  5. 【版本】 V1.0.0
  6. 【版权信息】 Copyright (C)2015 河南华谊网络科技有限公司
  7. 【更改记录】
  8. *************************************************************************/
  9. #pragma once
  10. #include "channelresource.h"
  11. #include "OneLeg.h"
  12. #include "IpmChannel.h"
  13. #include "IMixerHost.h"
  14. #include "Mixer.h"
  15. class CDspChannel;
  16. /*************************************************************************
  17. 【类名】 CVoipChannel
  18. 【功能】
  19. 【接口说明】 VOIP通道类
  20. 【开发者及日期】 郑石诺 2015/04/08
  21. 【版本】 V1.0.0
  22. 【版权信息】 Copyright (C)2015 河南华谊网络科技有限公司
  23. 【更改记录】
  24. *************************************************************************/
  25. class CVoipChannel : public CChannelResource, public COneLeg, public IMixerHost
  26. {
  27. private:
  28. class IImplement
  29. {
  30. public:
  31. virtual ~IImplement(void) = 0 {}
  32. virtual void onOffered(CVoipChannel& Chan, GCPARAMEX_MAKECALL* pMakeCallEx) = 0;
  33. virtual void onAlerting(CVoipChannel& Chan, METAEVENT* pMetaEvent) = 0;
  34. virtual bool makeCall(CVoipChannel& Chan, int AccountId) = 0;
  35. virtual void getMediaAddr(CIpmChannel* pImpChan, LPTSTR Buffer) = 0;
  36. };
  37. class CImplement4Trunk : public IImplement
  38. {
  39. void onOffered(CVoipChannel& Chan, GCPARAMEX_MAKECALL* pMakeCallEx);
  40. void onAlerting(CVoipChannel& Chan, METAEVENT* pMetaEvent);
  41. bool makeCall(CVoipChannel& Chan, int AccountId);
  42. void getMediaAddr(CIpmChannel* pImpChan, LPTSTR Buffer);
  43. private:
  44. void __constructMakeCallBody(GCPARAMEX_MAKECALL* pMakeCallEx, CVoipChannel& Chan, CIpmChannel* pImpChan, SIP_ACCOUNT* pAccount);
  45. };
  46. class CImplement4Exten : public IImplement
  47. {
  48. void onOffered(CVoipChannel& Chan, GCPARAMEX_MAKECALL* pMakeCallEx);
  49. void onAlerting(CVoipChannel& Chan, METAEVENT* pMetaEvent);
  50. bool makeCall(CVoipChannel& Chan, int AccountId);
  51. void getMediaAddr(CIpmChannel* pImpChan, LPTSTR Buffer);
  52. private:
  53. void __constructMakeCallBody(GCPARAMEX_MAKECALL* pMakeCallEx, CIpmChannel* pImpChan);
  54. };
  55. public:
  56. CVoipChannel(DEV_RES_CH_TYPE ChannelNo, DEV_RES_NO_TYPE NodeNo, DEV_RES_NO_TYPE BoardNo);
  57. virtual ~CVoipChannel(void);
  58. int getPeerMediaPort(void) const { return m_MediaPort; }
  59. int getPeerCodecId(void) const { return m_CodecId; }
  60. LPCTSTR getPeerConnectAddr(void) const { return m_ConnectAddr; }
  61. // 操作接口
  62. static bool isInnerSipUser(LPCTSTR User);
  63. bool reinvite4T38(void);
  64. ////////////////////////////////////////////////////////////////////////////////
  65. //继承自CChannelResource
  66. bool open(void);
  67. void close(void);
  68. int type(void) const { return SC_XOIP; }
  69. bool isBlocked(void) const { return m_IsBlocked; }
  70. bool isFree(void) const { return (m_State == GCST_NULL && !m_IsBlocked && m_pBindIpmCh == NULL); }
  71. bool isEvenNo(void) const { return m_Id.ChanNo % 2 == 0; }
  72. LPCTSTR getStateStr(void) const;
  73. void onDevEvent(METAEVENT* pMetaEvent);
  74. ////////////////////////////////////////////////////////////////////////////////
  75. //继承自COneLeg
  76. bool offhook(bool IgnoreSession, LPCTSTR CallerNum); // 内线摘机
  77. bool dropCall(bool IsPassive); // 挂机
  78. bool makeCall(LPCTSTR Callee, LPCTSTR Caller, int AccountId); // 启动线路拨号
  79. bool answer(void); // 应答呼叫
  80. bool playSound(PlayVoiceContent* pContent); // 放音收号
  81. bool playTone(int Type); // 播放信号音
  82. bool playStop(void); // 停止放音
  83. bool startRecord(RecordContent* pContent); // 开始录音
  84. bool stopRecord(void); // 停止录音
  85. bool monitor(COneLeg* pTalker, bool IsStop); // 监听
  86. bool allowMonitor(COneLeg* pMonitorParty) ; // 接受监听
  87. bool cancelMonitor(COneLeg* pMonitorParty); // 取消监听
  88. void freeResBinded(void); // 释放绑定资源
  89. bool reply(void);
  90. bool progress(void);
  91. bool accept(void);
  92. void onFaxEnd(bool IsSuccess, LPCTSTR Reason);
  93. CChannelResource* routeChannel(void) { return m_pBindIpmCh; }
  94. CChannelResource* resourceAttribute(void) { return this; }
  95. ////////////////////////////////////////////////////////////////////////////////
  96. //继承自IMixerHost
  97. int node(void) const { return m_pBindIpmCh == NULL ? DEVICE_NODE_NO_ANY : m_pBindIpmCh->nodeNo(); }
  98. int mixHandle(void) const { return m_pBindIpmCh == NULL ? DEV_HANDLE_INVALID :m_pBindIpmCh->handle(); }
  99. int mixType(void) const { return SC_XOIP_MIX; }
  100. int normalType(void) const { return SC_XOIP; }
  101. void onPlayEnd(LPCTSTR lpDtmf);
  102. void onRecEnd(UINT TaskId);
  103. void onToneEnd(int ToneTp);
  104. private:
  105. friend class CImplment4Trunk;
  106. friend class CImplement4Exten;
  107. bool __clearCall(int Cause);
  108. bool __getVoipAddr(LPTSTR AddrBuf);
  109. // 呼叫处理相关
  110. bool __getExtenAddrInfo(LPCTSTR Exten, LPTSTR pContactAddr, int Len);
  111. void __constructAnswerBody(GCPARAMEX_ANSWERCALL* pAnswerCallEx);
  112. void __constructProgressBody(GCPARAMEX_CALLPROGRESS* pProgressEx);
  113. void __constructReinviteBody4T38(ISXSIP_IE_BODY_EX* pBody);
  114. void __constructReinviteBody4Hold(ISXSIP_IE_BODY_EX* pBody, bool Hold);
  115. void __getCallNumFromSipAddr(LPCTSTR Called, CString& NumBuf);
  116. bool __getCallMediaDesc(ISXSIP_IE_BODY_EX* pSdp, int CodecId = -1);
  117. bool __consultMedia(ISXSIP_IE_BODY_EX* pSdp);
  118. ReinvitePurpose __analyzeReinvite(ISXSIP_IE_BODY_SDP_EX* pSdp);
  119. // 系统事件处理接口
  120. void __onOffered(METAEVENT* pMetaEvent);
  121. void __onAlerting(METAEVENT* pMetaEvent);
  122. void __onProgressing(void);
  123. void __onConnected(METAEVENT* pMetaEvent);
  124. void __onAnswered(void);
  125. void __onCallFinish(void);
  126. void __onDiconnected(METAEVENT* pMetaEvent);
  127. void __onTaskFail(void);
  128. void __onRecvInfo(METAEVENT* pMetaEvent);
  129. void __onRecvReinvite(METAEVENT* pMetaEvent);
  130. void __onRecvReinviteAck(METAEVENT* pMetaEvent);
  131. void __onRecvUpdate(METAEVENT* pMetaEvent);
  132. void __onRecvSubscribe(METAEVENT* pMetaEvent);
  133. void __onRecvMessage(METAEVENT* pMetaEvent);
  134. void __onRecvNotify(METAEVENT* pMetaEvent);
  135. void __onRecvRefer(METAEVENT* pMetaEvent);
  136. void __onRecvOption(METAEVENT* pMetaEvent);
  137. private:
  138. // VOIP通道既可被用作中继又可用作分机,而两种在实现上有差别,
  139. // 目前差别较小,但考虑到后期扩展这里将部分功能实现剥离出来
  140. static CImplement4Trunk ms_Implement4Trunk;
  141. static CImplement4Exten ms_Implement4Exten;
  142. IImplement* m_pImplement;
  143. // 通道属性
  144. DEV_RES_CALL_ID m_CallId;
  145. bool m_IsBlocked;
  146. DEV_LINE_CH_JOB_TYPE m_Job;
  147. UINT m_ExtenNo;
  148. // 通道占用资源参数
  149. CMixer m_Mixer;
  150. CIpmChannel* m_pBindIpmCh;
  151. // SIP媒体协商参数
  152. int m_MediaPort;
  153. int m_CodecId;
  154. CString m_ConnectAddr;
  155. };