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

OperationReactor.cpp 34KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160
  1. #include "StdAfx.h"
  2. #include "OperationReactor.h"
  3. #include "DevControl.h"
  4. #include "ChanExten.h"
  5. #include "ChanTrunk.h"
  6. #include "FsProxy.h"
  7. #include "OpAnswer.h"
  8. #include "OpHangup.h"
  9. #include "OpConsult.h"
  10. #include "OpInsert.h"
  11. #include "OpInstead.h"
  12. #include "OpIntercept.h"
  13. #include "OpLeaveWord.h"
  14. #include "OpListen.h"
  15. #include "OpMakeCall.h"
  16. #include "OpTransfer.h"
  17. #include "OpTurnExten.h"
  18. #include "OpTrunk2Trunk.h"
  19. #include "OpTurnIvr.h"
  20. #include "OpMeeting.h"
  21. #include "OpHoldon.h"
  22. #include "OpMute.h"
  23. #include "OpPlayAndDtmf.h"
  24. #include "OpRecord.h"
  25. #include "OpPredictionCall.h"
  26. SINGLETON_IMPLEMENT(COperationReactor)
  27. COperationReactor::COperationReactor(void)
  28. {
  29. }
  30. COperationReactor::~COperationReactor(void)
  31. {
  32. }
  33. /*****************************************************************
  34. **【函数名称】 __addOperation
  35. **【函数功能】 存储一个操作
  36. **【参数】
  37. **【返回值】
  38. *****************************************************************/
  39. void COperationReactor::__addOperation( COperation* pOperation )
  40. {
  41. m_TaskLock.Lock();
  42. m_TableOperation.SetAt(pOperation->uniqueId(), pOperation);
  43. m_TaskLock.Unlock();
  44. }
  45. /*****************************************************************
  46. **【函数名称】 __delOperation
  47. **【函数功能】 删除指定操作
  48. **【参数】
  49. **【返回值】
  50. *****************************************************************/
  51. bool COperationReactor::__delOperation( COperation* pOperation )
  52. {
  53. m_TaskLock.Lock();
  54. bool b= m_TableOperation.RemoveKey(pOperation->uniqueId()) == TRUE;
  55. m_TaskLock.Unlock();
  56. return b;
  57. }
  58. /*****************************************************************
  59. **【函数名称】 __getOperation
  60. **【函数功能】 获取指定操作
  61. **【参数】
  62. **【返回值】
  63. *****************************************************************/
  64. COperation* COperationReactor::__getOperation( LONG OpId )
  65. {
  66. m_TaskLock.Lock();
  67. COperation* pOp = NULL;
  68. m_TableOperation.Lookup(OpId, pOp);
  69. m_TaskLock.Unlock();
  70. return pOp;
  71. }
  72. /*****************************************************************
  73. **【函数名称】 __execOp
  74. **【函数功能】 执行OP
  75. **【参数】 pOp 操作实体
  76. pParam 操作参数
  77. **【返回值】
  78. ****************************************************************/
  79. bool COperationReactor::__execOp( COperation* pOp, LineOpParam* pParam )
  80. {
  81. __addOperation(pOp);
  82. if(pOp->start(pParam))
  83. return true;
  84. if(__delOperation(pOp))
  85. {
  86. pOp->detachHostChan();
  87. FS_LINK_DELETE(pOp);
  88. }
  89. return false;
  90. }
  91. /*****************************************************************
  92. **【函数名称】 __procOpMakeCall
  93. **【函数功能】 坐席外呼处理
  94. **【参数】
  95. **【返回值】
  96. ****************************************************************/
  97. bool COperationReactor::__procOpMakeCall( LONG Instance, ULONG ResID, LineOpParam* pParam )
  98. {
  99. // 通过设备资源查找主控线路
  100. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  101. if(pExten == NULL)
  102. {
  103. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行分机呼叫失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  104. return false;
  105. }
  106. // 生成外呼操作类
  107. COperation* pOp = new COpMakeCall(this, Instance);
  108. if(!pOp->attachHostChan(pExten))
  109. {
  110. // 如果线路正在执行其它操作
  111. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行分机呼叫失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"), ResID,
  112. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  113. FS_LINK_DELETE(pOp);
  114. return false;
  115. }
  116. // 启动操作
  117. return __execOp(pOp, pParam);
  118. }
  119. /*****************************************************************
  120. **【函数名称】 __procPredictionCall
  121. **【函数功能】 预测外呼
  122. **【参数】
  123. **【返回值】
  124. ****************************************************************/
  125. bool COperationReactor::__procOpPCall( LONG Instance, ULONG ResID, LineOpParam* pParam )
  126. {
  127. // 生成自动呼叫操作类
  128. COperation* pOp = new COpPredictionCall(this, Instance);
  129. // 启动操作
  130. return __execOp(pOp, pParam);
  131. }
  132. /*****************************************************************
  133. **【函数名称】 __procOpAnswerCall
  134. **【函数功能】 应答呼叫
  135. **【参数】
  136. **【返回值】
  137. ****************************************************************/
  138. bool COperationReactor::__procOpAnswerCall( LONG Instance, ULONG ResID, LineOpParam* pParam )
  139. {
  140. // 查找要应答呼叫的线路
  141. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  142. if(pExten == NULL)
  143. {
  144. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行分机应答失败, 未找到分机通道[%lu]"), ResID);
  145. return false;
  146. }
  147. // 生成应答呼叫操作类
  148. COperation* pOp = new COpAnswer(this, Instance);
  149. if(!pOp->attachHostChan(pExten))
  150. {
  151. // 如果线路正在执行其它操作
  152. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行分机应答失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  153. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()));
  154. FS_LINK_DELETE(pOp);
  155. return false;
  156. }
  157. // 启动操作
  158. return __execOp(pOp, pParam);
  159. }
  160. /*****************************************************************
  161. **【函数名称】 __procOpHangUp
  162. **【函数功能】 挂机操作处理
  163. **【参数】
  164. **【返回值】
  165. ****************************************************************/
  166. bool COperationReactor::__procOpHangUp( LONG Instance, ULONG ResID, LineOpParam* pParam )
  167. {
  168. // 查找要挂机的线路
  169. CVirtualChan* pChan = CFsProxy::GetInstance().getExten(ResID);
  170. if(pChan == NULL)
  171. pChan = CFsProxy::GetInstance().getTrunk(ResID);
  172. if(pChan == NULL)
  173. {
  174. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行挂机操作失败, 未找到通道[%lu]"), ResID);
  175. return false;
  176. } // end if
  177. // 如果线路正在执行其它操作
  178. if (pChan->currOp() != NULL)
  179. {
  180. if (pChan->currOp()->type() == LINE_OP_HANG_UP)
  181. {
  182. LOGGER(LOG_LEVEL_NORMAL, _T("{OperationReactor}: 当前线路正在执行挂机"));
  183. return false; // 使任务删除
  184. }
  185. LOGGER(LOG_LEVEL_NORMAL, _T("{OperationReactor}: 执行挂机, 当前线路绑定操作, Operation = %d"), pChan->currOp()->type());
  186. return pChan->currOp()->hangup(Instance);
  187. }
  188. if (pChan->state() == CHAN_LOGIC_STATE_FREE || pChan->state() == CHAN_LOGIC_STATE_DISABLED)
  189. {
  190. LOGGER(LOG_LEVEL_NORMAL, _T("{OperationReactor}: 当前线路已挂机"));
  191. return false; // 使任务删除
  192. }
  193. // 执行挂机操作
  194. COperation* pOp = new COpHangup(this, Instance);
  195. if(!pOp->attachHostChan(pChan))
  196. {
  197. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行挂机操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  198. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()));
  199. FS_LINK_DELETE(pOp);
  200. return false;
  201. }
  202. // 启动操作
  203. return __execOp(pOp, pParam);
  204. }
  205. /*****************************************************************
  206. **【函数名称】 __procOpTransfer
  207. **【函数功能】 座席呼叫转移
  208. **【参数】
  209. **【返回值】
  210. ****************************************************************/
  211. bool COperationReactor::__procOpTransfer( LONG Instance, ULONG ResID, LineOpParam* pParam )
  212. {
  213. // 通过设备资源查找主控线路
  214. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  215. if(pExten == NULL)
  216. {
  217. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行呼叫转移失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  218. return false;
  219. }
  220. COperation* pOp = new COpTransfer(this, Instance);
  221. if(!pOp->attachHostChan(pExten))
  222. {
  223. // 如果通道正在执行其它操作
  224. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行呼叫转移失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"), ResID,
  225. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  226. FS_LINK_DELETE(pOp);
  227. return false;
  228. }
  229. // 启动操作
  230. return __execOp(pOp, pParam);
  231. }
  232. /*****************************************************************
  233. **【函数名称】 __procOpTurnAgent
  234. **【函数功能】 外线转座席
  235. **【参数】
  236. **【返回值】
  237. ****************************************************************/
  238. bool COperationReactor::__procOpTurnAgent( LONG Instance, ULONG ResID, LineOpParam* pParam )
  239. {
  240. // 通过设备资源查找主控线路
  241. CVirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID);
  242. if(pChan == NULL)
  243. {
  244. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行中继转座席失败, 未找到中继通道[%lu], ExtenNum = %s"), ResID, pParam->szParam2);
  245. return false;
  246. }
  247. // 生成外线呼叫转移操作类
  248. COperation* pOp = new COpTurnExten(this, Instance);
  249. if(!pOp->attachHostChan(pChan))
  250. {
  251. // 当前线路是否正在进行其它操作
  252. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行中继转座席失败, 无法绑定通道[%lu], ChanCurTask = %d, ExtenNum = %s"), ResID,
  253. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()), pParam->szParam2);
  254. FS_LINK_DELETE(pOp);
  255. return false;
  256. }
  257. // 启动操作
  258. return __execOp(pOp, pParam);
  259. }
  260. /*****************************************************************
  261. **【函数名称】 __procOpTurnOut
  262. **【函数功能】 外线呼叫跳转
  263. **【参数】
  264. **【返回值】
  265. ****************************************************************/
  266. bool COperationReactor::__procOpTurnOut( LONG Instance, ULONG ResID, LineOpParam* pParam )
  267. {
  268. // 通过设备资源查找主控线路
  269. CVirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID);
  270. if(pChan == NULL)
  271. {
  272. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行中继呼叫跳转失败, 未找到中继通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  273. return false;
  274. }
  275. // 生成外线呼叫转移操作类
  276. COperation* pOp = new COpTrunk2Trunk(this, Instance);
  277. if(!pOp->attachHostChan(pChan))
  278. {
  279. // 当前线路是否正在进行其它操作
  280. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行中继呼叫跳转失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"), ResID,
  281. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()), pParam->szParam2);
  282. FS_LINK_DELETE(pOp);
  283. return false;
  284. }
  285. // 启动操作
  286. return __execOp(pOp, pParam);
  287. }
  288. /*****************************************************************
  289. **【函数名称】 __procOpTurnIvr
  290. **【函数功能】 转IVR
  291. **【参数】
  292. **【返回值】
  293. ****************************************************************/
  294. bool COperationReactor::__procOpTurnIvr( LONG Instance, ULONG ResID, LineOpParam* pParam )
  295. {
  296. // 查找要转IVR的线路
  297. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  298. if(pExten == NULL)
  299. {
  300. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行跳转IVR操作失败, 未找到分机通道[%lu]"), ResID);
  301. return false;
  302. } // end if
  303. // 执行转IVR操作
  304. COperation* pOp = new COpTurnIvr(this, Instance);
  305. if(!pOp->attachHostChan(pExten))
  306. {
  307. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行跳转IVR操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  308. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()));
  309. FS_LINK_DELETE(pOp);
  310. return false;
  311. } // end if
  312. return __execOp(pOp, pParam);
  313. }
  314. /*****************************************************************
  315. **【函数名称】 __procReqMeeting
  316. **【函数功能】 单步会议
  317. **【参数】
  318. **【返回值】
  319. ****************************************************************/
  320. bool COperationReactor::__procOpMeeting( LONG Instance, ULONG ResID, LineOpParam* pParam )
  321. {
  322. // 通过设备资源查找主控线路
  323. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  324. if(pExten == NULL)
  325. {
  326. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行会议操作失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  327. return false;
  328. }
  329. COperation* pOp = new COpMeeting(this, Instance);
  330. if(!pOp->attachHostChan(pExten))
  331. {
  332. // 如果线路正在执行其它操作
  333. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行会议操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"), ResID,
  334. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  335. FS_LINK_DELETE(pOp);
  336. return false;
  337. }
  338. // 启动操作
  339. return __execOp(pOp, pParam);
  340. }
  341. /*****************************************************************
  342. **【函数名称】 __procOpHold
  343. **【函数功能】 座席通话保持操作处理
  344. **【参数】 Instance 调用标识
  345. ResID 操作的主控资源ID
  346. LineOpParam* 操作信息
  347. **【返回值】 启动操作是否成功
  348. ****************************************************************/
  349. bool COperationReactor::__procOpHold( LONG Instance, ULONG ResID, LineOpParam* pParam )
  350. {
  351. // 通过设备资源查找主控线路
  352. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  353. if(pExten == NULL)
  354. {
  355. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行保持操作失败, 未找到分机通道[%lu]"), ResID);
  356. return false;
  357. }
  358. // 生成保持操作类
  359. COperation* pOp = new COpHoldon(this, Instance);
  360. if(!pOp->attachHostChan(pExten))
  361. {
  362. // 如果线路正在执行其它操作
  363. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行保持操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  364. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()));
  365. FS_LINK_DELETE(pOp);
  366. return false;
  367. }
  368. // 启动操作
  369. return __execOp(pOp, pParam);
  370. }
  371. /*****************************************************************
  372. **【函数名称】 __procOpTakeBack
  373. **【函数功能】 座席通话接回操作处理
  374. **【参数】 Instance 调用标识
  375. ResID 操作的主控资源ID
  376. LineOpParam* 操作信息
  377. **【返回值】 启动操作是否成功
  378. ****************************************************************/
  379. bool COperationReactor::__procOpTakeBack( LONG Instance, ULONG ResID, LineOpParam* pParam )
  380. {
  381. // 通过设备资源查找主控线路
  382. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  383. if(pExten == NULL)
  384. {
  385. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行保持接回操作失败, 未找到分机通道[%lu]"), ResID);
  386. return false;
  387. }
  388. // 如果线路正在执行其它操作
  389. COperation* pCurrOp = pExten->currOp();
  390. if(pCurrOp == NULL || pCurrOp->type() != LINE_OP_HOLD)
  391. {
  392. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行保持接回操作失败, 分机通道[%lu]当前未保持"), ResID);
  393. return false;
  394. }
  395. // 执行取消静音操作
  396. return pCurrOp->cancel(Instance);
  397. }
  398. /*****************************************************************
  399. **【函数名称】 __procOpMuteOn
  400. **【函数功能】 静音启动
  401. **【参数】
  402. **【返回值】
  403. ****************************************************************/
  404. bool COperationReactor::__procOpMuteOn( LONG Instance, ULONG ResID, LineOpParam* pParam )
  405. {
  406. // 通过设备资源查找主控线路
  407. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  408. if(pExten == NULL)
  409. {
  410. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行静音操作失败, 未找到分机通道[%lu]"), ResID);
  411. return false;
  412. }
  413. // 生成静音操作类
  414. COperation* pOp = new COpMute(this, Instance);
  415. if(!pOp->attachHostChan(pExten))
  416. {
  417. // 如果线路正在执行其它操作
  418. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行静音操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  419. (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()));
  420. FS_LINK_DELETE(pOp);
  421. return false;
  422. }
  423. // 启动操作
  424. return __execOp(pOp, pParam);
  425. }
  426. /*****************************************************************
  427. **【函数名称】 __procOpMuteOff
  428. **【函数功能】 静音取消
  429. **【参数】
  430. **【返回值】
  431. ****************************************************************/
  432. bool COperationReactor::__procOpMuteOff( LONG Instance, ULONG ResID, LineOpParam* pParam )
  433. {
  434. // 通过设备资源查找主控线路
  435. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  436. if(pExten == NULL)
  437. {
  438. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行取消静音操作失败, 未找到分机通道[%lu]"), ResID);
  439. return false;
  440. }
  441. // 如果线路正在执行其它操作
  442. COperation* pCurrOp = pExten->currOp();
  443. if(pCurrOp == NULL || pCurrOp->type() != LINE_OP_MUTE_BEGIN)
  444. {
  445. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行取消静音操作失败, 分机通道[%lu]当前未静音"), ResID);
  446. return false;
  447. }
  448. // 执行取消静音操作
  449. return pCurrOp->cancel(Instance);
  450. }
  451. /*****************************************************************
  452. **【函数名称】 __procOpReset
  453. **【函数功能】 重置
  454. **【参数】
  455. **【返回值】
  456. ****************************************************************/
  457. bool COperationReactor::__procOpReset( LONG Instance, ULONG ResID, LineOpParam* pParam )
  458. {
  459. // 通过设备资源查找主控线路
  460. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  461. if(pExten == NULL)
  462. {
  463. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行通道重置操作失败, 未找到分机通道[%lu]"), ResID);
  464. return false;
  465. }
  466. LOGGER(LOG_LEVEL_NORMAL, _T("{OperationReactor}: 执行通道重置操作, ChanNo = %lu"), ResID);
  467. // 清除关联操作
  468. COperation* pOp = pExten->currOp();
  469. if(pOp != NULL)
  470. {
  471. pOp->hangup(FS_LINK_INSTANCE_INVALID);
  472. if(__delOperation(pOp))
  473. {
  474. pOp->detachHostChan();
  475. FS_LINK_DELETE(pOp);
  476. }
  477. }
  478. else
  479. {
  480. if(!pExten->isFree())
  481. CFsProxy::GetInstance().kill(FS_LINK_JOBID_INVALID, pExten);
  482. } // end if
  483. return true;
  484. }
  485. /*****************************************************************
  486. **【函数名称】 __procOpListen
  487. **【函数功能】 监听
  488. **【参数】
  489. **【返回值】
  490. ****************************************************************/
  491. bool COperationReactor::__procOpListen( LONG Instance, ULONG ResID, LineOpParam* pParam )
  492. {
  493. // 通过设备资源查找主控线路
  494. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  495. if(pExten == NULL)
  496. {
  497. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行监听操作失败, 未找到分机通道[%lu], DestNum = %s"),
  498. ResID, pParam->szParam2);
  499. return false;
  500. }
  501. // 生成强插操作类
  502. COperation* pOp = new COpListen(this, Instance);
  503. if(!pOp->attachHostChan(pExten))
  504. {
  505. // 如果线路正在执行其它操作
  506. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行监听操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"),
  507. ResID, (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  508. FS_LINK_DELETE(pOp);
  509. return false;
  510. }
  511. // 启动操作
  512. return __execOp(pOp, pParam);
  513. }
  514. /*****************************************************************
  515. **【函数名称】 __procOpInsert
  516. **【函数功能】 强插
  517. **【参数】
  518. **【返回值】
  519. ****************************************************************/
  520. bool COperationReactor::__procOpInsert( LONG Instance, ULONG ResID, LineOpParam* pParam )
  521. {
  522. // 通过设备资源查找主控线路
  523. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  524. if(pExten == NULL)
  525. {
  526. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行强插操作失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  527. return false;
  528. }
  529. // 生成强插操作类
  530. COperation* pOp = new COpInsert(this, Instance);
  531. if(!pOp->attachHostChan(pExten))
  532. {
  533. // 如果线路正在执行其它操作
  534. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行强插操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"),
  535. ResID, (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  536. FS_LINK_DELETE(pOp);
  537. return false;
  538. }
  539. // 启动操作
  540. return __execOp(pOp, pParam);
  541. }
  542. /*****************************************************************
  543. **【函数名称】 __procReqInstead
  544. **【函数功能】 代接
  545. **【参数】
  546. **【返回值】
  547. ****************************************************************/
  548. bool COperationReactor::__procOpInstead( LONG Instance, ULONG ResID, LineOpParam* pParam )
  549. {
  550. // 通过设备资源查找主控线路
  551. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  552. if(pExten == NULL)
  553. {
  554. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行代接操作失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  555. return false;
  556. }
  557. // 生成代接操作类
  558. COperation* pOp = new COpInstead(this, Instance);
  559. if(!pOp->attachHostChan(pExten))
  560. {
  561. // 如果线路正在执行其它操作
  562. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行代接操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"),
  563. ResID, (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  564. FS_LINK_DELETE(pOp);
  565. return false;
  566. }
  567. // 启动操作
  568. return __execOp(pOp, pParam);
  569. }
  570. /*****************************************************************
  571. **【函数名称】 __procReqIntercept
  572. **【函数功能】 强截
  573. **【参数】
  574. **【返回值】
  575. ****************************************************************/
  576. bool COperationReactor::__procOpIntercept( LONG Instance, ULONG ResID, LineOpParam* pParam )
  577. {
  578. // 通过设备资源查找主控线路
  579. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  580. if(pExten == NULL)
  581. {
  582. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行强截操作失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  583. return false;
  584. }
  585. // 生成强截操作类
  586. COperation* pOp = new COpIntercept(this, Instance);
  587. if(!pOp->attachHostChan(pExten))
  588. {
  589. // 如果线路正在执行其它操作
  590. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行强截操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"),
  591. ResID, (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  592. FS_LINK_DELETE(pOp);
  593. return false;
  594. }
  595. // 启动操作
  596. return __execOp(pOp, pParam);
  597. }
  598. /*****************************************************************
  599. **【函数名称】 __procOpInfoTransaction
  600. **【函数功能】 数据交互
  601. **【参数】
  602. **【返回值】 启动操作是否成功
  603. ****************************************************************/
  604. bool COperationReactor::__procOpInfoTransaction( LONG Instance, ULONG ResID, LineOpParam* pParam )
  605. {
  606. // 通过设备资源查找主控线路
  607. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  608. if(pExten == NULL)
  609. {
  610. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行数据交换操作失败, 未找到分机通道[%lu]"), ResID);
  611. return false;
  612. }
  613. // 查找线路关联的操作
  614. COperation* pCurrOp = pExten->currOp();
  615. if(pCurrOp == NULL)
  616. {
  617. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行数据交换操作失败, 分机通道[%lu]未绑定任务"), ResID);
  618. return false;
  619. }
  620. // 执行信息交互
  621. pCurrOp->setOpInstance(Instance);
  622. return true;
  623. }
  624. /*****************************************************************
  625. **【函数名称】 __procOpConsultBegin
  626. **【函数功能】 协商呼叫启动
  627. **【参数】
  628. **【返回值】
  629. ****************************************************************/
  630. bool COperationReactor::__procOpConsultBegin( LONG Instance, ULONG ResID, LineOpParam* pParam )
  631. {
  632. // 通过设备资源查找主控线路
  633. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  634. if(pExten == NULL)
  635. {
  636. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行协商呼叫操作失败, 未找到分机通道[%lu], DestNum = %s"), ResID, pParam->szParam2);
  637. return false;
  638. }
  639. // 生成协商呼叫操作类
  640. COperation* pOp = new COpConsult(this, Instance);
  641. if(!pOp->attachHostChan(pExten))
  642. {
  643. // 如果线路正在执行其它操作
  644. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行协商呼叫操作失败, 无法绑定通道[%lu], ChanCurTask = %d, DestNum = %s"),
  645. ResID, (pExten->currOp() == NULL ? LINE_OP_UNKNOWN : pExten->currOp()->type()), pParam->szParam2);
  646. FS_LINK_DELETE(pOp);
  647. return false;
  648. }
  649. // 启动操作
  650. return __execOp(pOp, pParam);
  651. }
  652. /*****************************************************************
  653. **【函数名称】 __procOpConsultConfirm
  654. **【函数功能】 协商呼叫确认
  655. **【参数】
  656. **【返回值】
  657. ****************************************************************/
  658. bool COperationReactor::__procOpConsultConfirm( LONG Instance, ULONG ResID, LineOpParam* pParam )
  659. {
  660. // 通过设备资源查找主控线路
  661. CChanExten* pExten = CFsProxy::GetInstance().getExten(ResID);
  662. if(pExten == NULL)
  663. {
  664. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行协商确认操作失败, 未找到分机通道[%lu]"), ResID);
  665. return false;
  666. }
  667. // 如果线路未执行协商呼叫操作
  668. COperation* pCurrOp = pExten->currOp();
  669. if(pCurrOp == NULL || pCurrOp->type() != LINE_OP_CONSULT_CALL_BEGIN)
  670. {
  671. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行协商确认操作失败, 分机通道[%lu]未在协商呼叫环境中"), ResID);
  672. return false;
  673. }
  674. if (pParam->nParam1==3)
  675. {
  676. // 执行操作确认
  677. if(!pCurrOp->cancel(Instance))
  678. {
  679. if(__delOperation(pCurrOp))
  680. {
  681. pCurrOp->detachHostChan();
  682. FS_LINK_DELETE(pCurrOp);
  683. }
  684. return false;
  685. } // end if
  686. }
  687. else
  688. {
  689. // 执行操作确认
  690. if(!pCurrOp->next(Instance))
  691. {
  692. if(__delOperation(pCurrOp))
  693. {
  694. pCurrOp->detachHostChan();
  695. FS_LINK_DELETE(pCurrOp);
  696. }
  697. return false;
  698. } // end if
  699. }
  700. return true;
  701. }
  702. /*****************************************************************
  703. **【函数名称】 __procOpPlayAndDtmf
  704. **【函数功能】 线路放音收号
  705. **【参数】
  706. **【返回值】
  707. ****************************************************************/
  708. bool COperationReactor::__procOpPlayAndDtmf( LONG Instance, ULONG ResID, LineOpParam* pParam )
  709. {
  710. // 通过设备资源查找主控线路
  711. CVirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID);
  712. if(pChan == NULL)
  713. {
  714. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行放音收号操作失败, 未找到通道[%lu], mode = %d, AudioFile = %s"),
  715. ResID, pParam->nParam1, pParam->szParam3);
  716. return false;
  717. }
  718. COperation* pCurrOp = pChan->currOp();
  719. if(pParam->nParam1 == PVM_STOP_PLAY) // 停止放音
  720. {
  721. // 如果线路未在执行放音操作
  722. if(pCurrOp == NULL || pCurrOp->type() != LINE_OP_PLAY_VOICE)
  723. {
  724. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行停止放音操作失败, 通道[%lu]未执行放音操作"), ResID);
  725. return false;
  726. }
  727. else
  728. return pCurrOp->cancel(Instance); // 执行取消操作
  729. }
  730. else // 启动放音
  731. {
  732. // 生成放音操作类
  733. COperation* pOp = new COpPlayAndDtmf(this, Instance);
  734. if(!pOp->attachHostChan(pChan))
  735. {
  736. // 如果线路正在执行其它操作
  737. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行放音收号操作失败, 无法绑定通道[%lu], ChanCurTask = %d, AudioFile = %s"),
  738. ResID, (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()), pParam->szParam3);
  739. FS_LINK_DELETE(pOp);
  740. return false;
  741. }
  742. // 启动操作
  743. return __execOp(pOp, pParam);
  744. }
  745. }
  746. /*****************************************************************
  747. **【函数名称】 __procOpRecord
  748. **【函数功能】 线路录音
  749. **【参数】
  750. **【返回值】
  751. ****************************************************************/
  752. bool COperationReactor::__procOpRecord( LONG Instance, ULONG ResID, LineOpParam* pParam )
  753. {
  754. // 查找要录音的线路
  755. CVirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID);
  756. if(pChan == NULL)
  757. pChan = CFsProxy::GetInstance().getExten(ResID);
  758. if(pChan == NULL)
  759. {
  760. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行录音操作失败, 未找到通道[%lu]"), ResID);
  761. return false;
  762. } // end if
  763. // 生成录音操作类
  764. COperation* pOp = new COpRecord(this, Instance);
  765. if(!pOp->attachHostChan(pChan))
  766. {
  767. // 如果线路正在执行其它操作
  768. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行录音操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  769. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()));
  770. FS_LINK_DELETE(pOp);
  771. return false;
  772. }
  773. // 启动操作
  774. return __execOp(pOp, pParam);
  775. }
  776. /*****************************************************************
  777. **【函数名称】 __procOpLeaveWord
  778. **【函数功能】 留言录音
  779. **【参数】
  780. **【返回值】
  781. ****************************************************************/
  782. bool COperationReactor::__procOpLeaveWord( LONG Instance, ULONG ResID, LineOpParam* pParam )
  783. {
  784. // 查找要留言的线路
  785. CVirtualChan* pChan = CFsProxy::GetInstance().getTrunk(ResID); // 外线
  786. if(pChan == NULL)
  787. {
  788. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行留言操作失败, 未找到通道[%lu]"), ResID);
  789. return false;
  790. } // end if
  791. // 生成留言操作类
  792. COperation* pOp = new COpLeaveWord(this, Instance);
  793. if(!pOp->attachHostChan(pChan))
  794. {
  795. // 如果线路正在执行其它操作
  796. LOGGER(LOG_LEVEL_WARNING, _T("{OperationReactor}: 执行留言操作失败, 无法绑定通道[%lu], ChanCurTask = %d"), ResID,
  797. (pChan->currOp() == NULL ? LINE_OP_UNKNOWN : pChan->currOp()->type()));
  798. FS_LINK_DELETE(pOp);
  799. return false;
  800. }
  801. // 启动操作
  802. return __execOp(pOp, pParam);
  803. }
  804. /*****************************************************************
  805. **【函数名称】 __procOpFax
  806. **【函数功能】 传真
  807. **【参数】
  808. **【返回值】
  809. ****************************************************************/
  810. bool COperationReactor::__procOpFax( LONG Instance, ULONG ResID, LineOpParam* pParam )
  811. {
  812. return false;
  813. }
  814. /*****************************************************************
  815. **【函数名称】 procOperation
  816. **【函数功能】 线路操作处理
  817. **【参数】
  818. **【返回值】
  819. ****************************************************************/
  820. bool COperationReactor::procOperation( LONG Instance, UINT OpType, ULONG ResID, LineOpParam* pParam )
  821. {
  822. LOGGER(LOG_LEVEL_NORMAL, _T("{OperationReactor}: 通道操作, OpType = %lu,通道[%lu]"), OpType, ResID);
  823. bool Res = false;
  824. // 根据操作类型进行分类处理
  825. switch(OpType)
  826. {
  827. case LINE_OP_MAKE_CALL: // 座席外呼
  828. Res = __procOpMakeCall(Instance, ResID, pParam);
  829. break;
  830. case LINE_OP_ANSWER_CALL: // 应答呼叫
  831. Res = __procOpAnswerCall(Instance, ResID, pParam);
  832. break;
  833. case LINE_OP_PREDICTION_CALL: // 预测外呼
  834. Res = __procOpPCall(Instance, ResID, pParam);
  835. break;
  836. case LINE_OP_HANG_UP: // 挂机
  837. Res = __procOpHangUp(Instance, ResID, pParam);
  838. break;
  839. case LINE_OP_TRANSFER: // 呼叫转移
  840. Res = __procOpTransfer(Instance, ResID, pParam);
  841. break;
  842. case LINE_OP_TURNAGENT: // 转坐席
  843. Res = __procOpTurnAgent(Instance, ResID, pParam);
  844. break;
  845. case LINE_OP_TURNOUT: // 转外线
  846. Res = __procOpTurnOut(Instance, ResID, pParam);
  847. break;
  848. case LINE_OP_TURNIVR: // 转IVR
  849. Res = __procOpTurnIvr(Instance, ResID, pParam);
  850. break;
  851. case LINE_OP_CONFERENCE: // 单步会议
  852. Res = __procOpMeeting(Instance, ResID, pParam);
  853. break;
  854. case LINE_OP_LISTEN: // 监听
  855. Res = __procOpListen(Instance, ResID, pParam);
  856. break;
  857. case LINE_OP_INSERT: // 强插
  858. Res = __procOpInsert(Instance, ResID, pParam);
  859. break;
  860. case LINE_OP_RESET: // 重置
  861. Res = __procOpReset(Instance, ResID, pParam);
  862. break;
  863. case LINE_OP_INSTEAD: // 代接
  864. Res = __procOpInstead(Instance, ResID, pParam);
  865. break;
  866. case LINE_OP_GRAB: // 强截
  867. Res = __procOpIntercept(Instance, ResID, pParam);
  868. break;
  869. case LINE_OP_TRANSFER_INFO: // 信息交互
  870. Res = __procOpInfoTransaction(Instance, ResID, pParam);
  871. break;
  872. case LINE_OP_PLAY_VOICE: // 放音收号
  873. Res = __procOpPlayAndDtmf(Instance, ResID, pParam);
  874. break;
  875. case LINE_OP_FAX: // 传真
  876. Res = __procOpFax(Instance, ResID, pParam);
  877. break;
  878. case LINE_OP_RECORD: // 录音
  879. Res = __procOpRecord(Instance, ResID, pParam);
  880. break;
  881. case LINE_OP_LEAVEWORD: // 留言
  882. Res = __procOpLeaveWord(Instance, ResID, pParam);
  883. break;
  884. case LINE_OP_MUTE_BEGIN: // 静音开始
  885. Res = __procOpMuteOn(Instance, ResID, pParam);
  886. break;
  887. case LINE_OP_MUTE_END: // 静音结束
  888. Res = __procOpMuteOff(Instance, ResID, pParam);
  889. break;
  890. case LINE_OP_HOLD: // 保持
  891. Res = __procOpHold(Instance, ResID, pParam);
  892. break;
  893. case LINE_OP_TAKEBACK: // 接回
  894. Res = __procOpTakeBack(Instance, ResID, pParam);
  895. break;
  896. case LINE_OP_CONSULT_CALL_BEGIN: // 协商呼叫启动
  897. Res = __procOpConsultBegin(Instance, ResID, pParam);
  898. break;
  899. case LINE_OP_CONSULT_CALL_CONFIRM: // 协商呼叫确认
  900. Res = __procOpConsultConfirm(Instance, ResID, pParam);
  901. break;
  902. case LINE_OP_IVRFAX_TRANSFER:
  903. {
  904. CDevControl::GetInstance().onEventOpResult(Instance, true, NULL);
  905. Res = true;
  906. }
  907. break;
  908. default:
  909. ASSERT(FALSE);
  910. } // end switch
  911. return Res;
  912. }
  913. /*****************************************************************
  914. **【函数名称】 onOpProcess
  915. **【函数功能】 操作进展返回
  916. **【参数】 Instance 调用标识
  917. HostLine 主控线路ID
  918. AssoLine 关联线路ID
  919. AssoLineType 关联线路类型
  920. CallerNum 主叫号码
  921. CalleeNum 被叫号码
  922. **【返回值】
  923. ****************************************************************/
  924. void COperationReactor::onOpProcess( LONG Instance, UINT HostChanNo, UINT AssoChanNo, DEV_RES_TYPE AssoChanType, LPCTSTR CallerNum, LPCTSTR CalleeNum )
  925. {
  926. CDevControl::GetInstance().onEventOpProcess(Instance, HostChanNo, AssoChanNo, AssoChanType, CallerNum, CalleeNum);
  927. }
  928. /*****************************************************************
  929. **【函数名称】 onOpResult
  930. **【函数功能】 操作结果返回
  931. **【参数】 Instance 调用标识
  932. IsSucceed 操作结果
  933. pInfo 附加信息
  934. **【返回值】
  935. ****************************************************************/
  936. void COperationReactor::onOpResult( LONG Instance, bool IsSucceed )
  937. {
  938. CDevControl::GetInstance().onEventOpResult(Instance, IsSucceed, NULL);
  939. }
  940. /*****************************************************************
  941. **【函数名称】 onOpResult
  942. **【函数功能】 操作结果返回
  943. **【参数】 Instance 调用标识
  944. pOp 返回操作结果的操作实体指针
  945. IsSucceed 操作结果
  946. pInfo 附加信息
  947. **【返回值】
  948. ****************************************************************/
  949. void COperationReactor::onOpResult( long Instance, COperation* pOp, bool IsSucceed, CString Data /*= _T("")*/ )
  950. {
  951. ASSERT(pOp != NULL);
  952. if(pOp==NULL)return;
  953. if(__delOperation(pOp)) // 非取消操作的返回结果
  954. {
  955. // 关闭线路关联
  956. pOp->detachHostChan();
  957. // 释放操作
  958. FS_LINK_DELETE(pOp);
  959. } // end if
  960. // 返回执行结果
  961. CDevControl::GetInstance().onEventOpResult(Instance, IsSucceed, Data);
  962. }
  963. /*****************************************************************
  964. **【函数名称】 onOpFromDev
  965. **【函数功能】 设备主动操作事件
  966. **【参数】 pChan 主动操作的通道
  967. OpType 操作类型
  968. CallerNum 主叫号码
  969. CalleeNum 被叫号码
  970. **【返回值】
  971. ****************************************************************/
  972. void COperationReactor::onOpFromDev( CVirtualChan* pChan, DEV_OP OpType, LPCTSTR CallerNum, LPCTSTR CalleeNum )
  973. {
  974. CDevControl::GetInstance().onEventDevOperation(pChan->no(), OpType, CallerNum, CalleeNum);
  975. }
  976. /*****************************************************************
  977. **【函数名称】 onExtenCallFromDev
  978. **【函数功能】 分机直接外呼
  979. **【参数】
  980. **【返回值】
  981. *****************************************************************/
  982. bool COperationReactor::onExtenCallFromDev( CVirtualChan* pHostChan, PCHAN_EVENT_NOTIFY pNotify )
  983. {
  984. COpMakeCall* pMakeCall = new COpMakeCall(this, FS_LINK_INSTANCE_INVALID);
  985. pMakeCall->attachHostChan(pHostChan);
  986. if(pMakeCall->start(pNotify))
  987. {
  988. __addOperation(pMakeCall);
  989. return true;
  990. }
  991. else
  992. {
  993. pMakeCall->detachHostChan();
  994. FS_LINK_DELETE(pMakeCall);
  995. return false;
  996. }
  997. }
  998. /*****************************************************************
  999. **【函数名称】 onEslEvtBgJobDone
  1000. **【函数功能】 后台任务执行结束事件处理
  1001. **【参数】
  1002. **【返回值】
  1003. *****************************************************************/
  1004. void COperationReactor::onEslEvtBgJobDone( PBG_JOB_NOTIFY pNotify )
  1005. {
  1006. ASSERT(pNotify != NULL);
  1007. COperation* pOperation = __getOperation(pNotify->JobInstance);
  1008. if(pOperation != NULL)
  1009. pOperation->onBackgroudJobDone(pNotify);
  1010. }
  1011. /*****************************************************************
  1012. **【函数名称】 onEslEvtChanState
  1013. **【函数功能】 通道状态事件处理
  1014. **【参数】
  1015. **【返回值】
  1016. *****************************************************************/
  1017. void COperationReactor::onEslEvtChanState( LONG OpInstance, CVirtualChan* pChan )
  1018. {
  1019. COperation* pOperation = __getOperation(OpInstance);
  1020. if(pOperation != NULL)
  1021. pOperation->onAssoChanStateUpdated(pChan);
  1022. }