对照Jingle的XMPP stanza理解Libjingle的几个关键数据结构

1.

SessionManager管理多个Session:

Cpp代码    收藏代码
  1. class SessionManager {  
  2.   typedef std::map SessionMap;  
  3.   SessionMap session_map_;  
  4. }  

每个Session在SessionManager里通过sid来区分:

Cpp代码    收藏代码
  1. session_map_[session->id()] = session;  
 

通过SessionManager::CreateSession(content_type)创建一个Session, 每个Session对应一个content_type:

Cpp代码    收藏代码
  1. class Session {  
  2.   std::string content_type_;  
  3. }  

content_type目前传入的为"urn:xmpp:jingle:apps:rtp:1", 其实就是下元素的"xmlns"属性值.

 

2.

一个Session管理多个Transport:

Cpp代码    收藏代码
  1. typedef std::map TransportMap;  
  2. class Session {  
  3.   TransportMap transports_;  
  4. }  

每个Transport在Session里通过content_name来区分:

Cpp代码    收藏代码
  1. transports_[content_name] = transproxy;  

 

通过Session::GetOrCreateTransportProxy(content_name)来创建一个Transport. content_name就是元素的name属性值, 如"audio", "video"等. 比如, 在视频聊天中:

Xml代码   " quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">  收藏代码
  1. <</span>jingle>  
  2.   <</span>content name="audio" creator="initiator">  
  3.   </</span>content>  
  4.   <</span>content name="video" creator="initiator">  
  5.   </</span>content>  
  6. </</span>jingle>  

 

3.

一个Transport管理多个Transportchannel:

Cpp代码    收藏代码
  1. typedef std::map ChannelMap;  
  2. class Transport {  
  3.   ChannelMap channels_;  
  4. }   

每个Transportchannel通过channel_name来区分:

Cpp代码    收藏代码
  1. channels_[name] = channel;  
 

通过 Transport::CreateChannel(name)创建一个Transport, channel_name没有对应的XMPP stanza, 其值有"rtp", "rtcp"等.

 

4.

一个TransportChannel(主要是P2PTransportChannel)管理多个Port:

Cpp代码    收藏代码
  1. class P2PTransportChannel {  
  2.   std::vector ports_;  
  3. }  

 

Port分为StunPort, TCPPort, UDPPort等, 与元素的xmlns属性值(如"urn:xmpp:jingle:transports:ice-udp:1")以及子元素的protocol属性值(如"udp")有关.

 

5.

一个Port管理多个Connection:

Cpp代码    收藏代码
  1. class Port {  
  2.   typedef std::map AddressMap;  
  3.   AddressMap connections_;  
  4. }  

 

6.

一个Connection包括一个local_candidate和一个remote_candidate:

class Connection

Cpp代码    收藏代码
  1. class Connection {  
  2.   size_t local_candidate_index_;  
  3.   Candidate remote_candidate_;  
  4. }  

你可能感兴趣的:(对照Jingle的XMPP stanza理解Libjingle的几个关键数据结构)