中间件底层,websocket

OperationReactor.cpp 40KB

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