1.
SessionManager管理多个Session:
Cpp代码
- class SessionManager {
- typedef std::map SessionMap;
- SessionMap session_map_;
- }
每个Session在SessionManager里通过sid来区分:
Cpp代码
- session_map_[session->id()] = session;
通过SessionManager::CreateSession(content_type)创建一个Session, 每个Session对应一个content_type:
Cpp代码
- class Session {
- std::string content_type_;
- }
content_type目前传入的为"urn:xmpp:jingle:apps:rtp:1", 其实就是下元素的"xmlns"属性值.
2.
一个Session管理多个Transport:
Cpp代码
- typedef std::map TransportMap;
- class Session {
- TransportMap transports_;
- }
每个Transport在Session里通过content_name来区分:
Cpp代码
- 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">
- <</span>jingle>
- <</span>content name="audio" creator="initiator">
- </</span>content>
- <</span>content name="video" creator="initiator">
- </</span>content>
- </</span>jingle>
3.
一个Transport管理多个Transportchannel:
Cpp代码
- typedef std::map ChannelMap;
- class Transport {
- ChannelMap channels_;
- }
每个Transportchannel通过channel_name来区分:
Cpp代码
- channels_[name] = channel;
通过 Transport::CreateChannel(name)创建一个Transport, channel_name没有对应的XMPP stanza, 其值有"rtp", "rtcp"等.
4.
一个TransportChannel(主要是P2PTransportChannel)管理多个Port:
Cpp代码
- class P2PTransportChannel {
- std::vector ports_;
- }
Port分为StunPort, TCPPort, UDPPort等, 与元素的xmlns属性值(如"urn:xmpp:jingle:transports:ice-udp:1")以及子元素的protocol属性值(如"udp")有关.
5.
一个Port管理多个Connection:
Cpp代码
- class Port {
- typedef std::map AddressMap;
- AddressMap connections_;
- }
6.
一个Connection包括一个local_candidate和一个remote_candidate:
class Connection
Cpp代码
- class Connection {
- size_t local_candidate_index_;
- Candidate remote_candidate_;
- }