Index: talk/app/webrtc/webrtcsession.h |
diff --git a/talk/app/webrtc/webrtcsession.h b/talk/app/webrtc/webrtcsession.h |
index 6e4a9e92b459385054206325e925dc87ae5b4641..da6a8b1be448cbb8c4fde4688558cc8433c60ce0 100644 |
--- a/talk/app/webrtc/webrtcsession.h |
+++ b/talk/app/webrtc/webrtcsession.h |
@@ -38,7 +38,7 @@ |
#include "talk/app/webrtc/peerconnectioninterface.h" |
#include "talk/app/webrtc/statstypes.h" |
#include "talk/media/base/mediachannel.h" |
-#include "webrtc/p2p/base/session.h" |
+#include "webrtc/p2p/base/transportcontroller.h" |
#include "talk/session/media/mediasession.h" |
#include "webrtc/base/sigslot.h" |
#include "webrtc/base/sslidentity.h" |
@@ -46,7 +46,6 @@ |
namespace cricket { |
-class BaseChannel; |
class ChannelManager; |
class DataChannel; |
class StatsReport; |
@@ -112,13 +111,47 @@ class IceObserver { |
RTC_DISALLOW_COPY_AND_ASSIGN(IceObserver); |
}; |
-class WebRtcSession : public cricket::BaseSession, |
- public AudioProviderInterface, |
+// Statistics for all the transports of the session. |
+typedef std::map<std::string, cricket::TransportStats> TransportStatsMap; |
+typedef std::map<std::string, std::string> ProxyTransportMap; |
+ |
+// TODO(pthatcher): Think of a better name for this. We already have |
+// a TransportStats in transport.h. Perhaps TransportsStats? |
+struct SessionStats { |
+ ProxyTransportMap proxy_to_transport; |
+ TransportStatsMap transport_stats; |
+}; |
+ |
+// A WebRtcSession manages general session state. This includes negotiation |
+// of both the application-level and network-level protocols: the former |
+// defines what will be sent and the latter defines how it will be sent. Each |
+// network-level protocol is represented by a Transport object. Each Transport |
+// participates in the network-level negotiation. The individual streams of |
+// packets are represented by TransportChannels. The application-level protocol |
+// is represented by SessionDecription objects. |
+class WebRtcSession : public AudioProviderInterface, |
public DataChannelFactory, |
public VideoProviderInterface, |
public DtmfProviderInterface, |
- public DataChannelProviderInterface { |
+ public DataChannelProviderInterface, |
+ public sigslot::has_slots<> { |
public: |
+ enum State { |
+ STATE_INIT = 0, |
+ STATE_SENTOFFER, // Sent offer, waiting for answer. |
+ STATE_RECEIVEDOFFER, // Received an offer. Need to send answer. |
+ STATE_SENTPRANSWER, // Sent provisional answer. Need to send answer. |
+ STATE_RECEIVEDPRANSWER, // Received provisional answer, waiting for answer. |
+ STATE_INPROGRESS, // Offer/answer exchange completed. |
+ STATE_TERMINATED, // Terminate() was called. |
+ }; |
+ |
+ enum Error { |
+ ERROR_NONE = 0, // no error |
+ ERROR_CONTENT = 1, // channel errors in SetLocalContent/SetRemoteContent |
+ ERROR_TRANSPORT = 2, // transport error of some kind |
+ }; |
+ |
WebRtcSession(cricket::ChannelManager* channel_manager, |
rtc::Thread* signaling_thread, |
rtc::Thread* worker_thread, |
@@ -126,6 +159,14 @@ class WebRtcSession : public cricket::BaseSession, |
MediaStreamSignaling* mediastream_signaling); |
virtual ~WebRtcSession(); |
+ // These are const to allow them to be called from const methods. |
+ rtc::Thread* signaling_thread() const { return signaling_thread_; } |
+ rtc::Thread* worker_thread() const { return worker_thread_; } |
+ cricket::PortAllocator* port_allocator() const { return port_allocator_; } |
+ |
+ // The ID of this session. |
+ const std::string& id() const { return sid_; } |
+ |
bool Initialize( |
const PeerConnectionFactoryInterface::Options& options, |
const MediaConstraintsInterface* constraints, |
@@ -135,6 +176,18 @@ class WebRtcSession : public cricket::BaseSession, |
// to STATE_RECEIVEDTERMINATE. |
void Terminate(); |
+ // Returns true if we were the initial offerer. |
+ bool initial_offerer() const { return initial_offerer_; } |
+ |
+ // Returns the current state of the session. See the enum above for details. |
+ // Each time the state changes, we will fire this signal. |
+ State state() const { return state_; } |
+ sigslot::signal2<WebRtcSession*, State> SignalState; |
+ |
+ // Returns the last error in the session. See the enum above for details. |
+ Error error() const { return error_; } |
+ const std::string& error_desc() const { return error_desc_; } |
+ |
void RegisterIceObserver(IceObserver* observer) { |
ice_observer_ = observer; |
} |
@@ -159,10 +212,6 @@ class WebRtcSession : public cricket::BaseSession, |
// Get current ssl role from transport. |
bool GetSslRole(rtc::SSLRole* role); |
- // Generic error message callback from WebRtcSession. |
- // TODO - It may be necessary to supply error code as well. |
- sigslot::signal0<> SignalError; |
- |
void CreateOffer( |
CreateSessionDescriptionObserver* observer, |
const PeerConnectionInterface::RTCOfferAnswerOptions& options); |
@@ -181,21 +230,18 @@ class WebRtcSession : public cricket::BaseSession, |
cricket::IceConfig ParseIceConfig( |
const PeerConnectionInterface::RTCConfiguration& config) const; |
+ void SetIceConfig(const cricket::IceConfig& ice_config); |
+ |
+ // Start gathering candidates for any new transports, or transports doing an |
+ // ICE restart. |
+ void MaybeStartGathering(); |
+ |
const SessionDescriptionInterface* local_description() const { |
return local_desc_.get(); |
} |
const SessionDescriptionInterface* remote_description() const { |
return remote_desc_.get(); |
} |
- // TODO(pthatcher): Cleanup the distinction between |
- // SessionDescription and SessionDescriptionInterface and remove |
- // these if possible. |
- const cricket::SessionDescription* base_local_description() const { |
- return BaseSession::local_description(); |
- } |
- const cricket::SessionDescription* base_remote_description() const { |
- return BaseSession::remote_description(); |
- } |
// Get the id used as a media stream track's "id" field from ssrc. |
virtual bool GetLocalTrackIdBySsrc(uint32_t ssrc, std::string* track_id); |
@@ -238,11 +284,10 @@ class WebRtcSession : public cricket::BaseSession, |
// Returns stats for all channels of all transports. |
// This avoids exposing the internal structures used to track them. |
- virtual bool GetTransportStats(cricket::SessionStats* stats); |
+ virtual bool GetTransportStats(SessionStats* stats); |
// Get stats for a specific channel |
- bool GetChannelTransportStats(cricket::BaseChannel* ch, |
- cricket::SessionStats* stats); |
+ bool GetChannelTransportStats(cricket::BaseChannel* ch, SessionStats* stats); |
// virtual so it can be mocked in unit tests |
virtual bool GetLocalCertificate( |
@@ -288,6 +333,16 @@ class WebRtcSession : public cricket::BaseSession, |
kAnswer, |
}; |
+ // Log session state. |
+ void LogState(State old_state, State new_state); |
+ |
+ // Updates the state, signaling if necessary. |
+ virtual void SetState(State state); |
+ |
+ // Updates the error state, signaling if necessary. |
+ // TODO(ronghuawu): remove the SetError method that doesn't take |error_desc|. |
+ virtual void SetError(Error error, const std::string& error_desc); |
+ |
bool UpdateSessionState(Action action, cricket::ContentSource source, |
std::string* err_desc); |
static Action GetAction(const std::string& type); |
@@ -297,6 +352,27 @@ class WebRtcSession : public cricket::BaseSession, |
cricket::ContentSource source, |
std::string* error_desc); |
+ bool PushdownTransportDescription(cricket::ContentSource source, |
+ cricket::ContentAction action, |
+ std::string* error_desc); |
+ |
+ // Helper methods to push local and remote transport descriptions. |
+ bool PushdownLocalTransportDescription( |
+ const cricket::SessionDescription* sdesc, |
+ cricket::ContentAction action, |
+ std::string* error_desc); |
+ bool PushdownRemoteTransportDescription( |
+ const cricket::SessionDescription* sdesc, |
+ cricket::ContentAction action, |
+ std::string* error_desc); |
+ |
+ // Returns true and the TransportInfo of the given |content_name| |
+ // from |description|. Returns false if it's not available. |
+ static bool GetTransportDescription( |
+ const cricket::SessionDescription* description, |
+ const std::string& content_name, |
+ cricket::TransportDescription* info); |
+ |
cricket::BaseChannel* GetChannel(const std::string& content_name); |
// Cause all the BaseChannels in the bundle group to have the same |
// transport channel. |
@@ -328,10 +404,6 @@ class WebRtcSession : public cricket::BaseSession, |
bool CreateVideoChannel(const cricket::ContentInfo* content); |
bool CreateDataChannel(const cricket::ContentInfo* content); |
- // Copy the candidates from |saved_candidates_| to |dest_desc|. |
- // The |saved_candidates_| will be cleared after this function call. |
- void CopySavedCandidates(SessionDescriptionInterface* dest_desc); |
- |
// Listens to SCTP CONTROL messages on unused SIDs and process them as OPEN |
// messages. |
void OnDataChannelMessageReceived(cricket::DataChannel* channel, |
@@ -383,6 +455,18 @@ class WebRtcSession : public cricket::BaseSession, |
void ReportNegotiatedCiphers(const cricket::TransportStats& stats); |
+ rtc::Thread* const signaling_thread_; |
+ rtc::Thread* const worker_thread_; |
+ cricket::PortAllocator* const port_allocator_; |
+ |
+ State state_ = STATE_INIT; |
+ Error error_ = ERROR_NONE; |
+ std::string error_desc_; |
+ |
+ const std::string sid_; |
+ bool initial_offerer_ = false; |
+ |
+ rtc::scoped_ptr<cricket::TransportController> transport_controller_; |
rtc::scoped_ptr<MediaControllerInterface> media_controller_; |
rtc::scoped_ptr<cricket::VoiceChannel> voice_channel_; |
rtc::scoped_ptr<cricket::VideoChannel> video_channel_; |
@@ -394,8 +478,6 @@ class WebRtcSession : public cricket::BaseSession, |
bool ice_connection_receiving_; |
rtc::scoped_ptr<SessionDescriptionInterface> local_desc_; |
rtc::scoped_ptr<SessionDescriptionInterface> remote_desc_; |
- // Candidates that arrived before the remote description was set. |
- std::vector<IceCandidateInterface*> saved_candidates_; |
// If the remote peer is using a older version of implementation. |
bool older_version_remote_peer_; |
bool dtls_enabled_; |