#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(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 }