UniMedia 6S級電話語音中間件典型應(yīng)用-多機同振
[附源碼]
2009/05/15
1.應(yīng)用場景
用戶有多個號碼,在撥其中一個號碼時,另一個號碼同時振鈴,并且接通一個后,另一個停止振鈴。
2.源碼片段
假定發(fā)起呼叫的內(nèi)線分機為1000,同時響鈴的分機為1001,1002,具體代碼
//////////////////////////////////////////////////////////////////
CALL callOriginal
CALL callFst
CALL callSnd
//全局變量聲明
SCPMANAGER g_SCPManager
//進程主函數(shù)
sub main(LIST& cpl)
{
int iCallID, iTaskID, iRet
string sBno1,sBno2
//注冊系統(tǒng)錯誤事件處理函數(shù)
EventMap(INF_SYS_ERROR, OnSysError, 0)
//注冊CALL掛機事件處理函數(shù)
EventMap(INF_CTI_ONHOOK, OnCallEndInform, 0)
//注冊異步結(jié)束事件處理函數(shù)
EventMap(INF_SYS_ASYNCFINISHED, OnAsyncFinished, 0)
//注冊CALL連接事件處理函數(shù)
EventMap(INF_CTI_ROUTED, OnRoutedInform, 0)
//獲取進程命令行參數(shù)中的CallID
cpl.GetItem(0, iCallID, iRet)
Log(DBG, "Call Income: CallID=", iCallID)
//根據(jù)對象ID獲得當前Call對象
g_SCPManager.FindCallByID(iCallID, callOriginal, iRet)
//設(shè)置Call對象的業(yè)務(wù)處理進程ID為當前進程
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ù)處理進程ID為當前進程
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ù)處理進程ID為當前進程
callSnd.AttachCurrentProcess(iRet)
Log(DBG,"正在呼出,Bno=",sBno2, "; CallID=",callSnd.CallID)
}
Log(DBG,"等待主叫用戶掛機...")
//等待用戶掛機事件
Wait(-1)
}
//掛機通知處理函數(shù),只有主叫掛機才結(jié)束腳本線程
sub OnCallEndInform(int tag, CALL& call)
{
Log(INF, "OnHooked. CallID=", call.CallID)
if (call.CallID == callOriginal.CallID)
{
Log(INF,"因主叫用戶掛機,準備結(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成功異步事件需要進行連接處理
if (optype == 8)
{
//停止主叫等待音樂
callOriginal.StopOP(-1,iRet)
//連接主叫和先摘機的被叫
callOriginal.ConnectCall(call,iRet)
//停止還沒有摘機的呼叫
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)鏈接:
图片|
石台县|
新晃|
精河县|
原阳县|
剑阁县|
南宫市|
昭通市|
青河县|
阿拉尔市|
高阳县|
黎平县|
云浮市|
大庆市|
云林县|
宁夏|
江口县|
布尔津县|
东莞市|
巴林右旗|
荔浦县|
阜新|
舒城县|
江永县|
庆阳市|
松原市|
枝江市|
拉萨市|
忻州市|
牙克石市|
东丰县|
盐城市|
普陀区|
鹰潭市|
寻乌县|
苗栗市|
大足县|
邓州市|
大名县|
南阳市|
横山县|