15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/* 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2004--2005, Google Inc. 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met: 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer. 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer in the documentation 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * and/or other materials provided with the distribution. 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 3. The name of the author may not be used to endorse or promote products 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * derived from this software without specific prior written permission. 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */ 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifndef TALK_P2P_BASE_SESSIONMANAGER_H_ 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define TALK_P2P_BASE_SESSIONMANAGER_H_ 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <map> 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <string> 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <utility> 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <vector> 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/sigslot.h" 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/thread.h" 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/base/portallocator.h" 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/base/transportdescriptionfactory.h" 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace buzz { 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass QName; 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass XmlElement; 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace cricket { 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass Session; 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass BaseSession; 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass SessionClient; 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// SessionManager manages session instances. 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass SessionManager : public sigslot::has_slots<> { 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public: 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionManager(PortAllocator *allocator, 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::Thread *worker_thread = NULL); 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual ~SessionManager(); 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org PortAllocator *port_allocator() const { return allocator_; } 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::Thread *worker_thread() const { return worker_thread_; } 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::Thread *signaling_thread() const { return signaling_thread_; } 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int session_timeout() const { return timeout_; } 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void set_session_timeout(int timeout) { timeout_ = timeout; } 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Set what transport protocol we want to default to. 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void set_transport_protocol(TransportProtocol proto) { 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org transport_desc_factory_.set_protocol(proto); 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Control use of DTLS. An identity must be supplied if DTLS is enabled. 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void set_secure(SecurePolicy policy) { 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org transport_desc_factory_.set_secure(policy); 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void set_identity(talk_base::SSLIdentity* identity) { 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org transport_desc_factory_.set_identity(identity); 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const TransportDescriptionFactory* transport_desc_factory() const { 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return &transport_desc_factory_; 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Registers support for the given client. If we receive an initiate 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // describing a session of the given type, we will automatically create a 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Session object and notify this client. The client may then accept or 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // reject the session. 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void AddClient(const std::string& content_type, SessionClient* client); 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void RemoveClient(const std::string& content_type); 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionClient* GetClient(const std::string& content_type); 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Creates a new session. The given name is the JID of the client on whose 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // behalf we initiate the session. 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Session *CreateSession(const std::string& local_name, 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& content_type); 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 95c237f0ad875cde990bf9d89f41424b18809cc345henrike@webrtc.org Session *CreateSession(const std::string& id, 96c237f0ad875cde990bf9d89f41424b18809cc345henrike@webrtc.org const std::string& local_name, 97c237f0ad875cde990bf9d89f41424b18809cc345henrike@webrtc.org const std::string& content_type); 98c237f0ad875cde990bf9d89f41424b18809cc345henrike@webrtc.org 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Destroys the given session. 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void DestroySession(Session *session); 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Returns the session with the given ID or NULL if none exists. 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Session *GetSession(const std::string& sid); 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Terminates all of the sessions created by this manager. 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void TerminateAll(); 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // These are signaled whenever the set of existing sessions changes. 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org sigslot::signal2<Session *, bool> SignalSessionCreate; 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org sigslot::signal1<Session *> SignalSessionDestroy; 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Determines whether the given stanza is intended for some session. 1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool IsSessionMessage(const buzz::XmlElement* stanza); 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Given a sid, initiator, and remote_name, this finds the matching Session 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Session* FindSession(const std::string& sid, 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& remote_name); 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Called when we receive a stanza for which IsSessionMessage is true. 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnIncomingMessage(const buzz::XmlElement* stanza); 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Called when we get a response to a message that we sent. 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnIncomingResponse(const buzz::XmlElement* orig_stanza, 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const buzz::XmlElement* response_stanza); 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Called if an attempted to send times out or an error is returned. In the 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // timeout case error_stanza will be NULL 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnFailedSend(const buzz::XmlElement* orig_stanza, 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const buzz::XmlElement* error_stanza); 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Signalled each time a session generates a signaling message to send. 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Also signalled on errors, but with a NULL session. 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org sigslot::signal2<SessionManager*, 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const buzz::XmlElement*> SignalOutgoingMessage; 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Signaled before sessions try to send certain signaling messages. The 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // client should call OnSignalingReady once it is safe to send them. These 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // steps are taken so that we don't send signaling messages trying to 1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // re-establish the connectivity of a session when the client cannot send 1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // the messages (and would probably just drop them on the floor). 1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // 1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Note: you can connect this directly to OnSignalingReady(), if a signalling 1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // check is not supported. 1445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org sigslot::signal0<> SignalRequestSignaling; 1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnSignalingReady(); 1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Signaled when this SessionManager is deleted. 1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org sigslot::signal0<> SignalDestroyed; 1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private: 1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org typedef std::map<std::string, Session*> SessionMap; 1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org typedef std::map<std::string, SessionClient*> ClientMap; 1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Helper function for CreateSession. This is also invoked when we receive 1555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // a message attempting to initiate a session with this client. 1565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Session *CreateSession(const std::string& local_name, 1575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& initiator, 1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& sid, 1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& content_type, 1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool received_initiate); 1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Attempts to find a registered session type whose description appears as 1635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // a child of the session element. Such a child should be present indicating 1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // the application they hope to initiate. 1655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string FindClient(const buzz::XmlElement* session); 1665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Sends a message back to the other client indicating that we found an error 1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // in the stanza they sent. name identifies the error, type is one of the 1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // standard XMPP types (cancel, continue, modify, auth, wait), and text is a 1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // description for debugging purposes. 1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void SendErrorMessage(const buzz::XmlElement* stanza, 1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const buzz::QName& name, 1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& type, 1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& text, 1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const buzz::XmlElement* extra_info); 1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Creates and returns an error message from the given components. The 1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // caller is responsible for deleting this. 1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org buzz::XmlElement* CreateErrorMessage( 1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const buzz::XmlElement* stanza, 1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const buzz::QName& name, 1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& type, 1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& text, 1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const buzz::XmlElement* extra_info); 1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Called each time a session requests signaling. 1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnRequestSignaling(Session* session); 1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Called each time a session has an outgoing message. 1905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnOutgoingMessage(Session* session, const buzz::XmlElement* stanza); 1915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Called each time a session has an error to send. 1935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void OnErrorMessage(BaseSession* session, 1945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const buzz::XmlElement* stanza, 1955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const buzz::QName& name, 1965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& type, 1975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const std::string& text, 1985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const buzz::XmlElement* extra_info); 1995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org PortAllocator *allocator_; 2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::Thread *signaling_thread_; 2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org talk_base::Thread *worker_thread_; 2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org int timeout_; 2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org TransportDescriptionFactory transport_desc_factory_; 2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org SessionMap session_map_; 2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ClientMap client_map_; 2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 2085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} // namespace cricket 2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif // TALK_P2P_BASE_SESSIONMANAGER_H_ 212