mStateMacFifo(), //这个地方 mTuSelector(stack.mTuSelector),
mTransportSelector(mStateMacFifo),//TransportSelector中的mStateMacFifo这//样就和TransactionController中的mStateMacFifo代表了同一个对象 mStatelessHandler(*this), StatelessIdCounter(1), mShuttingDown(false) { }
再看看这儿(此处代码只是节选没有完全列出): void
SipStack::addTransport( TransportType protocol, int port, IpVersion version, const Data& ipInterface, const Data& sipDomainname, const Data& privateKeyPassPhrase, TransportProcessApproach threadApproach) {
InternalTransport* transport=0;
Fifo
mTransactionController.transportSelector().stateMacFifo(); //看看,都是引用//类型,导致它们都指向了同一个先进先出的队列。 try {
switch (protocol) {
case UDP:
transport = new UdpTransport(stateMacFifo, port, version, ipInterface);//注意传引用的stateMacFifo,导致TransactionController:: //stateMacFifo其实和UdpTransport:: stateMacFifo指向同一处。 break; case TCP:
transport = new TcpTransport(stateMacFifo, port, version, ipInterface);
25
break; default: assert(0); break; } } }
上面所列举的源码是为了引出下面这一段,这儿是接收和发送SIP Message的后台处理的一一个Process;搜搜整个源码有好几个Process,正是这一串Process让各种SIP Message在各层和各种类型实例间流动了起来: void
TransactionController::process(FdSet& fdset) {
mTransportSelector.process(fdset);
while (mStateMacFifo.messageAvailable()) //从这儿就能看到收发SipMessage//统一会在这儿处理。 {
if (mStateless) {
mStatelessHandler.process(); } else {
//Uagent一般就在这儿处理啦 TransactionState::process(*this); } } } void
TransactionState::process(TransactionController& controller) {
TransactionMessage* message = controller.mStateMacFifo.getNext(); }
26
以上种种TransactionController是个事务控制类,它在SipMessage的流动中起到了一个中间桥梁的作用。
接下来再看看接收到的SipMessage如何一步步上传到事务层/用户层。 void
TransactionState::process(TransactionController& controller) ? void TransactionState::sendToTU(TransactionUser* tu, TransactionController& controller, TransactionMessage* msg)
这段代码比较少,放上来: void
TransactionState::sendToTU(TransactionUser* tu, TransactionController& controller, TransactionMessage* msg) {
msg->setTransactionUser(tu);
controller.mTuSelector.add(msg, TimeLimitFifo
接下来的处理: void
TuSelector::add(Message* msg, TimeLimitFifo
//省去旁支末节代码后
msg->getTransactionUser()->postToTransactionUser(msg, usage); }
void
TransactionUser::postToTransactionUser(Message* msg, TimeLimitFifo
mFifo.add(msg, usage); }
27
这下接收到的SipMessage就到了TransactionUser其实就是交到了
DialogUsageManager手中,接下来就是由DialogUsageManager来根据状态来决定如何根据接收到的SipMessage来处理(如最终触发各种事件)。
最后再来贴贴这幅图回顾一下,加深理解:
28