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中打出下划线具体操作方法
- 蛤蜊油是什么做的,蛤蜊油是什么 蛤蜊油成分 蛤蜊油作用
