15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/*
25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle
35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2012, Google Inc.
45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without
65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met:
75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer.
105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     this list of conditions and the following disclaimer in the documentation
125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     and/or other materials provided with the distribution.
135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *  3. The name of the author may not be used to endorse or promote products
145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *     derived from this software without specific prior written permission.
155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org *
165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */
275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifndef TALK_APP_WEBRTC_WEBRTCSESSION_H_
295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define TALK_APP_WEBRTC_WEBRTCSESSION_H_
305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <string>
325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/app/webrtc/peerconnectioninterface.h"
345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/app/webrtc/dtmfsender.h"
355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/app/webrtc/mediastreamprovider.h"
365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/app/webrtc/datachannel.h"
375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/app/webrtc/statstypes.h"
385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/sigslot.h"
395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/base/thread.h"
405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/media/base/mediachannel.h"
415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/p2p/base/session.h"
425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include "talk/session/media/mediasession.h"
435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace cricket {
455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass ChannelManager;
475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass DataChannel;
485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass StatsReport;
495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass Transport;
505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass VideoCapturer;
515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass BaseChannel;
525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass VideoChannel;
535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass VoiceChannel;
545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}  // namespace cricket
565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace webrtc {
585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass IceRestartAnswerLatch;
605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass MediaStreamSignaling;
61e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.orgclass WebRtcSessionDescriptionFactory;
625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgextern const char kSetLocalSdpFailed[];
645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgextern const char kSetRemoteSdpFailed[];
655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgextern const char kCreateChannelFailed[];
66c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.orgextern const char kBundleWithoutRtcpMux[];
675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgextern const char kInvalidCandidates[];
685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgextern const char kInvalidSdp[];
695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgextern const char kMlineMismatch[];
705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgextern const char kSdpWithoutCrypto[];
715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgextern const char kSessionError[];
725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgextern const char kUpdateStateFailed[];
735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgextern const char kPushDownOfferTDFailed[];
745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgextern const char kPushDownPranswerTDFailed[];
755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgextern const char kPushDownAnswerTDFailed[];
765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// ICE state callback interface.
785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass IceObserver {
795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Called any time the IceConnectionState changes
815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void OnIceConnectionChange(
825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      PeerConnectionInterface::IceConnectionState new_state) {}
835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Called any time the IceGatheringState changes
845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void OnIceGatheringChange(
855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      PeerConnectionInterface::IceGatheringState new_state) {}
865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // New Ice candidate have been found.
875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void OnIceCandidate(const IceCandidateInterface* candidate) = 0;
885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // All Ice candidates have been found.
895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // TODO(bemasc): Remove this once callers transition to OnIceGatheringChange.
905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // (via PeerConnectionObserver)
915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void OnIceComplete() {}
925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org protected:
945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  ~IceObserver() {}
955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass WebRtcSession : public cricket::BaseSession,
985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                      public AudioProviderInterface,
995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                      public DataChannelFactory,
1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                      public VideoProviderInterface,
1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                      public DtmfProviderInterface {
1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org public:
1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  WebRtcSession(cricket::ChannelManager* channel_manager,
1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                talk_base::Thread* signaling_thread,
1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                talk_base::Thread* worker_thread,
1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                cricket::PortAllocator* port_allocator,
1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                MediaStreamSignaling* mediastream_signaling);
1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual ~WebRtcSession();
1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
110e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org  bool Initialize(const MediaConstraintsInterface* constraints,
111e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org                  DTLSIdentityServiceInterface* dtls_identity_service);
1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Deletes the voice, video and data channel and changes the session state
1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // to STATE_RECEIVEDTERMINATE.
1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void Terminate();
1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void RegisterIceObserver(IceObserver* observer) {
1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    ice_observer_ = observer;
1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual cricket::VoiceChannel* voice_channel() {
1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return voice_channel_.get();
1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual cricket::VideoChannel* video_channel() {
1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return video_channel_.get();
1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual cricket::DataChannel* data_channel() {
1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return data_channel_.get();
1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void set_secure_policy(cricket::SecureMediaPolicy secure_policy);
131e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org  cricket::SecureMediaPolicy secure_policy() const;
1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Generic error message callback from WebRtcSession.
1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // TODO - It may be necessary to supply error code as well.
1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal0<> SignalError;
1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
137e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org  void CreateOffer(CreateSessionDescriptionObserver* observer,
138e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org                   const MediaConstraintsInterface* constraints);
139e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org  void CreateAnswer(CreateSessionDescriptionObserver* observer,
140e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org                    const MediaConstraintsInterface* constraints);
141b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org  // The ownership of |desc| will be transferred after this call.
1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool SetLocalDescription(SessionDescriptionInterface* desc,
1435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                           std::string* err_desc);
144b30f5947ff2af0e3b77751bacec5dc7350c4dcd6sergeyu@chromium.org  // The ownership of |desc| will be transferred after this call.
1455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool SetRemoteDescription(SessionDescriptionInterface* desc,
1465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                            std::string* err_desc);
1475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool ProcessIceMessage(const IceCandidateInterface* ice_candidate);
1485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  const SessionDescriptionInterface* local_description() const {
1495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return local_desc_.get();
1505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  const SessionDescriptionInterface* remote_description() const {
1525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    return remote_desc_.get();
1535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  }
1545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
155e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org  void set_secure(cricket::SecureMediaPolicy secure_policy);
156e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org  cricket::SecureMediaPolicy secure();
157e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org
1585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Get the id used as a media stream track's "id" field from ssrc.
1595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual bool GetTrackIdBySsrc(uint32 ssrc, std::string* id);
1605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // AudioMediaProviderInterface implementation.
162c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org  virtual void SetAudioPlayout(uint32 ssrc, bool enable,
163c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org                               cricket::AudioRenderer* renderer) OVERRIDE;
1645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void SetAudioSend(uint32 ssrc, bool enable,
165c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org                            const cricket::AudioOptions& options,
166c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org                            cricket::AudioRenderer* renderer) OVERRIDE;
1675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Implements VideoMediaProviderInterface.
1695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual bool SetCaptureDevice(uint32 ssrc,
1705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                cricket::VideoCapturer* camera) OVERRIDE;
1715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void SetVideoPlayout(uint32 ssrc,
1725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                               bool enable,
1735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                               cricket::VideoRenderer* renderer) OVERRIDE;
1745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void SetVideoSend(uint32 ssrc, bool enable,
1755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                            const cricket::VideoOptions* options) OVERRIDE;
1765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Implements DtmfProviderInterface.
1785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual bool CanInsertDtmf(const std::string& track_id);
1795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual bool InsertDtmf(const std::string& track_id,
1805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                          int code, int duration);
1815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual sigslot::signal0<>* GetOnDestroyedSignal();
1825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::scoped_refptr<DataChannel> CreateDataChannel(
1845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const std::string& label,
1855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const DataChannelInit* config);
1865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
1875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  cricket::DataChannelType data_channel_type() const;
1885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
189e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org  bool IceRestartPending() const;
190e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org
191e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org  void ResetIceRestartLatch();
192e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org
193e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org  // Called when an SSLIdentity is generated or retrieved by
194e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org  // WebRTCSessionDescriptionFactory. Should happen before setLocalDescription.
195e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org  void OnIdentityReady(talk_base::SSLIdentity* identity);
196e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org
197e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org  // For unit test.
198e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org  bool waiting_for_identity() const;
199e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org
2005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org private:
2015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Indicates the type of SessionDescription in a call to SetLocalDescription
2025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // and SetRemoteDescription.
2035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  enum Action {
2045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    kOffer,
2055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    kPrAnswer,
2065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org    kAnswer,
2075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  };
208e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org
2095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Invokes ConnectChannels() on transport proxies, which initiates ice
2105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // candidates allocation.
2115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool StartCandidatesAllocation();
2125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool UpdateSessionState(Action action, cricket::ContentSource source,
2135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                          const cricket::SessionDescription* desc,
2145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                          std::string* err_desc);
2155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  static Action GetAction(const std::string& type);
2165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Transport related callbacks, override from cricket::BaseSession.
2185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void OnTransportRequestSignaling(cricket::Transport* transport);
2195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void OnTransportConnecting(cricket::Transport* transport);
2205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void OnTransportWritable(cricket::Transport* transport);
2215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void OnTransportProxyCandidatesReady(
2225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      cricket::TransportProxy* proxy,
2235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const cricket::Candidates& candidates);
2245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  virtual void OnCandidatesAllocationDone();
2255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Check if a call to SetLocalDescription is acceptable with |action|.
2275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool ExpectSetLocalDescription(Action action);
2285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Check if a call to SetRemoteDescription is acceptable with |action|.
2295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool ExpectSetRemoteDescription(Action action);
2305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Creates local session description with audio and video contents.
2315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool CreateDefaultLocalDescription();
2325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Enables media channels to allow sending of media.
2335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void EnableChannels();
2345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Creates a JsepIceCandidate and adds it to the local session description
2355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // and notify observers. Called when a new local candidate have been found.
2365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void ProcessNewLocalCandidate(const std::string& content_name,
2375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                const cricket::Candidates& candidates);
2385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Returns the media index for a local ice candidate given the content name.
2395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Returns false if the local session description does not have a media
2405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // content called  |content_name|.
2415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool GetLocalCandidateMediaIndex(const std::string& content_name,
2425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org                                   int* sdp_mline_index);
2435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Uses all remote candidates in |remote_desc| in this session.
2445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool UseCandidatesInSessionDescription(
2455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const SessionDescriptionInterface* remote_desc);
2465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Uses |candidate| in this session.
2475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool UseCandidate(const IceCandidateInterface* candidate);
2485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Deletes the corresponding channel of contents that don't exist in |desc|.
2495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // |desc| can be null. This means that all channels are deleted.
2505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void RemoveUnusedChannelsAndTransports(
2515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org      const cricket::SessionDescription* desc);
2525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Allocates media channels based on the |desc|. If |desc| doesn't have
2545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // the BUNDLE option, this method will disable BUNDLE in PortAllocator.
2555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // This method will also delete any existing media channels before creating.
2565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool CreateChannels(const cricket::SessionDescription* desc);
2575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Helper methods to create media channels.
259c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org  bool CreateVoiceChannel(const cricket::ContentInfo* content);
260c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org  bool CreateVideoChannel(const cricket::ContentInfo* content);
261c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org  bool CreateDataChannel(const cricket::ContentInfo* content);
262c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org
2635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Copy the candidates from |saved_candidates_| to |dest_desc|.
2645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // The |saved_candidates_| will be cleared after this function call.
2655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void CopySavedCandidates(SessionDescriptionInterface* dest_desc);
2665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
267e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org  void OnDataReceived(
268e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org      cricket::DataChannel* channel,
269e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org      const cricket::ReceiveDataParams& params,
270e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org      const talk_base::Buffer& payload);
2715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool GetLocalTrackId(uint32 ssrc, std::string* track_id);
2735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool GetRemoteTrackId(uint32 ssrc, std::string* track_id);
2745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
2755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::string BadStateErrMsg(const std::string& type, State state);
2765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  void SetIceConnectionState(PeerConnectionInterface::IceConnectionState state);
2775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
278c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org  bool VerifyBundleSettings(const cricket::SessionDescription* desc);
279c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org  bool HasRtcpMuxEnabled(const cricket::ContentInfo* content);
280c1c67e5a722135af4ca83ee4c7d2dbe3f26bae70henrike@webrtc.org
2815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::scoped_ptr<cricket::VoiceChannel> voice_channel_;
2825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::scoped_ptr<cricket::VideoChannel> video_channel_;
2835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::scoped_ptr<cricket::DataChannel> data_channel_;
2845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  cricket::ChannelManager* channel_manager_;
2855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  MediaStreamSignaling* mediastream_signaling_;
2865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  IceObserver* ice_observer_;
2875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  PeerConnectionInterface::IceConnectionState ice_connection_state_;
2885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::scoped_ptr<SessionDescriptionInterface> local_desc_;
2895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::scoped_ptr<SessionDescriptionInterface> remote_desc_;
2905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Candidates that arrived before the remote description was set.
2915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  std::vector<IceCandidateInterface*> saved_candidates_;
2925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // If the remote peer is using a older version of implementation.
2935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  bool older_version_remote_peer_;
2945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // Specifies which kind of data channel is allowed. This is controlled
2955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // by the chrome command-line flag and constraints:
2965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // 1. If chrome command-line switch 'enable-sctp-data-channels' is enabled,
2975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // constraint kEnableDtlsSrtp is true, and constaint kEnableRtpDataChannels is
2985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // not set or false, SCTP is allowed (DCT_SCTP);
2995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // 2. If constraint kEnableRtpDataChannels is true, RTP is allowed (DCT_RTP);
3005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  // 3. If both 1&2 are false, data channel is not allowed (DCT_NONE).
3015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  cricket::DataChannelType data_channel_type_;
3025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  talk_base::scoped_ptr<IceRestartAnswerLatch> ice_restart_latch_;
303e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org
304e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org  talk_base::scoped_ptr<WebRtcSessionDescriptionFactory>
305e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org      webrtc_session_desc_factory_;
306e6781b6279d20210a5050a3e55e9c7effd3b144ewu@webrtc.org
3075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal0<> SignalVoiceChannelDestroyed;
3085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal0<> SignalVideoChannelDestroyed;
3095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org  sigslot::signal0<> SignalDataChannelDestroyed;
3105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org};
3115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}  // namespace webrtc
3135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org
3145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif  // TALK_APP_WEBRTC_WEBRTCSESSION_H_
315