| OLD | NEW | 
|---|
|  | (Empty) | 
| 1 /* |  | 
| 2  *  Copyright 2012 The WebRTC project authors. All Rights Reserved. |  | 
| 3  * |  | 
| 4  *  Use of this source code is governed by a BSD-style license |  | 
| 5  *  that can be found in the LICENSE file in the root of the source |  | 
| 6  *  tree. An additional intellectual property rights grant can be found |  | 
| 7  *  in the file PATENTS.  All contributing project authors may |  | 
| 8  *  be found in the AUTHORS file in the root of the source tree. |  | 
| 9  */ |  | 
| 10 |  | 
| 11 #ifndef WEBRTC_API_WEBRTCSESSION_H_ |  | 
| 12 #define WEBRTC_API_WEBRTCSESSION_H_ |  | 
| 13 |  | 
| 14 #include <memory> |  | 
| 15 #include <set> |  | 
| 16 #include <string> |  | 
| 17 #include <vector> |  | 
| 18 |  | 
| 19 #include "webrtc/api/datachannel.h" |  | 
| 20 #include "webrtc/api/dtmfsender.h" |  | 
| 21 #include "webrtc/api/mediacontroller.h" |  | 
| 22 #include "webrtc/api/peerconnectioninterface.h" |  | 
| 23 #include "webrtc/api/statstypes.h" |  | 
| 24 #include "webrtc/base/constructormagic.h" |  | 
| 25 #include "webrtc/base/sigslot.h" |  | 
| 26 #include "webrtc/base/sslidentity.h" |  | 
| 27 #include "webrtc/base/thread.h" |  | 
| 28 #include "webrtc/media/base/mediachannel.h" |  | 
| 29 #include "webrtc/p2p/base/candidate.h" |  | 
| 30 #include "webrtc/p2p/base/transportcontroller.h" |  | 
| 31 #include "webrtc/pc/mediasession.h" |  | 
| 32 |  | 
| 33 #ifdef HAVE_QUIC |  | 
| 34 #include "webrtc/api/quicdatatransport.h" |  | 
| 35 #endif  // HAVE_QUIC |  | 
| 36 |  | 
| 37 namespace cricket { |  | 
| 38 |  | 
| 39 class ChannelManager; |  | 
| 40 class DataChannel; |  | 
| 41 class StatsReport; |  | 
| 42 class VideoChannel; |  | 
| 43 class VoiceChannel; |  | 
| 44 |  | 
| 45 #ifdef HAVE_QUIC |  | 
| 46 class QuicTransportChannel; |  | 
| 47 #endif  // HAVE_QUIC |  | 
| 48 |  | 
| 49 }  // namespace cricket |  | 
| 50 |  | 
| 51 namespace webrtc { |  | 
| 52 |  | 
| 53 class IceRestartAnswerLatch; |  | 
| 54 class JsepIceCandidate; |  | 
| 55 class MediaStreamSignaling; |  | 
| 56 class WebRtcSessionDescriptionFactory; |  | 
| 57 |  | 
| 58 extern const char kBundleWithoutRtcpMux[]; |  | 
| 59 extern const char kCreateChannelFailed[]; |  | 
| 60 extern const char kInvalidCandidates[]; |  | 
| 61 extern const char kInvalidSdp[]; |  | 
| 62 extern const char kMlineMismatch[]; |  | 
| 63 extern const char kPushDownTDFailed[]; |  | 
| 64 extern const char kSdpWithoutDtlsFingerprint[]; |  | 
| 65 extern const char kSdpWithoutSdesCrypto[]; |  | 
| 66 extern const char kSdpWithoutIceUfragPwd[]; |  | 
| 67 extern const char kSdpWithoutSdesAndDtlsDisabled[]; |  | 
| 68 extern const char kSessionError[]; |  | 
| 69 extern const char kSessionErrorDesc[]; |  | 
| 70 extern const char kDtlsSetupFailureRtp[]; |  | 
| 71 extern const char kDtlsSetupFailureRtcp[]; |  | 
| 72 extern const char kEnableBundleFailed[]; |  | 
| 73 |  | 
| 74 // Maximum number of received video streams that will be processed by webrtc |  | 
| 75 // even if they are not signalled beforehand. |  | 
| 76 extern const int kMaxUnsignalledRecvStreams; |  | 
| 77 |  | 
| 78 // ICE state callback interface. |  | 
| 79 class IceObserver { |  | 
| 80  public: |  | 
| 81   IceObserver() {} |  | 
| 82   // Called any time the IceConnectionState changes |  | 
| 83   // TODO(honghaiz): Change the name to OnIceConnectionStateChange so as to |  | 
| 84   // conform to the w3c standard. |  | 
| 85   virtual void OnIceConnectionChange( |  | 
| 86       PeerConnectionInterface::IceConnectionState new_state) {} |  | 
| 87   // Called any time the IceGatheringState changes |  | 
| 88   virtual void OnIceGatheringChange( |  | 
| 89       PeerConnectionInterface::IceGatheringState new_state) {} |  | 
| 90   // New Ice candidate have been found. |  | 
| 91   virtual void OnIceCandidate(const IceCandidateInterface* candidate) = 0; |  | 
| 92 |  | 
| 93   // Some local ICE candidates have been removed. |  | 
| 94   virtual void OnIceCandidatesRemoved( |  | 
| 95       const std::vector<cricket::Candidate>& candidates) = 0; |  | 
| 96 |  | 
| 97   // Called whenever the state changes between receiving and not receiving. |  | 
| 98   virtual void OnIceConnectionReceivingChange(bool receiving) {} |  | 
| 99 |  | 
| 100  protected: |  | 
| 101   ~IceObserver() {} |  | 
| 102 |  | 
| 103  private: |  | 
| 104   RTC_DISALLOW_COPY_AND_ASSIGN(IceObserver); |  | 
| 105 }; |  | 
| 106 |  | 
| 107 // Statistics for all the transports of the session. |  | 
| 108 typedef std::map<std::string, cricket::TransportStats> TransportStatsMap; |  | 
| 109 typedef std::map<std::string, std::string> ProxyTransportMap; |  | 
| 110 |  | 
| 111 // TODO(pthatcher): Think of a better name for this.  We already have |  | 
| 112 // a TransportStats in transport.h.  Perhaps TransportsStats? |  | 
| 113 struct SessionStats { |  | 
| 114   ProxyTransportMap proxy_to_transport; |  | 
| 115   TransportStatsMap transport_stats; |  | 
| 116 }; |  | 
| 117 |  | 
| 118 // A WebRtcSession manages general session state. This includes negotiation |  | 
| 119 // of both the application-level and network-level protocols:  the former |  | 
| 120 // defines what will be sent and the latter defines how it will be sent.  Each |  | 
| 121 // network-level protocol is represented by a Transport object.  Each Transport |  | 
| 122 // participates in the network-level negotiation.  The individual streams of |  | 
| 123 // packets are represented by TransportChannels.  The application-level protocol |  | 
| 124 // is represented by SessionDecription objects. |  | 
| 125 class WebRtcSession : |  | 
| 126 |  | 
| 127     public DtmfProviderInterface, |  | 
| 128     public DataChannelProviderInterface, |  | 
| 129     public sigslot::has_slots<> { |  | 
| 130  public: |  | 
| 131   enum State { |  | 
| 132     STATE_INIT = 0, |  | 
| 133     STATE_SENTOFFER,         // Sent offer, waiting for answer. |  | 
| 134     STATE_RECEIVEDOFFER,     // Received an offer. Need to send answer. |  | 
| 135     STATE_SENTPRANSWER,      // Sent provisional answer. Need to send answer. |  | 
| 136     STATE_RECEIVEDPRANSWER,  // Received provisional answer, waiting for answer. |  | 
| 137     STATE_INPROGRESS,        // Offer/answer exchange completed. |  | 
| 138     STATE_CLOSED,            // Close() was called. |  | 
| 139   }; |  | 
| 140 |  | 
| 141   enum Error { |  | 
| 142     ERROR_NONE = 0,       // no error |  | 
| 143     ERROR_CONTENT = 1,    // channel errors in SetLocalContent/SetRemoteContent |  | 
| 144     ERROR_TRANSPORT = 2,  // transport error of some kind |  | 
| 145   }; |  | 
| 146 |  | 
| 147   WebRtcSession( |  | 
| 148       webrtc::MediaControllerInterface* media_controller, |  | 
| 149       rtc::Thread* network_thread, |  | 
| 150       rtc::Thread* worker_thread, |  | 
| 151       rtc::Thread* signaling_thread, |  | 
| 152       cricket::PortAllocator* port_allocator, |  | 
| 153       std::unique_ptr<cricket::TransportController> transport_controller); |  | 
| 154   virtual ~WebRtcSession(); |  | 
| 155 |  | 
| 156   // These are const to allow them to be called from const methods. |  | 
| 157   rtc::Thread* network_thread() const { return network_thread_; } |  | 
| 158   rtc::Thread* worker_thread() const { return worker_thread_; } |  | 
| 159   rtc::Thread* signaling_thread() const { return signaling_thread_; } |  | 
| 160 |  | 
| 161   // The ID of this session. |  | 
| 162   const std::string& id() const { return sid_; } |  | 
| 163 |  | 
| 164   bool Initialize( |  | 
| 165       const PeerConnectionFactoryInterface::Options& options, |  | 
| 166       std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator, |  | 
| 167       const PeerConnectionInterface::RTCConfiguration& rtc_configuration); |  | 
| 168   // Deletes the voice, video and data channel and changes the session state |  | 
| 169   // to STATE_CLOSED. |  | 
| 170   void Close(); |  | 
| 171 |  | 
| 172   // Returns true if we were the initial offerer. |  | 
| 173   bool initial_offerer() const { return initial_offerer_; } |  | 
| 174 |  | 
| 175   // Returns the current state of the session. See the enum above for details. |  | 
| 176   // Each time the state changes, we will fire this signal. |  | 
| 177   State state() const { return state_; } |  | 
| 178   sigslot::signal2<WebRtcSession*, State> SignalState; |  | 
| 179 |  | 
| 180   // Returns the last error in the session. See the enum above for details. |  | 
| 181   Error error() const { return error_; } |  | 
| 182   const std::string& error_desc() const { return error_desc_; } |  | 
| 183 |  | 
| 184   void RegisterIceObserver(IceObserver* observer) { |  | 
| 185     ice_observer_ = observer; |  | 
| 186   } |  | 
| 187 |  | 
| 188   virtual cricket::VoiceChannel* voice_channel() { |  | 
| 189     return voice_channel_.get(); |  | 
| 190   } |  | 
| 191   virtual cricket::VideoChannel* video_channel() { |  | 
| 192     return video_channel_.get(); |  | 
| 193   } |  | 
| 194   virtual cricket::DataChannel* data_channel() { |  | 
| 195     return data_channel_.get(); |  | 
| 196   } |  | 
| 197 |  | 
| 198   cricket::BaseChannel* GetChannel(const std::string& content_name); |  | 
| 199 |  | 
| 200   cricket::SecurePolicy SdesPolicy() const; |  | 
| 201 |  | 
| 202   // Get current ssl role from transport. |  | 
| 203   bool GetSslRole(const std::string& transport_name, rtc::SSLRole* role); |  | 
| 204 |  | 
| 205   // Get current SSL role for this channel's transport. |  | 
| 206   // If |transport| is null, returns false. |  | 
| 207   bool GetSslRole(const cricket::BaseChannel* channel, rtc::SSLRole* role); |  | 
| 208 |  | 
| 209   void CreateOffer( |  | 
| 210       CreateSessionDescriptionObserver* observer, |  | 
| 211       const PeerConnectionInterface::RTCOfferAnswerOptions& options, |  | 
| 212       const cricket::MediaSessionOptions& session_options); |  | 
| 213   void CreateAnswer(CreateSessionDescriptionObserver* observer, |  | 
| 214                     const cricket::MediaSessionOptions& session_options); |  | 
| 215   // The ownership of |desc| will be transferred after this call. |  | 
| 216   bool SetLocalDescription(SessionDescriptionInterface* desc, |  | 
| 217                            std::string* err_desc); |  | 
| 218   // The ownership of |desc| will be transferred after this call. |  | 
| 219   bool SetRemoteDescription(SessionDescriptionInterface* desc, |  | 
| 220                             std::string* err_desc); |  | 
| 221   bool ProcessIceMessage(const IceCandidateInterface* ice_candidate); |  | 
| 222 |  | 
| 223   bool RemoveRemoteIceCandidates( |  | 
| 224       const std::vector<cricket::Candidate>& candidates); |  | 
| 225 |  | 
| 226   cricket::IceConfig ParseIceConfig( |  | 
| 227       const PeerConnectionInterface::RTCConfiguration& config) const; |  | 
| 228 |  | 
| 229   void SetIceConfig(const cricket::IceConfig& ice_config); |  | 
| 230 |  | 
| 231   // Start gathering candidates for any new transports, or transports doing an |  | 
| 232   // ICE restart. |  | 
| 233   void MaybeStartGathering(); |  | 
| 234 |  | 
| 235   const SessionDescriptionInterface* local_description() const { |  | 
| 236     return local_desc_.get(); |  | 
| 237   } |  | 
| 238   const SessionDescriptionInterface* remote_description() const { |  | 
| 239     return remote_desc_.get(); |  | 
| 240   } |  | 
| 241 |  | 
| 242   // Get the id used as a media stream track's "id" field from ssrc. |  | 
| 243   virtual bool GetLocalTrackIdBySsrc(uint32_t ssrc, std::string* track_id); |  | 
| 244   virtual bool GetRemoteTrackIdBySsrc(uint32_t ssrc, std::string* track_id); |  | 
| 245 |  | 
| 246   // Implements DtmfProviderInterface. |  | 
| 247   bool CanInsertDtmf(const std::string& track_id) override; |  | 
| 248   bool InsertDtmf(const std::string& track_id, |  | 
| 249                   int code, int duration) override; |  | 
| 250   sigslot::signal0<>* GetOnDestroyedSignal() override; |  | 
| 251 |  | 
| 252   // Implements DataChannelProviderInterface. |  | 
| 253   bool SendData(const cricket::SendDataParams& params, |  | 
| 254                 const rtc::CopyOnWriteBuffer& payload, |  | 
| 255                 cricket::SendDataResult* result) override; |  | 
| 256   bool ConnectDataChannel(DataChannel* webrtc_data_channel) override; |  | 
| 257   void DisconnectDataChannel(DataChannel* webrtc_data_channel) override; |  | 
| 258   void AddSctpDataStream(int sid) override; |  | 
| 259   void RemoveSctpDataStream(int sid) override; |  | 
| 260   bool ReadyToSendData() const override; |  | 
| 261 |  | 
| 262   // Returns stats for all channels of all transports. |  | 
| 263   // This avoids exposing the internal structures used to track them. |  | 
| 264   virtual bool GetTransportStats(SessionStats* stats); |  | 
| 265 |  | 
| 266   // Get stats for a specific channel |  | 
| 267   bool GetChannelTransportStats(cricket::BaseChannel* ch, SessionStats* stats); |  | 
| 268 |  | 
| 269   // virtual so it can be mocked in unit tests |  | 
| 270   virtual bool GetLocalCertificate( |  | 
| 271       const std::string& transport_name, |  | 
| 272       rtc::scoped_refptr<rtc::RTCCertificate>* certificate); |  | 
| 273 |  | 
| 274   // Caller owns returned certificate |  | 
| 275   virtual std::unique_ptr<rtc::SSLCertificate> GetRemoteSSLCertificate( |  | 
| 276       const std::string& transport_name); |  | 
| 277 |  | 
| 278   cricket::DataChannelType data_channel_type() const; |  | 
| 279 |  | 
| 280   // Returns true if there was an ICE restart initiated by the remote offer. |  | 
| 281   bool IceRestartPending(const std::string& content_name) const; |  | 
| 282 |  | 
| 283   // Set the "needs-ice-restart" flag as described in JSEP. After the flag is |  | 
| 284   // set, offers should generate new ufrags/passwords until an ICE restart |  | 
| 285   // occurs. |  | 
| 286   void SetNeedsIceRestartFlag(); |  | 
| 287   // Returns true if the ICE restart flag above was set, and no ICE restart has |  | 
| 288   // occurred yet for this transport (by applying a local description with |  | 
| 289   // changed ufrag/password). If the transport has been deleted as a result of |  | 
| 290   // bundling, returns false. |  | 
| 291   bool NeedsIceRestart(const std::string& content_name) const; |  | 
| 292 |  | 
| 293   // Called when an RTCCertificate is generated or retrieved by |  | 
| 294   // WebRTCSessionDescriptionFactory. Should happen before setLocalDescription. |  | 
| 295   void OnCertificateReady( |  | 
| 296       const rtc::scoped_refptr<rtc::RTCCertificate>& certificate); |  | 
| 297   void OnDtlsSetupFailure(cricket::BaseChannel*, bool rtcp); |  | 
| 298 |  | 
| 299   // For unit test. |  | 
| 300   bool waiting_for_certificate_for_testing() const; |  | 
| 301   const rtc::scoped_refptr<rtc::RTCCertificate>& certificate_for_testing(); |  | 
| 302 |  | 
| 303   void set_metrics_observer( |  | 
| 304       webrtc::MetricsObserverInterface* metrics_observer) { |  | 
| 305     metrics_observer_ = metrics_observer; |  | 
| 306     transport_controller_->SetMetricsObserver(metrics_observer); |  | 
| 307   } |  | 
| 308 |  | 
| 309   // Called when voice_channel_, video_channel_ and data_channel_ are created |  | 
| 310   // and destroyed. As a result of, for example, setting a new description. |  | 
| 311   sigslot::signal0<> SignalVoiceChannelCreated; |  | 
| 312   sigslot::signal0<> SignalVoiceChannelDestroyed; |  | 
| 313   sigslot::signal0<> SignalVideoChannelCreated; |  | 
| 314   sigslot::signal0<> SignalVideoChannelDestroyed; |  | 
| 315   sigslot::signal0<> SignalDataChannelCreated; |  | 
| 316   sigslot::signal0<> SignalDataChannelDestroyed; |  | 
| 317   // Called when the whole session is destroyed. |  | 
| 318   sigslot::signal0<> SignalDestroyed; |  | 
| 319 |  | 
| 320   // Called when a valid data channel OPEN message is received. |  | 
| 321   // std::string represents the data channel label. |  | 
| 322   sigslot::signal2<const std::string&, const InternalDataChannelInit&> |  | 
| 323       SignalDataChannelOpenMessage; |  | 
| 324 #ifdef HAVE_QUIC |  | 
| 325   QuicDataTransport* quic_data_transport() { |  | 
| 326     return quic_data_transport_.get(); |  | 
| 327   } |  | 
| 328 #endif  // HAVE_QUIC |  | 
| 329 |  | 
| 330  private: |  | 
| 331   // Indicates the type of SessionDescription in a call to SetLocalDescription |  | 
| 332   // and SetRemoteDescription. |  | 
| 333   enum Action { |  | 
| 334     kOffer, |  | 
| 335     kPrAnswer, |  | 
| 336     kAnswer, |  | 
| 337   }; |  | 
| 338 |  | 
| 339   // Log session state. |  | 
| 340   void LogState(State old_state, State new_state); |  | 
| 341 |  | 
| 342   // Updates the state, signaling if necessary. |  | 
| 343   virtual void SetState(State state); |  | 
| 344 |  | 
| 345   // Updates the error state, signaling if necessary. |  | 
| 346   // TODO(ronghuawu): remove the SetError method that doesn't take |error_desc|. |  | 
| 347   virtual void SetError(Error error, const std::string& error_desc); |  | 
| 348 |  | 
| 349   bool UpdateSessionState(Action action, cricket::ContentSource source, |  | 
| 350                           std::string* err_desc); |  | 
| 351   static Action GetAction(const std::string& type); |  | 
| 352   // Push the media parts of the local or remote session description |  | 
| 353   // down to all of the channels. |  | 
| 354   bool PushdownMediaDescription(cricket::ContentAction action, |  | 
| 355                                 cricket::ContentSource source, |  | 
| 356                                 std::string* error_desc); |  | 
| 357 |  | 
| 358   bool PushdownTransportDescription(cricket::ContentSource source, |  | 
| 359                                     cricket::ContentAction action, |  | 
| 360                                     std::string* error_desc); |  | 
| 361 |  | 
| 362   // Helper methods to push local and remote transport descriptions. |  | 
| 363   bool PushdownLocalTransportDescription( |  | 
| 364       const cricket::SessionDescription* sdesc, |  | 
| 365       cricket::ContentAction action, |  | 
| 366       std::string* error_desc); |  | 
| 367   bool PushdownRemoteTransportDescription( |  | 
| 368       const cricket::SessionDescription* sdesc, |  | 
| 369       cricket::ContentAction action, |  | 
| 370       std::string* error_desc); |  | 
| 371 |  | 
| 372   // Returns true and the TransportInfo of the given |content_name| |  | 
| 373   // from |description|. Returns false if it's not available. |  | 
| 374   static bool GetTransportDescription( |  | 
| 375       const cricket::SessionDescription* description, |  | 
| 376       const std::string& content_name, |  | 
| 377       cricket::TransportDescription* info); |  | 
| 378 |  | 
| 379   // Returns the name of the transport channel when BUNDLE is enabled, or |  | 
| 380   // nullptr if the channel is not part of any bundle. |  | 
| 381   const std::string* GetBundleTransportName( |  | 
| 382       const cricket::ContentInfo* content, |  | 
| 383       const cricket::ContentGroup* bundle); |  | 
| 384 |  | 
| 385   // Cause all the BaseChannels in the bundle group to have the same |  | 
| 386   // transport channel. |  | 
| 387   bool EnableBundle(const cricket::ContentGroup& bundle); |  | 
| 388 |  | 
| 389   // Enables media channels to allow sending of media. |  | 
| 390   void EnableChannels(); |  | 
| 391   // Returns the media index for a local ice candidate given the content name. |  | 
| 392   // Returns false if the local session description does not have a media |  | 
| 393   // content called  |content_name|. |  | 
| 394   bool GetLocalCandidateMediaIndex(const std::string& content_name, |  | 
| 395                                    int* sdp_mline_index); |  | 
| 396   // Uses all remote candidates in |remote_desc| in this session. |  | 
| 397   bool UseCandidatesInSessionDescription( |  | 
| 398       const SessionDescriptionInterface* remote_desc); |  | 
| 399   // Uses |candidate| in this session. |  | 
| 400   bool UseCandidate(const IceCandidateInterface* candidate); |  | 
| 401   // Deletes the corresponding channel of contents that don't exist in |desc|. |  | 
| 402   // |desc| can be null. This means that all channels are deleted. |  | 
| 403   void RemoveUnusedChannels(const cricket::SessionDescription* desc); |  | 
| 404 |  | 
| 405   // Allocates media channels based on the |desc|. If |desc| doesn't have |  | 
| 406   // the BUNDLE option, this method will disable BUNDLE in PortAllocator. |  | 
| 407   // This method will also delete any existing media channels before creating. |  | 
| 408   bool CreateChannels(const cricket::SessionDescription* desc); |  | 
| 409 |  | 
| 410   // Helper methods to create media channels. |  | 
| 411   bool CreateVoiceChannel(const cricket::ContentInfo* content, |  | 
| 412                           const std::string* bundle_transport); |  | 
| 413   bool CreateVideoChannel(const cricket::ContentInfo* content, |  | 
| 414                           const std::string* bundle_transport); |  | 
| 415   bool CreateDataChannel(const cricket::ContentInfo* content, |  | 
| 416                          const std::string* bundle_transport); |  | 
| 417 |  | 
| 418   // Listens to SCTP CONTROL messages on unused SIDs and process them as OPEN |  | 
| 419   // messages. |  | 
| 420   void OnDataChannelMessageReceived(cricket::DataChannel* channel, |  | 
| 421                                     const cricket::ReceiveDataParams& params, |  | 
| 422                                     const rtc::CopyOnWriteBuffer& payload); |  | 
| 423 |  | 
| 424   std::string BadStateErrMsg(State state); |  | 
| 425   void SetIceConnectionState(PeerConnectionInterface::IceConnectionState state); |  | 
| 426   void SetIceConnectionReceiving(bool receiving); |  | 
| 427 |  | 
| 428   bool ValidateBundleSettings(const cricket::SessionDescription* desc); |  | 
| 429   bool HasRtcpMuxEnabled(const cricket::ContentInfo* content); |  | 
| 430   // Below methods are helper methods which verifies SDP. |  | 
| 431   bool ValidateSessionDescription(const SessionDescriptionInterface* sdesc, |  | 
| 432                                   cricket::ContentSource source, |  | 
| 433                                   std::string* err_desc); |  | 
| 434 |  | 
| 435   // Check if a call to SetLocalDescription is acceptable with |action|. |  | 
| 436   bool ExpectSetLocalDescription(Action action); |  | 
| 437   // Check if a call to SetRemoteDescription is acceptable with |action|. |  | 
| 438   bool ExpectSetRemoteDescription(Action action); |  | 
| 439   // Verifies a=setup attribute as per RFC 5763. |  | 
| 440   bool ValidateDtlsSetupAttribute(const cricket::SessionDescription* desc, |  | 
| 441                                   Action action); |  | 
| 442 |  | 
| 443   // Returns true if we are ready to push down the remote candidate. |  | 
| 444   // |remote_desc| is the new remote description, or NULL if the current remote |  | 
| 445   // description should be used. Output |valid| is true if the candidate media |  | 
| 446   // index is valid. |  | 
| 447   bool ReadyToUseRemoteCandidate(const IceCandidateInterface* candidate, |  | 
| 448                                  const SessionDescriptionInterface* remote_desc, |  | 
| 449                                  bool* valid); |  | 
| 450 |  | 
| 451   // Returns true if SRTP (either using DTLS-SRTP or SDES) is required by |  | 
| 452   // this session. |  | 
| 453   bool SrtpRequired() const; |  | 
| 454 |  | 
| 455   void OnTransportControllerConnectionState(cricket::IceConnectionState state); |  | 
| 456   void OnTransportControllerReceiving(bool receiving); |  | 
| 457   void OnTransportControllerGatheringState(cricket::IceGatheringState state); |  | 
| 458   void OnTransportControllerCandidatesGathered( |  | 
| 459       const std::string& transport_name, |  | 
| 460       const std::vector<cricket::Candidate>& candidates); |  | 
| 461   void OnTransportControllerCandidatesRemoved( |  | 
| 462       const std::vector<cricket::Candidate>& candidates); |  | 
| 463 |  | 
| 464   std::string GetSessionErrorMsg(); |  | 
| 465 |  | 
| 466   // Invoked when TransportController connection completion is signaled. |  | 
| 467   // Reports stats for all transports in use. |  | 
| 468   void ReportTransportStats(); |  | 
| 469 |  | 
| 470   // Gather the usage of IPv4/IPv6 as best connection. |  | 
| 471   void ReportBestConnectionState(const cricket::TransportStats& stats); |  | 
| 472 |  | 
| 473   void ReportNegotiatedCiphers(const cricket::TransportStats& stats); |  | 
| 474 |  | 
| 475   void OnSentPacket_w(const rtc::SentPacket& sent_packet); |  | 
| 476 |  | 
| 477   const std::string GetTransportName(const std::string& content_name); |  | 
| 478 |  | 
| 479   void OnDtlsHandshakeError(rtc::SSLHandshakeError error); |  | 
| 480 |  | 
| 481   rtc::Thread* const network_thread_; |  | 
| 482   rtc::Thread* const worker_thread_; |  | 
| 483   rtc::Thread* const signaling_thread_; |  | 
| 484 |  | 
| 485   State state_ = STATE_INIT; |  | 
| 486   Error error_ = ERROR_NONE; |  | 
| 487   std::string error_desc_; |  | 
| 488 |  | 
| 489   const std::string sid_; |  | 
| 490   bool initial_offerer_ = false; |  | 
| 491 |  | 
| 492   std::unique_ptr<cricket::TransportController> transport_controller_; |  | 
| 493   MediaControllerInterface* media_controller_; |  | 
| 494   std::unique_ptr<cricket::VoiceChannel> voice_channel_; |  | 
| 495   std::unique_ptr<cricket::VideoChannel> video_channel_; |  | 
| 496   std::unique_ptr<cricket::DataChannel> data_channel_; |  | 
| 497   cricket::ChannelManager* channel_manager_; |  | 
| 498   IceObserver* ice_observer_; |  | 
| 499   PeerConnectionInterface::IceConnectionState ice_connection_state_; |  | 
| 500   bool ice_connection_receiving_; |  | 
| 501   std::unique_ptr<SessionDescriptionInterface> local_desc_; |  | 
| 502   std::unique_ptr<SessionDescriptionInterface> remote_desc_; |  | 
| 503   // If the remote peer is using a older version of implementation. |  | 
| 504   bool older_version_remote_peer_; |  | 
| 505   bool dtls_enabled_; |  | 
| 506   // Specifies which kind of data channel is allowed. This is controlled |  | 
| 507   // by the chrome command-line flag and constraints: |  | 
| 508   // 1. If chrome command-line switch 'enable-sctp-data-channels' is enabled, |  | 
| 509   // constraint kEnableDtlsSrtp is true, and constaint kEnableRtpDataChannels is |  | 
| 510   // not set or false, SCTP is allowed (DCT_SCTP); |  | 
| 511   // 2. If constraint kEnableRtpDataChannels is true, RTP is allowed (DCT_RTP); |  | 
| 512   // 3. If both 1&2 are false, data channel is not allowed (DCT_NONE). |  | 
| 513   // The data channel type could be DCT_QUIC if the QUIC data channel is |  | 
| 514   // enabled. |  | 
| 515   cricket::DataChannelType data_channel_type_; |  | 
| 516   // List of content names for which the remote side triggered an ICE restart. |  | 
| 517   std::set<std::string> pending_ice_restarts_; |  | 
| 518 |  | 
| 519   std::unique_ptr<WebRtcSessionDescriptionFactory> webrtc_session_desc_factory_; |  | 
| 520 |  | 
| 521   // Member variables for caching global options. |  | 
| 522   cricket::AudioOptions audio_options_; |  | 
| 523   cricket::VideoOptions video_options_; |  | 
| 524   MetricsObserverInterface* metrics_observer_; |  | 
| 525 |  | 
| 526   // Declares the bundle policy for the WebRTCSession. |  | 
| 527   PeerConnectionInterface::BundlePolicy bundle_policy_; |  | 
| 528 |  | 
| 529   // Declares the RTCP mux policy for the WebRTCSession. |  | 
| 530   PeerConnectionInterface::RtcpMuxPolicy rtcp_mux_policy_; |  | 
| 531 |  | 
| 532   bool received_first_video_packet_ = false; |  | 
| 533   bool received_first_audio_packet_ = false; |  | 
| 534 |  | 
| 535 #ifdef HAVE_QUIC |  | 
| 536   std::unique_ptr<QuicDataTransport> quic_data_transport_; |  | 
| 537 #endif  // HAVE_QUIC |  | 
| 538 |  | 
| 539   RTC_DISALLOW_COPY_AND_ASSIGN(WebRtcSession); |  | 
| 540 }; |  | 
| 541 }  // namespace webrtc |  | 
| 542 |  | 
| 543 #endif  // WEBRTC_API_WEBRTCSESSION_H_ |  | 
| OLD | NEW | 
|---|