| /* | 
 |  *  Copyright 2013 The WebRTC project authors. All Rights Reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 |  | 
 | #ifndef PC_WEBRTCSESSIONDESCRIPTIONFACTORY_H_ | 
 | #define PC_WEBRTCSESSIONDESCRIPTIONFACTORY_H_ | 
 |  | 
 | #include <memory> | 
 | #include <queue> | 
 | #include <string> | 
 |  | 
 | #include "p2p/base/transportdescriptionfactory.h" | 
 | #include "pc/mediasession.h" | 
 | #include "pc/peerconnectioninternal.h" | 
 | #include "rtc_base/constructormagic.h" | 
 | #include "rtc_base/messagehandler.h" | 
 | #include "rtc_base/rtccertificate.h" | 
 | #include "rtc_base/rtccertificategenerator.h" | 
 |  | 
 | namespace webrtc { | 
 |  | 
 | // DTLS certificate request callback class. | 
 | class WebRtcCertificateGeneratorCallback | 
 |     : public rtc::RTCCertificateGeneratorCallback, | 
 |       public sigslot::has_slots<> { | 
 |  public: | 
 |   // |rtc::RTCCertificateGeneratorCallback| overrides. | 
 |   void OnSuccess( | 
 |       const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) override; | 
 |   void OnFailure() override; | 
 |  | 
 |   sigslot::signal0<> SignalRequestFailed; | 
 |   sigslot::signal1<const rtc::scoped_refptr<rtc::RTCCertificate>&> | 
 |       SignalCertificateReady; | 
 | }; | 
 |  | 
 | struct CreateSessionDescriptionRequest { | 
 |   enum Type { | 
 |     kOffer, | 
 |     kAnswer, | 
 |   }; | 
 |  | 
 |   CreateSessionDescriptionRequest(Type type, | 
 |                                   CreateSessionDescriptionObserver* observer, | 
 |                                   const cricket::MediaSessionOptions& options) | 
 |       : type(type), observer(observer), options(options) {} | 
 |  | 
 |   Type type; | 
 |   rtc::scoped_refptr<CreateSessionDescriptionObserver> observer; | 
 |   cricket::MediaSessionOptions options; | 
 | }; | 
 |  | 
 | // This class is used to create offer/answer session description. Certificates | 
 | // for WebRtcSession/DTLS are either supplied at construction or generated | 
 | // asynchronously. It queues the create offer/answer request until the | 
 | // certificate generation has completed, i.e. when OnCertificateRequestFailed or | 
 | // OnCertificateReady is called. | 
 | class WebRtcSessionDescriptionFactory : public rtc::MessageHandler, | 
 |                                         public sigslot::has_slots<> { | 
 |  public: | 
 |   // Can specify either a |cert_generator| or |certificate| to enable DTLS. If | 
 |   // a certificate generator is given, starts generating the certificate | 
 |   // asynchronously. If a certificate is given, will use that for identifying | 
 |   // over DTLS. If neither is specified, DTLS is disabled. | 
 |   WebRtcSessionDescriptionFactory( | 
 |       rtc::Thread* signaling_thread, | 
 |       cricket::ChannelManager* channel_manager, | 
 |       PeerConnectionInternal* pc, | 
 |       const std::string& session_id, | 
 |       std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator, | 
 |       const rtc::scoped_refptr<rtc::RTCCertificate>& certificate); | 
 |   virtual ~WebRtcSessionDescriptionFactory(); | 
 |  | 
 |   static void CopyCandidatesFromSessionDescription( | 
 |       const SessionDescriptionInterface* source_desc, | 
 |       const std::string& content_name, | 
 |       SessionDescriptionInterface* dest_desc); | 
 |  | 
 |   void CreateOffer( | 
 |       CreateSessionDescriptionObserver* observer, | 
 |       const PeerConnectionInterface::RTCOfferAnswerOptions& options, | 
 |       const cricket::MediaSessionOptions& session_options); | 
 |   void CreateAnswer(CreateSessionDescriptionObserver* observer, | 
 |                     const cricket::MediaSessionOptions& session_options); | 
 |  | 
 |   void SetSdesPolicy(cricket::SecurePolicy secure_policy); | 
 |   cricket::SecurePolicy SdesPolicy() const; | 
 |  | 
 |   void set_enable_encrypted_rtp_header_extensions(bool enable) { | 
 |     session_desc_factory_.set_enable_encrypted_rtp_header_extensions(enable); | 
 |   } | 
 |  | 
 |   sigslot::signal1<const rtc::scoped_refptr<rtc::RTCCertificate>&> | 
 |       SignalCertificateReady; | 
 |  | 
 |   // For testing. | 
 |   bool waiting_for_certificate_for_testing() const { | 
 |     return certificate_request_state_ == CERTIFICATE_WAITING; | 
 |   } | 
 |  | 
 |  private: | 
 |   enum CertificateRequestState { | 
 |     CERTIFICATE_NOT_NEEDED, | 
 |     CERTIFICATE_WAITING, | 
 |     CERTIFICATE_SUCCEEDED, | 
 |     CERTIFICATE_FAILED, | 
 |   }; | 
 |  | 
 |   // MessageHandler implementation. | 
 |   virtual void OnMessage(rtc::Message* msg); | 
 |  | 
 |   void InternalCreateOffer(CreateSessionDescriptionRequest request); | 
 |   void InternalCreateAnswer(CreateSessionDescriptionRequest request); | 
 |   // Posts failure notifications for all pending session description requests. | 
 |   void FailPendingRequests(const std::string& reason); | 
 |   void PostCreateSessionDescriptionFailed( | 
 |       CreateSessionDescriptionObserver* observer, | 
 |       const std::string& error); | 
 |   void PostCreateSessionDescriptionSucceeded( | 
 |       CreateSessionDescriptionObserver* observer, | 
 |       std::unique_ptr<SessionDescriptionInterface> description); | 
 |  | 
 |   void OnCertificateRequestFailed(); | 
 |   void SetCertificate( | 
 |       const rtc::scoped_refptr<rtc::RTCCertificate>& certificate); | 
 |  | 
 |   std::queue<CreateSessionDescriptionRequest> | 
 |       create_session_description_requests_; | 
 |   rtc::Thread* const signaling_thread_; | 
 |   cricket::TransportDescriptionFactory transport_desc_factory_; | 
 |   cricket::MediaSessionDescriptionFactory session_desc_factory_; | 
 |   uint64_t session_version_; | 
 |   const std::unique_ptr<rtc::RTCCertificateGeneratorInterface> cert_generator_; | 
 |   // TODO(jiayl): remove the dependency on peer connection once bug 2264 is | 
 |   // fixed. | 
 |   PeerConnectionInternal* const pc_; | 
 |   const std::string session_id_; | 
 |   CertificateRequestState certificate_request_state_; | 
 |  | 
 |   RTC_DISALLOW_COPY_AND_ASSIGN(WebRtcSessionDescriptionFactory); | 
 | }; | 
 | }  // namespace webrtc | 
 |  | 
 | #endif  // PC_WEBRTCSESSIONDESCRIPTIONFACTORY_H_ |