| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937 |
- #include "StdAfx.h"
- #include "LineOpExec.h"
- #include "TapiLine.h"
- #include "DevControl.h"
- #include "VsControl.h"
- #include "TapiControl.h"
- #include "TapiOpMakeCall.h"
- #include "TapiOpAnswer.h"
- #include "TapiOpHangup.h"
- #include "TapiOpTransfer.h"
- #include "TapiOpMeeting.h"
- #include "TapiOpHold.h"
- #include "TapiOpTakeBack.h"
- #include "TapiOpListen.h"
- #include "TapiOpInsert.h"
- #include "TapiOpInstead.h"
- #include "TapiOpIntercept.h"
- #include "TapiOpConsult.h"
- SINGLETON_IMPLEMENT(CLineOpExec)
- CLineOpExec::CLineOpExec(void)
- {
- }
- CLineOpExec::~CLineOpExec(void)
- {
- }
- /*****************************************************************
- **【函数名称】 __getTapiLine
- **【函数功能】 得到关联线路
- **【参数】 ResID 设备资源ID
- **【返回值】
- ****************************************************************/
- CTapiLine* CLineOpExec::__getTapiLine( ULONG ResID )
- {
- CString ExtId;
- ExtId.Format(_T("%lu"), ResID);
- return CTapiControl::GetInstance().getLine(ExtId);
- }
- /*****************************************************************
- **【函数名称】 __execOp
- **【函数功能】 执行OP
- **【参数】 pTapiOp TAPI操作实体
- pParam 操作参数
- **【返回值】
- ****************************************************************/
- bool CLineOpExec::__execOp( CTapiOpBase* pTapiOp, LineOpParam* pParam )
- {
- if(!pTapiOp->start(pParam))
- {
- pTapiOp->detachAllLines();
- delete pTapiOp;
- return false;
- } // end if
- return true;
- }
- /*****************************************************************
- **【函数名称】 doVsOperation
- **【函数功能】 语音操作相关处理
- **【参数】
- **【返回值】 操作启动是否成功
- ****************************************************************/
- bool CLineOpExec::__doVsOperation( long Instance, UINT OpType, ULONG ResID, LineOpParam* pParam )
- {
- switch(OpType)
- {
- case LINE_OP_LEAVEWORD: // 留言录音
- {
- if(!CVsControl::GetInstance().isVsVocOnline())
- return false;
- UINT IvrLineId = CTapiControl::GetInstance().getTrunkAssoIvrId(ResID);
- if(IvrLineId == 0)
- {
- CDevControl::GetInstance().onEventLog(LOG_LEVEL_WARNING, _T("{OpExec}: 执行留言失败, Trunk[%lu]未找到关联IVR线路, Instance = %lu"), ResID, Instance);
- return false;
- } // end if
- CPduEntity cmd(PDU_CMD_IVR_LEAVE_WORD);
- cmd.SetDataUInt(3, IvrLineId); // 外线关联的IVR线路ID
- cmd.SetDataUInt(4, pParam->nParam3); // 留言时长
- cmd.SetDataString(5, pParam->szParam1); // 留言结束标志
- cmd.SetDataString(6, pParam->szParam3); // 留言文件名
- cmd.SetDataLong(7, Instance);
- return CVsControl::GetInstance().sendCmd2Voc(&cmd);
- }
- break;
- case LINE_OP_PLAY_VOICE: // 放音
- {
- if(!CVsControl::GetInstance().isVsVocOnline())
- return false;
- UINT IvrLineId = CTapiControl::GetInstance().getTrunkAssoIvrId(ResID);
- if(IvrLineId == 0)
- {
- CDevControl::GetInstance().onEventLog(LOG_LEVEL_WARNING, _T("{OpExec}: 执行放音失败, Trunk[%lu]未找到关联IVR线路, Instance = %lu"), ResID, Instance);
- return false;
- } // end if
- CPduEntity cmd(PDU_CMD_IVR_PLAY_DTMF);
- cmd.SetDataUInt(3, IvrLineId); // 外线关联的IVR线路ID
- cmd.SetDataInt(4, pParam->nParam1); // 放音收号模式,1:放音收号,2:只放音,3:只收号,4:停止放音
- cmd.SetDataInt(5, pParam->nParam2); // 放音内容类型
- cmd.SetDataInt(6, pParam->nParam3); // 数字播报模式
- cmd.SetDataInt(7, pParam->nParam4); // 引擎音库
- cmd.SetDataInt(8, pParam->nParam5); // 语速
- cmd.SetDataInt(9, pParam->nParam6); // 音量
- cmd.SetDataInt(10, pParam->nParam7); // 收号位数
- cmd.SetDataInt(12, pParam->nParam8); // 收号时间间隔
- cmd.SetDataInt(13, pParam->nParam9); // 收号时是否放音
- cmd.SetDataString(11, pParam->szParam1); // 结束标识
- cmd.SetDataString(15, pParam->szParam3); // 放音内容
- cmd.SetDataLong(17, Instance); // 调用标识(业务处理占用)
- return CVsControl::GetInstance().sendCmd2Voc(&cmd);
- }
- break;
- case LINE_OP_FAX: // 传真
- {
- if(!CVsControl::GetInstance().isVsFaxOnline() && !CVsControl::GetInstance().isVsVocOnline())
- return false;
- UINT IvrLineId = 0;
- if(lstrlen(pParam->szParam2) != 0)
- sscanf_s(pParam->szParam2, "%lu", &IvrLineId);
- else
- IvrLineId = CTapiControl::GetInstance().getTrunkAssoFaxId(ResID);
- if(IvrLineId == 0)
- {
- CDevControl::GetInstance().onEventLog(LOG_LEVEL_WARNING, _T("{OpExec}: 执行传真失败, Trunk[%lu]未找到关联IVR线路, Instance = %lu"), ResID, Instance);
- return false;
- } // end if
- CPduEntity cmd(PDU_CMD_IVR_FAX);
- cmd.SetDataUInt(3, IvrLineId); // 外线关联的IVR线路ID
- cmd.SetDataUInt(4, pParam->nParam1); // 收发传真标志 0发送 1接收
- cmd.SetDataString(5, pParam->szParam3); // 传真文件名
- cmd.SetDataLong(6, Instance); // 调用标识(业务处理占用)
- return CVsControl::GetInstance().sendCmd2Fax(&cmd);
- }
- break;
- case LINE_OP_RECORD: // 录音
- {
- if(!CVsControl::GetInstance().isVsRecOnline())
- return false;
- CPduEntity cmd(PDU_CMD_CTI_VS_RECORD);
- cmd.SetDataUInt(1, ResID);
- cmd.SetDataInt(2, pParam->nParam1);
- cmd.SetDataString(3, pParam->szParam3); // 录音文件名
- cmd.SetDataLong(6, Instance); // 调用标识
- return CVsControl::GetInstance().sendCmd2Rec(&cmd);
- }
- break;
- } // end switch
- return false;
- }
- /*****************************************************************
- **【函数名称】 __procOpMakeCall
- **【函数功能】 外呼操作处理
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpMakeCall( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 通过设备资源查找主控线路
- CTapiLine* pLine = __getTapiLine(ResID);
- if(pLine == NULL)
- return false;
- // 如果线路正在执行其它操作
- if(pLine->currTapiOp() != NULL)
- return false;
- // 生成外呼操作类
- CTapiOpBase* pTapiOp = new CTapiOpMakeCall(Instance);
- pTapiOp->attachHostLine(pLine);
- // 启动操作
- return __execOp(pTapiOp, pParam);
- }
- /*****************************************************************
- **【函数名称】 __procOpAutoCall
- **【函数功能】 自动外呼
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpAutoCall( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 查找空闲的IVR线路
- CTapiLine* pLine = CTapiControl::GetInstance().getFreeIvrLine();
- if(pLine == NULL)
- return false;
- // 生成外呼操作类
- CTapiOpBase* pTapiOp = new CTapiOpMakeCall(Instance);
- pTapiOp->attachHostLine(pLine);
- // 启动操作
- return __execOp(pTapiOp, pParam);
- }
- /*****************************************************************
- **【函数名称】 __procOpAnswerCall
- **【函数功能】 应答操作处理
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpAnswerCall( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 通过设备资源查找主控线路
- CTapiLine* pLine = __getTapiLine(ResID);
- if(pLine == NULL)
- return false;
- // 如果线路正在执行其它操作
- if(pLine->currTapiOp() != NULL)
- return false;
- // 生成应答呼叫操作类
- CTapiOpBase* pTapiOp = new CTapiOpAnswer(Instance);
- pTapiOp->attachHostLine(pLine);
- // 启动操作
- return __execOp(pTapiOp, pParam);
- }
- /*****************************************************************
- **【函数名称】 __procOpHangUp
- **【函数功能】 挂机操作处理
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpHangUp( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 通过设备资源查找主控线路
- CTapiLine* pLine = __getTapiLine(ResID); // 内线挂机
- if(pLine == NULL)
- pLine = CTapiControl::GetInstance().getIvrLineByAssoTrunk(ResID); // 外线挂机
- if(pLine == NULL)
- {
- // 执行线路查询,查看是否有IVR吊死,如果有关闭。
- pLine= CTapiControl::GetInstance().getErrorIvrLine();
- if (pLine == NULL)
- {
- CDevControl::GetInstance().onEventLog(LOG_LEVEL_WARNING, _T("{OpExec}: 执行挂机失败, 未找到对应线路Line[%lu], Instance = %lu"), ResID, Instance);
- return false;
- }
- } // end if
- // 如果线路正在执行其它操作
- if(pLine->currTapiOp() != NULL)
- return pLine->currTapiOp()->cancel(Instance);
- //如果保持中
- if (NULL != pLine->heldCall())
- pLine->lineTakeBack(pLine->heldCall());
- // 生成挂机操作类
- CTapiOpBase* pTapiOp = new CTapiOpHangup(Instance);
- pTapiOp->attachHostLine(pLine);
- // 启动操作
- return __execOp(pTapiOp, pParam);
- }
- /*****************************************************************
- **【函数名称】 __procOpTransfer
- **【函数功能】 呼叫转移操作处理
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpTransfer( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 通过设备资源查找主控线路
- CTapiLine* pLine = __getTapiLine(ResID);
- if(pLine == NULL) return FALSE;
- // 如果线路正在执行其它操作
- if(pLine->currTapiOp() != NULL)
- return false;
- // 生成转移操作类
- CTapiOpBase* pTapiOp = new CTapiOpTransfer(Instance);
- pTapiOp->attachHostLine(pLine);
- // 启动操作
- return __execOp(pTapiOp, pParam);
- }
- /*****************************************************************
- **【函数名称】 __procOpTurnAgent
- **【函数功能】 外线呼入转座席操作处理
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpTurnAgent( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 通过设备资源查找主控线路
- CTapiLine* pLine = CTapiControl::GetInstance().getIvrLineByAssoTrunk(ResID);
- if(pLine == NULL)
- return false;
- // 如果线路正在执行其它操作
- if(pLine->currTapiOp() != NULL)
- return false;
- // 生成转移操作类
- CTapiOpBase* pTapiOp = new CTapiOpTransfer(Instance);
- pTapiOp->attachHostLine(pLine);
- // 启动操作
- return __execOp(pTapiOp, pParam);
- }
- /*****************************************************************
- **【函数名称】 __procOpTurnOut
- **【函数功能】 外线呼入转外线操作处理
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpTurnOut( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 通过设备资源查找主控线路
- CTapiLine* pLine = CTapiControl::GetInstance().getIvrLineByAssoTrunk(ResID);
- if(pLine == NULL)
- return false;
- // 如果线路正在执行其它操作
- if(pLine->currTapiOp() != NULL)
- return false;
- // 生成转移操作类
- CTapiOpBase* pTapiOp = new CTapiOpTransfer(Instance);
- pTapiOp->attachHostLine(pLine);
- // 启动操作
- return __execOp(pTapiOp, pParam);
- }
- /*****************************************************************
- **【函数名称】 __procOpTurnIvr
- **【函数功能】 座席通话转IVR操作处理
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpTurnIvr( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 查找要转IVR的座席线路
- CTapiLine* pHostLine = __getTapiLine(ResID);
- if(pHostLine == NULL)
- return false;
- // 查找目标线路
- CTapiLine* pAssistLine = NULL;
- if(pParam->nParam1 == LINE_TURN_TO_IVR) // 查找空闲的IVR线路
- {
- pAssistLine = CTapiControl::GetInstance().getFreeIvrLine();
- }
- else // 查找空闲的传真线路
- {
- pAssistLine = CTapiControl::GetInstance().getFreeFaxLine();
- } // end if
- if(pAssistLine == NULL)
- return false;
- // 如果座席分机正在执行其它操作
- if(pHostLine->currTapiOp() != NULL)
- return false;
- // 生成转移操作类
- CTapiOpBase* pTapiOp = new CTapiOpTransfer(Instance);
- pTapiOp->attachHostLine(pHostLine);
- pTapiOp->attachAssistLine(pAssistLine);
- // 填充转移的被叫号码
- lstrcpy(pParam->szParam2, pAssistLine->extenID());
- // 启动操作
- return __execOp(pTapiOp, pParam);
- }
- /*****************************************************************
- **【函数名称】 __procOpMeeting
- **【函数功能】 座席单步会议操作处理
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpMeeting( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 通过设备资源查找主控线路
- CTapiLine* pLine = __getTapiLine(ResID);
- if(pLine == NULL)
- return false;
- // 如果线路正在执行其它操作
- if(pLine->currTapiOp() != NULL)
- return false;
- // 生成会议操作类
- CTapiOpBase* pTapiOp = new CTapiOpMeeting(Instance);
- pTapiOp->attachHostLine(pLine);
- // 启动操作
- return __execOp(pTapiOp, pParam);
- }
- /*****************************************************************
- **【函数名称】 __procOpHold
- **【函数功能】 座席通话保持操作处理
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpHold( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 通过设备资源查找主控线路
- CTapiLine* pLine = __getTapiLine(ResID);
- if(pLine == NULL)
- return false;
- // 如果线路正在执行其它操作
- if(pLine->currTapiOp() != NULL)
- return false;
- // 生成保持操作类
- CTapiOpBase* pTapiOp = new CTapiOpHold(Instance);
- pTapiOp->attachHostLine(pLine);
- // 启动操作
- return __execOp(pTapiOp, pParam);
- }
- /*****************************************************************
- **【函数名称】 __procOpTakeBack
- **【函数功能】 座席通话接回操作处理
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpTakeBack( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 通过设备资源查找主控线路
- CTapiLine* pLine = __getTapiLine(ResID);
- if(pLine == NULL)
- return false;
- // 如果线路正在执行其它操作
- if(pLine->currTapiOp() != NULL)
- return false;
- // 生成接回操作类
- CTapiOpBase* pTapiOp = new CTapiOpTakeBack(Instance);
- pTapiOp->attachHostLine(pLine);
- // 启动操作
- return __execOp(pTapiOp, pParam);
- }
- /*****************************************************************
- **【函数名称】 __procOpReset
- **【函数功能】 线路重置
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpReset( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 通过设备资源查找主控线路
- CTapiLine* pLine = __getTapiLine(ResID);
- if(pLine == NULL)
- return false;
- // 显示重置日志
- CDevControl::GetInstance().onEventLog(LOG_LEVEL_NORMAL, _T("{OpExec}: Line[%lu]执行重置操作"), ResID);
- // 清除关联操作
- CTapiOpBase* pTapiOp = pLine->currTapiOp();
- if(pTapiOp != NULL)
- {
- pTapiOp->detachAllLines();
- delete pTapiOp;
- } // end if
- // 线路重置
- return pLine->lineReset();
- }
- /*****************************************************************
- **【函数名称】 __procOpListen
- **【函数功能】 监听控制
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpListen( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 通过设备资源查找主控线路
- CTapiLine* pLine = __getTapiLine(ResID);
- if(pLine == NULL)
- return false;
- // 如果线路正在执行其它操作
- if(pLine->currTapiOp() != NULL)
- return false;
- // 生成监听操作类
- CTapiOpBase* pTapiOp = new CTapiOpListen(Instance);
- pTapiOp->attachHostLine(pLine);
- // 启动操作
- return __execOp(pTapiOp, pParam);
- }
- /*****************************************************************
- **【函数名称】 __procOpInsert
- **【函数功能】 强插控制
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpInsert( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 通过设备资源查找主控线路
- CTapiLine* pLine = __getTapiLine(ResID);
- if(pLine == NULL)
- return false;
- // 如果线路正在执行其它操作
- if(pLine->currTapiOp() != NULL)
- return false;
- // 生成强插操作类
- CTapiOpBase* pTapiOp = new CTapiOpInsert(Instance);
- pTapiOp->attachHostLine(pLine);
- // 启动操作
- return __execOp(pTapiOp, pParam);
- }
- /*****************************************************************
- **【函数名称】 __procOpInstead
- **【函数功能】 代接
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpInstead( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 通过设备资源查找主控线路
- CTapiLine* pHostLine = __getTapiLine(ResID);
- if(pHostLine == NULL)
- return false;
- // 查找辅助线路
- UINT AssistLineId = 0;
- sscanf_s(pParam->szParam2, "%lu", &AssistLineId);
- CTapiLine* pAssistLine = __getTapiLine(AssistLineId);
- if(pAssistLine == NULL)
- return false;
- // 如果线路正在执行其它操作
- if(pHostLine->currTapiOp() != NULL || pAssistLine->currTapiOp() != NULL)
- return false;
- // 生成代接操作类
- CTapiOpBase* pTapiOp = new CTapiOpInstead(Instance);
- pTapiOp->attachHostLine(pHostLine);
- pTapiOp->attachAssistLine(pAssistLine);
- // 启动操作
- return __execOp(pTapiOp, pParam);
- }
- /*****************************************************************
- **【函数名称】 __procOpIntercept
- **【函数功能】 强截
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpIntercept( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 通过设备资源查找主控线路
- CTapiLine* pHostLine = __getTapiLine(ResID);
- if(pHostLine == NULL)
- return false;
- // 查找辅助线路
- UINT AssistLineId = 0;
- sscanf_s(pParam->szParam2, "%lu", &AssistLineId);
- CTapiLine* pAssistLine = __getTapiLine(AssistLineId);
- if(pAssistLine == NULL)
- return false;
- // 如果线路正在执行其它操作
- if(pHostLine->currTapiOp() != NULL || pAssistLine->currTapiOp() != NULL)
- return false;
- // 生成强截操作类
- CTapiOpBase* pTapiOp = new CTapiOpIntercept(Instance);
- pTapiOp->attachHostLine(pHostLine);
- pTapiOp->attachAssistLine(pAssistLine);
- // 启动操作
- return __execOp(pTapiOp, pParam);
- }
- /*****************************************************************
- **【函数名称】 __procOpInfoTransaction
- **【函数功能】 数据交互
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpInfoTransaction( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 通过设备资源查找主控线路
- CTapiLine* pHostLine = __getTapiLine(ResID);
- if(pHostLine == NULL)
- return false;
- // 查找线路关联的操作
- CTapiOpBase* pTapiOp = pHostLine->currTapiOp();
- if(pTapiOp == NULL)
- return false;
- // 执行信息交互
- pTapiOp->setAssoInfo(Instance);
- return true;
- }
- /*****************************************************************
- **【函数名称】 __procOpConsultCallBegin
- **【函数功能】 协商呼叫启动
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpConsultCallBegin( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 通过设备资源查找主控线路
- CTapiLine* pLine = __getTapiLine(ResID);
- if(pLine == NULL)
- return false;
- // 如果线路正在执行其它操作
- if(pLine->currTapiOp() != NULL)
- return false;
- // 生成协商呼叫操作类
- CTapiOpBase* pTapiOp = new CTapiOpConsult(Instance);
- pTapiOp->attachHostLine(pLine);
- // 启动操作
- return __execOp(pTapiOp, pParam);
- }
- /*****************************************************************
- **【函数名称】 __procOpConsultCallConfirm
- **【函数功能】 协商呼叫确认
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpConsultCallConfirm( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 通过设备资源查找主控线路
- CTapiLine* pLine = __getTapiLine(ResID);
- if(pLine == NULL)
- return false;
- // 如果线路未执行协商呼叫操作
- CTapiOpBase* pTapiOp = pLine->currTapiOp();
- if(pTapiOp == NULL)
- return false;
- if(dynamic_cast<CTapiOpConsult*>(pTapiOp) == NULL)
- return false;
- // 执行操作确认
- if(!pTapiOp->resume(Instance))
- {
- pTapiOp->detachAllLines();
- delete pTapiOp;
- return false;
- } // end if
- return true;
- }
- /*****************************************************************
- **【函数名称】 __procOpIvrFaxTransfer
- **【函数功能】 IVR发起的传真任务而产生的转移
- **【参数】 Instance 调用标识
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 转移操作是否成功
- ****************************************************************/
- bool CLineOpExec::__procOpIvrFaxTransfer( long Instance, ULONG ResID, LineOpParam* pParam )
- {
- // 本来IVR发起的传真任务是不需要发起转移的操作的,可以在三汇的放音卡中完成,但是因为引入了Diva卡,所以需要鉴定当前环境是否
- // 包含传真线路(即Diva卡,或其他传真卡),若包含则必须发起转移操作到空闲的传真线路
- // 查找要转IVR的座席线路
- CTapiLine* pHostLine = CTapiControl::GetInstance().getIvrLineByAssoTrunk(ResID);
- if(pHostLine == NULL)
- return false;
- // 如果座席分机正在执行其它操作
- if(pHostLine->currTapiOp() != NULL)
- return false;
- // 查找目标线路
- CTapiLine* pAssistLine = NULL;
- // 查找空闲的传真线路
- pAssistLine = CTapiControl::GetInstance().getFreeFaxLineOnly();
- if(pAssistLine == NULL)
- {
- pAssistLine = CTapiControl::GetInstance().getFreeIvrLine();
- if(pAssistLine != NULL)
- {
- // 若是普通IVR线路说明当前环境不包含Diva传真卡或者是所有传真线路忙
- // 这种情况下则不需要转移操作,直接返回成功
- CDevControl::GetInstance().onEventOpResult(Instance, true);
- return true;
- }
- else
- return false;
- }
- // 生成转移操作类
- CTapiOpBase* pTapiOp = new CTapiOpTransfer(Instance);
- pTapiOp->attachHostLine(pHostLine);
- pTapiOp->attachAssistLine(pAssistLine);
- // 填充转移的被叫号码
- lstrcpy(pParam->szParam2, pAssistLine->extenID());
- // 启动操作
- return __execOp(pTapiOp, pParam);
- }
- /*****************************************************************
- **【函数名称】 procLineOp
- **【函数功能】 处理业务逻辑层操作请求
- **【参数】 Instance 调用标识
- OpType 操作类型
- ResID 操作的主控资源ID
- LineOpParam* 操作信息
- **【返回值】 启动操作是否成功
- ****************************************************************/
- bool CLineOpExec::procLineOp( LONG Instance, LINE_OP OpType, ULONG ResID, LineOpParam* pParam )
- {
- bool bRet = false;
- // 根据操作类型进行分类处理
- switch(OpType)
- {
- case LINE_OP_MAKE_CALL: // 座席外呼
- bRet = __procOpMakeCall(Instance, ResID, pParam);
- break;
- case LINE_OP_ANSWER_CALL: // 应答呼叫
- bRet = __procOpAnswerCall(Instance, ResID, pParam);
- break;
- case LINE_OP_PREDICTION_CALL: // 预测外呼
- bRet = __procOpAutoCall(Instance, ResID, pParam);
- break;
- case LINE_OP_HANG_UP: // 挂机
- bRet = __procOpHangUp(Instance, ResID, pParam);
- break;
- case LINE_OP_TRANSFER: // 呼叫转移
- bRet = __procOpTransfer(Instance, ResID, pParam);
- break;
- case LINE_OP_TURNAGENT: // 转坐席
- bRet = __procOpTurnAgent(Instance, ResID, pParam);
- break;
- case LINE_OP_TURNOUT: // 转外线
- bRet = __procOpTurnOut(Instance, ResID, pParam);
- break;
- case LINE_OP_TURNIVR: // 转IVR
- bRet = __procOpTurnIvr(Instance, ResID, pParam);
- break;
- case LINE_OP_CONFERENCE: // 单步会议
- bRet = __procOpMeeting(Instance, ResID, pParam);
- break;
- case LINE_OP_HOLD: // 保持
- bRet = __procOpHold(Instance, ResID, pParam);
- break;
- case LINE_OP_TAKEBACK: // 接回
- bRet = __procOpTakeBack(Instance, ResID, pParam);
- break;
- case LINE_OP_LISTEN: // 监听
- bRet = __procOpListen(Instance, ResID, pParam);
- break;
- case LINE_OP_INSERT: // 强插
- bRet = __procOpInsert(Instance, ResID, pParam);
- break;
- case LINE_OP_RESET: // 重置
- bRet = __procOpReset(Instance, ResID, pParam);
- break;
- case LINE_OP_INSTEAD: // 代接
- bRet = __procOpInstead(Instance, ResID, pParam);
- break;
- case LINE_OP_GRAB: // 强截
- bRet = __procOpIntercept(Instance, ResID, pParam);
- break;
- case LINE_OP_TRANSFER_INFO: // 信息交互
- bRet = __procOpInfoTransaction(Instance, ResID, pParam);
- break;
- case LINE_OP_CONSULT_CALL_BEGIN: // 协商呼叫启动
- bRet = __procOpConsultCallBegin(Instance, ResID, pParam);
- break;
- case LINE_OP_CONSULT_CALL_CONFIRM: // 协商呼叫确认
- bRet = __procOpConsultCallConfirm(Instance, ResID, pParam);
- break;
- case LINE_OP_IVRFAX_TRANSFER: // VR发起的传真任务而产生的转移
- bRet = __procOpIvrFaxTransfer(Instance, ResID, pParam);
- break;
- case LINE_OP_PLAY_VOICE: // 放音
- case LINE_OP_FAX: // 传真
- case LINE_OP_RECORD: // 录音
- case LINE_OP_LEAVEWORD: // 留言
- bRet = __doVsOperation(Instance, OpType, ResID, pParam);
- break;
- default:
- ASSERT(FALSE);
- } // end switch
- return bRet;
- }
- /*****************************************************************
- **【函数名称】 onTapiOpResult
- **【函数功能】 操作结果返回
- **【参数】 Instance 调用标识
- pTapiOp 返回操作结果的TapiOp实体指针
- IsSucceed 操作结果
- pInfo 附加信息
- **【返回值】
- ****************************************************************/
- void CLineOpExec::onTapiOpResult( long Instance, CTapiOpBase* pTapiOp, bool IsSucceed, LPCTSTR pInfo /*= NULL*/ )
- {
- if(pTapiOp != NULL) // 非取消操作的返回结果
- {
- // 关闭线路关联
- pTapiOp->detachAllLines();
- // 关闭操作
- delete pTapiOp;
- } // end if
- // 返回执行结果
- CDevControl::GetInstance().onEventOpResult(Instance, IsSucceed, pInfo);
- }
- /*****************************************************************
- **【函数名称】 onDevDirectOpBegin
- **【函数功能】 设备直接操作启动
- **【参数】 OpType 启动的操作类型
- pHostLine 触发事件的线路实体
- pInfo 触发操作启动的DevLinkS事件内容
- **【返回值】
- ****************************************************************/
- void CLineOpExec::onDevDirectOpBegin( UINT OpType, CTapiLine* pHostLine, DevLinkInfoS* pInfo )
- {
- switch(OpType)
- {
- case DEV_OP_CALL_OUT: // 手动外呼
- {
- CTapiOpBase* pTapiOp = new CTapiOpMakeCall(CONST_TAPI_OP_INSTANCE_INVALID);
- pTapiOp->attachHostLine(pHostLine);
- pTapiOp->start(pInfo);
- }
- break;
- } // end switch
- }
|