#include "StdAfx.h" #include "DevControl.h" #include "VsControl.h" #include "TapiControl.h" #include "Config.h" #include "AvayaLinkControl.h" #include "LineOpExec.h" #include "LineFactory.h" #include "TrunkContainer.h" SINGLETON_IMPLEMENT(CDevControl) IDeviceLink& IDeviceLink::getInstance( void ) { return CDevControl::GetInstance(); } CDevControl::CDevControl(void) : m_pOperator(NULL) { } CDevControl::~CDevControl(void) { } /***************************************************************** **【函数名称】 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; COtlConnection* pDbControl = COtlConnection::GetOtlInstence(); onEventLog(LOG_LEVEL_NORMAL, _T("{DevCtrl}: 设备链路建立...")); do { // 打开数据库连接 if(!pDbControl->Connect()) { onEventLog(LOG_LEVEL_ERROR, _T("{DevCtrl}: 数据库连接失败, Cause = %s"), pDbControl->GetLastError()); break; } CConfig::load(); onEventResType(); // 初始化中继线列表 if(!CLineFactory::makeTrunkLine()) { onEventLog(LOG_LEVEL_ERROR, _T("{TapiCtrl}: 中继线路打开失败")); break; } // 初始化VS控制 if(!CVsControl::GetInstance().init()) break; // DevLink的打开 CAvayaLinkControl::GetInstance().open(); CTapiControl::GetInstance().init(); pDbControl->Disconnect(); onEventInitEnd(); onEventLog(LOG_LEVEL_NORMAL, _T("{DevCtrl}: 设备链路建立完成")); return true; } while (false); pDbControl->Disconnect(); 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}: 设备链路关闭")); // TAPI资源释放 CTapiControl::GetInstance().release(); // DevLink的关闭 CAvayaLinkControl::GetInstance().close(); // VS资源释放 CVsControl::GetInstance().release(); CTrunkContainer::clear(); m_pOperator = NULL; } } /***************************************************************** **【函数名称】 operate **【函数功能】 线路控制 **【参数】 nInstance 调用标识 nOpType 操作类型 nResID 线路ID pLineOpParam 操作参数 **【返回值】 成功true,失败false ****************************************************************/ bool CDevControl::operate( LONG Instance, LINE_OP OpType, ULONG ResID, LineOpParam* pLineOpParam ) { return CLineOpExec::GetInstance().procLineOp(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); // IVR分机 node.nResType = DEV_RES_TYPE_IVR; m_pOperator->onDeviceEvent(DEV_EVENT_RES_TYPE, &node); // TRUNK node.nResType = DEV_RES_TYPE_TRUNK; m_pOperator->onDeviceEvent(DEV_EVENT_RES_TYPE, &node); // 传真 node.nResType = DEV_RES_TYPE_FAX; m_pOperator->onDeviceEvent(DEV_EVENT_RES_TYPE, &node); } /***************************************************************** **【函数名称】 onEventResDetail **【函数功能】 通知可控的资源明细信息 **【参数】 Type 资源类型 ResID 资源ID **【返回值】 ****************************************************************/ void CDevControl::onEventResDetail( UINT Type, LPCTSTR ResID ) { EventResDetail node; memset(&node, 0, sizeof(EventResDetail)); node.nResType = Type; node.nResID = atoi(ResID); ASSERT(m_pOperator != NULL); m_pOperator->onDeviceEvent(DEV_EVENT_RES_DETAIL, &node); } /***************************************************************** **【函数名称】 onEventResState **【函数功能】 通知资源状态信息 **【参数】 Type 资源类型 ResID 资源ID State 资源状态 **【返回值】 ****************************************************************/ void CDevControl::onEventResState( UINT Type, LPCTSTR ResID, long State, LPCTSTR CallerNum /*= NULL*/, LPCTSTR CalleeNum /*= NULL*/ ) { EventResStatus node; memset(&node, 0, sizeof(EventResStatus)); node.nResType = Type; node.nResID = atoi(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); } /***************************************************************** **【函数名称】 onEventInitEnd **【函数功能】 设备初始化结束 **【参数】 **【返回值】 ****************************************************************/ void CDevControl::onEventInitEnd( void ) { ASSERT(m_pOperator != NULL); m_pOperator->onDeviceEvent(DEV_EVENT_INIT_END, NULL); } /***************************************************************** **【函数名称】 onEventOpResult **【函数功能】 设备操作执行结果 **【参数】 Instance 调用标识 IsSucceed 是否成功 strData 执行结果返回的随路数据 **【返回值】 ****************************************************************/ void CDevControl::onEventOpResult( long Instance, bool IsSucceed, LPCTSTR lpData /*= NULL*/ ) { // 生成执行结果内容 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, UINT 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); }