#include "StdAfx.h" #include "DevControl.h" #include "OperationReactor.h" #include "FsProxy.h" SINGLETON_IMPLEMENT(CDevControl) IDeviceLink& IDeviceLink::getInstance( void ) { return CDevControl::GetInstance(); } CDevControl::CDevControl(void) : m_pOperator(NULL) { } CDevControl::~CDevControl(void) { } /***************************************************************** **【函数名称】 __openTts **【函数功能】 打开TTS **【参数】 **【返回值】 ****************************************************************/ void CDevControl::__openTts( void ) { TTS_TYPE TtsType = CConfig::ttsType(); if(TtsType != TTS_NONE) { CHAR szErrCode[BUFFER_LENGTH]; if(ITtsInterface::getInstance().init(TtsType, CConfig::ttsPath(), szErrCode)) onEventLog(LOG_LEVEL_NORMAL, _T("{DevCtrl}: TTS打开成功")); else onEventLog(LOG_LEVEL_WARNING, _T("{DevCtrl}: TTS打开失败, Reason = %s"), szErrCode); } } /***************************************************************** **【函数名称】 __closeTts **【函数功能】 关闭TTS **【参数】 **【返回值】 ****************************************************************/ void CDevControl::__closeTts( void ) { if(CConfig::ttsType() != TTS_NONE) ITtsInterface::getInstance().close(); } /***************************************************************** **【函数名称】 open **【函数功能】 设备打开 **【参数】 a_pOperator:设备操作者对象 **【返回值】 成功true,失败false ****************************************************************/ bool CDevControl::open( IDeviceOperator* a_pOperator ) { ASSERT(a_pOperator != NULL); if(m_pOperator != NULL) return false; m_pOperator = a_pOperator; onEventLog(LOG_LEVEL_NORMAL, _T("{DevCtrl}: 设备链路建立...")); do { if(!CConfig::load()) { onEventLog(LOG_LEVEL_ERROR, _T("{DevCtrl}: 加载配置信息失败")); m_pOperator = NULL; return false; } __openTts(); onEventResType(); // 连接设备 if(!CFsProxy::GetInstance().init(&COperationReactor::GetInstance())) { m_pOperator = NULL; return false; } onEventDevUp(); onEventLog(LOG_LEVEL_NORMAL, _T("{DevCtrl}: 设备链路建立完成")); return true; } while (false); onEventLog(LOG_LEVEL_ERROR, _T("{DevCtrl}: 设备链路建立失败")); m_pOperator = NULL; return false; } /***************************************************************** **【函数名称】 close **【函数功能】 设备关闭 **【参数】 **【返回值】 ****************************************************************/ void CDevControl::close( void ) { if(m_pOperator != NULL) { onEventLog(LOG_LEVEL_NORMAL, _T("{DevCtrl}: 设备链路关闭")); // 关闭设备 CFsProxy::GetInstance().release(); __closeTts(); m_pOperator = NULL; } } /***************************************************************** **【函数名称】 operate **【函数功能】 线路控制 **【参数】 nInstance 调用标识 nOpType 操作类型 nResID 线路ID pLineOpParam 操作参数 **【返回值】 成功true,失败false ****************************************************************/ bool CDevControl::operate( LONG Instance, LINE_OP OpType, ULONG ResID, LineOpParam* pLineOpParam ) { return COperationReactor::GetInstance().procOperation(Instance, OpType, ResID, pLineOpParam); } /***************************************************************** **【函数名称】 onEventResType **【函数功能】 通知可控的资源类型 **【参数】 **【返回值】 ****************************************************************/ void CDevControl::onEventResType( void ) { EventResType node; ASSERT(m_pOperator != NULL); // 内线分机 node.nResType = DEV_RES_TYPE_EXT; m_pOperator->onDeviceEvent(DEV_EVENT_RES_TYPE, &node); // TRUNK node.nResType = DEV_RES_TYPE_TRUNK; m_pOperator->onDeviceEvent(DEV_EVENT_RES_TYPE, &node); } /***************************************************************** **【函数名称】 onEventResDetail **【函数功能】 通知可控的资源明细信息 **【参数】 Type 资源类型 ResID 资源ID **【返回值】 ****************************************************************/ void CDevControl::onEventResDetail( UINT Type, UINT ResID ) { EventResDetail node; memset(&node, 0, sizeof(EventResDetail)); node.nResType = Type; node.nResID = ResID; ASSERT(m_pOperator != NULL); m_pOperator->onDeviceEvent(DEV_EVENT_RES_DETAIL, &node); } /***************************************************************** **【函数名称】 onEventResState **【函数功能】 通知资源状态信息 **【参数】 Type 资源类型 ResID 资源ID State 资源状态 **【返回值】 ****************************************************************/ void CDevControl::onEventResState( UINT Type, UINT ResID, UINT State, LPCTSTR CallerNum /*= NULL*/, LPCTSTR CalleeNum /*= NULL*/ ) { EventResStatus node; memset(&node, 0, sizeof(EventResStatus)); node.nResType = Type; node.nResID = ResID; node.nState = State; if(CallerNum != NULL) lstrcpy(node.szCallerNum, CallerNum); if(CalleeNum != NULL) lstrcpy(node.szCalleeNum, CalleeNum); ASSERT(m_pOperator != NULL); m_pOperator->onDeviceEvent(DEV_EVENT_RES_STATUS, &node); } /***************************************************************** **【函数名称】 onEventLog **【函数功能】 通知显示日志 **【参数】 Level 日志级别 lpszFormat 日志内容 **【返回值】 ****************************************************************/ void CDevControl::onEventLog( UINT Level, CHAR* lpszFormat, ... ) { EventLog node; memset(&node, 0, sizeof(EventLog)); node.nLevel = Level; // 得到消息内容 va_list ap; va_start(ap, lpszFormat); vsprintf_s(node.szContent, lpszFormat, ap); // 通知日志显示 ASSERT(m_pOperator != NULL); m_pOperator->onDeviceEvent(DEV_EVENT_LOG, &node); } /***************************************************************** **【函数名称】 onEventDevUp **【函数功能】 设备初始化结束 **【参数】 **【返回值】 ****************************************************************/ void CDevControl::onEventDevUp( void ) { ASSERT(m_pOperator != NULL); m_pOperator->onDeviceEvent(DEV_EVENT_INIT_END, NULL); } /***************************************************************** **【函数名称】 onEventDevDown **【函数功能】 设备不可用 **【参数】 **【返回值】 ****************************************************************/ void CDevControl::onEventDevDown( void ) { ASSERT(m_pOperator != NULL); m_pOperator->onDeviceEvent(DEV_EVENT_DEV_CLOSED, NULL); } /***************************************************************** **【函数名称】 onEventOpResult **【函数功能】 设备操作执行结果 **【参数】 Instance 调用标识 IsSucceed 是否成功 strData 执行结果返回的随路数据 **【返回值】 ****************************************************************/ void CDevControl::onEventOpResult( long Instance, bool IsSucceed, LPCTSTR lpData ) { // 生成执行结果内容 EventOpResult node; memset(&node, 0, sizeof(EventOpResult)); node.nInstance = Instance; node.bIsSucceed = IsSucceed; if(lpData != NULL) lstrcpy(node.szData, lpData); ASSERT(m_pOperator != NULL); m_pOperator->onDeviceEvent(DEV_EVENT_LINE_OP_RESULT, &node); } /***************************************************************** **【函数名称】 onEventReqProcess **【函数功能】 操作进展返回 **【参数】 Instance 调用标识 HostLine 主控线路ID AssoLine 关联线路ID AssoLineType 关联线路类型 CallerNum 主叫号码 CalleeNum 被叫号码 **【返回值】 ****************************************************************/ void CDevControl::onEventOpProcess( long Instance, UINT HostLine, UINT AssoLine, DEV_RES_TYPE AssoLineType, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum ) { // 生成执行进展内容 EventOpProcess node; memset(&node, 0, sizeof(EventOpProcess)); node.nInstance = Instance; node.nHostLine = HostLine; node.nAssoLine = AssoLine; node.nAssoLineType = AssoLineType; if(lpCallerNum != NULL) lstrcpy(node.szCallerNum, lpCallerNum); if(lpCalleeNum != NULL) lstrcpy(node.szCalleeNum, lpCalleeNum); ASSERT(m_pOperator != NULL); m_pOperator->onDeviceEvent(DEV_EVENT_LINE_OP_PROCESS, &node); } /***************************************************************** **【函数名称】 onEventDevOperation **【函数功能】 设备主动操作事件 **【参数】 LineID 线路ID OpType 操作类型 lpCallerNum 主叫号码 lpCalleeNum 被叫号码 **【返回值】 ****************************************************************/ void CDevControl::onEventDevOperation( UINT LineID, DEV_OP OpType, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum ) { // 生成执行事件内容 EventDevOperation node; memset(&node, 0, sizeof(EventDevOperation)); node.nLineId = LineID; node.nOpType = OpType; if(lpCallerNum != NULL) lstrcpy(node.szCallerNum, lpCallerNum); if(lpCalleeNum != NULL) lstrcpy(node.szCalleeNum, lpCalleeNum); ASSERT(m_pOperator != NULL); m_pOperator->onDeviceEvent(DEV_EVENT_DEV_OPERATOR, &node); }