UniMedia 6S級電話語音中間件典型應(yīng)用-多機(jī)同振 
                    [附源碼]
                  
                   2009/05/15
                  1.應(yīng)用場景
                  
                    用戶有多個號碼,在撥其中一個號碼時,另一個號碼同時振鈴,并且接通一個后,另一個停止振鈴。
                  
                   2.源碼片段
                    假定發(fā)起呼叫的內(nèi)線分機(jī)為1000,同時響鈴的分機(jī)為1001,1002,具體代碼
                  //////////////////////////////////////////////////////////////////
                  CALL callOriginal
                  CALL callFst
                  CALL callSnd
                  //全局變量聲明
                  SCPMANAGER g_SCPManager
                  
                  //進(jìn)程主函數(shù)
                  sub main(LIST& cpl)
                  {
                  int iCallID, iTaskID, iRet
                  string sBno1,sBno2
                  
                  //注冊系統(tǒng)錯誤事件處理函數(shù)
                  EventMap(INF_SYS_ERROR, OnSysError, 0)
                  //注冊CALL掛機(jī)事件處理函數(shù)
                  EventMap(INF_CTI_ONHOOK, OnCallEndInform, 0)
                  //注冊異步結(jié)束事件處理函數(shù)
                  EventMap(INF_SYS_ASYNCFINISHED, OnAsyncFinished, 0)
                  //注冊CALL連接事件處理函數(shù)
                  EventMap(INF_CTI_ROUTED, OnRoutedInform, 0)
                  
                  
                  //獲取進(jìn)程命令行參數(shù)中的CallID
                  cpl.GetItem(0, iCallID, iRet)
                  
                  Log(DBG, "Call Income: CallID=", iCallID)
                  
                  //根據(jù)對象ID獲得當(dāng)前Call對象
                  g_SCPManager.FindCallByID(iCallID, callOriginal, iRet)
                  //設(shè)置Call對象的業(yè)務(wù)處理進(jìn)程ID為當(dāng)前進(jìn)程
                  callOriginal.AttachCurrentProcess(iRet)
                  //應(yīng)答CALL
                  callOriginal.Answer(iRet)
                  
                  //給主叫放等待音樂
                  callOriginal.Play(true,true,"musichold.vox",iTaskID,iRet)
                  
                  Log(DBG,"給主叫播放等待音樂成功,TASKID=",iTaskID)
                  
                  //根據(jù)業(yè)務(wù)需求確定多個被叫號碼
                  sBno1 = "1001"
                  sBno2 = "1002"
                  
                  
                  int iMakeTaskID1,iMakeTaskID2
                  //發(fā)起兩次呼叫
                  g_SCPManager.MakeCall("",sBno1,-1,true,callFst,iMakeTaskID1,iRet)
                  if (iRet == RET_FAIL)
                  {
                  Log(DBG,"呼出失敗,Bno=",sBno1, "; error:",__LASTERRSTR__)
                  callOriginal.OnHook(iRet)
                  Exit("Make Call Fail")
                  }
                  else
                  {
                  //設(shè)置Call對象的業(yè)務(wù)處理進(jìn)程ID為當(dāng)前進(jìn)程
                  callFst.AttachCurrentProcess(iRet)
                  Log(DBG,"正在呼出,Bno=",sBno1, "; CallID=",callFst.CallID)
                  }
                  
                  g_SCPManager.MakeCall("",sBno2,-1,true,callSnd,iMakeTaskID2,iRet)
                  if (iRet == RET_FAIL)
                  {
                  Log(DBG,"呼出失敗,Bno=",sBno2, "; error:",__LASTERRSTR__)
                  callFst.OnHook(iRet)
                  callOriginal.OnHook(iRet)
                  Exit("Make Call Fail")
                  }
                  else
                  {
                  //設(shè)置Call對象的業(yè)務(wù)處理進(jìn)程ID為當(dāng)前進(jìn)程
                  callSnd.AttachCurrentProcess(iRet)
                  Log(DBG,"正在呼出,Bno=",sBno2, "; CallID=",callSnd.CallID)
                  }
                  
                  Log(DBG,"等待主叫用戶掛機(jī)...")
                  //等待用戶掛機(jī)事件
                  Wait(-1)
                  }
                  
                  //掛機(jī)通知處理函數(shù),只有主叫掛機(jī)才結(jié)束腳本線程
                  sub OnCallEndInform(int tag, CALL& call)
                  {
                  Log(INF, "OnHooked. CallID=", call.CallID)
                  if (call.CallID == callOriginal.CallID)
                  {
                  Log(INF,"因主叫用戶掛機(jī),準(zhǔn)備結(jié)束腳本線程...")
                  //增加下面三行就可以了
                  int ret
                  callFst.StopOP(-1,ret)
                  callSnd.StopOP(-1,ret)
                  Exit("callOriginal onhook")
                  }
                  }
                  
                  //錯誤處理函數(shù)
                  sub OnSysError(int tag)
                  {
                  Log(ERR, "System error: ", __LASTERRSTR__)
                  }
                  
                  //異步結(jié)束事件
                  sub OnAsyncFinished(int tag, CALL& call, int optype, int taskid, 
                  int ret)
                  {
                  int iRet
                  
                  if (ret == RET_SUCC)
                  {
                  Log(INF, "異步結(jié)束OK. CallID=", call.CallID, " optype=", optype, 
                  " taskid=", taskid)
                  //如果是MAKE CALL成功異步事件需要進(jìn)行連接處理
                  if (optype == 8)
                  {
                  //停止主叫等待音樂
                  callOriginal.StopOP(-1,iRet)
                  //連接主叫和先摘機(jī)的被叫
                  callOriginal.ConnectCall(call,iRet)
                  
                  //停止還沒有摘機(jī)的呼叫
                  if (call.CallID == callFst.CallID)
                  {
                  
                  callSnd.StopOP(-1,iRet)
                  }
                  elseif(call.CallID == callSnd.CallID)
                  {
                  callFst.StopOP(-1,iRet)
                  }
                  }//make call 異步結(jié)束
                  }
                  else
                  {
                  Log(INF, "異步結(jié)束FAIL. CallID=", call.CallID, " optype=", optype, 
                  " taskid=", taskid)
                  }
                  }
                  
                  //被路由通知處理函數(shù)
                  sub OnRoutedInform(int tag, CALL& call1, CALL& call2)
                  {
                  Log(INF, "Routed. CallID1=", call1.CallID, " CallID2=", call2.CallID) 
                  CTI論壇報道
                  
 相關(guān)鏈接: