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_SESSION_H_ 29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define TALK_P2P_BASE_SESSION_H_ 30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <list> 32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <map> 33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <string> 34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <vector> 35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 36f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/p2p/base/sessionmessages.h" 37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/p2p/base/sessionmanager.h" 38f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/base/socketaddress.h" 39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/p2p/base/sessionclient.h" 40f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/p2p/base/parsing.h" 41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/p2p/base/port.h" 42f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/xmllite/xmlelement.h" 43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include "talk/xmpp/constants.h" 44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace cricket { 46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass P2PTransportChannel; 48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass Transport; 49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass TransportChannel; 50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass TransportChannelProxy; 51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass TransportChannelImpl; 52f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Used for errors that will send back a specific error message to the 54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// remote peer. We add "type" to the errors because it's needed for 55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// SignalErrorMessage. 56731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstruct MessageError : ParseError { 57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch buzz::QName type; 58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // if unset, assume type is a parse error 60731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick MessageError() : ParseError(), type(buzz::QN_STANZA_BAD_REQUEST) {} 61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void SetType(const buzz::QName type) { 63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch this->type = type; 64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 65f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 67731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Used for errors that may be returned by public session methods that 68731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// can fail. 69731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// TODO: Use this error in Session::Initiate and 70731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Session::Accept. 71731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstruct SessionError : WriteError { 72731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 73731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 74731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Bundles a Transport and ChannelMap together. ChannelMap is used to 75731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// create transport channels before receiving or sending a session 76731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// initiate, and for speculatively connecting channels. Previously, a 77731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// session had one ChannelMap and transport. Now, with multiple 78731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// transports per session, we need multiple ChannelMaps as well. 79731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickclass TransportProxy { 80731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick public: 81731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TransportProxy(const std::string& content_name, Transport* transport) 82731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick : content_name_(content_name), 83731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick transport_(transport), 84731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state_(STATE_INIT), 85731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick sent_candidates_(false) {} 86731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~TransportProxy(); 87731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string content_name() const { return content_name_; } 89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Transport* impl() const { return transport_; } 90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string type() const; 91731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool negotiated() const { return state_ == STATE_NEGOTIATED; } 92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const Candidates& sent_candidates() const { return sent_candidates_; } 93731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 94731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TransportChannel* GetChannel(const std::string& name); 95731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TransportChannel* CreateChannel(const std::string& name, 96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& content_type); 97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void DestroyChannel(const std::string& name); 98731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void AddSentCandidates(const Candidates& candidates); 99731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void ClearSentCandidates() { sent_candidates_.clear(); } 100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void SpeculativelyConnectChannels(); 101731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void CompleteNegotiation(); 102731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick private: 104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick enum TransportState { 105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick STATE_INIT, 106731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick STATE_CONNECTING, 107731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick STATE_NEGOTIATED 108731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick }; 109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick typedef std::map<std::string, TransportChannelProxy*> ChannelMap; 111731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 112731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TransportChannelProxy* GetProxy(const std::string& name); 113731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TransportChannelImpl* GetOrCreateImpl(const std::string& name, 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& content_type); 115731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void SetProxyImpl(const std::string& name, TransportChannelProxy* proxy); 116731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 117731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string content_name_; 118731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Transport* transport_; 119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TransportState state_; 120731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ChannelMap channels_; 121731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Candidates sent_candidates_; 122731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick}; 123731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 124731df977c0511bca2206b5f333555b1205ff1f43Iain Merricktypedef std::map<std::string, TransportProxy*> TransportMap; 125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 126731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// TODO: Consider simplifying the dependency from Voice/VideoChannel 127f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// on Session. Right now the Channel class requires a BaseSession, but it only 128f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// uses CreateChannel/DestroyChannel. Perhaps something like a 129f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// TransportChannelFactory could be hoisted up out of BaseSession, or maybe 130f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// the transports could be passed in directly. 131f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 132f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// A BaseSession manages general session state. This includes negotiation 133f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// of both the application-level and network-level protocols: the former 134f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// defines what will be sent and the latter defines how it will be sent. Each 135f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// network-level protocol is represented by a Transport object. Each Transport 136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// participates in the network-level negotiation. The individual streams of 137f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// packets are represented by TransportChannels. The application-level protocol 138f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// is represented by SessionDecription objects. 139f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass BaseSession : public sigslot::has_slots<>, 140f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public talk_base::MessageHandler { 141f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 142f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch enum State { 143f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch STATE_INIT = 0, 144f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch STATE_SENTINITIATE, // sent initiate, waiting for Accept or Reject 145f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch STATE_RECEIVEDINITIATE, // received an initiate. Call Accept or Reject 146f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch STATE_SENTACCEPT, // sent accept. begin connecting transport 147f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch STATE_RECEIVEDACCEPT, // received accept. begin connecting transport 148f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch STATE_SENTMODIFY, // sent modify, waiting for Accept or Reject 149f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch STATE_RECEIVEDMODIFY, // received modify, call Accept or Reject 150f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch STATE_SENTREJECT, // sent reject after receiving initiate 151f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch STATE_RECEIVEDREJECT, // received reject after sending initiate 152f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch STATE_SENTREDIRECT, // sent direct after receiving initiate 153f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch STATE_SENTTERMINATE, // sent terminate (any time / either side) 154f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch STATE_RECEIVEDTERMINATE, // received terminate (any time / either side) 155f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch STATE_INPROGRESS, // session accepted and in progress 156f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch STATE_DEINIT, // session is being destroyed 157f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch }; 158f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 159f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch enum Error { 160f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ERROR_NONE = 0, // no error 161f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ERROR_TIME = 1, // no response to signaling 162f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ERROR_RESPONSE = 2, // error during signaling 163f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ERROR_NETWORK = 3, // network error, could not allocate network resources 164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ERROR_CONTENT = 4, // channel errors in SetLocalContent/SetRemoteContent 165f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch }; 166f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 167f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch explicit BaseSession(talk_base::Thread *signaling_thread); 168f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual ~BaseSession(); 169f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 170f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Updates the state, signaling if necessary. 171f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void SetState(State state); 172f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 173f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Updates the error state, signaling if necessary. 174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void SetError(Error error); 175f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 176f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Handles messages posted to us. 177f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void OnMessage(talk_base::Message *pmsg); 178f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 179f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns the current state of the session. See the enum above for details. 180f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Each time the state changes, we will fire this signal. 181f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch State state() const { return state_; } 182f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sigslot::signal2<BaseSession *, State> SignalState; 183f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 184f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns the last error in the session. See the enum above for details. 185f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Each time the an error occurs, we will fire this signal. 186f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Error error() const { return error_; } 187f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sigslot::signal2<BaseSession *, Error> SignalError; 188f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 189731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Creates a new channel with the given names. This method may be called 190f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // immediately after creating the session. However, the actual 191f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // implementation may not be fixed until transport negotiation completes. 192731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // This will usually be called from the worker thread, but that 193731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // shouldn't be an issue since the main thread will be blocked in 194731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Send when doing so. 195731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual TransportChannel* CreateChannel(const std::string& content_name, 196731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& channel_name) = 0; 197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Returns the channel with the given names. 199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual TransportChannel* GetChannel(const std::string& content_name, 200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& channel_name) = 0; 201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Destroys the channel with the given names. 203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // This will usually be called from the worker thread, but that 204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // shouldn't be an issue since the main thread will be blocked in 205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Send when doing so. 206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void DestroyChannel(const std::string& content_name, 207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& channel_name) = 0; 208f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 209f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Invoked when we notice that there is no matching channel on our peer. 210f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sigslot::signal2<Session*, const std::string&> SignalChannelGone; 211f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 212f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns the application-level description given by our client. 2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // If we are the recipient, this will be NULL until we send an accept. 2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const SessionDescription* local_description() const { 2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return local_description_; 2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Takes ownership of SessionDescription* 2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool set_local_description(const SessionDescription* sdesc) { 2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (sdesc != local_description_) { 2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick delete local_description_; 2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick local_description_ = sdesc; 222f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 223f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return true; 224f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 225f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 226f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns the application-level description given by the other client. 2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // If we are the initiator, this will be NULL until we receive an accept. 2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const SessionDescription* remote_description() const { 229f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return remote_description_; 230f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Takes ownership of SessionDescription* 2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool set_remote_description(const SessionDescription* sdesc) { 2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (sdesc != remote_description_) { 234f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch delete remote_description_; 2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick remote_description_ = sdesc; 236f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 237f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return true; 238f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 239f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 2403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // When we receive an initiate, we create a session in the 2413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // RECEIVEDINITIATE state and respond by accepting or rejecting. 2423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Takes ownership of session description. 2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual bool Accept(const SessionDescription* sdesc) = 0; 244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual bool Reject(const std::string& reason) = 0; 245731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool Terminate() { 246731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return TerminateWithReason(STR_TERMINATE_SUCCESS); 247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual bool TerminateWithReason(const std::string& reason) = 0; 249f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 250f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // The worker thread used by the session manager 251f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual talk_base::Thread *worker_thread() = 0; 252f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 2534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch talk_base::Thread *signaling_thread() { 2544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch return signaling_thread_; 2554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 2564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 257f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns the JID of this client. 258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& local_name() const { return local_name_; } 259f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 260f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns the JID of the other peer in this session. 261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& remote_name() const { return remote_name_; } 262f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Set the JID of the other peer in this session. 2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Typically the remote_name_ is set when the session is initiated. 2653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // However, sometimes (e.g when a proxy is used) the peer name is 2663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // known after the BaseSession has been initiated and it must be updated 2673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // explicitly. 2683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick void set_remote_name(const std::string& name) { remote_name_ = name; } 2693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& id() const { return sid_; } 271f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 272f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch protected: 273f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch State state_; 274f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Error error_; 2753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const SessionDescription* local_description_; 2763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const SessionDescription* remote_description_; 277731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string sid_; 278f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // We don't use buzz::Jid because changing to buzz:Jid here has a 279f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // cascading effect that requires an enormous number places to 280f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // change to buzz::Jid as well. 281731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string local_name_; 282f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string remote_name_; 283f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch talk_base::Thread *signaling_thread_; 284f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 285f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 286f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// A specific Session created by the SessionManager, using XMPP for protocol. 287f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass Session : public BaseSession { 288f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch public: 289f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns the manager that created and owns this session. 290f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SessionManager* session_manager() const { return session_manager_; } 291f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 292f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // the worker thread used by the session manager 293f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch talk_base::Thread *worker_thread() { 294f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return session_manager_->worker_thread(); 295f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 296f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 297f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns the XML namespace identifying the type of this session. 2983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const std::string& content_type() const { return content_type_; } 299f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 300f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Returns the client that is handling the application data of this session. 301f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SessionClient* client() const { return client_; } 302f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 303731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SignalingProtocol current_protocol() const { return current_protocol_; } 304731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 305731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void set_current_protocol(SignalingProtocol protocol) { 306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick current_protocol_ = protocol; 307731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 308731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 309f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Indicates whether we initiated this session. 310f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool initiator() const { return initiator_; } 311f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 312731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const SessionDescription* initiator_description() const { 313731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (initiator_) { 314731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return local_description_; 315731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else { 316731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return remote_description_; 317731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 319731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 320f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Fired whenever we receive a terminate message along with a reason 321f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sigslot::signal2<Session*, const std::string&> SignalReceivedTerminateReason; 322f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 323731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void set_allow_local_ips(bool allow); 324731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 325731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Returns the transport that has been negotiated or NULL if 326731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // negotiation is still in progress. 327731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Transport* GetTransport(const std::string& content_name); 328f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 3293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Takes ownership of session description. 330731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO: Add an error argument to pass back to the caller. 331f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool Initiate(const std::string& to, 3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const SessionDescription* sdesc); 333f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 3343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // When we receive an initiate, we create a session in the 3353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // RECEIVEDINITIATE state and respond by accepting or rejecting. 3363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Takes ownership of session description. 337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TODO: Add an error argument to pass back to the caller. 3383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick virtual bool Accept(const SessionDescription* sdesc); 339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual bool Reject(const std::string& reason); 340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual bool TerminateWithReason(const std::string& reason); 341f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 342f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // The two clients in the session may also send one another arbitrary XML 343f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // messages, which are called "info" messages. Both of these functions take 344f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // ownership of the XmlElements and delete them when done. 345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool SendInfoMessage(const XmlElements& elems); 346f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sigslot::signal2<Session*, const XmlElements&> SignalInfoMessage; 347f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 348f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Maps passed to serialization functions. 349f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch TransportParserMap GetTransportParsers(); 3503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ContentParserMap GetContentParsers(); 351f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 352731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Creates a new channel with the given names. This method may be called 353f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // immediately after creating the session. However, the actual 354f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // implementation may not be fixed until transport negotiation completes. 355731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual TransportChannel* CreateChannel(const std::string& content_name, 356731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& channel_name); 357f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 358731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Returns the channel with the given names. 359731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual TransportChannel* GetChannel(const std::string& content_name, 360731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& channel_name); 361f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 362731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Destroys the channel with the given names. 363731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual void DestroyChannel(const std::string& content_name, 364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& channel_name); 365f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 366dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Updates the error state, signaling if necessary. 367dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void SetError(Error error); 368dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 369f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Handles messages posted to us. 370f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual void OnMessage(talk_base::Message *pmsg); 371f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 372dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Fired when notification of media sources is received from the server. 373dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Passes a map whose keys are strings containing nick names for users 374dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // in the session and whose values contain the SSRCs for each user. 375dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen sigslot::signal1<const StringToMediaSourcesMap&> SignalMediaSources; 376dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 377dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Sets the video streams to receive from the server. 378dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool SetVideoView(const VideoViewRequestVector& view_requests); 379dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 380f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch private: 381f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Creates or destroys a session. (These are called only SessionManager.) 382f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Session(SessionManager *session_manager, 383731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& local_name, const std::string& initiator_name, 384731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const std::string& sid, const std::string& content_type, 385f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch SessionClient* client); 386f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ~Session(); 387f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 388731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Get a TransportProxy by content_name or transport. NULL if not found. 389731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TransportProxy* GetTransportProxy(const std::string& content_name); 390731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TransportProxy* GetTransportProxy(const Transport* transport); 391731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TransportProxy* GetFirstTransportProxy(); 392731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // TransportProxy is owned by session. Return proxy just for convenience. 393731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TransportProxy* GetOrCreateTransportProxy(const std::string& content_name); 394731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // For each transport info, create a transport proxy. Can fail for 395731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // incompatible transport types. 396731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool CreateTransportProxies(const TransportInfos& tinfos, 397731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SessionError* error); 398731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick void SpeculativelyConnectAllTransportChannels(); 3994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool OnRemoteCandidates(const TransportInfos& tinfos, 4004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ParseError* error); 401731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Returns a TransportInfo without candidates for each content name. 402731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Uses the transport_type_ of the session. 403731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TransportInfos GetEmptyTransportInfos(const ContentInfos& contents) const; 404f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 405f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Called when the first channel of a transport begins connecting. We use 406f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // this to start a timer, to make sure that the connection completes in a 407f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // reasonable amount of time. 408f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnTransportConnecting(Transport* transport); 409f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 410f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Called when a transport changes its writable state. We track this to make 411f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // sure that the transport becomes writable within a reasonable amount of 412f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // time. If this does not occur, we signal an error. 413f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnTransportWritable(Transport* transport); 414f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 415f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Called when a transport requests signaling. 416f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnTransportRequestSignaling(Transport* transport); 417f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 418f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Called when a transport signals that it has a message to send. Note that 419f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // these messages are just the transport part of the stanza; they need to be 420f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // wrapped in the appropriate session tags. 421f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnTransportCandidatesReady(Transport* transport, 422f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const Candidates& candidates); 423f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 424f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Called when a transport signals that it found an error in an incoming 425f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // message. 426f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnTransportSendError(Transport* transport, 427f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::XmlElement* stanza, 428f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::QName& name, 429f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string& type, 430f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string& text, 431f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::XmlElement* extra_info); 432f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 433f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Called when we notice that one of our local channels has no peer, so it 434f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // should be destroyed. 435f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnTransportChannelGone(Transport* transport, const std::string& name); 436f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 437f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // When the session needs to send signaling messages, it beings by requesting 438f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // signaling. The client should handle this by calling OnSignalingReady once 439f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // it is ready to send the messages. 440f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // (These are called only by SessionManager.) 441f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sigslot::signal1<Session*> SignalRequestSignaling; 442f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnSignalingReady(); 443f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 444f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Send various kinds of session messages. 445731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool SendInitiateMessage(const SessionDescription* sdesc, 446731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SessionError* error); 447731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool SendAcceptMessage(const SessionDescription* sdesc, SessionError* error); 448731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool SendRejectMessage(const std::string& reason, SessionError* error); 449731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool SendTerminateMessage(const std::string& reason, SessionError* error); 450731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool SendTransportInfoMessage(const TransportInfo& tinfo, 451731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SessionError* error); 452dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool SendViewMessage(const SessionView& view, SessionError* error); 4534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool ResendAllTransportInfoMessages(SessionError* error); 454731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 455731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Both versions of SendMessage send a message of the given type to 456731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // the other client. Can pass either a set of elements or an 457731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // "action", which must have a WriteSessionAction method to go along 458731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // with it. Sending with an action supports sending a "hybrid" 459731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // message. Sending with elements must be sent as Jingle or Gingle. 460731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 461731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // When passing elems, must be either Jingle or Gingle protocol. 462731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Takes ownership of action_elems. 463731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool SendMessage(ActionType type, const XmlElements& action_elems, 464731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SessionError* error); 465731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // When passing an action, may be Hybrid protocol. 466731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick template <typename Action> 467731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool SendMessage(ActionType type, const Action& action, 468731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SessionError* error); 469731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 470731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Helper methods to write the session message stanza. 471731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick template <typename Action> 472731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool WriteActionMessage(ActionType type, const Action& action, 473731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick buzz::XmlElement* stanza, WriteError* error); 474731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick template <typename Action> 475731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool WriteActionMessage(SignalingProtocol protocol, 476731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ActionType type, const Action& action, 477731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick buzz::XmlElement* stanza, WriteError* error); 478731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 479731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Sending messages in hybrid form requires being able to write them 480731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // on a per-protocol basis with a common method signature, which all 481731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // of these have. 482731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool WriteSessionAction(SignalingProtocol protocol, 483731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const SessionInitiate& init, 484731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick XmlElements* elems, WriteError* error); 485731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool WriteSessionAction(SignalingProtocol protocol, 486731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const TransportInfo& tinfo, 487731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick XmlElements* elems, WriteError* error); 488731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool WriteSessionAction(SignalingProtocol protocol, 489731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const SessionTerminate& term, 490731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick XmlElements* elems, WriteError* error); 491f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 492f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Sends a message back to the other client indicating that we have received 493f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // and accepted their message. 494f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void SendAcknowledgementMessage(const buzz::XmlElement* stanza); 495f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 496f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Once signaling is ready, the session will use this signal to request the 497f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // sending of each message. When messages are received by the other client, 498f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // they should be handed to OnIncomingMessage. 499f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // (These are called only by SessionManager.) 500f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sigslot::signal2<Session *, const buzz::XmlElement*> SignalOutgoingMessage; 501f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnIncomingMessage(const SessionMessage& msg); 502f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 503f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void OnFailedSend(const buzz::XmlElement* orig_stanza, 504f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::XmlElement* error_stanza); 505f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 506f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Invoked when an error is found in an incoming message. This is translated 507f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // into the appropriate XMPP response by SessionManager. 508f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch sigslot::signal6<BaseSession*, 509f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::XmlElement*, 510f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::QName&, 511f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string&, 512f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const std::string&, 513f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const buzz::XmlElement*> SignalErrorMessage; 514f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 515f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Handlers for the various types of messages. These functions may take 516f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // pointers to the whole stanza or to just the session element. 517731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool OnInitiateMessage(const SessionMessage& msg, MessageError* error); 518731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool OnAcceptMessage(const SessionMessage& msg, MessageError* error); 519731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool OnRejectMessage(const SessionMessage& msg, MessageError* error); 520f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool OnInfoMessage(const SessionMessage& msg); 521731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool OnTerminateMessage(const SessionMessage& msg, MessageError* error); 522731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool OnTransportInfoMessage(const SessionMessage& msg, MessageError* error); 523731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool OnTransportAcceptMessage(const SessionMessage& msg, MessageError* error); 524dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool OnNotifyMessage(const SessionMessage& msg, MessageError* error); 525dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool OnUpdateMessage(const SessionMessage& msg, MessageError* error); 5264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool OnRedirectError(const SessionRedirect& redirect, SessionError* error); 527f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 528f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // Verifies that we are in the appropriate state to receive this message. 529731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool CheckState(State state, MessageError* error); 530731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 531731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SessionManager *session_manager_; 532731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool initiator_; 533731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string initiator_name_; 534731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string content_type_; 535731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SessionClient* client_; 536731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string transport_type_; 537731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TransportParser* transport_parser_; 538731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // This is transport-specific but required so much by unit tests 539731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // that it's much easier to put it here. 540731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick bool allow_local_ips_; 541731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick TransportMap transports_; 542731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Keeps track of what protocol we are speaking. 543731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick SignalingProtocol current_protocol_; 544f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 545f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch friend class SessionManager; // For access to constructor, destructor, 546f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch // and signaling related methods. 547f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 548f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 549f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} // namespace cricket 550f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 551f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif // TALK_P2P_BASE_SESSION_H_ 552