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

LineOpExec.cpp 26KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937
  1. #include "StdAfx.h"
  2. #include "LineOpExec.h"
  3. #include "TapiLine.h"
  4. #include "DevControl.h"
  5. #include "VsControl.h"
  6. #include "TapiControl.h"
  7. #include "TapiOpMakeCall.h"
  8. #include "TapiOpAnswer.h"
  9. #include "TapiOpHangup.h"
  10. #include "TapiOpTransfer.h"
  11. #include "TapiOpMeeting.h"
  12. #include "TapiOpHold.h"
  13. #include "TapiOpTakeBack.h"
  14. #include "TapiOpListen.h"
  15. #include "TapiOpInsert.h"
  16. #include "TapiOpInstead.h"
  17. #include "TapiOpIntercept.h"
  18. #include "TapiOpConsult.h"
  19. SINGLETON_IMPLEMENT(CLineOpExec)
  20. CLineOpExec::CLineOpExec(void)
  21. {
  22. }
  23. CLineOpExec::~CLineOpExec(void)
  24. {
  25. }
  26. /*****************************************************************
  27. **【函数名称】 __getTapiLine
  28. **【函数功能】 得到关联线路
  29. **【参数】 ResID 设备资源ID
  30. **【返回值】
  31. ****************************************************************/
  32. CTapiLine* CLineOpExec::__getTapiLine( ULONG ResID )
  33. {
  34. CString ExtId;
  35. ExtId.Format(_T("%lu"), ResID);
  36. return CTapiControl::GetInstance().getLine(ExtId);
  37. }
  38. /*****************************************************************
  39. **【函数名称】 __execOp
  40. **【函数功能】 执行OP
  41. **【参数】 pTapiOp TAPI操作实体
  42. pParam 操作参数
  43. **【返回值】
  44. ****************************************************************/
  45. bool CLineOpExec::__execOp( CTapiOpBase* pTapiOp, LineOpParam* pParam )
  46. {
  47. if(!pTapiOp->start(pParam))
  48. {
  49. pTapiOp->detachAllLines();
  50. delete pTapiOp;
  51. return false;
  52. } // end if
  53. return true;
  54. }
  55. /*****************************************************************
  56. **【函数名称】 doVsOperation
  57. **【函数功能】 语音操作相关处理
  58. **【参数】
  59. **【返回值】 操作启动是否成功
  60. ****************************************************************/
  61. bool CLineOpExec::__doVsOperation( long Instance, UINT OpType, ULONG ResID, LineOpParam* pParam )
  62. {
  63. switch(OpType)
  64. {
  65. case LINE_OP_LEAVEWORD: // 留言录音
  66. {
  67. if(!CVsControl::GetInstance().isVsVocOnline())
  68. return false;
  69. UINT IvrLineId = CTapiControl::GetInstance().getTrunkAssoIvrId(ResID);
  70. if(IvrLineId == 0)
  71. {
  72. CDevControl::GetInstance().onEventLog(LOG_LEVEL_WARNING, _T("{OpExec}: 执行留言失败, Trunk[%lu]未找到关联IVR线路, Instance = %lu"), ResID, Instance);
  73. return false;
  74. } // end if
  75. CPduEntity cmd(PDU_CMD_IVR_LEAVE_WORD);
  76. cmd.SetDataUInt(3, IvrLineId); // 外线关联的IVR线路ID
  77. cmd.SetDataUInt(4, pParam->nParam3); // 留言时长
  78. cmd.SetDataString(5, pParam->szParam1); // 留言结束标志
  79. cmd.SetDataString(6, pParam->szParam3); // 留言文件名
  80. cmd.SetDataLong(7, Instance);
  81. return CVsControl::GetInstance().sendCmd2Voc(&cmd);
  82. }
  83. break;
  84. case LINE_OP_PLAY_VOICE: // 放音
  85. {
  86. if(!CVsControl::GetInstance().isVsVocOnline())
  87. return false;
  88. UINT IvrLineId = CTapiControl::GetInstance().getTrunkAssoIvrId(ResID);
  89. if(IvrLineId == 0)
  90. {
  91. CDevControl::GetInstance().onEventLog(LOG_LEVEL_WARNING, _T("{OpExec}: 执行放音失败, Trunk[%lu]未找到关联IVR线路, Instance = %lu"), ResID, Instance);
  92. return false;
  93. } // end if
  94. CPduEntity cmd(PDU_CMD_IVR_PLAY_DTMF);
  95. cmd.SetDataUInt(3, IvrLineId); // 外线关联的IVR线路ID
  96. cmd.SetDataInt(4, pParam->nParam1); // 放音收号模式,1:放音收号,2:只放音,3:只收号,4:停止放音
  97. cmd.SetDataInt(5, pParam->nParam2); // 放音内容类型
  98. cmd.SetDataInt(6, pParam->nParam3); // 数字播报模式
  99. cmd.SetDataInt(7, pParam->nParam4); // 引擎音库
  100. cmd.SetDataInt(8, pParam->nParam5); // 语速
  101. cmd.SetDataInt(9, pParam->nParam6); // 音量
  102. cmd.SetDataInt(10, pParam->nParam7); // 收号位数
  103. cmd.SetDataInt(12, pParam->nParam8); // 收号时间间隔
  104. cmd.SetDataInt(13, pParam->nParam9); // 收号时是否放音
  105. cmd.SetDataString(11, pParam->szParam1); // 结束标识
  106. cmd.SetDataString(15, pParam->szParam3); // 放音内容
  107. cmd.SetDataLong(17, Instance); // 调用标识(业务处理占用)
  108. return CVsControl::GetInstance().sendCmd2Voc(&cmd);
  109. }
  110. break;
  111. case LINE_OP_FAX: // 传真
  112. {
  113. if(!CVsControl::GetInstance().isVsFaxOnline() && !CVsControl::GetInstance().isVsVocOnline())
  114. return false;
  115. UINT IvrLineId = 0;
  116. if(lstrlen(pParam->szParam2) != 0)
  117. sscanf_s(pParam->szParam2, "%lu", &IvrLineId);
  118. else
  119. IvrLineId = CTapiControl::GetInstance().getTrunkAssoFaxId(ResID);
  120. if(IvrLineId == 0)
  121. {
  122. CDevControl::GetInstance().onEventLog(LOG_LEVEL_WARNING, _T("{OpExec}: 执行传真失败, Trunk[%lu]未找到关联IVR线路, Instance = %lu"), ResID, Instance);
  123. return false;
  124. } // end if
  125. CPduEntity cmd(PDU_CMD_IVR_FAX);
  126. cmd.SetDataUInt(3, IvrLineId); // 外线关联的IVR线路ID
  127. cmd.SetDataUInt(4, pParam->nParam1); // 收发传真标志 0发送 1接收
  128. cmd.SetDataString(5, pParam->szParam3); // 传真文件名
  129. cmd.SetDataLong(6, Instance); // 调用标识(业务处理占用)
  130. return CVsControl::GetInstance().sendCmd2Fax(&cmd);
  131. }
  132. break;
  133. case LINE_OP_RECORD: // 录音
  134. {
  135. if(!CVsControl::GetInstance().isVsRecOnline())
  136. return false;
  137. CPduEntity cmd(PDU_CMD_CTI_VS_RECORD);
  138. cmd.SetDataUInt(1, ResID);
  139. cmd.SetDataInt(2, pParam->nParam1);
  140. cmd.SetDataString(3, pParam->szParam3); // 录音文件名
  141. cmd.SetDataLong(6, Instance); // 调用标识
  142. return CVsControl::GetInstance().sendCmd2Rec(&cmd);
  143. }
  144. break;
  145. } // end switch
  146. return false;
  147. }
  148. /*****************************************************************
  149. **【函数名称】 __procOpMakeCall
  150. **【函数功能】 外呼操作处理
  151. **【参数】 Instance 调用标识
  152. ResID 操作的主控资源ID
  153. LineOpParam* 操作信息
  154. **【返回值】 启动操作是否成功
  155. ****************************************************************/
  156. bool CLineOpExec::__procOpMakeCall( long Instance, ULONG ResID, LineOpParam* pParam )
  157. {
  158. // 通过设备资源查找主控线路
  159. CTapiLine* pLine = __getTapiLine(ResID);
  160. if(pLine == NULL)
  161. return false;
  162. // 如果线路正在执行其它操作
  163. if(pLine->currTapiOp() != NULL)
  164. return false;
  165. // 生成外呼操作类
  166. CTapiOpBase* pTapiOp = new CTapiOpMakeCall(Instance);
  167. pTapiOp->attachHostLine(pLine);
  168. // 启动操作
  169. return __execOp(pTapiOp, pParam);
  170. }
  171. /*****************************************************************
  172. **【函数名称】 __procOpAutoCall
  173. **【函数功能】 自动外呼
  174. **【参数】 Instance 调用标识
  175. ResID 操作的主控资源ID
  176. LineOpParam* 操作信息
  177. **【返回值】 启动操作是否成功
  178. ****************************************************************/
  179. bool CLineOpExec::__procOpAutoCall( long Instance, ULONG ResID, LineOpParam* pParam )
  180. {
  181. // 查找空闲的IVR线路
  182. CTapiLine* pLine = CTapiControl::GetInstance().getFreeIvrLine();
  183. if(pLine == NULL)
  184. return false;
  185. // 生成外呼操作类
  186. CTapiOpBase* pTapiOp = new CTapiOpMakeCall(Instance);
  187. pTapiOp->attachHostLine(pLine);
  188. // 启动操作
  189. return __execOp(pTapiOp, pParam);
  190. }
  191. /*****************************************************************
  192. **【函数名称】 __procOpAnswerCall
  193. **【函数功能】 应答操作处理
  194. **【参数】 Instance 调用标识
  195. ResID 操作的主控资源ID
  196. LineOpParam* 操作信息
  197. **【返回值】 启动操作是否成功
  198. ****************************************************************/
  199. bool CLineOpExec::__procOpAnswerCall( long Instance, ULONG ResID, LineOpParam* pParam )
  200. {
  201. // 通过设备资源查找主控线路
  202. CTapiLine* pLine = __getTapiLine(ResID);
  203. if(pLine == NULL)
  204. return false;
  205. // 如果线路正在执行其它操作
  206. if(pLine->currTapiOp() != NULL)
  207. return false;
  208. // 生成应答呼叫操作类
  209. CTapiOpBase* pTapiOp = new CTapiOpAnswer(Instance);
  210. pTapiOp->attachHostLine(pLine);
  211. // 启动操作
  212. return __execOp(pTapiOp, pParam);
  213. }
  214. /*****************************************************************
  215. **【函数名称】 __procOpHangUp
  216. **【函数功能】 挂机操作处理
  217. **【参数】 Instance 调用标识
  218. ResID 操作的主控资源ID
  219. LineOpParam* 操作信息
  220. **【返回值】 启动操作是否成功
  221. ****************************************************************/
  222. bool CLineOpExec::__procOpHangUp( long Instance, ULONG ResID, LineOpParam* pParam )
  223. {
  224. // 通过设备资源查找主控线路
  225. CTapiLine* pLine = __getTapiLine(ResID); // 内线挂机
  226. if(pLine == NULL)
  227. pLine = CTapiControl::GetInstance().getIvrLineByAssoTrunk(ResID); // 外线挂机
  228. if(pLine == NULL)
  229. {
  230. // 执行线路查询,查看是否有IVR吊死,如果有关闭。
  231. pLine= CTapiControl::GetInstance().getErrorIvrLine();
  232. if (pLine == NULL)
  233. {
  234. CDevControl::GetInstance().onEventLog(LOG_LEVEL_WARNING, _T("{OpExec}: 执行挂机失败, 未找到对应线路Line[%lu], Instance = %lu"), ResID, Instance);
  235. return false;
  236. }
  237. } // end if
  238. // 如果线路正在执行其它操作
  239. if(pLine->currTapiOp() != NULL)
  240. return pLine->currTapiOp()->cancel(Instance);
  241. //如果保持中
  242. if (NULL != pLine->heldCall())
  243. pLine->lineTakeBack(pLine->heldCall());
  244. // 生成挂机操作类
  245. CTapiOpBase* pTapiOp = new CTapiOpHangup(Instance);
  246. pTapiOp->attachHostLine(pLine);
  247. // 启动操作
  248. return __execOp(pTapiOp, pParam);
  249. }
  250. /*****************************************************************
  251. **【函数名称】 __procOpTransfer
  252. **【函数功能】 呼叫转移操作处理
  253. **【参数】 Instance 调用标识
  254. ResID 操作的主控资源ID
  255. LineOpParam* 操作信息
  256. **【返回值】 启动操作是否成功
  257. ****************************************************************/
  258. bool CLineOpExec::__procOpTransfer( long Instance, ULONG ResID, LineOpParam* pParam )
  259. {
  260. // 通过设备资源查找主控线路
  261. CTapiLine* pLine = __getTapiLine(ResID);
  262. if(pLine == NULL) return FALSE;
  263. // 如果线路正在执行其它操作
  264. if(pLine->currTapiOp() != NULL)
  265. return false;
  266. // 生成转移操作类
  267. CTapiOpBase* pTapiOp = new CTapiOpTransfer(Instance);
  268. pTapiOp->attachHostLine(pLine);
  269. // 启动操作
  270. return __execOp(pTapiOp, pParam);
  271. }
  272. /*****************************************************************
  273. **【函数名称】 __procOpTurnAgent
  274. **【函数功能】 外线呼入转座席操作处理
  275. **【参数】 Instance 调用标识
  276. ResID 操作的主控资源ID
  277. LineOpParam* 操作信息
  278. **【返回值】 启动操作是否成功
  279. ****************************************************************/
  280. bool CLineOpExec::__procOpTurnAgent( long Instance, ULONG ResID, LineOpParam* pParam )
  281. {
  282. // 通过设备资源查找主控线路
  283. CTapiLine* pLine = CTapiControl::GetInstance().getIvrLineByAssoTrunk(ResID);
  284. if(pLine == NULL)
  285. return false;
  286. // 如果线路正在执行其它操作
  287. if(pLine->currTapiOp() != NULL)
  288. return false;
  289. // 生成转移操作类
  290. CTapiOpBase* pTapiOp = new CTapiOpTransfer(Instance);
  291. pTapiOp->attachHostLine(pLine);
  292. // 启动操作
  293. return __execOp(pTapiOp, pParam);
  294. }
  295. /*****************************************************************
  296. **【函数名称】 __procOpTurnOut
  297. **【函数功能】 外线呼入转外线操作处理
  298. **【参数】 Instance 调用标识
  299. ResID 操作的主控资源ID
  300. LineOpParam* 操作信息
  301. **【返回值】 启动操作是否成功
  302. ****************************************************************/
  303. bool CLineOpExec::__procOpTurnOut( long Instance, ULONG ResID, LineOpParam* pParam )
  304. {
  305. // 通过设备资源查找主控线路
  306. CTapiLine* pLine = CTapiControl::GetInstance().getIvrLineByAssoTrunk(ResID);
  307. if(pLine == NULL)
  308. return false;
  309. // 如果线路正在执行其它操作
  310. if(pLine->currTapiOp() != NULL)
  311. return false;
  312. // 生成转移操作类
  313. CTapiOpBase* pTapiOp = new CTapiOpTransfer(Instance);
  314. pTapiOp->attachHostLine(pLine);
  315. // 启动操作
  316. return __execOp(pTapiOp, pParam);
  317. }
  318. /*****************************************************************
  319. **【函数名称】 __procOpTurnIvr
  320. **【函数功能】 座席通话转IVR操作处理
  321. **【参数】 Instance 调用标识
  322. ResID 操作的主控资源ID
  323. LineOpParam* 操作信息
  324. **【返回值】 启动操作是否成功
  325. ****************************************************************/
  326. bool CLineOpExec::__procOpTurnIvr( long Instance, ULONG ResID, LineOpParam* pParam )
  327. {
  328. // 查找要转IVR的座席线路
  329. CTapiLine* pHostLine = __getTapiLine(ResID);
  330. if(pHostLine == NULL)
  331. return false;
  332. // 查找目标线路
  333. CTapiLine* pAssistLine = NULL;
  334. if(pParam->nParam1 == LINE_TURN_TO_IVR) // 查找空闲的IVR线路
  335. {
  336. pAssistLine = CTapiControl::GetInstance().getFreeIvrLine();
  337. }
  338. else // 查找空闲的传真线路
  339. {
  340. pAssistLine = CTapiControl::GetInstance().getFreeFaxLine();
  341. } // end if
  342. if(pAssistLine == NULL)
  343. return false;
  344. // 如果座席分机正在执行其它操作
  345. if(pHostLine->currTapiOp() != NULL)
  346. return false;
  347. // 生成转移操作类
  348. CTapiOpBase* pTapiOp = new CTapiOpTransfer(Instance);
  349. pTapiOp->attachHostLine(pHostLine);
  350. pTapiOp->attachAssistLine(pAssistLine);
  351. // 填充转移的被叫号码
  352. lstrcpy(pParam->szParam2, pAssistLine->extenID());
  353. // 启动操作
  354. return __execOp(pTapiOp, pParam);
  355. }
  356. /*****************************************************************
  357. **【函数名称】 __procOpMeeting
  358. **【函数功能】 座席单步会议操作处理
  359. **【参数】 Instance 调用标识
  360. ResID 操作的主控资源ID
  361. LineOpParam* 操作信息
  362. **【返回值】 启动操作是否成功
  363. ****************************************************************/
  364. bool CLineOpExec::__procOpMeeting( long Instance, ULONG ResID, LineOpParam* pParam )
  365. {
  366. // 通过设备资源查找主控线路
  367. CTapiLine* pLine = __getTapiLine(ResID);
  368. if(pLine == NULL)
  369. return false;
  370. // 如果线路正在执行其它操作
  371. if(pLine->currTapiOp() != NULL)
  372. return false;
  373. // 生成会议操作类
  374. CTapiOpBase* pTapiOp = new CTapiOpMeeting(Instance);
  375. pTapiOp->attachHostLine(pLine);
  376. // 启动操作
  377. return __execOp(pTapiOp, pParam);
  378. }
  379. /*****************************************************************
  380. **【函数名称】 __procOpHold
  381. **【函数功能】 座席通话保持操作处理
  382. **【参数】 Instance 调用标识
  383. ResID 操作的主控资源ID
  384. LineOpParam* 操作信息
  385. **【返回值】 启动操作是否成功
  386. ****************************************************************/
  387. bool CLineOpExec::__procOpHold( long Instance, ULONG ResID, LineOpParam* pParam )
  388. {
  389. // 通过设备资源查找主控线路
  390. CTapiLine* pLine = __getTapiLine(ResID);
  391. if(pLine == NULL)
  392. return false;
  393. // 如果线路正在执行其它操作
  394. if(pLine->currTapiOp() != NULL)
  395. return false;
  396. // 生成保持操作类
  397. CTapiOpBase* pTapiOp = new CTapiOpHold(Instance);
  398. pTapiOp->attachHostLine(pLine);
  399. // 启动操作
  400. return __execOp(pTapiOp, pParam);
  401. }
  402. /*****************************************************************
  403. **【函数名称】 __procOpTakeBack
  404. **【函数功能】 座席通话接回操作处理
  405. **【参数】 Instance 调用标识
  406. ResID 操作的主控资源ID
  407. LineOpParam* 操作信息
  408. **【返回值】 启动操作是否成功
  409. ****************************************************************/
  410. bool CLineOpExec::__procOpTakeBack( long Instance, ULONG ResID, LineOpParam* pParam )
  411. {
  412. // 通过设备资源查找主控线路
  413. CTapiLine* pLine = __getTapiLine(ResID);
  414. if(pLine == NULL)
  415. return false;
  416. // 如果线路正在执行其它操作
  417. if(pLine->currTapiOp() != NULL)
  418. return false;
  419. // 生成接回操作类
  420. CTapiOpBase* pTapiOp = new CTapiOpTakeBack(Instance);
  421. pTapiOp->attachHostLine(pLine);
  422. // 启动操作
  423. return __execOp(pTapiOp, pParam);
  424. }
  425. /*****************************************************************
  426. **【函数名称】 __procOpReset
  427. **【函数功能】 线路重置
  428. **【参数】 Instance 调用标识
  429. ResID 操作的主控资源ID
  430. LineOpParam* 操作信息
  431. **【返回值】 启动操作是否成功
  432. ****************************************************************/
  433. bool CLineOpExec::__procOpReset( long Instance, ULONG ResID, LineOpParam* pParam )
  434. {
  435. // 通过设备资源查找主控线路
  436. CTapiLine* pLine = __getTapiLine(ResID);
  437. if(pLine == NULL)
  438. return false;
  439. // 显示重置日志
  440. CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OpExec}: Line[%lu]执行重置操作"), ResID);
  441. // 清除关联操作
  442. CTapiOpBase* pTapiOp = pLine->currTapiOp();
  443. if(pTapiOp != NULL)
  444. {
  445. pTapiOp->detachAllLines();
  446. delete pTapiOp;
  447. } // end if
  448. // 线路重置
  449. return pLine->lineReset();
  450. }
  451. /*****************************************************************
  452. **【函数名称】 __procOpListen
  453. **【函数功能】 监听控制
  454. **【参数】 Instance 调用标识
  455. ResID 操作的主控资源ID
  456. LineOpParam* 操作信息
  457. **【返回值】 启动操作是否成功
  458. ****************************************************************/
  459. bool CLineOpExec::__procOpListen( long Instance, ULONG ResID, LineOpParam* pParam )
  460. {
  461. // 通过设备资源查找主控线路
  462. CTapiLine* pLine = __getTapiLine(ResID);
  463. if(pLine == NULL)
  464. return false;
  465. // 如果线路正在执行其它操作
  466. if(pLine->currTapiOp() != NULL)
  467. return false;
  468. // 生成监听操作类
  469. CTapiOpBase* pTapiOp = new CTapiOpListen(Instance);
  470. pTapiOp->attachHostLine(pLine);
  471. // 启动操作
  472. return __execOp(pTapiOp, pParam);
  473. }
  474. /*****************************************************************
  475. **【函数名称】 __procOpInsert
  476. **【函数功能】 强插控制
  477. **【参数】 Instance 调用标识
  478. ResID 操作的主控资源ID
  479. LineOpParam* 操作信息
  480. **【返回值】 启动操作是否成功
  481. ****************************************************************/
  482. bool CLineOpExec::__procOpInsert( long Instance, ULONG ResID, LineOpParam* pParam )
  483. {
  484. // 通过设备资源查找主控线路
  485. CTapiLine* pLine = __getTapiLine(ResID);
  486. if(pLine == NULL)
  487. return false;
  488. // 如果线路正在执行其它操作
  489. if(pLine->currTapiOp() != NULL)
  490. return false;
  491. // 生成强插操作类
  492. CTapiOpBase* pTapiOp = new CTapiOpInsert(Instance);
  493. pTapiOp->attachHostLine(pLine);
  494. // 启动操作
  495. return __execOp(pTapiOp, pParam);
  496. }
  497. /*****************************************************************
  498. **【函数名称】 __procOpInstead
  499. **【函数功能】 代接
  500. **【参数】 Instance 调用标识
  501. ResID 操作的主控资源ID
  502. LineOpParam* 操作信息
  503. **【返回值】 启动操作是否成功
  504. ****************************************************************/
  505. bool CLineOpExec::__procOpInstead( long Instance, ULONG ResID, LineOpParam* pParam )
  506. {
  507. // 通过设备资源查找主控线路
  508. CTapiLine* pHostLine = __getTapiLine(ResID);
  509. if(pHostLine == NULL)
  510. return false;
  511. // 查找辅助线路
  512. UINT AssistLineId = 0;
  513. sscanf_s(pParam->szParam2, "%lu", &AssistLineId);
  514. CTapiLine* pAssistLine = __getTapiLine(AssistLineId);
  515. if(pAssistLine == NULL)
  516. return false;
  517. // 如果线路正在执行其它操作
  518. if(pHostLine->currTapiOp() != NULL || pAssistLine->currTapiOp() != NULL)
  519. return false;
  520. // 生成代接操作类
  521. CTapiOpBase* pTapiOp = new CTapiOpInstead(Instance);
  522. pTapiOp->attachHostLine(pHostLine);
  523. pTapiOp->attachAssistLine(pAssistLine);
  524. // 启动操作
  525. return __execOp(pTapiOp, pParam);
  526. }
  527. /*****************************************************************
  528. **【函数名称】 __procOpIntercept
  529. **【函数功能】 强截
  530. **【参数】 Instance 调用标识
  531. ResID 操作的主控资源ID
  532. LineOpParam* 操作信息
  533. **【返回值】 启动操作是否成功
  534. ****************************************************************/
  535. bool CLineOpExec::__procOpIntercept( long Instance, ULONG ResID, LineOpParam* pParam )
  536. {
  537. // 通过设备资源查找主控线路
  538. CTapiLine* pHostLine = __getTapiLine(ResID);
  539. if(pHostLine == NULL)
  540. return false;
  541. // 查找辅助线路
  542. UINT AssistLineId = 0;
  543. sscanf_s(pParam->szParam2, "%lu", &AssistLineId);
  544. CTapiLine* pAssistLine = __getTapiLine(AssistLineId);
  545. if(pAssistLine == NULL)
  546. return false;
  547. // 如果线路正在执行其它操作
  548. if(pHostLine->currTapiOp() != NULL || pAssistLine->currTapiOp() != NULL)
  549. return false;
  550. // 生成强截操作类
  551. CTapiOpBase* pTapiOp = new CTapiOpIntercept(Instance);
  552. pTapiOp->attachHostLine(pHostLine);
  553. pTapiOp->attachAssistLine(pAssistLine);
  554. // 启动操作
  555. return __execOp(pTapiOp, pParam);
  556. }
  557. /*****************************************************************
  558. **【函数名称】 __procOpInfoTransaction
  559. **【函数功能】 数据交互
  560. **【参数】 Instance 调用标识
  561. ResID 操作的主控资源ID
  562. LineOpParam* 操作信息
  563. **【返回值】 启动操作是否成功
  564. ****************************************************************/
  565. bool CLineOpExec::__procOpInfoTransaction( long Instance, ULONG ResID, LineOpParam* pParam )
  566. {
  567. // 通过设备资源查找主控线路
  568. CTapiLine* pHostLine = __getTapiLine(ResID);
  569. if(pHostLine == NULL)
  570. return false;
  571. // 查找线路关联的操作
  572. CTapiOpBase* pTapiOp = pHostLine->currTapiOp();
  573. if(pTapiOp == NULL)
  574. return false;
  575. // 执行信息交互
  576. pTapiOp->setAssoInfo(Instance);
  577. return true;
  578. }
  579. /*****************************************************************
  580. **【函数名称】 __procOpConsultCallBegin
  581. **【函数功能】 协商呼叫启动
  582. **【参数】 Instance 调用标识
  583. ResID 操作的主控资源ID
  584. LineOpParam* 操作信息
  585. **【返回值】 启动操作是否成功
  586. ****************************************************************/
  587. bool CLineOpExec::__procOpConsultCallBegin( long Instance, ULONG ResID, LineOpParam* pParam )
  588. {
  589. // 通过设备资源查找主控线路
  590. CTapiLine* pLine = __getTapiLine(ResID);
  591. if(pLine == NULL)
  592. return false;
  593. // 如果线路正在执行其它操作
  594. if(pLine->currTapiOp() != NULL)
  595. return false;
  596. // 生成协商呼叫操作类
  597. CTapiOpBase* pTapiOp = new CTapiOpConsult(Instance);
  598. pTapiOp->attachHostLine(pLine);
  599. // 启动操作
  600. return __execOp(pTapiOp, pParam);
  601. }
  602. /*****************************************************************
  603. **【函数名称】 __procOpConsultCallConfirm
  604. **【函数功能】 协商呼叫确认
  605. **【参数】 Instance 调用标识
  606. ResID 操作的主控资源ID
  607. LineOpParam* 操作信息
  608. **【返回值】 启动操作是否成功
  609. ****************************************************************/
  610. bool CLineOpExec::__procOpConsultCallConfirm( long Instance, ULONG ResID, LineOpParam* pParam )
  611. {
  612. // 通过设备资源查找主控线路
  613. CTapiLine* pLine = __getTapiLine(ResID);
  614. if(pLine == NULL)
  615. return false;
  616. // 如果线路未执行协商呼叫操作
  617. CTapiOpBase* pTapiOp = pLine->currTapiOp();
  618. if(pTapiOp == NULL)
  619. return false;
  620. if(dynamic_cast<CTapiOpConsult*>(pTapiOp) == NULL)
  621. return false;
  622. // 执行操作确认
  623. if(!pTapiOp->resume(Instance))
  624. {
  625. pTapiOp->detachAllLines();
  626. delete pTapiOp;
  627. return false;
  628. } // end if
  629. return true;
  630. }
  631. /*****************************************************************
  632. **【函数名称】 __procOpIvrFaxTransfer
  633. **【函数功能】 IVR发起的传真任务而产生的转移
  634. **【参数】 Instance 调用标识
  635. ResID 操作的主控资源ID
  636. LineOpParam* 操作信息
  637. **【返回值】 转移操作是否成功
  638. ****************************************************************/
  639. bool CLineOpExec::__procOpIvrFaxTransfer( long Instance, ULONG ResID, LineOpParam* pParam )
  640. {
  641. // 本来IVR发起的传真任务是不需要发起转移的操作的,可以在三汇的放音卡中完成,但是因为引入了Diva卡,所以需要鉴定当前环境是否
  642. // 包含传真线路(即Diva卡,或其他传真卡),若包含则必须发起转移操作到空闲的传真线路
  643. // 查找要转IVR的座席线路
  644. CTapiLine* pHostLine = CTapiControl::GetInstance().getIvrLineByAssoTrunk(ResID);
  645. if(pHostLine == NULL)
  646. return false;
  647. // 如果座席分机正在执行其它操作
  648. if(pHostLine->currTapiOp() != NULL)
  649. return false;
  650. // 查找目标线路
  651. CTapiLine* pAssistLine = NULL;
  652. // 查找空闲的传真线路
  653. pAssistLine = CTapiControl::GetInstance().getFreeFaxLineOnly();
  654. if(pAssistLine == NULL)
  655. {
  656. pAssistLine = CTapiControl::GetInstance().getFreeIvrLine();
  657. if(pAssistLine != NULL)
  658. {
  659. // 若是普通IVR线路说明当前环境不包含Diva传真卡或者是所有传真线路忙
  660. // 这种情况下则不需要转移操作,直接返回成功
  661. CDevControl::GetInstance().onEventOpResult(Instance, true);
  662. return true;
  663. }
  664. else
  665. return false;
  666. }
  667. // 生成转移操作类
  668. CTapiOpBase* pTapiOp = new CTapiOpTransfer(Instance);
  669. pTapiOp->attachHostLine(pHostLine);
  670. pTapiOp->attachAssistLine(pAssistLine);
  671. // 填充转移的被叫号码
  672. lstrcpy(pParam->szParam2, pAssistLine->extenID());
  673. // 启动操作
  674. return __execOp(pTapiOp, pParam);
  675. }
  676. /*****************************************************************
  677. **【函数名称】 procLineOp
  678. **【函数功能】 处理业务逻辑层操作请求
  679. **【参数】 Instance 调用标识
  680. OpType 操作类型
  681. ResID 操作的主控资源ID
  682. LineOpParam* 操作信息
  683. **【返回值】 启动操作是否成功
  684. ****************************************************************/
  685. bool CLineOpExec::procLineOp( LONG Instance, LINE_OP OpType, ULONG ResID, LineOpParam* pParam )
  686. {
  687. bool bRet = false;
  688. // 根据操作类型进行分类处理
  689. switch(OpType)
  690. {
  691. case LINE_OP_MAKE_CALL: // 座席外呼
  692. bRet = __procOpMakeCall(Instance, ResID, pParam);
  693. break;
  694. case LINE_OP_ANSWER_CALL: // 应答呼叫
  695. bRet = __procOpAnswerCall(Instance, ResID, pParam);
  696. break;
  697. case LINE_OP_PREDICTION_CALL: // 预测外呼
  698. bRet = __procOpAutoCall(Instance, ResID, pParam);
  699. break;
  700. case LINE_OP_HANG_UP: // 挂机
  701. bRet = __procOpHangUp(Instance, ResID, pParam);
  702. break;
  703. case LINE_OP_TRANSFER: // 呼叫转移
  704. bRet = __procOpTransfer(Instance, ResID, pParam);
  705. break;
  706. case LINE_OP_TURNAGENT: // 转坐席
  707. bRet = __procOpTurnAgent(Instance, ResID, pParam);
  708. break;
  709. case LINE_OP_TURNOUT: // 转外线
  710. bRet = __procOpTurnOut(Instance, ResID, pParam);
  711. break;
  712. case LINE_OP_TURNIVR: // 转IVR
  713. bRet = __procOpTurnIvr(Instance, ResID, pParam);
  714. break;
  715. case LINE_OP_CONFERENCE: // 单步会议
  716. bRet = __procOpMeeting(Instance, ResID, pParam);
  717. break;
  718. case LINE_OP_HOLD: // 保持
  719. bRet = __procOpHold(Instance, ResID, pParam);
  720. break;
  721. case LINE_OP_TAKEBACK: // 接回
  722. bRet = __procOpTakeBack(Instance, ResID, pParam);
  723. break;
  724. case LINE_OP_LISTEN: // 监听
  725. bRet = __procOpListen(Instance, ResID, pParam);
  726. break;
  727. case LINE_OP_INSERT: // 强插
  728. bRet = __procOpInsert(Instance, ResID, pParam);
  729. break;
  730. case LINE_OP_RESET: // 重置
  731. bRet = __procOpReset(Instance, ResID, pParam);
  732. break;
  733. case LINE_OP_INSTEAD: // 代接
  734. bRet = __procOpInstead(Instance, ResID, pParam);
  735. break;
  736. case LINE_OP_GRAB: // 强截
  737. bRet = __procOpIntercept(Instance, ResID, pParam);
  738. break;
  739. case LINE_OP_TRANSFER_INFO: // 信息交互
  740. bRet = __procOpInfoTransaction(Instance, ResID, pParam);
  741. break;
  742. case LINE_OP_CONSULT_CALL_BEGIN: // 协商呼叫启动
  743. bRet = __procOpConsultCallBegin(Instance, ResID, pParam);
  744. break;
  745. case LINE_OP_CONSULT_CALL_CONFIRM: // 协商呼叫确认
  746. bRet = __procOpConsultCallConfirm(Instance, ResID, pParam);
  747. break;
  748. case LINE_OP_IVRFAX_TRANSFER: // VR发起的传真任务而产生的转移
  749. bRet = __procOpIvrFaxTransfer(Instance, ResID, pParam);
  750. break;
  751. case LINE_OP_PLAY_VOICE: // 放音
  752. case LINE_OP_FAX: // 传真
  753. case LINE_OP_RECORD: // 录音
  754. case LINE_OP_LEAVEWORD: // 留言
  755. bRet = __doVsOperation(Instance, OpType, ResID, pParam);
  756. break;
  757. default:
  758. ASSERT(FALSE);
  759. } // end switch
  760. return bRet;
  761. }
  762. /*****************************************************************
  763. **【函数名称】 onTapiOpResult
  764. **【函数功能】 操作结果返回
  765. **【参数】 Instance 调用标识
  766. pTapiOp 返回操作结果的TapiOp实体指针
  767. IsSucceed 操作结果
  768. pInfo 附加信息
  769. **【返回值】
  770. ****************************************************************/
  771. void CLineOpExec::onTapiOpResult( long Instance, CTapiOpBase* pTapiOp, bool IsSucceed, LPCTSTR pInfo /*= NULL*/ )
  772. {
  773. if(pTapiOp != NULL) // 非取消操作的返回结果
  774. {
  775. // 关闭线路关联
  776. pTapiOp->detachAllLines();
  777. // 关闭操作
  778. delete pTapiOp;
  779. } // end if
  780. // 返回执行结果
  781. CDevControl::GetInstance().onEventOpResult(Instance, IsSucceed, pInfo);
  782. }
  783. /*****************************************************************
  784. **【函数名称】 onDevDirectOpBegin
  785. **【函数功能】 设备直接操作启动
  786. **【参数】 OpType 启动的操作类型
  787. pHostLine 触发事件的线路实体
  788. pInfo 触发操作启动的DevLinkS事件内容
  789. **【返回值】
  790. ****************************************************************/
  791. void CLineOpExec::onDevDirectOpBegin( UINT OpType, CTapiLine* pHostLine, DevLinkInfoS* pInfo )
  792. {
  793. switch(OpType)
  794. {
  795. case DEV_OP_CALL_OUT: // 手动外呼
  796. {
  797. CTapiOpBase* pTapiOp = new CTapiOpMakeCall(CONST_TAPI_OP_INSTANCE_INVALID);
  798. pTapiOp->attachHostLine(pHostLine);
  799. pTapiOp->start(pInfo);
  800. }
  801. break;
  802. } // end switch
  803. }