if ( callInfo == 0 )
{
//下面分成两种状况进行讨论 , 一种是接受到Invite的消息 , 一种是接收到一个普通的
//命令 , 例如
Sptr < InviteMsg > inviteMsg;
inviteMsg.dynamicCast( sipEvent->getSipMsg() );
if ( inviteMsg == 0 )
{
//假如大家在这里有什么希奇的话没有必要 , 为什么除了inviteMsg以外的所有的消
//息都不处理呢?其实这些消息都在SipThread这个程序中处理了 , 在Ua这个大状态
//机中所有的状态都是以Invite这个消息作为启动的 。每一个INVITE启动一个系列的//消息和状态 。
return true;
}
else
{
//收到一个Invite消息 , 这个时候我们就要进入相应的处理机制中了;
callInfo = calls->newCall
( sipEvent->getSipCallLeg()->getCallId() );
assert( callInfo != 0 );
callInfo->setFeature( stateMachine );
//假如进入的状态是自动呼叫(Auto Call)或者是自动应答(Auto Answer)状态(这
//两种状态的确定要在CFG文件中体现)
if ( UaConfiguration::instance()->getLoadGenOn() )
{
/// Assume this is a new call...
/// Also assume that we are not in use.
callInfo->setState( stateMachine->findState( "StateAutoIdle" ) );
//StateAutoIdle这个状态是一个自动应答和自动呼叫(按照呼叫列表)时候的状态 , 这里我
//们不做介绍 , 它本身和手动呼叫是非常相似的 。
}
else // LoadGen is off
{
//下面这个程序会进入等待远端SIP事件和本地呼叫事件的状态StateIdle
if( handleCallWaiting( callInfo ) )
{
cpLog( LOG_ERR, "Returned from handleCallWaitingn" );
return true;
}
}
} // lots of brackets!
}
return false;
} /// UaBuilder::processSipEvent
handleStatusMsg在做什么?
前面我们已经作了简单的介绍 , 这个函数的主要目的是在处理Rgister,Notify,和Subscribe等几个状态 , 并且分别调用他们的处理机;
Rgister调用它的处理机:
handleRegistrationResponse他的主要作用是处理返回的各种Rgister状态 , 例如200 , 4XX或者是100等状态 , 另外它还负责在作为Mashal Server的时候转发各种状态时候 , 重新设定EXPire的值;另外要注重的是在Register中增加了一个新的返回--Trying这个是非常合理的 , 非凡是大型网络中 , 对服务器端的性能判定很有效 , 所以使用协议栈的同志能好好利用这个机制;另外假如发挥的值是401/407状态(未授权) , 还需要调用authenticateMessage做相应的处理 , 以返回的(401/407)状态中所带的密钥加密新的Rgister消息 , 发送给Register服务器重新进行授权判定;有爱好的可以看看BaseAuthentication中的addAuthorization函数 。在介绍UaMarshal和Redirect Server的时候会着重讨论这个问题 。
注明:Subscribe的处理机在Feature Server章节里面在再具体介绍) 。
2.5.1.2 processUaDeviceEvent
前面说了 , processUaDeviceEvent主要是用来处理本地的设备事件 , 最主要就是处理摘机信号 , 在这里程序的流程我就不具体的列出 , 不过我们从主要的程序主体部分可以看出:
在uaDeviceEvent->type == DeviceEventHookUp也就是检测了摘机以后 , 程序会采取某些必要的方式取得CallID(主要是通过CFG文件) , 最后让程序进入状态机的StateIdle状态 , 这个状态是接收和发送消息的初始状态 , 我们可以在后面将会重点介绍这个状态;
2.5.1.3 processUaDigitEvent
也是主要通过判定CFG文件中的LoadGen_On的参数是On或者是Off来决定是否进入StateAutoIdle状态 , 或者是StateAutoRS状态(自动通过Marshal Server进行中转所有的SIP的消息和状态 , 在Marshal Server的时候会做具体的介绍) 。
推荐阅读
- br软件是干嘛的
- 小孩叛逆期一般在什么年龄段
- 逆向工程技术的发展趋势
- 档案室用什么类型的灭火器
- adobe reader xi如何使用签名文档?
- 湖藕与莲藕的区别 湖藕与莲藕的区别在哪
- 现存老虎的种类有多少种小说中武松在景阳冈上打死的老虎是什么品种的有何依据
- 长虹 M618购机几天来的一些心得
- word中打出下划线具体操作方法
- 蛤蜊油是什么做的,蛤蜊油是什么 蛤蜊油成分 蛤蜊油作用