| Index: webrtc/p2p/base/dtlstransport.h
 | 
| diff --git a/webrtc/p2p/base/dtlstransport.h b/webrtc/p2p/base/dtlstransport.h
 | 
| index 27cece49d04ea9cfe328ad0084eca36a7b967f93..0c53ff9c5b61c4c9f0a1c143ce47557a12ab24bb 100644
 | 
| --- a/webrtc/p2p/base/dtlstransport.h
 | 
| +++ b/webrtc/p2p/base/dtlstransport.h
 | 
| @@ -11,6 +11,7 @@
 | 
|  #ifndef WEBRTC_P2P_BASE_DTLSTRANSPORT_H_
 | 
|  #define WEBRTC_P2P_BASE_DTLSTRANSPORT_H_
 | 
|  
 | 
| +#include "webrtc/base/checks.h"
 | 
|  #include "webrtc/p2p/base/dtlstransportchannel.h"
 | 
|  #include "webrtc/p2p/base/transport.h"
 | 
|  
 | 
| @@ -23,6 +24,7 @@ namespace cricket {
 | 
|  class PortAllocator;
 | 
|  
 | 
|  // Base should be a descendant of cricket::Transport
 | 
| +// TODO(hbos): Add appropriate DCHECK thread checks to all methods.
 | 
|  template<class Base>
 | 
|  class DtlsTransport : public Base {
 | 
|   public:
 | 
| @@ -30,9 +32,9 @@ class DtlsTransport : public Base {
 | 
|                  rtc::Thread* worker_thread,
 | 
|                  const std::string& content_name,
 | 
|                  PortAllocator* allocator,
 | 
| -                rtc::SSLIdentity* identity)
 | 
| +                const rtc::scoped_refptr<rtc::RTCCertificate>& certificate)
 | 
|        : Base(signaling_thread, worker_thread, content_name, allocator),
 | 
| -        identity_(identity),
 | 
| +        certificate_(certificate),
 | 
|          secure_role_(rtc::SSL_CLIENT),
 | 
|          ssl_max_version_(rtc::SSL_PROTOCOL_DTLS_10) {
 | 
|    }
 | 
| @@ -40,33 +42,39 @@ class DtlsTransport : public Base {
 | 
|    ~DtlsTransport() {
 | 
|      Base::DestroyAllChannels();
 | 
|    }
 | 
| -  virtual void SetIdentity_w(rtc::SSLIdentity* identity) {
 | 
| -    identity_ = identity;
 | 
| +  void SetCertificate_w(
 | 
| +      const rtc::scoped_refptr<rtc::RTCCertificate>& certificate) override {
 | 
| +    DCHECK(Base::worker_thread()->IsCurrent());
 | 
| +    certificate_ = certificate;
 | 
|    }
 | 
| -  virtual bool GetIdentity_w(rtc::SSLIdentity** identity) {
 | 
| -    if (!identity_)
 | 
| +  bool GetCertificate_w(
 | 
| +      rtc::scoped_refptr<rtc::RTCCertificate>* certificate) override {
 | 
| +    DCHECK(Base::worker_thread()->IsCurrent());
 | 
| +    if (!certificate_)
 | 
|        return false;
 | 
|  
 | 
| -    *identity = identity_->GetReference();
 | 
| +    *certificate = certificate_;
 | 
|      return true;
 | 
|    }
 | 
|  
 | 
|    virtual bool SetSslMaxProtocolVersion_w(rtc::SSLProtocolVersion version) {
 | 
| +    DCHECK(Base::worker_thread()->IsCurrent());
 | 
|      ssl_max_version_ = version;
 | 
|      return true;
 | 
|    }
 | 
|  
 | 
|    virtual bool ApplyLocalTransportDescription_w(TransportChannelImpl* channel,
 | 
|                                                  std::string* error_desc) {
 | 
| +    DCHECK(Base::worker_thread()->IsCurrent());
 | 
|      rtc::SSLFingerprint* local_fp =
 | 
|          Base::local_description()->identity_fingerprint.get();
 | 
|  
 | 
|      if (local_fp) {
 | 
|        // Sanity check local fingerprint.
 | 
| -      if (identity_) {
 | 
| +      if (certificate_) {
 | 
|          rtc::scoped_ptr<rtc::SSLFingerprint> local_fp_tmp(
 | 
|              rtc::SSLFingerprint::Create(local_fp->algorithm,
 | 
| -                                              identity_));
 | 
| +                                        certificate_->identity()));
 | 
|          ASSERT(local_fp_tmp.get() != NULL);
 | 
|          if (!(*local_fp_tmp == *local_fp)) {
 | 
|            std::ostringstream desc;
 | 
| @@ -81,10 +89,12 @@ class DtlsTransport : public Base {
 | 
|              error_desc);
 | 
|        }
 | 
|      } else {
 | 
| -      identity_ = NULL;
 | 
| +      certificate_ = nullptr;
 | 
|      }
 | 
|  
 | 
| -    if (!channel->SetLocalIdentity(identity_)) {
 | 
| +    // TODO(hbos): SetLocalCertificate
 | 
| +    if (!channel->SetLocalIdentity(
 | 
| +        certificate_ ? certificate_->identity() : nullptr)) {
 | 
|        return BadTransportDescription("Failed to set local identity.",
 | 
|                                       error_desc);
 | 
|      }
 | 
| @@ -95,6 +105,7 @@ class DtlsTransport : public Base {
 | 
|  
 | 
|    virtual bool NegotiateTransportDescription_w(ContentAction local_role,
 | 
|                                                 std::string* error_desc) {
 | 
| +    DCHECK(Base::worker_thread()->IsCurrent());
 | 
|      if (!Base::local_description() || !Base::remote_description()) {
 | 
|        const std::string msg = "Local and Remote description must be set before "
 | 
|                                "transport descriptions are negotiated";
 | 
| @@ -211,6 +222,7 @@ class DtlsTransport : public Base {
 | 
|    }
 | 
|  
 | 
|    virtual bool GetSslRole_w(rtc::SSLRole* ssl_role) const {
 | 
| +    DCHECK(Base::worker_thread()->IsCurrent());
 | 
|      ASSERT(ssl_role != NULL);
 | 
|      *ssl_role = secure_role_;
 | 
|      return true;
 | 
| @@ -220,6 +232,7 @@ class DtlsTransport : public Base {
 | 
|    virtual bool ApplyNegotiatedTransportDescription_w(
 | 
|        TransportChannelImpl* channel,
 | 
|        std::string* error_desc) {
 | 
| +    DCHECK(Base::worker_thread()->IsCurrent());
 | 
|      // Set ssl role. Role must be set before fingerprint is applied, which
 | 
|      // initiates DTLS setup.
 | 
|      if (!channel->SetSslRole(secure_role_)) {
 | 
| @@ -237,7 +250,7 @@ class DtlsTransport : public Base {
 | 
|      return Base::ApplyNegotiatedTransportDescription_w(channel, error_desc);
 | 
|    }
 | 
|  
 | 
| -  rtc::SSLIdentity* identity_;
 | 
| +  rtc::scoped_refptr<rtc::RTCCertificate> certificate_;
 | 
|    rtc::SSLRole secure_role_;
 | 
|    rtc::SSLProtocolVersion ssl_max_version_;
 | 
|    rtc::scoped_ptr<rtc::SSLFingerprint> remote_fingerprint_;
 | 
| 
 |