[Libjingle代码分析]对照Jingle的XMPP stanza理解Libjingle的几个关键数据结构
1.
SessionManager管理多个Session:
class SessionManager { typedef std::map<std::string, Session*> SessionMap; SessionMap session_map_;}
每个Session在SessionManager里通过sid来区分:
session_map_[session->id()] = session;?
通过SessionManager::CreateSession(content_type)创建一个Session, 每个Session对应一个content_type:
class Session { std::string content_type_;}
content_type目前传入的为"urn:xmpp:jingle:apps:rtp:1", 其实就是<content>下<description>元素的"xmlns"属性值.
?
2.
一个Session管理多个Transport:
typedef std::map<std::string, TransportProxy*> TransportMap;class Session { TransportMap transports_;}
每个Transport在Session里通过content_name来区分:
transports_[content_name] = transproxy;
?
通过Session::GetOrCreateTransportProxy(content_name)来创建一个Transport. content_name就是<content>元素的name属性值, 如"audio", "video"等. 比如, 在视频聊天中:
<jingle> <content name="audio" creator="initiator"> </content> <content name="video" creator="initiator"> </content></jingle>
?
3.
一个Transport管理多个Transportchannel:
typedef std::map<std::string, TransportChannelImpl*> ChannelMap;class Transport { ChannelMap channels_;}
每个Transportchannel通过channel_name来区分:
channels_[name] = channel;?
通过 Transport::CreateChannel(name)创建一个Transport, channel_name没有对应的XMPP stanza, 其值有"rtp", "rtcp"等.
?
4.
一个TransportChannel(主要是P2PTransportChannel)管理多个Port:
class P2PTransportChannel { std::vector<Port *> ports_;}
?
Port分为StunPort, TCPPort, UDPPort等, 与<transport>元素的xmlns属性值(如"urn:xmpp:jingle:transports:ice-udp:1")以及子元素<candidate>的protocol属性值(如"udp")有关.
?
5.
一个Port管理多个Connection:
class Port { typedef std::map<talk_base::SocketAddress, Connection*> AddressMap; AddressMap connections_;}
?
6.
一个Connection包括一个local_candidate和一个remote_candidate:
class Connection
class Connection { size_t local_candidate_index_; Candidate remote_candidate_;}