Index: talk/app/webrtc/peerconnectionfactory.cc |
diff --git a/talk/app/webrtc/peerconnectionfactory.cc b/talk/app/webrtc/peerconnectionfactory.cc |
index 3524af7932a4f92f60da84e552f742d1a2aaa7ac..26765d21097ff81a791b4ac54b64fa207eb0d48c 100644 |
--- a/talk/app/webrtc/peerconnectionfactory.cc |
+++ b/talk/app/webrtc/peerconnectionfactory.cc |
@@ -28,8 +28,6 @@ |
#include "talk/app/webrtc/peerconnectionfactory.h" |
#include "talk/app/webrtc/audiotrack.h" |
-#include "talk/app/webrtc/dtlsidentityservice.h" |
-#include "talk/app/webrtc/dtlsidentitystore.h" |
#include "talk/app/webrtc/localaudiosource.h" |
#include "talk/app/webrtc/mediastreamproxy.h" |
#include "talk/app/webrtc/mediastreamtrackproxy.h" |
@@ -49,6 +47,30 @@ |
namespace webrtc { |
+namespace { |
+ |
+// Passes down the calls to |store_|. See usage in CreatePeerConnection. |
+class DtlsIdentityStoreWrapper : public DtlsIdentityStoreInterface { |
+ public: |
+ DtlsIdentityStoreWrapper( |
+ const rtc::scoped_refptr<RefCountedDtlsIdentityStore>& store) |
+ : store_(store) { |
+ DCHECK(store_); |
+ } |
+ |
+ void RequestIdentity( |
+ rtc::KeyType key_type, |
+ const rtc::scoped_refptr<webrtc::DtlsIdentityRequestObserver>& |
+ observer) override { |
+ store_->RequestIdentity(key_type, observer); |
+ } |
+ |
+ private: |
+ rtc::scoped_refptr<RefCountedDtlsIdentityStore> store_; |
+}; |
+ |
+} // anonymous namespace |
+ |
rtc::scoped_refptr<PeerConnectionFactoryInterface> |
CreatePeerConnectionFactory() { |
rtc::scoped_refptr<PeerConnectionFactory> pc_factory( |
@@ -130,12 +152,12 @@ PeerConnectionFactory::PeerConnectionFactory( |
PeerConnectionFactory::~PeerConnectionFactory() { |
DCHECK(signaling_thread_->IsCurrent()); |
- channel_manager_.reset(NULL); |
- default_allocator_factory_ = NULL; |
+ channel_manager_.reset(nullptr); |
+ default_allocator_factory_ = nullptr; |
// Make sure |worker_thread_| and |signaling_thread_| outlive |
// |dtls_identity_store_|. |
- dtls_identity_store_.reset(NULL); |
+ dtls_identity_store_ = nullptr; |
if (owns_ptrs_) { |
if (wraps_current_thread_) |
@@ -169,9 +191,8 @@ bool PeerConnectionFactory::Initialize() { |
return false; |
} |
- dtls_identity_store_.reset( |
- new DtlsIdentityStore(signaling_thread_, worker_thread_)); |
- dtls_identity_store_->Initialize(); |
+ dtls_identity_store_ = new RefCountedDtlsIdentityStore( |
+ signaling_thread_, worker_thread_); |
return true; |
} |
@@ -205,13 +226,17 @@ PeerConnectionFactory::CreatePeerConnection( |
const PeerConnectionInterface::RTCConfiguration& configuration, |
const MediaConstraintsInterface* constraints, |
PortAllocatorFactoryInterface* allocator_factory, |
- DTLSIdentityServiceInterface* dtls_identity_service, |
+ rtc::scoped_ptr<DtlsIdentityStoreInterface> dtls_identity_store, |
PeerConnectionObserver* observer) { |
DCHECK(signaling_thread_->IsCurrent()); |
DCHECK(allocator_factory || default_allocator_factory_); |
- if (!dtls_identity_service) { |
- dtls_identity_service = new DtlsIdentityService(dtls_identity_store_.get()); |
+ if (!dtls_identity_store.get()) { |
+ // Because |pc|->Initialize takes ownership of the store we need a new |
+ // wrapper object that can be deleted without deleting the underlying |
+ // |dtls_identity_store_|, protecting it from being deleted multiple times. |
+ dtls_identity_store.reset( |
+ new DtlsIdentityStoreWrapper(dtls_identity_store_)); |
} |
PortAllocatorFactoryInterface* chosen_allocator_factory = |
@@ -224,7 +249,7 @@ PeerConnectionFactory::CreatePeerConnection( |
configuration, |
constraints, |
chosen_allocator_factory, |
- dtls_identity_service, |
+ dtls_identity_store.Pass(), |
observer)) { |
return NULL; |
} |