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