2.5 HeartLessProxy Run方法的實現
HeartLessProxy::run()
{
myWorkerThread->run();
mySipThread->run();
}
通過上面可以看到有兩個Run方法的調用 , 第一個是WorkThread的Run方法 , 它的主要作用是處理UaBuilder的Process方法 , 主要用來處理Sptr < Fifo < Sptr < SipProxyEvent > > > myFifo中的各種事件 , 前面已經具體的介紹了SipProxyEvent類的作用 , 這個類已經在前面介紹了 , 其實簡單的說 , 它就是一個本地的各種事件的集合 。
現在我們來看一下兩個Run方法的實現:
2.5.1 WorkerThread的Run方法:
UaBuilder::process( const Sptr < SipProxyEvent > nextEvent )
{
//處理以下的四種事件
/// SipEvent
Sptr < SipEvent > sipEvent;
sipEvent.dynamicCast( nextEvent );
if ( sipEvent != 0 )
{
//處理本地的SIP的事件 , 包括對狀態機的設置和命令/狀態隊列返回的操作在下面將//對它做具體的介紹
if( processSipEvent( sipEvent ) )
{
return;
}
//向消息隊列myCallContainer中插入相應的事件信息 。
sendEvent( nextEvent );
return;
}
/// UaDeviceEvent
Sptr < UaDeviceEvent > uaDeviceEvent;
uaDeviceEvent.dynamicCast( nextEvent );
if ( uaDeviceEvent != 0 )
{
//處理本地的設備事件 , 最主要的就是處理摘機信號;
if( processUaDeviceEvent( uaDeviceEvent ) )
{
return;
}
sendEvent( nextEvent );
return;
}
/// UaDigitEvent
Sptr < UaDigitTimerEvent > uaDigitEvent;
uaDigitEvent.dynamicCast( nextEvent );
if ( uaDigitEvent != 0 )
{
//處理在規定的時間間隔(Kickstart)主動呼叫事件的觸發 。
if( processUaDigitEvent( uaDigitEvent ) )
{
return;
}
sendEvent( nextEvent );
return;
}
/// UaTimerEvent
Sptr < UaTimerEvent > uaTimerEvent;
uaTimerEvent.dynamicCast( nextEvent );
if ( uaTimerEvent != 0 )
{
//在各種SIP命令的回應產生了超時事件后 , 系統的事件觸發 。例如:
//在StateTrying()中addEntryOperator( new OpStartTimer )在myEntryOperators隊列中加入
//該Operator(指一個操作 , 例如呼叫或者是進入等待),這里我們這個Operator在時間到達
//以后戶會被OpTimeout::process的方法檢測到(isTimeout(event)進行檢測 , 對StateTrying
//整個狀態進行檢測 , 也就是Trying事件) , 最后假如UaTimerEvent事件被觸發 , 那么 , //就會調用:stateMachine->findState( "StateError" )這個狀態 , 進入錯誤狀態 , 實施錯誤的
//處理機制 , 同時向myEntryOperators隊列中加入一個新的Operator--OpStartErrorTone ,
//從而被processUaTimerEvent過程撲捉到 , 最后通過SendEvent發送到執行隊列里去 。
if( processUaTimerEvent( uaTimerEvent ) )
{
return;
}
sendEvent( nextEvent );
return;
}
assert( 0 );
}
2.5.1.1 processSipEvent
顧名思義 , processSipEvent方法是對隊列中的SIP消息進行處理 , 我們來看下面的程序:
bool UaBuilder::processSipEvent( const Sptr < SipEvent > sipEvent )
{
Sptr < StatusMsg > statusMsg;
statusMsg.dynamicCast( sipEvent->getSipMsg() );
// 檢驗是否為返回的狀態碼(主要是對Notify,Subscribe,Register三種狀態進行單獨處理)
//下面做具體介紹
if ( statusMsg != 0 )
{
if( handleStatusMsg( sipEvent ) )
{
return true;
}
}
//在這里表示接收到一個SIP的消息 ,
//檢驗是否為一個SIP的消息而不是一個狀態(例如是否為Invite命令)
/// Let"s check the call info, now
callId = sipEvent->getSipCallLeg()->getCallId();
callInfo = calls->findCall( callId );
推薦閱讀
- br軟件是干嘛的
- 小孩叛逆期一般在什么年齡段
- 逆向工程技術的發展趨勢
- 檔案室用什么類型的滅火器
- adobe reader xi如何使用簽名文檔?
- 湖藕與蓮藕的區別 湖藕與蓮藕的區別在哪
- 現存老虎的種類有多少種小說中武松在景陽岡上打死的老虎是什么品種的有何依據
- 長虹 M618購機幾天來的一些心得
- word中打出下劃線具體操作方法
- 蛤蜊油是什么做的,蛤蜊油是什么 蛤蜊油成分 蛤蜊油作用
