中间件标准版5.1git,去除基础模块

DevControl.cpp 8.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311
  1. #include "StdAfx.h"
  2. #include "DevControl.h"
  3. #include "VsControl.h"
  4. #include "TapiControl.h"
  5. #include "Config.h"
  6. #include "AvayaLinkControl.h"
  7. #include "LineOpExec.h"
  8. #include "LineFactory.h"
  9. #include "TrunkContainer.h"
  10. SINGLETON_IMPLEMENT(CDevControl)
  11. IDeviceLink& IDeviceLink::getInstance( void )
  12. {
  13. return CDevControl::GetInstance();
  14. }
  15. CDevControl::CDevControl(void) : m_pOperator(NULL)
  16. {
  17. }
  18. CDevControl::~CDevControl(void)
  19. {
  20. }
  21. /*****************************************************************
  22. **【函数名称】 open
  23. **【函数功能】 设备打开
  24. **【参数】 a_pOperator:设备操作者对象
  25. **【返回值】 成功true,失败false
  26. ****************************************************************/
  27. bool CDevControl::open( IDeviceOperator* a_pOperator )
  28. {
  29. ASSERT(a_pOperator != NULL);
  30. if(m_pOperator != NULL)
  31. return false;
  32. m_pOperator = a_pOperator;
  33. COtlConnection* pDbControl = COtlConnection::GetOtlInstence();
  34. onEventLog(LOG_LEVEL_NORMAL, _T("{DevCtrl}: 设备链路建立..."));
  35. do
  36. {
  37. // 打开数据库连接
  38. if(!pDbControl->Connect())
  39. {
  40. onEventLog(LOG_LEVEL_ERROR, _T("{DevCtrl}: 数据库连接失败, Cause = %s"), pDbControl->GetLastError());
  41. break;
  42. }
  43. CConfig::load();
  44. onEventResType();
  45. // 初始化中继线列表
  46. if(!CLineFactory::makeTrunkLine())
  47. {
  48. onEventLog(LOG_LEVEL_ERROR, _T("{TapiCtrl}: 中继线路打开失败"));
  49. break;
  50. }
  51. // 初始化VS控制
  52. if(!CVsControl::GetInstance().init())
  53. break;
  54. // DevLink的打开
  55. CAvayaLinkControl::GetInstance().open();
  56. CTapiControl::GetInstance().init();
  57. pDbControl->Disconnect();
  58. onEventInitEnd();
  59. onEventLog(LOG_LEVEL_NORMAL, _T("{DevCtrl}: 设备链路建立完成"));
  60. return true;
  61. } while (false);
  62. pDbControl->Disconnect();
  63. onEventLog(LOG_LEVEL_ERROR, _T("{DevCtrl}: 设备链路建立失败"));
  64. m_pOperator = NULL;
  65. return false;
  66. }
  67. /*****************************************************************
  68. **【函数名称】 close
  69. **【函数功能】 设备关闭
  70. **【参数】
  71. **【返回值】
  72. ****************************************************************/
  73. void CDevControl::close( void )
  74. {
  75. if(m_pOperator != NULL)
  76. {
  77. onEventLog(LOG_LEVEL_NORMAL, _T("{DevCtrl}: 设备链路关闭"));
  78. // TAPI资源释放
  79. CTapiControl::GetInstance().release();
  80. // DevLink的关闭
  81. CAvayaLinkControl::GetInstance().close();
  82. // VS资源释放
  83. CVsControl::GetInstance().release();
  84. CTrunkContainer::clear();
  85. m_pOperator = NULL;
  86. }
  87. }
  88. /*****************************************************************
  89. **【函数名称】 operate
  90. **【函数功能】 线路控制
  91. **【参数】 nInstance 调用标识
  92. nOpType 操作类型
  93. nResID 线路ID
  94. pLineOpParam 操作参数
  95. **【返回值】 成功true,失败false
  96. ****************************************************************/
  97. bool CDevControl::operate( LONG Instance, LINE_OP OpType, ULONG ResID, LineOpParam* pLineOpParam )
  98. {
  99. return CLineOpExec::GetInstance().procLineOp(Instance, OpType, ResID, pLineOpParam);
  100. }
  101. /*****************************************************************
  102. **【函数名称】 onEventResType
  103. **【函数功能】 通知可控的资源类型
  104. **【参数】
  105. **【返回值】
  106. ****************************************************************/
  107. void CDevControl::onEventResType( void )
  108. {
  109. EventResType node;
  110. ASSERT(m_pOperator != NULL);
  111. // 内线分机
  112. node.nResType = DEV_RES_TYPE_EXT;
  113. m_pOperator->onDeviceEvent(DEV_EVENT_RES_TYPE, &node);
  114. // IVR分机
  115. node.nResType = DEV_RES_TYPE_IVR;
  116. m_pOperator->onDeviceEvent(DEV_EVENT_RES_TYPE, &node);
  117. // TRUNK
  118. node.nResType = DEV_RES_TYPE_TRUNK;
  119. m_pOperator->onDeviceEvent(DEV_EVENT_RES_TYPE, &node);
  120. // 传真
  121. node.nResType = DEV_RES_TYPE_FAX;
  122. m_pOperator->onDeviceEvent(DEV_EVENT_RES_TYPE, &node);
  123. }
  124. /*****************************************************************
  125. **【函数名称】 onEventResDetail
  126. **【函数功能】 通知可控的资源明细信息
  127. **【参数】 Type 资源类型
  128. ResID 资源ID
  129. **【返回值】
  130. ****************************************************************/
  131. void CDevControl::onEventResDetail( UINT Type, LPCTSTR ResID )
  132. {
  133. EventResDetail node;
  134. memset(&node, 0, sizeof(EventResDetail));
  135. node.nResType = Type;
  136. node.nResID = atoi(ResID);
  137. ASSERT(m_pOperator != NULL);
  138. m_pOperator->onDeviceEvent(DEV_EVENT_RES_DETAIL, &node);
  139. }
  140. /*****************************************************************
  141. **【函数名称】 onEventResState
  142. **【函数功能】 通知资源状态信息
  143. **【参数】 Type 资源类型
  144. ResID 资源ID
  145. State 资源状态
  146. **【返回值】
  147. ****************************************************************/
  148. void CDevControl::onEventResState( UINT Type, LPCTSTR ResID, long State, LPCTSTR CallerNum /*= NULL*/, LPCTSTR CalleeNum /*= NULL*/ )
  149. {
  150. EventResStatus node;
  151. memset(&node, 0, sizeof(EventResStatus));
  152. node.nResType = Type;
  153. node.nResID = atoi(ResID);
  154. node.nState = State;
  155. if(CallerNum != NULL)
  156. lstrcpy(node.szCallerNum, CallerNum);
  157. if(CalleeNum != NULL)
  158. lstrcpy(node.szCalleeNum, CalleeNum);
  159. ASSERT(m_pOperator != NULL);
  160. m_pOperator->onDeviceEvent(DEV_EVENT_RES_STATUS, &node);
  161. }
  162. /*****************************************************************
  163. **【函数名称】 onEventLog
  164. **【函数功能】 通知显示日志
  165. **【参数】 Level 日志级别
  166. lpszFormat 日志内容
  167. **【返回值】
  168. ****************************************************************/
  169. void CDevControl::onEventLog( UINT Level, CHAR* lpszFormat, ... )
  170. {
  171. EventLog node;
  172. memset(&node, 0, sizeof(EventLog));
  173. node.nLevel = Level;
  174. // 得到消息内容
  175. va_list ap;
  176. va_start(ap, lpszFormat);
  177. vsprintf_s(node.szContent, lpszFormat, ap);
  178. // 通知日志显示
  179. ASSERT(m_pOperator != NULL);
  180. m_pOperator->onDeviceEvent(DEV_EVENT_LOG, &node);
  181. }
  182. /*****************************************************************
  183. **【函数名称】 onEventInitEnd
  184. **【函数功能】 设备初始化结束
  185. **【参数】
  186. **【返回值】
  187. ****************************************************************/
  188. void CDevControl::onEventInitEnd( void )
  189. {
  190. ASSERT(m_pOperator != NULL);
  191. m_pOperator->onDeviceEvent(DEV_EVENT_INIT_END, NULL);
  192. }
  193. /*****************************************************************
  194. **【函数名称】 onEventOpResult
  195. **【函数功能】 设备操作执行结果
  196. **【参数】 Instance 调用标识
  197. IsSucceed 是否成功
  198. strData 执行结果返回的随路数据
  199. **【返回值】
  200. ****************************************************************/
  201. void CDevControl::onEventOpResult( long Instance, bool IsSucceed, LPCTSTR lpData /*= NULL*/ )
  202. {
  203. // 生成执行结果内容
  204. EventOpResult node;
  205. memset(&node, 0, sizeof(EventOpResult));
  206. node.nInstance = Instance;
  207. node.bIsSucceed = IsSucceed;
  208. if(lpData != NULL)
  209. lstrcpy(node.szData, lpData);
  210. ASSERT(m_pOperator != NULL);
  211. m_pOperator->onDeviceEvent(DEV_EVENT_LINE_OP_RESULT, &node);
  212. }
  213. /*****************************************************************
  214. **【函数名称】 onEventReqProcess
  215. **【函数功能】 操作进展返回
  216. **【参数】 Instance 调用标识
  217. HostLine 主控线路ID
  218. AssoLine 关联线路ID
  219. AssoLineType 关联线路类型
  220. CallerNum 主叫号码
  221. CalleeNum 被叫号码
  222. **【返回值】
  223. ****************************************************************/
  224. void CDevControl::onEventOpProcess( long Instance, UINT HostLine, UINT AssoLine, DEV_RES_TYPE AssoLineType, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum )
  225. {
  226. // 生成执行进展内容
  227. EventOpProcess node;
  228. memset(&node, 0, sizeof(EventOpProcess));
  229. node.nInstance = Instance;
  230. node.nHostLine = HostLine;
  231. node.nAssoLine = AssoLine;
  232. node.nAssoLineType = AssoLineType;
  233. if(lpCallerNum != NULL)
  234. lstrcpy(node.szCallerNum, lpCallerNum);
  235. if(lpCalleeNum != NULL)
  236. lstrcpy(node.szCalleeNum, lpCalleeNum);
  237. ASSERT(m_pOperator != NULL);
  238. m_pOperator->onDeviceEvent(DEV_EVENT_LINE_OP_PROCESS, &node);
  239. }
  240. /*****************************************************************
  241. **【函数名称】 onEventDevOperation
  242. **【函数功能】 设备主动操作事件
  243. **【参数】 LineID 线路ID
  244. OpType 操作类型
  245. lpCallerNum 主叫号码
  246. lpCalleeNum 被叫号码
  247. **【返回值】
  248. ****************************************************************/
  249. void CDevControl::onEventDevOperation( UINT LineID, UINT OpType, LPCTSTR lpCallerNum, LPCTSTR lpCalleeNum )
  250. {
  251. // 生成执行事件内容
  252. EventDevOperation node;
  253. memset(&node, 0, sizeof(EventDevOperation));
  254. node.nLineId = LineID;
  255. node.nOpType = OpType;
  256. if(lpCallerNum != NULL)
  257. lstrcpy(node.szCallerNum, lpCallerNum);
  258. if(lpCalleeNum != NULL)
  259. lstrcpy(node.szCalleeNum, lpCalleeNum);
  260. ASSERT(m_pOperator != NULL);
  261. m_pOperator->onDeviceEvent(DEV_EVENT_DEV_OPERATOR, &node);
  262. }