修改三方通话功能,在发起三方通话时,先保持住主叫,然后再拉回主叫到会议

StableCoreInc.h 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. /*************************************************************************
  2. 【文件名】 StableCoreInc.h
  3. 【功能模块和目的】 StableCore系统公共头文件
  4. 【开发者及日期】 郑石诺 2015/03/18
  5. 【版本】 V1.0.0
  6. 【版权信息】 Copyright (C)2015 河南华谊网络科技有限公司
  7. 【更改记录】
  8. *************************************************************************/
  9. #pragma once
  10. #include "../Public/GlobalDef/CommonTypeDef.h"
  11. #include "../Public/GlobalDef/DevInfoInc.h"
  12. #include "../Public/GlobalDef/DevLinkInc.h"
  13. #include "Logger.h"
  14. #include "TtsInterface.h"
  15. #include "NetCtrlInterface.h"
  16. #include "NetRepInterface.h"
  17. #include "PduEntity.h"
  18. #include "PduDataFormat.h"
  19. #include "../3rd/ehang/Inc/srllib.h"
  20. #include "../3rd/ehang/Inc/gclib.h"
  21. #include "../3rd/ehang/Inc/dtilib.h"
  22. #include "../3rd/ehang/Inc/ipmlib.h"
  23. #include "../3rd/ehang/Inc/faxlib.h"
  24. #ifndef LOGGER
  25. #define LOGGER ILogger::getInstance().log
  26. #endif
  27. #define STR_ERR_CORE_INIT_CFG_LOAD _T("{Core}: 加载配置信息失败")
  28. #define STR_ERR_CORE_INIT_MC_OPEN _T("{Core}: MC打开失败")
  29. #define STR_ERR_CORE_INIT_NET_SETUP _T("{Core}: 创建网络服务器端失败")
  30. #define NET_MAX_CLIENT 4
  31. #define SIP_URI_LEN 128
  32. #define IP_PORT_LEN 32
  33. #define DEVICE_BUF_MIN_SIZE 32
  34. #define DEVICE_BUF_MAX_SIZE 1024
  35. #define DEVICE_ALARM_THRESHOLD 2
  36. #define DEVICE_MC_NO -1
  37. #define DEVICE_NODE_NO_ANY -1
  38. #define DEVICE_BRD_NO_ANY -1
  39. #define DEVICE_RES_NO_ANY -1
  40. #define DEVICE_SPAN_CAPACITY 30
  41. #define DEVICE_LOG_PATH _T("./log_dev/")
  42. #define DEVICE_KEEP_ALIVE 2
  43. #define DEVICE_WAIT_TIME 2000
  44. #define DEVICE_SIP_RETRY_INTERVAL 10
  45. #define DEV_HANDLE_INVALID NULL
  46. #define DEV_RES_NO_TYPE CHAR
  47. #define DEV_RES_CH_TYPE SHORT
  48. #define DEV_RES_HANDLE LINEDEV
  49. #define DEV_RES_CALL_ID CRN
  50. #define DEV_MEDIA_PORT_BEGIN 10000 //起始端口号
  51. #define DEV_PER_CH_PORT_NUM 4 //每个通道占用端口数
  52. #define DEV_RES_ID_NODE_SEED 1000000
  53. #define DEV_RES_ID_BOARD_SEED 100000
  54. #define DEV_RES_ID_SPAN_SEED 30
  55. #define DEV_RES_ID_TYPE_SEED 10
  56. #define MEETING_ID_INVALID -9999
  57. #define MEETING_RESULT_SUCCESS (LPCTSTR)NULL + 1
  58. #define MEETING_RESULT_FAILED NULL
  59. #define CHANNEL_TONE_DIAL 0
  60. #define CHANNEL_TONE_RINGBACK 1
  61. #define CHANNEL_TONE_BUSY 2
  62. #define CHANNEL_TONE_HOLD 3
  63. #define CHANNEL_TONE_NULL -1
  64. #define TONE_NAME_DIAL _T("Tone/dialtone.pcm")
  65. #define TONE_NAME_RINGBACK _T("Tone/ringtone.pcm")
  66. #define TONE_NAME_BUSY _T("Tone/busytone.pcm")
  67. #define TONE_NAME_HOLD _T("Prompt/song.pcm")
  68. #define RECORD_MODE_NORMAL 1
  69. #define RECORD_MODE_MEETING 2
  70. #define RECORD_MODE_LEAVEWORD 3
  71. #define RECORD_TASK_ID_LEAVEWORD 0
  72. #define RECORD_TASK_ID_NORMAL 100
  73. #define CLIENT_REQ_FAX_SEND 0
  74. #define CLIENT_REQ_FAX_RECV 1
  75. #define CLIENT_REQ_MUTE_ON 0
  76. #define CLIENT_REQ_MUTE_OFF 1
  77. #define SESSION_INVALID_CALL 0
  78. #define SESSION_INVALID_SUB_CALL 0
  79. #define CONST_ERR_PLAY_AUDIO ((LPCTSTR)-1)
  80. // 设备资源ID描述
  81. typedef struct tagDEV_RES_ID
  82. {
  83. public:
  84. tagDEV_RES_ID(void) : ResType(DEV_RES_TYPE_UNKNOWN), NodeNo(DEVICE_RES_NO_ANY), BoardNo(DEVICE_RES_NO_ANY), SpanNo(DEVICE_RES_NO_ANY), ChanNo(DEVICE_RES_NO_ANY)
  85. {
  86. }
  87. tagDEV_RES_ID(DEV_RES_NO_TYPE Type, DEV_RES_NO_TYPE Node, DEV_RES_NO_TYPE Board, DEV_RES_NO_TYPE Span, DEV_RES_CH_TYPE Channel)
  88. : ResType(Type), NodeNo(Node), BoardNo(Board), SpanNo(Span), ChanNo(Channel)
  89. {
  90. }
  91. tagDEV_RES_ID(const tagDEV_RES_ID& Another)
  92. {
  93. ResType = Another.ResType;
  94. NodeNo = Another.NodeNo;
  95. BoardNo = Another.BoardNo;
  96. SpanNo = Another.SpanNo;
  97. ChanNo = Another.ChanNo;
  98. }
  99. tagDEV_RES_ID& operator=(const tagDEV_RES_ID& Another)
  100. {
  101. ResType = Another.ResType;
  102. NodeNo = Another.NodeNo;
  103. BoardNo = Another.BoardNo;
  104. SpanNo = Another.SpanNo;
  105. ChanNo = Another.ChanNo;
  106. return *this;
  107. }
  108. bool operator==(const tagDEV_RES_ID& Another)
  109. {
  110. return (ResType == Another.ResType && NodeNo == Another.NodeNo && BoardNo == Another.BoardNo && SpanNo == Another.SpanNo && ChanNo == Another.ChanNo);
  111. }
  112. operator long(void) const
  113. {
  114. if(SpanNo > 0)
  115. return DEV_RES_ID_NODE_SEED * (NodeNo + 1) + DEV_RES_ID_BOARD_SEED * BoardNo + (DEV_RES_ID_SPAN_SEED * SpanNo + ChanNo) * DEV_RES_ID_TYPE_SEED + ResType;
  116. else
  117. return DEV_RES_ID_NODE_SEED * (NodeNo + 1) + DEV_RES_ID_BOARD_SEED * BoardNo + ChanNo * DEV_RES_ID_TYPE_SEED + ResType;
  118. }
  119. int toIntId(void) const
  120. {
  121. if(SpanNo > 0)
  122. return DEV_RES_ID_NODE_SEED * (NodeNo + 1) + DEV_RES_ID_BOARD_SEED * BoardNo + (DEV_RES_ID_SPAN_SEED * SpanNo + ChanNo) * DEV_RES_ID_TYPE_SEED + ResType;
  123. else
  124. return DEV_RES_ID_NODE_SEED * (NodeNo + 1) + DEV_RES_ID_BOARD_SEED * BoardNo + ChanNo * DEV_RES_ID_TYPE_SEED + ResType;
  125. }
  126. void reset(void)
  127. {
  128. ResType = DEV_RES_TYPE_UNKNOWN;
  129. NodeNo = DEVICE_RES_NO_ANY;
  130. BoardNo = DEVICE_RES_NO_ANY;
  131. SpanNo = DEVICE_RES_NO_ANY;
  132. ChanNo = DEVICE_RES_NO_ANY;
  133. }
  134. bool isEmpty(void) const
  135. {
  136. return (ResType == DEV_RES_TYPE_UNKNOWN && NodeNo == DEVICE_RES_NO_ANY && BoardNo == DEVICE_RES_NO_ANY && SpanNo == DEVICE_RES_NO_ANY && ChanNo == DEVICE_RES_NO_ANY);
  137. }
  138. DEV_RES_NO_TYPE ResType;
  139. DEV_RES_NO_TYPE NodeNo;
  140. DEV_RES_NO_TYPE BoardNo;
  141. DEV_RES_NO_TYPE SpanNo;
  142. DEV_RES_CH_TYPE ChanNo;
  143. } DEV_RES_ID;
  144. #define CRDRID const DEV_RES_ID&
  145. static bool operator==(CRDRID OneId, CRDRID OtherId);
  146. bool operator==(CRDRID OneId, CRDRID OtherId)
  147. {
  148. return (OneId.ResType == OtherId.ResType && OneId.NodeNo == OtherId.NodeNo && OneId.BoardNo == OtherId.BoardNo
  149. && OneId.SpanNo == OtherId.SpanNo && OneId.ChanNo == OtherId.ChanNo);
  150. }
  151. typedef enum tagSC_SYS_MSG
  152. {
  153. SYS_MSG_RES_NEW = 3, // 资源新建
  154. SYS_MSG_RES_DEL = 4, // 资源移除
  155. SYS_MSG_RES_STATE = 5 // 资源状态更新
  156. } SC_SYS_MSG;
  157. // 设备资源状态
  158. typedef enum tagVIRTUAL_LINE_STATE
  159. {
  160. VIRTUAL_LINE_STATE_DISABLED = 0x00, // 不可用
  161. VIRTUAL_LINE_STATE_FREE = 0x01, // 空闲
  162. VIRTUAL_LINE_STATE_INIT = 0x02, // 摘机等待拨号
  163. VIRTUAL_LINE_STATE_DIALING = 0x03, // 拨号
  164. VIRTUAL_LINE_STATE_RING_BACK = 0x04, // 呼出振铃
  165. VIRTUAL_LINE_STATE_ALERTING = 0x05, // 来电振铃
  166. VIRTUAL_LINE_STATE_PROGRESSING = 0x06, // 通话进展
  167. VIRTUAL_LINE_STATE_TALKING = 0x07, // 通话中
  168. VIRTUAL_LINE_STATE_REMOVE = 0x08 // 注销分机 用于IP话机注销
  169. } VIRTUAL_LINE_STATE;
  170. // 线路在会话中的职责类别
  171. typedef enum tagCALL_PARTY_TYPE
  172. {
  173. CALL_PARTY_UNKNOWN = 0xFF, // 未知职责
  174. CALL_PARTY_HOST = 0, // 主控线路
  175. CALL_PARTY_PEER = 1, // 通话对端线路
  176. CALL_PARTY_LISTEN = 2, // 通话的监听线路
  177. CALL_PARTY_PENDING = 3, // 操作待处理线路
  178. CALL_PARTY_MEETING = 4, // 会议中的线路
  179. } CALL_PARTY_TYPE;
  180. // 动态呼叫的类型
  181. typedef enum tagPENDING_CALL_TYPE
  182. {
  183. PENDING_CALL_DIRECT = 0, // 直接呼叫
  184. PENDING_CALL_TRANSFER = 1, // 转移呼叫
  185. PENDING_CALL_MEETING = 2, // 会议呼叫
  186. PENDING_CALL_TRUNK = 3, // 直接呼叫外线
  187. PENDING_CALL_CONSULT = 4 // 协商呼叫
  188. } PENDING_CALL_TYPE;
  189. // 待处理会话的内容
  190. typedef struct tagPendingCallInfo
  191. {
  192. UINT nCallType; // 呼叫类型
  193. long nCall; // 会话ID
  194. UINT nHostLineStatus; // 主控线路初始状态
  195. int nSipAccountId; // SIP账户ID
  196. DEV_RES_ID nHostLine; // 主控线路
  197. DEV_RES_ID nAssoLine; // 对端线路
  198. CHAR szCallerNum[PHONE_NUM_LEN]; // 主叫号码
  199. CHAR szCalleeNum[PHONE_NUM_LEN]; // 被叫号码
  200. CHAR szPreCallerNum[PHONE_NUM_LEN]; // 主控线路原主叫号码
  201. CHAR szPreCalleeNum[PHONE_NUM_LEN]; // 主控线路原被叫号码
  202. } PendingCallInfo;
  203. // 语音资源任务类型
  204. typedef enum tagDEV_VOICE_JOB_TYPE
  205. {
  206. DEV_VOC_JOB_NONE = 0x00, // 无任务
  207. DEV_VOC_JOB_PLAY_TONE, // Tone音播放
  208. DEV_VOC_JOB_PLAY_FILE, // 语音文件播放
  209. DEV_VOC_JOB_PLAY_DTMF, // 放音收号
  210. DEV_VOC_JOB_GET_DTMF, // 收取DTMF
  211. DEV_VOC_JOB_GET_FUN_CODE, // 获取功能按键(内线分机专用)
  212. DEV_VOC_JOB_MEETING // 会议接入
  213. } DEV_VOICE_JOB_TYPE;
  214. // 模拟内线资源任务类型
  215. typedef enum tagDEV_LINE_CH_JOB_TYPE
  216. {
  217. DEV_LINE_CH_JOB_NONE = 0x00, // 无任务
  218. DEV_LINE_CH_JOB_PRE_DIAL, // 预拨号
  219. DEV_LINE_CH_JOB_OFF_HOOK, // 摘机
  220. } DEV_LINE_CH_JOB_TYPE;
  221. // 设备向上层发送的设备主动事件类型
  222. typedef enum tagDEV_CH_EVT_TYPE
  223. {
  224. DEV_CH_EVT_UNKONWN = 0x00, // 未知事件
  225. DEV_CH_EVT_FUN_CODE, // 收取功能键
  226. DEV_CH_EVT_PLAY_END, // 放音结束
  227. DEV_CH_EVT_OFF_HOOK, // 内线摘机
  228. DEV_CH_EVT_FAX_OK, // 传真成功
  229. DEV_CH_EVT_FAX_FAILED, // 传真失败
  230. DEV_CH_EVT_REC_END, // 录音完成
  231. DEV_CH_EVT_HOLD_ON, // 保持
  232. DEV_CH_EVT_TAKE_BACK, // 接回
  233. DEV_CH_EVT_MEETING_RESULT, // 会议结果
  234. DEV_CH_EVT_CALL_FAILD_CAUSE // 呼叫失败原因
  235. } DEV_CH_EVT_TYPE;
  236. // reinvite目的
  237. typedef enum tagReinvitePurpose
  238. {
  239. REINVITE_FOR_NULL = 0, // reinvite为未知目的
  240. REINVITE_FOR_HOLD = 1, // reinvite为保持
  241. REINVITE_FOR_TAKEBACK = 2, // reinvite为接回
  242. REINVITE_FOR_FAX = 3 // reinvite为传真
  243. } ReinvitePurpose;
  244. // 放音收号内容
  245. typedef struct tagPlayVoiceContent
  246. {
  247. PlayVoiceMode nModel; // 放音模式(1:放音收号,2:只放音,3:只收号,4:停止放音)
  248. CHAR szFileName[MAX_PATH]; // 放音文件名/信号音类型
  249. UINT nDtmfCount; // 收号位数
  250. UINT nDtmfPeriod; // DTMF收号间隔
  251. CHAR cDtmfEnd; // DTMF结束按键
  252. UINT nTts; // TTS类型
  253. int nTtsDigitMode; // TTS数字播报模式
  254. int nTtsSpeed; // TTS语速
  255. int nTtsVolume; // TTS音量
  256. } PlayVoiceContent;
  257. // 线路录音内容
  258. typedef struct tagRecordContent
  259. {
  260. UINT nModel; // 录音模式(1:均衡录音,2:会议录音,3:单通道录音,4:留言录音)
  261. DEV_RES_ID nPeerLine; // 均衡录音时对端的线路ID
  262. CHAR szFileName[MAX_PATH]; // 录音文件名
  263. UINT nPeriod; // 录音时长(0 - 不限制时长)
  264. CHAR cEnd; // 录音结束按键值(0 - 不接受按键停止)
  265. UINT nTaskId; // 任务ID
  266. } RecordContent;
  267. // 从呼叫控制类发送的线路状态事件
  268. typedef struct tagLineState
  269. {
  270. DEV_RES_ID nLineDevId; // 触发事件的线路ID
  271. long nSession; // 线路所属的主会话
  272. VIRTUAL_LINE_STATE nState; // 线路当前状态
  273. CHAR szCallerNum[PHONE_NUM_LEN]; // 主叫号码
  274. CHAR szCalleeNum[PHONE_NUM_LEN]; // 被叫号码
  275. } LineState;
  276. // 会议ID信息相关
  277. typedef struct tagMeetingInfo
  278. {
  279. int NodeNo;
  280. int BoardNo;
  281. int MeetingId;
  282. } MeetingInfo;
  283. #define WM_CORE_EVENT (WM_USER + 100)
  284. // Core事件类型
  285. typedef enum tagCORE_EVENT_TYPE
  286. {
  287. CORE_EVENT_DEV_CLOSE = 1, // 设备关闭
  288. CORE_EVENT_DEV_RES_NEW = 2, // 设备资源创建
  289. CORE_EVENT_DEV_RES_DEL = 3, // 设备资源销毁
  290. CORE_EVENT_DEV_RES_STATE = 4 // 设备资源状态更新
  291. } CORE_EVENT_TYPE;
  292. #define UI_ITEM_NAME_DEV _T("Dev")
  293. #define UI_ITEM_NAME_BOARD _T("Board")
  294. #define UI_ITEM_NAME_SPAN _T("Span")
  295. #define UI_ITEM_NAME_STATE _T("State")
  296. #define UI_ITEM_NAME_CALLER _T("Caller")
  297. #define UI_ITEM_NAME_CALLEE _T("Callee")