Index: talk/app/webrtc/webrtcsession.h |
diff --git a/talk/app/webrtc/webrtcsession.h b/talk/app/webrtc/webrtcsession.h |
index 6e4a9e92b459385054206325e925dc87ae5b4641..7b5ed5617141765e2de9bc795fe10b2abf866bef 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,57 @@ 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 rtc::MessageHandler, |
+ public sigslot::has_slots<> { |
public: |
+ enum State { |
+ STATE_INIT = 0, |
+ STATE_SENTINITIATE, // sent initiate, waiting for Accept or Reject |
+ STATE_RECEIVEDINITIATE, // received an initiate. Call Accept or Reject |
+ STATE_SENTPRACCEPT, // sent provisional Accept |
+ STATE_SENTACCEPT, // sent accept. begin connecting transport |
+ STATE_RECEIVEDPRACCEPT, // received provisional Accept, waiting for Accept |
+ STATE_RECEIVEDACCEPT, // received accept. begin connecting transport |
+ STATE_SENTMODIFY, // sent modify, waiting for Accept or Reject |
+ STATE_RECEIVEDMODIFY, // received modify, call Accept or Reject |
+ STATE_SENTREJECT, // sent reject after receiving initiate |
+ STATE_RECEIVEDREJECT, // received reject after sending initiate |
+ STATE_SENTREDIRECT, // sent direct after receiving initiate |
+ STATE_SENTTERMINATE, // sent terminate (any time / either side) |
+ STATE_RECEIVEDTERMINATE, // received terminate (any time / either side) |
+ STATE_INPROGRESS, // session accepted and in progress |
+ STATE_DEINIT, // session is being destroyed |
pthatcher1
2015/10/09 03:28:57
Not all of these are used any more, and almost all
Taylor Brandstetter
2015/10/09 23:02:07
Done.
|
+ }; |
+ |
+ 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 +169,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 +186,20 @@ class WebRtcSession : public cricket::BaseSession, |
// to STATE_RECEIVEDTERMINATE. |
void Terminate(); |
+ // Returns true if we were the initial offerer. |
+ bool initiator() const { return initiator_; } |
pthatcher1
2015/10/09 03:28:57
Maybe call it offerer.
Taylor Brandstetter
2015/10/09 23:02:06
Since there can be multiple offer/answer pairs, I'
|
+ |
+ // 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. |
+ // Each time the an error occurs, we will fire this signal. |
+ Error error() const { return error_; } |
+ const std::string& error_desc() const { return error_desc_; } |
+ sigslot::signal2<WebRtcSession*, Error> SignalError; |
pthatcher1
2015/10/09 03:28:57
Is this still used? I think we can just remove it
Taylor Brandstetter
2015/10/09 23:02:07
Done.
|
+ |
void RegisterIceObserver(IceObserver* observer) { |
ice_observer_ = observer; |
} |
@@ -159,10 +224,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,20 +242,27 @@ 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(); |
+ return local_desc_ ? local_desc_->description() : nullptr; |
pthatcher1
2015/10/09 03:28:57
base_ doesn't make sense as a prefix any more. Bu
Taylor Brandstetter
2015/10/09 23:02:06
Actually, the only reason I even kept these around
|
} |
const cricket::SessionDescription* base_remote_description() const { |
- return BaseSession::remote_description(); |
+ return remote_desc_ ? remote_desc_->description() : nullptr; |
} |
// Get the id used as a media stream track's "id" field from ssrc. |
@@ -238,11 +306,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 +355,19 @@ class WebRtcSession : public cricket::BaseSession, |
kAnswer, |
}; |
+ // Handles messages posted to us. |
+ void OnMessage(rtc::Message* pmsg) override; |
+ |
+ // 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 +377,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. |
@@ -383,6 +484,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 initiator_ = 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_; |