Keine Beschreibung

DevControl.cpp 32KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103
  1. #include "StdAfx.h"
  2. #include "DevControl.h"
  3. #include "resource.h"
  4. #include "eHangConfig.h"
  5. #include "NetCtrlInterface.h"
  6. #include "PduDataFormat.h"
  7. #include "PduLinkInc.h"
  8. #include "PduEntity.h"
  9. SINGLETON_IMPLEMENT(CDevControl)
  10. IDeviceLink& IDeviceLink::getInstance( void )
  11. {
  12. return CDevControl::GetInstance();
  13. }
  14. CDevControl::CDevControl(void) : m_pOperator(NULL), m_IsConnected2Sc(false), m_IsDevOK(false)
  15. {
  16. }
  17. CDevControl::~CDevControl(void)
  18. {
  19. }
  20. /*****************************************************************
  21. **【函数名称】 __initNetLink
  22. **【函数功能】 初始化网络连接
  23. **【参数】
  24. **【返回值】
  25. ****************************************************************/
  26. bool CDevControl::__initNetLink( void )
  27. {
  28. // 初始化命令配置
  29. #ifdef _DEBUG
  30. CPduDataFormat::getInstance()->Load("../StableCore/ScPduFormat.ini");
  31. #else
  32. CPduDataFormat::getInstance()->Load("./ScPduFormat.ini");
  33. #endif
  34. // 注册事件响应接口
  35. CInterfaceWindow::getLinkInstance()->RegistPduLinkProc(this, TRUE);
  36. CInterfaceWindow::getCommInstance()->RegistPduCommProc(this, TRUE);
  37. // 连接到CTI
  38. CString Ip = CeHangConfig::scAddr();
  39. int Port = CeHangConfig::scPort();
  40. if(!CInterfaceWindow::getLinkInstance()->CreatePduClient(Ip, Port, PDU_DEV_TYPE_SC_CLIENT, 0, PDU_DEV_TYPE_SC_SERVER, 0, false))
  41. {
  42. __onLog(LOG_LEVEL_ERROR, _T("{Dev}: 连接SC服务[%s:%d]失败, 请检查网络配置是否正常!"), Ip, Port);
  43. return false;
  44. } // end if
  45. return true;
  46. }
  47. /*****************************************************************
  48. **【函数名称】 __shutNetLink
  49. **【函数功能】 关闭网络连接
  50. **【参数】
  51. **【返回值】
  52. ****************************************************************/
  53. void CDevControl::__shutNetLink( void )
  54. {
  55. CInterfaceWindow::getLinkInstance()->StopAll();
  56. }
  57. /*****************************************************************
  58. **【函数名称】 __notifyResType
  59. **【函数功能】 通知资源类型
  60. **【参数】
  61. **【返回值】
  62. ****************************************************************/
  63. void CDevControl::__notifyResType( void )
  64. {
  65. EventResType node;
  66. ASSERT(m_pOperator != NULL);
  67. // 内线分机
  68. node.nResType = DEV_RES_TYPE_EXT;
  69. m_pOperator->onDeviceEvent(DEV_EVENT_RES_TYPE, &node);
  70. // 中继线路
  71. node.nResType = DEV_RES_TYPE_TRUNK;
  72. m_pOperator->onDeviceEvent(DEV_EVENT_RES_TYPE, &node);
  73. // VOIP资源
  74. node.nResType = DEV_RES_TYPE_VOIP;
  75. m_pOperator->onDeviceEvent(DEV_EVENT_RES_TYPE, &node);
  76. }
  77. /*****************************************************************
  78. **【函数名称】 onLog
  79. **【函数功能】 日志处理
  80. **【参数】
  81. **【返回值】
  82. ****************************************************************/
  83. void CDevControl::__onLog( UINT Level, CHAR* lpszFormat, ... )
  84. {
  85. // 得到消息内容
  86. CHAR szMsg[1024];
  87. ZeroMemory(szMsg, 1024);
  88. va_list ap;
  89. va_start(ap, lpszFormat);
  90. vsprintf_s(szMsg, lpszFormat, ap);
  91. if(strlen(szMsg) == 0) // 如果内容为空,不打印日志
  92. return;
  93. // 通知日志显示
  94. EventLog node;
  95. memset(&node, 0, sizeof(EventLog));
  96. node.nLevel = Level;
  97. lstrcpy(node.szContent, szMsg);
  98. ASSERT(m_pOperator != NULL);
  99. m_pOperator->onDeviceEvent(DEV_EVENT_LOG, &node);
  100. }
  101. /*****************************************************************
  102. **【函数名称】 onDevInvalid
  103. **【函数功能】 设备不可用
  104. **【参数】
  105. **【返回值】
  106. ****************************************************************/
  107. void CDevControl::__onDevStateUpdated( UINT DevState )
  108. {
  109. if(DevState == DEVICE_STATE_ENABLE)
  110. {
  111. __onLog(LOG_LEVEL_NORMAL, _T("{Dev}: 设备状态正常, 可响应CTI控制"));
  112. m_IsDevOK = true;
  113. ASSERT(m_pOperator != NULL);
  114. m_pOperator->onDeviceEvent(DEV_EVENT_INIT_END, NULL);
  115. }
  116. else
  117. {
  118. __onLog(LOG_LEVEL_ERROR, _T("{Dev}: 失去与PBX设备的连接, 或设备处于无效状态"));
  119. m_IsDevOK = false;
  120. ASSERT(m_pOperator != NULL);
  121. m_pOperator->onDeviceEvent(DEV_EVENT_DEV_CLOSED, NULL);
  122. }
  123. }
  124. /*****************************************************************
  125. **【函数名称】 __onNetLinkDisconnected
  126. **【函数功能】 连接断开后续处理
  127. **【参数】
  128. **【返回值】
  129. ****************************************************************/
  130. void CDevControl::__onNetLinkDisconnected( PduLinkContent linkContent )
  131. {
  132. m_IsConnected2Sc = false;
  133. __onDevStateUpdated(DEVICE_STATE_DISABLE);
  134. }
  135. /*****************************************************************
  136. **【函数名称】 __onOpResult
  137. **【函数功能】 设备操作执行结果
  138. **【参数】 Instance 调用标识
  139. IsSucceed 是否成功
  140. Data 执行结果返回的随路数据
  141. **【返回值】
  142. ****************************************************************/
  143. void CDevControl::__onOpResult( long Instance, BOOL IsSucceed, LPCTSTR Data )
  144. {
  145. // 生成执行结果内容
  146. EventOpResult node;
  147. memset(&node, 0, sizeof(EventOpResult));
  148. node.nInstance = Instance;
  149. node.bIsSucceed = IsSucceed;
  150. if(Data != NULL)
  151. lstrcpy(node.szData, Data);
  152. // 返回执行结果
  153. m_pOperator->onDeviceEvent(DEV_EVENT_LINE_OP_RESULT, &node);
  154. }
  155. /*****************************************************************
  156. **【函数名称】 __onDevResDetail
  157. **【函数功能】 设备资源状态处理
  158. **【参数】
  159. **【返回值】
  160. ****************************************************************/
  161. void CDevControl::__onDevResDetail( CPduEntity* a_pPduEntity )
  162. {
  163. EventResDetail node;
  164. memset(&node, 0, sizeof(EventResDetail));
  165. node.nResType = a_pPduEntity->GetDataUInt(0);
  166. node.nResID = a_pPduEntity->GetDataUInt(1);
  167. m_pOperator->onDeviceEvent(DEV_EVENT_RES_DETAIL, &node);
  168. }
  169. /*****************************************************************
  170. **【函数名称】 __onDevResState
  171. **【函数功能】 设备资源状态处理
  172. **【参数】
  173. **【返回值】
  174. ****************************************************************/
  175. void CDevControl::__onDevResState( CPduEntity* a_pPduEntity )
  176. {
  177. DEV_RES_TYPE ResTp = (DEV_RES_TYPE)a_pPduEntity->GetDataUInt(0);
  178. UINT State = a_pPduEntity->GetDataUInt(2);
  179. if(ResTp == DEV_RES_TYPE_MB)
  180. {
  181. __onDevStateUpdated(State);
  182. }
  183. else
  184. {
  185. EventResStatus node;
  186. memset(&node, 0, sizeof(EventResStatus));
  187. node.nResType = ResTp;
  188. node.nResID = a_pPduEntity->GetDataUInt(1);
  189. node.nState = State;
  190. lstrcpy(node.szCallerNum, a_pPduEntity->GetDataString(3));
  191. lstrcpy(node.szCalleeNum, a_pPduEntity->GetDataString(4));
  192. m_pOperator->onDeviceEvent(DEV_EVENT_RES_STATUS, &node);
  193. }
  194. }
  195. /*****************************************************************
  196. **【函数名称】 __onDevOpProcess
  197. **【函数功能】 操作进展返回
  198. **【参数】
  199. **【返回值】
  200. ****************************************************************/
  201. void CDevControl::__onDevOpProcess( CPduEntity* a_pPduEntity )
  202. {
  203. // 生成执行进展内容
  204. EventOpProcess node;
  205. memset(&node, 0, sizeof(EventOpProcess));
  206. node.nInstance = a_pPduEntity->GetDataLong(0);
  207. node.nHostLine = a_pPduEntity->GetDataUInt(1);
  208. node.nAssoLine = a_pPduEntity->GetDataUInt(2);
  209. node.nAssoLineType = a_pPduEntity->GetDataUInt(3);
  210. lstrcpy(node.szCallerNum, a_pPduEntity->GetDataString(4));
  211. lstrcpy(node.szCalleeNum, a_pPduEntity->GetDataString(5));
  212. // 返回执行结果
  213. m_pOperator->onDeviceEvent(DEV_EVENT_LINE_OP_PROCESS, &node);
  214. }
  215. /*****************************************************************
  216. **【函数名称】 __onDevOpResult
  217. **【函数功能】 设备操作执行结果
  218. **【参数】
  219. **【返回值】
  220. ****************************************************************/
  221. void CDevControl::__onDevOpResult( CPduEntity* a_pPduEntity )
  222. {
  223. // 生成执行结果内容
  224. EventOpResult node;
  225. memset(&node, 0, sizeof(EventOpResult));
  226. node.nInstance = a_pPduEntity->GetDataLong(0);
  227. node.bIsSucceed = a_pPduEntity->GetDataBool(1);
  228. lstrcpy(node.szData, a_pPduEntity->GetDataString(2));
  229. // 返回执行结果
  230. m_pOperator->onDeviceEvent(DEV_EVENT_LINE_OP_RESULT, &node);
  231. }
  232. /*****************************************************************
  233. **【函数名称】 __onDevActiveEvent
  234. **【函数功能】 设备主动事件处理
  235. **【参数】
  236. **【返回值】
  237. ****************************************************************/
  238. void CDevControl::__onDevActiveEvent( CPduEntity* a_pPduEntity )
  239. {
  240. // 生成执行事件内容
  241. EventDevOperation node;
  242. memset(&node, 0, sizeof(EventDevOperation));
  243. node.nLineId = a_pPduEntity->GetDataUInt(0);
  244. node.nOpType = a_pPduEntity->GetDataUInt(1);
  245. lstrcpy(node.szCallerNum, a_pPduEntity->GetDataString(2));
  246. lstrcpy(node.szCalleeNum, a_pPduEntity->GetDataString(3));
  247. // 通知事件
  248. m_pOperator->onDeviceEvent(DEV_EVENT_DEV_OPERATOR, &node);
  249. }
  250. /*****************************************************************
  251. **【函数名称】 __onDevReqReturn
  252. **【函数功能】 设备请求返回处理
  253. **【参数】
  254. **【返回值】
  255. ****************************************************************/
  256. void CDevControl::__onDevReqReturn( CPduEntity* a_pPduEntity )
  257. {
  258. bool ReqRes = a_pPduEntity->GetDataBool(1);
  259. if(!ReqRes)
  260. {
  261. if(a_pPduEntity->GetCmdType() == PDU_CMD_SC_REQ_RECORD) // 录音命令失败不再通知上层,因为录音是由会话发起并非任务发起
  262. {
  263. __onLog(LOG_LEVEL_WARNING, _T("{Dev}: 设备录音失败, HostLine = %d, RecordFile = %s"), a_pPduEntity->GetDataUInt(2), a_pPduEntity->GetDataString(3));
  264. }
  265. else
  266. {
  267. // 生成执行结果内容
  268. EventOpResult node;
  269. memset(&node, 0, sizeof(EventOpResult));
  270. node.nInstance = a_pPduEntity->GetDataLong(0);
  271. node.bIsSucceed = ReqRes;
  272. // 返回执行结果
  273. m_pOperator->onDeviceEvent(DEV_EVENT_LINE_OP_RESULT, &node);
  274. }
  275. }
  276. }
  277. #pragma region 设备操作
  278. /*****************************************************************
  279. **【函数名称】 __procOpInfoTransaction
  280. **【函数功能】 数据交互
  281. **【参数】 Instance 调用标识
  282. ResID 操作的主控资源ID
  283. LineOpParam* 操作信息
  284. **【返回值】 启动操作是否成功
  285. ****************************************************************/
  286. bool CDevControl::__procOpInfoTransaction( long Instance, ULONG ResID, LineOpParam* pParam )
  287. {
  288. CPduEntity Pdu(PDU_CMD_SC_REQ_INFOTRANSFER);
  289. Pdu.SetDataLong(0, Instance);
  290. Pdu.SetDataUInt(2, ResID);
  291. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  292. }
  293. /*****************************************************************
  294. **【函数名称】 __procOpPlayVoice
  295. **【函数功能】 线路放音收号
  296. **【参数】
  297. **【返回值】
  298. ****************************************************************/
  299. bool CDevControl::__procOpPlayVoice( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  300. {
  301. ASSERT(pLineOpParam != NULL);
  302. CPduEntity Pdu(PDU_CMD_SC_REQ_PLAY);
  303. Pdu.SetDataLong(0, Instance);
  304. Pdu.SetDataUInt(2, ResID);
  305. Pdu.SetDataInt(3, pLineOpParam->nParam1);
  306. Pdu.SetDataInt(4, pLineOpParam->nParam2);
  307. Pdu.SetDataInt(5, pLineOpParam->nParam3);
  308. Pdu.SetDataInt(6, pLineOpParam->nParam4);
  309. Pdu.SetDataInt(7, pLineOpParam->nParam5);
  310. Pdu.SetDataInt(8, pLineOpParam->nParam6);
  311. Pdu.SetDataInt(9, pLineOpParam->nParam7);
  312. Pdu.SetDataInt(10, pLineOpParam->nParam8);
  313. Pdu.SetDataString(11, pLineOpParam->szParam1);
  314. Pdu.SetDataString(12, pLineOpParam->szParam3);
  315. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  316. }
  317. /*****************************************************************
  318. **【函数名称】 __procOpMakeCall
  319. **【函数功能】 坐席外呼处理
  320. **【参数】
  321. **【返回值】
  322. ****************************************************************/
  323. bool CDevControl::__procOpMakeCall( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  324. {
  325. ASSERT(pLineOpParam != NULL);
  326. CPduEntity Pdu(PDU_CMD_SC_REQ_MAKECALL);
  327. Pdu.SetDataLong(0, Instance);
  328. Pdu.SetDataUInt(2, ResID);
  329. Pdu.SetDataString(3, pLineOpParam->szParam2);
  330. Pdu.SetDataString(4, pLineOpParam->szParam1);
  331. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  332. }
  333. /*****************************************************************
  334. **【函数名称】 __procOpHangUp
  335. **【函数功能】 挂机操作处理
  336. **【参数】 nInstance 调用标识
  337. nResID 操作的主控资源ID
  338. LineOpParam* 操作信息
  339. **【返回值】 启动操作是否成功
  340. ****************************************************************/
  341. bool CDevControl::__procOpHangUp( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  342. {
  343. CPduEntity Pdu(PDU_CMD_SC_REQ_HANGUP);
  344. Pdu.SetDataLong(0, Instance);
  345. Pdu.SetDataUInt(2, ResID);
  346. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  347. }
  348. /*****************************************************************
  349. **【函数名称】 __procOpTrunkTurn
  350. **【函数功能】 外线呼叫转移
  351. **【参数】
  352. **【返回值】
  353. ****************************************************************/
  354. bool CDevControl::__procOpTrunkTurn( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  355. {
  356. ASSERT(pLineOpParam != NULL);
  357. CPduEntity Pdu(PDU_CMD_SC_REQ_TRUNKTURN);
  358. Pdu.SetDataLong(0, Instance);
  359. Pdu.SetDataUInt(2, ResID);
  360. Pdu.SetDataString(3, pLineOpParam->szParam2);
  361. Pdu.SetDataString(4, pLineOpParam->szParam1);
  362. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  363. }
  364. /*****************************************************************
  365. **【函数名称】 __procOpTurnAgent
  366. **【函数功能】 外线转坐席
  367. **【参数】
  368. **【返回值】
  369. ****************************************************************/
  370. bool CDevControl::__procOpTurnAgent( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  371. {
  372. ASSERT(pLineOpParam != NULL);
  373. CPduEntity Pdu(PDU_CMD_SC_REQ_TURNAGENT);
  374. Pdu.SetDataLong(0, Instance);
  375. Pdu.SetDataUInt(2, ResID);
  376. Pdu.SetDataString(3, pLineOpParam->szParam2);
  377. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  378. }
  379. /*****************************************************************
  380. **【函数名称】 __procOpAnswerCall
  381. **【函数功能】 应答呼叫
  382. **【参数】
  383. **【返回值】
  384. ****************************************************************/
  385. bool CDevControl::__procOpAnswerCall( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  386. {
  387. CPduEntity Pdu(PDU_CMD_SC_REQ_ANSWER);
  388. Pdu.SetDataLong(0, Instance);
  389. Pdu.SetDataUInt(2, ResID);
  390. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  391. }
  392. /*****************************************************************
  393. **【函数名称】 __procOpAutoCall
  394. **【函数功能】 自动外呼
  395. **【参数】
  396. **【返回值】
  397. ****************************************************************/
  398. bool CDevControl::__procOpPCall( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  399. {
  400. ASSERT(pLineOpParam != NULL);
  401. CPduEntity Pdu(PDU_CMD_SC_REQ_PCALL);
  402. Pdu.SetDataLong(0, Instance);
  403. Pdu.SetDataString(2, pLineOpParam->szParam2);
  404. Pdu.SetDataString(3, pLineOpParam->szParam1);
  405. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  406. }
  407. /*****************************************************************
  408. **【函数名称】 __procOpTransfer
  409. **【函数功能】 座席呼叫转移
  410. **【参数】 Instance 调用标识
  411. ResID 操作的主控资源ID
  412. LineOpParam* 操作信息
  413. **【返回值】 启动操作是否成功
  414. ****************************************************************/
  415. bool CDevControl::__procOpTransfer( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  416. {
  417. ASSERT(pLineOpParam != NULL);
  418. CPduEntity Pdu(PDU_CMD_SC_REQ_TRANSFER);
  419. Pdu.SetDataLong(0, Instance);
  420. Pdu.SetDataUInt(2, ResID);
  421. Pdu.SetDataString(3, pLineOpParam->szParam2);
  422. Pdu.SetDataString(4, pLineOpParam->szParam1);
  423. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  424. }
  425. /*****************************************************************
  426. **【函数名称】 __procOpConf
  427. **【函数功能】 单步会议
  428. **【参数】 Instance 调用标识
  429. ResID 操作的主控资源ID
  430. LineOpParam* 操作信息
  431. **【返回值】 启动操作是否成功
  432. ****************************************************************/
  433. bool CDevControl::__procOpConf( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  434. {
  435. ASSERT(pLineOpParam != NULL);
  436. CPduEntity Pdu(PDU_CMD_SC_REQ_MEETING);
  437. Pdu.SetDataLong(0, Instance);
  438. Pdu.SetDataUInt(2, ResID);
  439. Pdu.SetDataString(3, pLineOpParam->szParam2);
  440. Pdu.SetDataString(4, pLineOpParam->szParam1);
  441. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  442. }
  443. /*****************************************************************
  444. **【函数名称】 __procOpTurnIvr
  445. **【函数功能】 转IVR
  446. **【参数】 Instance 调用标识
  447. ResID 操作的主控资源ID
  448. LineOpParam* 操作信息
  449. **【返回值】 启动操作是否成功
  450. ****************************************************************/
  451. bool CDevControl::__procOpTurnIvr( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  452. {
  453. CPduEntity Pdu(PDU_CMD_SC_REQ_TURNIVR);
  454. Pdu.SetDataLong(0, Instance);
  455. Pdu.SetDataUInt(2, ResID);
  456. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  457. }
  458. /*****************************************************************
  459. **【函数名称】 __procOpInstead
  460. **【函数功能】 代接
  461. **【参数】 Instance 调用标识
  462. ResID 操作的主控资源ID
  463. LineOpParam* 操作信息
  464. **【返回值】 启动操作是否成功
  465. ****************************************************************/
  466. bool CDevControl::__procOpInstead( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  467. {
  468. ASSERT(pLineOpParam != NULL);
  469. CPduEntity Pdu(PDU_CMD_SC_REQ_INSTEAD);
  470. Pdu.SetDataLong(0, Instance);
  471. Pdu.SetDataUInt(2, ResID);
  472. UINT ExtNum = 0;
  473. sscanf_s(pLineOpParam->szParam2, _T("%u"), &ExtNum);
  474. Pdu.SetDataUInt(3, ExtNum);
  475. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  476. }
  477. /*****************************************************************
  478. **【函数名称】 __procOpGrab
  479. **【函数功能】 强截
  480. **【参数】 Instance 调用标识
  481. ResID 操作的主控资源ID
  482. LineOpParam* 操作信息
  483. **【返回值】 启动操作是否成功
  484. ****************************************************************/
  485. bool CDevControl::__procOpGrab( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  486. {
  487. ASSERT(pLineOpParam != NULL);
  488. CPduEntity Pdu(PDU_CMD_SC_REQ_INTERCEPT);
  489. Pdu.SetDataLong(0, Instance);
  490. Pdu.SetDataUInt(2, ResID);
  491. UINT ExtNum = 0;
  492. sscanf_s(pLineOpParam->szParam2, _T("%u"), &ExtNum);
  493. Pdu.SetDataUInt(3, ExtNum);
  494. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  495. }
  496. /*****************************************************************
  497. **【函数名称】 __procOpInsert
  498. **【函数功能】 强插
  499. **【参数】 Instance 调用标识
  500. ResID 操作的主控资源ID
  501. LineOpParam* 操作信息
  502. **【返回值】 启动操作是否成功
  503. ****************************************************************/
  504. bool CDevControl::__procOpInsert( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  505. {
  506. ASSERT(pLineOpParam != NULL);
  507. CPduEntity Pdu(PDU_CMD_SC_REQ_INSERT);
  508. Pdu.SetDataLong(0, Instance);
  509. Pdu.SetDataUInt(2, ResID);
  510. UINT ExtNum = 0;
  511. sscanf_s(pLineOpParam->szParam2, _T("%u"), &ExtNum);
  512. Pdu.SetDataUInt(3, ExtNum);
  513. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  514. }
  515. /*****************************************************************
  516. **【函数名称】 __procOpListen
  517. **【函数功能】 监听
  518. **【参数】 Instance 调用标识
  519. ResID 操作的主控资源ID
  520. LineOpParam* 操作信息
  521. **【返回值】 启动操作是否成功
  522. ****************************************************************/
  523. bool CDevControl::__procOpListen( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  524. {
  525. ASSERT(pLineOpParam != NULL);
  526. CPduEntity Pdu(PDU_CMD_SC_REQ_LISTEN);
  527. Pdu.SetDataLong(0, Instance);
  528. Pdu.SetDataUInt(2, ResID);
  529. UINT ExtNum = 0;
  530. sscanf_s(pLineOpParam->szParam2, _T("%u"), &ExtNum);
  531. Pdu.SetDataUInt(3, ExtNum);
  532. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  533. }
  534. /*****************************************************************
  535. **【函数名称】 __procOpReset
  536. **【函数功能】 监听
  537. **【参数】 Instance 调用标识
  538. ResID 操作的主控资源ID
  539. LineOpParam* 操作信息
  540. **【返回值】 启动操作是否成功
  541. ****************************************************************/
  542. bool CDevControl::__procOpReset( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  543. {
  544. CPduEntity Pdu(PDU_CMD_SC_REQ_RESET);
  545. Pdu.SetDataLong(0, Instance);
  546. Pdu.SetDataUInt(2, ResID);
  547. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  548. }
  549. /*****************************************************************
  550. **【函数名称】 __ProcOpFax
  551. **【函数功能】 传真
  552. **【参数】 nInstance 调用标识
  553. nResID 操作的主控资源ID
  554. LineOpParam* 操作信息
  555. **【返回值】 启动操作是否成功
  556. ****************************************************************/
  557. bool CDevControl::__procOpFax( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  558. {
  559. ASSERT(pLineOpParam != NULL);
  560. CPduEntity Pdu(PDU_CMD_SC_REQ_FAX);
  561. Pdu.SetDataLong(0, Instance);
  562. Pdu.SetDataUInt(2, ResID);
  563. Pdu.SetDataUInt(3, pLineOpParam->nParam1);
  564. Pdu.SetDataString(4, pLineOpParam->szParam3);
  565. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  566. }
  567. /*****************************************************************
  568. **【函数名称】 __procOpRecord
  569. **【函数功能】 线路录音
  570. **【参数】 Instance 调用标识
  571. ResID 操作的主控资源ID
  572. LineOpParam* 操作信息
  573. **【返回值】 启动操作是否成功
  574. ****************************************************************/
  575. bool CDevControl::__procOpRecord( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  576. {
  577. ASSERT(pLineOpParam != NULL);
  578. CPduEntity Pdu(PDU_CMD_SC_REQ_RECORD);
  579. Pdu.SetDataLong(0, Instance);
  580. Pdu.SetDataUInt(2, ResID);
  581. Pdu.SetDataString(3, pLineOpParam->szParam3);
  582. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  583. }
  584. /*****************************************************************
  585. **【函数名称】 __procOpLeaveWord
  586. **【函数功能】 留言录音
  587. **【参数】 Instance 调用标识
  588. ResID 操作的主控资源ID
  589. LineOpParam* 操作信息
  590. **【返回值】 启动操作是否成功
  591. ****************************************************************/
  592. bool CDevControl::__procOpLeaveWord( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  593. {
  594. ASSERT(pLineOpParam != NULL);
  595. CPduEntity Pdu(PDU_CMD_SC_REQ_LEAVEWORD);
  596. Pdu.SetDataLong(0, Instance);
  597. Pdu.SetDataUInt(2, ResID);
  598. Pdu.SetDataUInt(3, pLineOpParam->nParam3);
  599. Pdu.SetDataString(4, pLineOpParam->szParam1);
  600. Pdu.SetDataString(5, pLineOpParam->szParam3);
  601. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  602. }
  603. /*****************************************************************
  604. **【函数名称】 __procOpMuteOn
  605. **【函数功能】 静音启动
  606. **【参数】 Instance 调用标识
  607. ResID 操作的主控资源ID
  608. LineOpParam* 操作信息
  609. **【返回值】 启动操作是否成功
  610. ****************************************************************/
  611. bool CDevControl::__procOpMuteOn( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  612. {
  613. CPduEntity Pdu(PDU_CMD_SC_REQ_MUTE);
  614. Pdu.SetDataLong(0, Instance);
  615. Pdu.SetDataUInt(2, ResID);
  616. Pdu.SetDataUInt(3, 0);
  617. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  618. }
  619. /*****************************************************************
  620. **【函数名称】 __procOpMuteOff
  621. **【函数功能】 静音结束
  622. **【参数】 Instance 调用标识
  623. ResID 操作的主控资源ID
  624. LineOpParam* 操作信息
  625. **【返回值】 启动操作是否成功
  626. ****************************************************************/
  627. bool CDevControl::__procOpMuteOff( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  628. {
  629. CPduEntity Pdu(PDU_CMD_SC_REQ_MUTE);
  630. Pdu.SetDataLong(0, Instance);
  631. Pdu.SetDataUInt(2, ResID);
  632. Pdu.SetDataUInt(3, 1);
  633. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  634. }
  635. /*****************************************************************
  636. **【函数名称】 __procOpSelfCheck
  637. **【函数功能】 线路自检(当前只对模拟外线有效)
  638. **【参数】 Instance 调用标识
  639. ResID 操作的主控资源ID
  640. LineOpParam* 操作信息
  641. **【返回值】 启动操作是否成功
  642. ****************************************************************/
  643. bool CDevControl::__procOpSelfCheck( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  644. {
  645. CPduEntity Pdu(PDU_CMD_SC_REQ_LINECHECK);
  646. Pdu.SetDataLong(0, Instance);
  647. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  648. }
  649. /*****************************************************************
  650. **【函数名称】 __procOpConsultCallBegin
  651. **【函数功能】 协商呼叫启动
  652. **【参数】 Instance 调用标识
  653. ResID 操作的主控资源ID
  654. LineOpParam* 操作信息
  655. **【返回值】 启动操作是否成功
  656. ****************************************************************/
  657. bool CDevControl::__procOpConsultCallBegin( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  658. {
  659. ASSERT(pLineOpParam != NULL);
  660. CPduEntity Pdu(PDU_CMD_SC_REQ_CONSULTCALL);
  661. Pdu.SetDataLong(0, Instance);
  662. Pdu.SetDataUInt(2, ResID);
  663. Pdu.SetDataString(3, pLineOpParam->szParam2);
  664. Pdu.SetDataString(4, pLineOpParam->szParam1);
  665. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  666. }
  667. /*****************************************************************
  668. **【函数名称】 __procOpConsultCallConfirm
  669. **【函数功能】 协商呼叫确认
  670. **【参数】 Instance 调用标识
  671. ResID 操作的主控资源ID
  672. LineOpParam* 操作信息
  673. **【返回值】 启动操作是否成功
  674. ****************************************************************/
  675. bool CDevControl::__procOpConsultCallConfirm( long Instance, ULONG ResID, LineOpParam* pLineOpParam )
  676. {
  677. ASSERT(pLineOpParam != NULL);
  678. CPduEntity Pdu(PDU_CMD_SC_REQ_CONSULTCONFIRM);
  679. Pdu.SetDataLong(0, Instance);
  680. Pdu.SetDataUInt(2, ResID);
  681. Pdu.SetDataInt(3, pLineOpParam->nParam1);
  682. return CInterfaceWindow::getCommInstance()->Send(&Pdu, PDU_DEV_TYPE_SC_SERVER, 0) == TRUE;
  683. }
  684. #pragma endregion
  685. /*****************************************************************
  686. **【函数名称】 open
  687. **【函数功能】 设备打开
  688. **【参数】 a_pOperator:设备操作者对象
  689. **【返回值】 成功true,失败false
  690. ****************************************************************/
  691. bool CDevControl::open( IDeviceOperator* a_pOperator )
  692. {
  693. if(m_pOperator != NULL)
  694. return false;
  695. CeHangConfig::load();
  696. ASSERT(a_pOperator != NULL);
  697. m_pOperator = a_pOperator;
  698. __onLog(LOG_LEVEL_NORMAL, _T("{DevCtrl}: 开始连接毅航PBX, DevLink版本号: 4.0.0.2"));
  699. if(!__initNetLink())
  700. {
  701. m_pOperator = NULL;
  702. return false;
  703. }
  704. __notifyResType();
  705. return true;
  706. }
  707. /*****************************************************************
  708. **【函数名称】 close
  709. **【函数功能】 设备关闭
  710. **【参数】
  711. **【返回值】
  712. ****************************************************************/
  713. void CDevControl::close( void )
  714. {
  715. if(m_pOperator != NULL)
  716. {
  717. __onLog(LOG_LEVEL_NORMAL, _T("{DevCtrl}: 设备链路关闭"));
  718. __shutNetLink();
  719. m_pOperator = NULL;
  720. }
  721. }
  722. /*****************************************************************
  723. **【函数名称】 operate
  724. **【函数功能】 线路控制
  725. **【参数】 Instance 调用标识
  726. OpType 操作类型
  727. ResID 线路ID
  728. pLineOpParam 操作参数
  729. **【返回值】 成功true,失败false
  730. ****************************************************************/
  731. bool CDevControl::operate( LONG Instance, LINE_OP OpType, ULONG ResID, LineOpParam* pLineOpParam )
  732. {
  733. bool Res = false;
  734. // 根据操作类型进行分类处理
  735. switch(OpType)
  736. {
  737. case LINE_OP_MAKE_CALL: // 座席外呼
  738. Res = __procOpMakeCall(Instance, ResID, pLineOpParam);
  739. break;
  740. case LINE_OP_ANSWER_CALL: // 应答呼叫
  741. Res = __procOpAnswerCall(Instance, ResID, pLineOpParam);
  742. break;
  743. case LINE_OP_PREDICTION_CALL: // 预测外呼
  744. Res = __procOpPCall(Instance, ResID, pLineOpParam);
  745. break;
  746. case LINE_OP_HANG_UP: // 挂机
  747. Res = __procOpHangUp(Instance, ResID, pLineOpParam);
  748. break;
  749. case LINE_OP_TRANSFER: // 呼叫转移
  750. Res = __procOpTransfer(Instance, ResID, pLineOpParam);
  751. break;
  752. case LINE_OP_TURNOUT: // 转外线
  753. Res = __procOpTrunkTurn(Instance, ResID, pLineOpParam);
  754. break;
  755. case LINE_OP_TURNAGENT: // 转坐席
  756. Res = __procOpTurnAgent(Instance, ResID, pLineOpParam);
  757. break;
  758. case LINE_OP_TURNIVR: // 转IVR
  759. Res = __procOpTurnIvr(Instance, ResID, pLineOpParam);
  760. break;
  761. case LINE_OP_CONFERENCE: // 单步会议
  762. Res = __procOpConf(Instance, ResID, pLineOpParam);
  763. break;
  764. case LINE_OP_LISTEN: // 监听
  765. Res = __procOpListen(Instance, ResID, pLineOpParam);
  766. break;
  767. case LINE_OP_INSERT: // 强插
  768. Res = __procOpInsert(Instance, ResID, pLineOpParam);
  769. break;
  770. case LINE_OP_RESET: // 重置
  771. Res = __procOpReset(Instance, ResID, pLineOpParam);
  772. break;
  773. case LINE_OP_INSTEAD: // 代接
  774. Res = __procOpInstead(Instance, ResID, pLineOpParam);
  775. break;
  776. case LINE_OP_GRAB: // 强截
  777. Res = __procOpGrab(Instance, ResID, pLineOpParam);
  778. break;
  779. case LINE_OP_TRANSFER_INFO: // 信息交互
  780. Res = __procOpInfoTransaction(Instance, ResID, pLineOpParam);
  781. break;
  782. case LINE_OP_PLAY_VOICE: // 放音收号
  783. Res = __procOpPlayVoice(Instance, ResID, pLineOpParam);
  784. break;
  785. case LINE_OP_FAX: // 传真
  786. Res = __procOpFax(Instance, ResID, pLineOpParam);
  787. break;
  788. case LINE_OP_RECORD: // 录音
  789. Res = __procOpRecord(Instance, ResID, pLineOpParam);
  790. break;
  791. case LINE_OP_LEAVEWORD: // 留言
  792. Res = __procOpLeaveWord(Instance, ResID, pLineOpParam);
  793. break;
  794. case LINE_OP_MUTE_BEGIN: // 静音启动
  795. Res = __procOpMuteOn(Instance, ResID, pLineOpParam);
  796. break;
  797. case LINE_OP_MUTE_END: // 静音结束
  798. Res = __procOpMuteOff(Instance, ResID, pLineOpParam);
  799. break;
  800. case LINE_OP_SELF_CHECK: // 线路自检
  801. Res = __procOpSelfCheck(Instance, ResID, pLineOpParam);
  802. break;
  803. case LINE_OP_CONSULT_CALL_BEGIN: // 协商呼叫启动
  804. Res = __procOpConsultCallBegin(Instance, ResID, pLineOpParam);
  805. break;
  806. case LINE_OP_CONSULT_CALL_CONFIRM: // 协商呼叫确认
  807. Res = __procOpConsultCallConfirm(Instance, ResID, pLineOpParam);
  808. break;
  809. case LINE_OP_IVRFAX_TRANSFER:
  810. __onOpResult(Instance, TRUE, _T(""));
  811. return TRUE;
  812. } // end switch
  813. return Res;
  814. }
  815. /*****************************************************************
  816. **【函数名称】 OnLinkStateChanged
  817. **【函数功能】 网络链路状态变化处理函数
  818. **【参数】
  819. **【返回值】
  820. ****************************************************************/
  821. void CDevControl::OnLinkStateChanged( const PduLinkContent& linkContent )
  822. {
  823. CString Msg;
  824. LOG_LEVEL Level = LOG_LEVEL_NORMAL;
  825. switch(linkContent.nLinkState)
  826. {
  827. case PDU_LINK_STATE_SUCCESSED: // 请求连接成功
  828. Msg.Format(_T("Far End[IP = %s, Port = %d], Hint = 网络连接成功..."),
  829. linkContent.szFarIp,
  830. linkContent.nFarPort);
  831. break;
  832. case PDU_LINK_STATE_FAILED: // 请求连接失败
  833. Msg.Format(_T("Far End[IP = %s, Port = %d], Hint = 网络连接失败..."),
  834. linkContent.szFarIp,
  835. linkContent.nFarPort);
  836. Level = LOG_LEVEL_ERROR;
  837. break;
  838. case PDU_LINK_STATE_DISCONNECTED: // 连接已断开
  839. Msg.Format(_T("Far End[IP = %s, Port = %d], Hint = 网络连接已断开..."),
  840. linkContent.szFarIp,
  841. linkContent.nFarPort);
  842. __onNetLinkDisconnected(linkContent); // 后续处理
  843. Level = LOG_LEVEL_ERROR;
  844. break;
  845. case PDU_LINK_STATE_REG_OK: // 注册成功
  846. {
  847. Msg.Format(_T("Far End[Type = %d, ID = %d, IP = %s, Port = %d], Hint = 网络连接注册成功..."),
  848. linkContent.nFarType,
  849. linkContent.nFarId,
  850. linkContent.szFarIp,
  851. linkContent.nFarPort);
  852. if(linkContent.nFarType == PDU_DEV_TYPE_SC_SERVER) m_IsConnected2Sc = true;
  853. }
  854. break;
  855. case PDU_LINK_STATE_REG_FAILED: // 注册失败
  856. Msg.Format(_T("Far End[IP = %s, Port = %d], Hint = 网络连接注册失败,通讯禁止..."),
  857. linkContent.szFarIp,
  858. linkContent.nFarPort);
  859. Level = LOG_LEVEL_ERROR;
  860. break;
  861. default:
  862. Msg.Format(_T("Far End[Type = %d, ID = %d, IP = %s, Port = %d]"),
  863. linkContent.nFarType,
  864. linkContent.nFarId,
  865. linkContent.szFarIp,
  866. linkContent.nFarPort);
  867. break;
  868. } // end switch
  869. __onLog(Level, _T("{Dev}: %s"), Msg);
  870. }
  871. /*****************************************************************
  872. **【函数名称】 OnRecvCommand
  873. **【函数功能】 网络命令处理函数
  874. **【参数】
  875. **【返回值】
  876. ****************************************************************/
  877. void CDevControl::OnRecvCommand( CPduEntity* a_pPduEntity )
  878. {
  879. ASSERT(a_pPduEntity != NULL);
  880. switch(a_pPduEntity->GetCmdType())
  881. {
  882. case PDU_CMD_SC_RES_DETAIL:
  883. __onDevResDetail(a_pPduEntity);
  884. break;
  885. case PDU_CMD_SC_RES_STATE:
  886. __onDevResState(a_pPduEntity);
  887. break;
  888. case PDU_CMD_SC_ACTIVE_EVENT:
  889. __onDevActiveEvent(a_pPduEntity);
  890. break;
  891. case PDU_CMD_SC_REQ_PROCESS:
  892. __onDevOpProcess(a_pPduEntity);
  893. break;
  894. case PDU_CMD_SC_REQ_RESULT:
  895. __onDevOpResult(a_pPduEntity);
  896. break;
  897. case PDU_CMD_SC_REQ_PCALL:
  898. case PDU_CMD_SC_REQ_MAKECALL:
  899. case PDU_CMD_SC_REQ_ANSWER:
  900. case PDU_CMD_SC_REQ_HANGUP:
  901. case PDU_CMD_SC_REQ_TRANSFER:
  902. case PDU_CMD_SC_REQ_TRUNKTURN:
  903. case PDU_CMD_SC_REQ_PLAY:
  904. case PDU_CMD_SC_REQ_CONSULTCALL:
  905. case PDU_CMD_SC_REQ_CONSULTCONFIRM:
  906. case PDU_CMD_SC_REQ_MUTE:
  907. case PDU_CMD_SC_REQ_INSTEAD:
  908. case PDU_CMD_SC_REQ_INTERCEPT:
  909. case PDU_CMD_SC_REQ_INSERT:
  910. case PDU_CMD_SC_REQ_LISTEN:
  911. case PDU_CMD_SC_REQ_LEAVEWORD:
  912. case PDU_CMD_SC_REQ_MEETING:
  913. case PDU_CMD_SC_REQ_FAX:
  914. case PDU_CMD_SC_REQ_TURNIVR:
  915. case PDU_CMD_SC_REQ_RESET:
  916. case PDU_CMD_SC_REQ_RECORD:
  917. case PDU_CMD_SC_REQ_LINECHECK:
  918. case PDU_CMD_SC_REQ_INFOTRANSFER:
  919. case PDU_CMD_SC_REQ_TURNAGENT:
  920. __onDevReqReturn(a_pPduEntity);
  921. break;
  922. }
  923. }