1f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/* 2f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * libjingle 3f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Copyright 2004--2005, Google Inc. 4f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 5f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Redistribution and use in source and binary forms, with or without 6f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * modification, are permitted provided that the following conditions are met: 7f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 8f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 1. Redistributions of source code must retain the above copyright notice, 9f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer. 10f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright notice, 11f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer in the documentation 12f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * and/or other materials provided with the distribution. 13f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 3. The name of the author may not be used to endorse or promote products 14f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * derived from this software without specific prior written permission. 15f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 16f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 27f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 28f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifndef TALK_P2P_BASE_SESSIONMANAGER_H_ 29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define TALK_P2P_BASE_SESSIONMANAGER_H_ 30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <map> 32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <string> 33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <utility> 34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <vector> 35731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 36731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "talk/base/sigslot.h" 37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/thread.h" 38f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/p2p/base/portallocator.h" 39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 40f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace buzz { 41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass QName; 42f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass XmlElement; 43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} 44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace cricket { 46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass Session; 48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass BaseSession; 49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass SessionClient; 50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// SessionManager manages session instances 52f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 53f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass SessionManager : public sigslot::has_slots<> { 54f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SessionManager(PortAllocator *allocator, 56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch talk_base::Thread *worker_thread = NULL); 57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual ~SessionManager(); 58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch PortAllocator *port_allocator() const { return allocator_; } 60f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch talk_base::Thread *worker_thread() const { return worker_thread_; } 61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch talk_base::Thread *signaling_thread() const { return signaling_thread_; } 62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int session_timeout() const { return timeout_; } 64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void set_session_timeout(int timeout) { timeout_ = timeout; } 65f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Registers support for the given client. If we receive an initiate 67f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // describing a session of the given type, we will automatically create a 68f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Session object and notify this client. The client may then accept or 69f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // reject the session. 703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void AddClient(const std::string& content_type, SessionClient* client); 713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void RemoveClient(const std::string& content_type); 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick SessionClient* GetClient(const std::string& content_type); 73f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 74f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Creates a new session. The given name is the JID of the client on whose 75f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // behalf we initiate the session. 76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Session *CreateSession(const std::string& local_name, 773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string& content_type); 78f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 79f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Destroys the given session. 80f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void DestroySession(Session *session); 81f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns the session with the given ID or NULL if none exists. 83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Session *GetSession(const std::string& sid); 84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 85f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Terminates all of the sessions created by this manager. 86f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void TerminateAll(); 87f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 88f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // These are signaled whenever the set of existing sessions changes. 89f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sigslot::signal2<Session *, bool> SignalSessionCreate; 90f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sigslot::signal1<Session *> SignalSessionDestroy; 91f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 92f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Determines whether the given stanza is intended for some session. 93f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool IsSessionMessage(const buzz::XmlElement* stanza); 94f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 95f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Given a sid, initiator, and remote_name, this finds the matching Session 96f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Session* FindSession(const std::string& sid, 97f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string& remote_name); 98f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 99f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Called when we receive a stanza for which IsSessionMessage is true. 100f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnIncomingMessage(const buzz::XmlElement* stanza); 101f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Called when we get a response to a message that we sent. 103f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnIncomingResponse(const buzz::XmlElement* orig_stanza, 104f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::XmlElement* response_stanza); 105f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 106f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Called if an attempted to send times out or an error is returned. In the 107f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // timeout case error_stanza will be NULL 108f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnFailedSend(const buzz::XmlElement* orig_stanza, 109f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::XmlElement* error_stanza); 110f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 111f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Signalled each time a session generates a signaling message to send. 112f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Also signalled on errors, but with a NULL session. 113f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sigslot::signal2<SessionManager*, 114f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::XmlElement*> SignalOutgoingMessage; 115f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 116f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Signaled before sessions try to send certain signaling messages. The 117f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // client should call OnSignalingReady once it is safe to send them. These 118f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // steps are taken so that we don't send signaling messages trying to 119f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // re-establish the connectivity of a session when the client cannot send 120f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // the messages (and would probably just drop them on the floor). 121f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // 122f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Note: you can connect this directly to OnSignalingReady(), if a signalling 123f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // check is not supported. 124f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sigslot::signal0<> SignalRequestSignaling; 125f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnSignalingReady(); 126f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 127f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch private: 128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick typedef std::map<std::string, Session*> SessionMap; 129f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch typedef std::map<std::string, SessionClient*> ClientMap; 130f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 131f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch PortAllocator *allocator_; 132f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch talk_base::Thread *signaling_thread_; 133f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch talk_base::Thread *worker_thread_; 134f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch int timeout_; 135f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SessionMap session_map_; 136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ClientMap client_map_; 137f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 138f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Helper function for CreateSession. This is also invoked when we receive 139f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // a message attempting to initiate a session with this client. 140731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Session *CreateSession(const std::string& local_name, 141731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& initiator, 142731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& sid, 1433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string& content_type, 144f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool received_initiate); 145f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 146f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Attempts to find a registered session type whose description appears as 147f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // a child of the session element. Such a child should be present indicating 148f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // the application they hope to initiate. 149f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string FindClient(const buzz::XmlElement* session); 150f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 151f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Sends a message back to the other client indicating that we found an error 152f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // in the stanza they sent. name identifies the error, type is one of the 153f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // standard XMPP types (cancel, continue, modify, auth, wait), and text is a 154f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // description for debugging purposes. 155f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void SendErrorMessage(const buzz::XmlElement* stanza, 156f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::QName& name, 157f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string& type, 158f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string& text, 159f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::XmlElement* extra_info); 160f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 161f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Creates and returns an error message from the given components. The 162f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // caller is responsible for deleting this. 163f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch buzz::XmlElement* CreateErrorMessage( 164f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::XmlElement* stanza, 165f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::QName& name, 166f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string& type, 167f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string& text, 168f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::XmlElement* extra_info); 169f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 170f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Called each time a session requests signaling. 171f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnRequestSignaling(Session* session); 172f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 173f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Called each time a session has an outgoing message. 174f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnOutgoingMessage(Session* session, const buzz::XmlElement* stanza); 175f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 176f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Called each time a session has an error to send. 177f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnErrorMessage(BaseSession* session, 178f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::XmlElement* stanza, 179f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::QName& name, 180f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string& type, 181f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string& text, 182f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::XmlElement* extra_info); 183f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 184f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 185f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} // namespace cricket 186f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 187f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif // TALK_P2P_BASE_SESSIONMANAGER_H_ 188