/************************************************************************* 【文件名】 StableCoreInc.h 【功能模块和目的】 StableCore系统公共头文件 【开发者及日期】 郑石诺 2015/03/18 【版本】 V1.0.0 【版权信息】 Copyright (C)2015 河南华谊网络科技有限公司 【更改记录】 *************************************************************************/ #pragma once #include "../Public/GlobalDef/CommonTypeDef.h" #include "../Public/GlobalDef/DevInfoInc.h" #include "../Public/GlobalDef/DevLinkInc.h" #include "Logger.h" #include "TtsInterface.h" #include "NetCtrlInterface.h" #include "NetRepInterface.h" #include "PduEntity.h" #include "PduDataFormat.h" #include "../3rd/ehang/Inc/srllib.h" #include "../3rd/ehang/Inc/gclib.h" #include "../3rd/ehang/Inc/dtilib.h" #include "../3rd/ehang/Inc/ipmlib.h" #include "../3rd/ehang/Inc/faxlib.h" #ifndef LOGGER #define LOGGER ILogger::getInstance().log #endif #define STR_ERR_CORE_INIT_CFG_LOAD _T("{Core}: 加载配置信息失败") #define STR_ERR_CORE_INIT_MC_OPEN _T("{Core}: MC打开失败") #define STR_ERR_CORE_INIT_NET_SETUP _T("{Core}: 创建网络服务器端失败") #define NET_MAX_CLIENT 4 #define SIP_URI_LEN 128 #define IP_PORT_LEN 32 #define DEVICE_BUF_MIN_SIZE 32 #define DEVICE_BUF_MAX_SIZE 1024 #define DEVICE_ALARM_THRESHOLD 2 #define DEVICE_MC_NO -1 #define DEVICE_NODE_NO_ANY -1 #define DEVICE_BRD_NO_ANY -1 #define DEVICE_RES_NO_ANY -1 #define DEVICE_SPAN_CAPACITY 30 #define DEVICE_LOG_PATH _T("./log_dev/") #define DEVICE_KEEP_ALIVE 2 #define DEVICE_WAIT_TIME 2000 #define DEVICE_SIP_RETRY_INTERVAL 10 #define DEV_HANDLE_INVALID NULL #define DEV_RES_NO_TYPE CHAR #define DEV_RES_CH_TYPE SHORT #define DEV_RES_HANDLE LINEDEV #define DEV_RES_CALL_ID CRN #define DEV_MEDIA_PORT_BEGIN 10000 //起始端口号 #define DEV_PER_CH_PORT_NUM 4 //每个通道占用端口数 #define DEV_RES_ID_NODE_SEED 1000000 #define DEV_RES_ID_BOARD_SEED 100000 #define DEV_RES_ID_SPAN_SEED 30 #define DEV_RES_ID_TYPE_SEED 10 #define MEETING_ID_INVALID -9999 #define MEETING_RESULT_SUCCESS (LPCTSTR)NULL + 1 #define MEETING_RESULT_FAILED NULL #define CHANNEL_TONE_DIAL 0 #define CHANNEL_TONE_RINGBACK 1 #define CHANNEL_TONE_BUSY 2 #define CHANNEL_TONE_HOLD 3 #define CHANNEL_TONE_NULL -1 #define TONE_NAME_DIAL _T("Tone/dialtone.pcm") #define TONE_NAME_RINGBACK _T("Tone/ringtone.pcm") #define TONE_NAME_BUSY _T("Tone/busytone.pcm") #define TONE_NAME_HOLD _T("Prompt/song.pcm") #define RECORD_MODE_NORMAL 1 #define RECORD_MODE_MEETING 2 #define RECORD_MODE_LEAVEWORD 3 #define RECORD_TASK_ID_LEAVEWORD 0 #define RECORD_TASK_ID_NORMAL 100 #define CLIENT_REQ_FAX_SEND 0 #define CLIENT_REQ_FAX_RECV 1 #define CLIENT_REQ_MUTE_ON 0 #define CLIENT_REQ_MUTE_OFF 1 #define SESSION_INVALID_CALL 0 #define SESSION_INVALID_SUB_CALL 0 #define CONST_ERR_PLAY_AUDIO ((LPCTSTR)-1) // 设备资源ID描述 typedef struct tagDEV_RES_ID { public: 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) { } 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) : ResType(Type), NodeNo(Node), BoardNo(Board), SpanNo(Span), ChanNo(Channel) { } tagDEV_RES_ID(const tagDEV_RES_ID& Another) { ResType = Another.ResType; NodeNo = Another.NodeNo; BoardNo = Another.BoardNo; SpanNo = Another.SpanNo; ChanNo = Another.ChanNo; } tagDEV_RES_ID& operator=(const tagDEV_RES_ID& Another) { ResType = Another.ResType; NodeNo = Another.NodeNo; BoardNo = Another.BoardNo; SpanNo = Another.SpanNo; ChanNo = Another.ChanNo; return *this; } bool operator==(const tagDEV_RES_ID& Another) { return (ResType == Another.ResType && NodeNo == Another.NodeNo && BoardNo == Another.BoardNo && SpanNo == Another.SpanNo && ChanNo == Another.ChanNo); } operator long(void) const { if(SpanNo > 0) 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; else return DEV_RES_ID_NODE_SEED * (NodeNo + 1) + DEV_RES_ID_BOARD_SEED * BoardNo + ChanNo * DEV_RES_ID_TYPE_SEED + ResType; } int toIntId(void) const { if(SpanNo > 0) 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; else return DEV_RES_ID_NODE_SEED * (NodeNo + 1) + DEV_RES_ID_BOARD_SEED * BoardNo + ChanNo * DEV_RES_ID_TYPE_SEED + ResType; } void reset(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; } bool isEmpty(void) const { 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); } DEV_RES_NO_TYPE ResType; DEV_RES_NO_TYPE NodeNo; DEV_RES_NO_TYPE BoardNo; DEV_RES_NO_TYPE SpanNo; DEV_RES_CH_TYPE ChanNo; } DEV_RES_ID; #define CRDRID const DEV_RES_ID& static bool operator==(CRDRID OneId, CRDRID OtherId); bool operator==(CRDRID OneId, CRDRID OtherId) { return (OneId.ResType == OtherId.ResType && OneId.NodeNo == OtherId.NodeNo && OneId.BoardNo == OtherId.BoardNo && OneId.SpanNo == OtherId.SpanNo && OneId.ChanNo == OtherId.ChanNo); } typedef enum tagSC_SYS_MSG { SYS_MSG_RES_NEW = 3, // 资源新建 SYS_MSG_RES_DEL = 4, // 资源移除 SYS_MSG_RES_STATE = 5 // 资源状态更新 } SC_SYS_MSG; // 设备资源状态 typedef enum tagVIRTUAL_LINE_STATE { VIRTUAL_LINE_STATE_DISABLED = 0x00, // 不可用 VIRTUAL_LINE_STATE_FREE = 0x01, // 空闲 VIRTUAL_LINE_STATE_INIT = 0x02, // 摘机等待拨号 VIRTUAL_LINE_STATE_DIALING = 0x03, // 拨号 VIRTUAL_LINE_STATE_RING_BACK = 0x04, // 呼出振铃 VIRTUAL_LINE_STATE_ALERTING = 0x05, // 来电振铃 VIRTUAL_LINE_STATE_PROGRESSING = 0x06, // 通话进展 VIRTUAL_LINE_STATE_TALKING = 0x07, // 通话中 VIRTUAL_LINE_STATE_REMOVE = 0x08 // 注销分机 用于IP话机注销 } VIRTUAL_LINE_STATE; // 线路在会话中的职责类别 typedef enum tagCALL_PARTY_TYPE { CALL_PARTY_UNKNOWN = 0xFF, // 未知职责 CALL_PARTY_HOST = 0, // 主控线路 CALL_PARTY_PEER = 1, // 通话对端线路 CALL_PARTY_LISTEN = 2, // 通话的监听线路 CALL_PARTY_PENDING = 3, // 操作待处理线路 CALL_PARTY_MEETING = 4, // 会议中的线路 } CALL_PARTY_TYPE; // 动态呼叫的类型 typedef enum tagPENDING_CALL_TYPE { PENDING_CALL_DIRECT = 0, // 直接呼叫 PENDING_CALL_TRANSFER = 1, // 转移呼叫 PENDING_CALL_MEETING = 2, // 会议呼叫 PENDING_CALL_TRUNK = 3, // 直接呼叫外线 PENDING_CALL_CONSULT = 4 // 协商呼叫 } PENDING_CALL_TYPE; // 待处理会话的内容 typedef struct tagPendingCallInfo { UINT nCallType; // 呼叫类型 long nCall; // 会话ID UINT nHostLineStatus; // 主控线路初始状态 int nSipAccountId; // SIP账户ID DEV_RES_ID nHostLine; // 主控线路 DEV_RES_ID nAssoLine; // 对端线路 CHAR szCallerNum[PHONE_NUM_LEN]; // 主叫号码 CHAR szCalleeNum[PHONE_NUM_LEN]; // 被叫号码 CHAR szPreCallerNum[PHONE_NUM_LEN]; // 主控线路原主叫号码 CHAR szPreCalleeNum[PHONE_NUM_LEN]; // 主控线路原被叫号码 } PendingCallInfo; // 语音资源任务类型 typedef enum tagDEV_VOICE_JOB_TYPE { DEV_VOC_JOB_NONE = 0x00, // 无任务 DEV_VOC_JOB_PLAY_TONE, // Tone音播放 DEV_VOC_JOB_PLAY_FILE, // 语音文件播放 DEV_VOC_JOB_PLAY_DTMF, // 放音收号 DEV_VOC_JOB_GET_DTMF, // 收取DTMF DEV_VOC_JOB_GET_FUN_CODE, // 获取功能按键(内线分机专用) DEV_VOC_JOB_MEETING // 会议接入 } DEV_VOICE_JOB_TYPE; // 模拟内线资源任务类型 typedef enum tagDEV_LINE_CH_JOB_TYPE { DEV_LINE_CH_JOB_NONE = 0x00, // 无任务 DEV_LINE_CH_JOB_PRE_DIAL, // 预拨号 DEV_LINE_CH_JOB_OFF_HOOK, // 摘机 } DEV_LINE_CH_JOB_TYPE; // 设备向上层发送的设备主动事件类型 typedef enum tagDEV_CH_EVT_TYPE { DEV_CH_EVT_UNKONWN = 0x00, // 未知事件 DEV_CH_EVT_FUN_CODE, // 收取功能键 DEV_CH_EVT_PLAY_END, // 放音结束 DEV_CH_EVT_OFF_HOOK, // 内线摘机 DEV_CH_EVT_FAX_OK, // 传真成功 DEV_CH_EVT_FAX_FAILED, // 传真失败 DEV_CH_EVT_REC_END, // 录音完成 DEV_CH_EVT_HOLD_ON, // 保持 DEV_CH_EVT_TAKE_BACK, // 接回 DEV_CH_EVT_MEETING_RESULT, // 会议结果 DEV_CH_EVT_CALL_FAILD_CAUSE // 呼叫失败原因 } DEV_CH_EVT_TYPE; // reinvite目的 typedef enum tagReinvitePurpose { REINVITE_FOR_NULL = 0, // reinvite为未知目的 REINVITE_FOR_HOLD = 1, // reinvite为保持 REINVITE_FOR_TAKEBACK = 2, // reinvite为接回 REINVITE_FOR_FAX = 3 // reinvite为传真 } ReinvitePurpose; // 放音收号内容 typedef struct tagPlayVoiceContent { PlayVoiceMode nModel; // 放音模式(1:放音收号,2:只放音,3:只收号,4:停止放音) CHAR szFileName[MAX_PATH]; // 放音文件名/信号音类型 UINT nDtmfCount; // 收号位数 UINT nDtmfPeriod; // DTMF收号间隔 CHAR cDtmfEnd; // DTMF结束按键 UINT nTts; // TTS类型 int nTtsDigitMode; // TTS数字播报模式 int nTtsSpeed; // TTS语速 int nTtsVolume; // TTS音量 } PlayVoiceContent; // 线路录音内容 typedef struct tagRecordContent { UINT nModel; // 录音模式(1:均衡录音,2:会议录音,3:单通道录音,4:留言录音) DEV_RES_ID nPeerLine; // 均衡录音时对端的线路ID CHAR szFileName[MAX_PATH]; // 录音文件名 UINT nPeriod; // 录音时长(0 - 不限制时长) CHAR cEnd; // 录音结束按键值(0 - 不接受按键停止) UINT nTaskId; // 任务ID } RecordContent; // 从呼叫控制类发送的线路状态事件 typedef struct tagLineState { DEV_RES_ID nLineDevId; // 触发事件的线路ID long nSession; // 线路所属的主会话 VIRTUAL_LINE_STATE nState; // 线路当前状态 CHAR szCallerNum[PHONE_NUM_LEN]; // 主叫号码 CHAR szCalleeNum[PHONE_NUM_LEN]; // 被叫号码 } LineState; // 会议ID信息相关 typedef struct tagMeetingInfo { int NodeNo; int BoardNo; int MeetingId; } MeetingInfo; #define WM_CORE_EVENT (WM_USER + 100) // Core事件类型 typedef enum tagCORE_EVENT_TYPE { CORE_EVENT_DEV_CLOSE = 1, // 设备关闭 CORE_EVENT_DEV_RES_NEW = 2, // 设备资源创建 CORE_EVENT_DEV_RES_DEL = 3, // 设备资源销毁 CORE_EVENT_DEV_RES_STATE = 4 // 设备资源状态更新 } CORE_EVENT_TYPE; #define UI_ITEM_NAME_DEV _T("Dev") #define UI_ITEM_NAME_BOARD _T("Board") #define UI_ITEM_NAME_SPAN _T("Span") #define UI_ITEM_NAME_STATE _T("State") #define UI_ITEM_NAME_CALLER _T("Caller") #define UI_ITEM_NAME_CALLEE _T("Callee")