diff --git a/api/jsep.h b/api/jsep.h index cf8aeb0cb4..7ef4c5364f 100644 --- a/api/jsep.h +++ b/api/jsep.h @@ -136,6 +136,13 @@ class RTC_EXPORT SessionDescriptionInterface { virtual ~SessionDescriptionInterface() {} + // Create a new SessionDescriptionInterface object + // with the same values as the old object. + // TODO(bugs.webrtc.org:12215): Remove default implementation + virtual std::unique_ptr Clone() { + return nullptr; + } + // Only for use internally. virtual cricket::SessionDescription* description() = 0; virtual const cricket::SessionDescription* description() const = 0; diff --git a/api/jsep_session_description.h b/api/jsep_session_description.h index 79e15e21fe..0ba3807026 100644 --- a/api/jsep_session_description.h +++ b/api/jsep_session_description.h @@ -49,6 +49,8 @@ class JsepSessionDescription : public SessionDescriptionInterface { const std::string& session_id, const std::string& session_version); + virtual std::unique_ptr Clone(); + virtual cricket::SessionDescription* description() { return description_.get(); } diff --git a/pc/jsep_session_description.cc b/pc/jsep_session_description.cc index 7f30b50d97..2334e92b9a 100644 --- a/pc/jsep_session_description.cc +++ b/pc/jsep_session_description.cc @@ -215,6 +215,13 @@ bool JsepSessionDescription::Initialize( return true; } +std::unique_ptr JsepSessionDescription::Clone() { + auto new_description = std::make_unique(type_); + new_description->Initialize(description_->Clone(), session_id_, + session_version_); + return new_description; +} + bool JsepSessionDescription::AddCandidate( const IceCandidateInterface* candidate) { if (!candidate) diff --git a/pc/jsep_session_description_unittest.cc b/pc/jsep_session_description_unittest.cc index 8caac94613..7f83c085a7 100644 --- a/pc/jsep_session_description_unittest.cc +++ b/pc/jsep_session_description_unittest.cc @@ -117,6 +117,18 @@ class JsepSessionDescriptionTest : public ::testing::Test { std::unique_ptr jsep_desc_; }; +TEST_F(JsepSessionDescriptionTest, CloneDefault) { + auto new_desc = jsep_desc_->Clone(); + EXPECT_EQ(jsep_desc_->type(), new_desc->type()); + std::string old_desc_string; + std::string new_desc_string; + EXPECT_TRUE(jsep_desc_->ToString(&old_desc_string)); + EXPECT_TRUE(new_desc->ToString(&new_desc_string)); + EXPECT_EQ(old_desc_string, new_desc_string); + EXPECT_EQ(jsep_desc_->session_id(), new_desc->session_id()); + EXPECT_EQ(jsep_desc_->session_version(), new_desc->session_version()); +} + // Test that number_of_mediasections() returns the number of media contents in // a session description. TEST_F(JsepSessionDescriptionTest, CheckSessionDescription) {