Introduce CreateDataChannelOrError

Deprecate CreateDataChannel, and make it a simple wrapper function.

Bug: webrtc:12796
Change-Id: I053d75a264596ba87ca734a29df9241de93a80c3
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/219784
Reviewed-by: Xavier Lepaul‎ <xalep@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34130}
This commit is contained in:
Harald Alvestrand
2021-05-21 13:33:51 +00:00
committed by WebRTC LUCI CQ
parent 0d0ed76ac1
commit a9af50f151
12 changed files with 60 additions and 27 deletions

View File

@ -920,9 +920,24 @@ class RTC_EXPORT PeerConnectionInterface : public rtc::RefCountInterface {
// Also, calling CreateDataChannel is the only way to get a data "m=" section // Also, calling CreateDataChannel is the only way to get a data "m=" section
// in SDP, so it should be done before CreateOffer is called, if the // in SDP, so it should be done before CreateOffer is called, if the
// application plans to use data channels. // application plans to use data channels.
virtual RTCErrorOr<rtc::scoped_refptr<DataChannelInterface>>
CreateDataChannelOrError(const std::string& label,
const DataChannelInit* config) {
return RTCError(RTCErrorType::INTERNAL_ERROR, "dummy function called");
}
// TODO(crbug.com/788659): Remove "virtual" below and default implementation
// above once mock in Chrome is fixed.
ABSL_DEPRECATED("Use CreateDataChannelOrError")
virtual rtc::scoped_refptr<DataChannelInterface> CreateDataChannel( virtual rtc::scoped_refptr<DataChannelInterface> CreateDataChannel(
const std::string& label, const std::string& label,
const DataChannelInit* config) = 0; const DataChannelInit* config) {
auto result = CreateDataChannelOrError(label, config);
if (!result.ok()) {
return nullptr;
} else {
return result.MoveValue();
}
}
// NOTE: For the following 6 methods, it's only safe to dereference the // NOTE: For the following 6 methods, it's only safe to dereference the
// SessionDescriptionInterface on signaling_thread() (for example, calling // SessionDescriptionInterface on signaling_thread() (for example, calling

View File

@ -76,8 +76,8 @@ PROXY_METHOD2(void,
rtc::scoped_refptr<RtpReceiverInterface>, rtc::scoped_refptr<RtpReceiverInterface>,
rtc::scoped_refptr<RTCStatsCollectorCallback>) rtc::scoped_refptr<RTCStatsCollectorCallback>)
PROXY_METHOD0(void, ClearStatsCache) PROXY_METHOD0(void, ClearStatsCache)
PROXY_METHOD2(rtc::scoped_refptr<DataChannelInterface>, PROXY_METHOD2(RTCErrorOr<rtc::scoped_refptr<DataChannelInterface>>,
CreateDataChannel, CreateDataChannelOrError,
const std::string&, const std::string&,
const DataChannelInit*) const DataChannelInit*)
PROXY_CONSTMETHOD0(const SessionDescriptionInterface*, local_description) PROXY_CONSTMETHOD0(const SessionDescriptionInterface*, local_description)

View File

@ -114,10 +114,10 @@ class DummyPeerConnection : public PeerConnectionInterface {
} }
void ClearStatsCache() override {} void ClearStatsCache() override {}
rtc::scoped_refptr<DataChannelInterface> CreateDataChannel( RTCErrorOr<rtc::scoped_refptr<DataChannelInterface>> CreateDataChannelOrError(
const std::string& label, const std::string& label,
const DataChannelInit* config) override { const DataChannelInit* config) override {
return nullptr; return RTCError(RTCErrorType::INTERNAL_ERROR, "Dummy function called");
} }
const SessionDescriptionInterface* local_description() const override { const SessionDescriptionInterface* local_description() const override {

View File

@ -100,8 +100,8 @@ class MockPeerConnectionInterface
GetSctpTransport, GetSctpTransport,
(), (),
(const override)); (const override));
MOCK_METHOD(rtc::scoped_refptr<DataChannelInterface>, MOCK_METHOD(RTCErrorOr<rtc::scoped_refptr<DataChannelInterface>>,
CreateDataChannel, CreateDataChannelOrError,
(const std::string&, const DataChannelInit*), (const std::string&, const DataChannelInit*),
(override)); (override));
MOCK_METHOD(const SessionDescriptionInterface*, MOCK_METHOD(const SessionDescriptionInterface*,

View File

@ -497,8 +497,9 @@ bool SimplePeerConnection::CreateDataChannel() {
struct webrtc::DataChannelInit init; struct webrtc::DataChannelInit init;
init.ordered = true; init.ordered = true;
init.reliable = true; init.reliable = true;
data_channel_ = peer_connection_->CreateDataChannel("Hello", &init); auto result = peer_connection_->CreateDataChannelOrError("Hello", &init);
if (data_channel_.get()) { if (result.ok()) {
data_channel_ = result.MoveValue();
data_channel_->RegisterObserver(this); data_channel_->RegisterObserver(this);
RTC_LOG(LS_INFO) << "Succeeds to create data channel"; RTC_LOG(LS_INFO) << "Succeeds to create data channel";
return true; return true;

View File

@ -1279,8 +1279,8 @@ absl::optional<bool> PeerConnection::can_trickle_ice_candidates() {
"trickle"); "trickle");
} }
rtc::scoped_refptr<DataChannelInterface> PeerConnection::CreateDataChannel( RTCErrorOr<rtc::scoped_refptr<DataChannelInterface>>
const std::string& label, PeerConnection::CreateDataChannelOrError(const std::string& label,
const DataChannelInit* config) { const DataChannelInit* config) {
RTC_DCHECK_RUN_ON(signaling_thread()); RTC_DCHECK_RUN_ON(signaling_thread());
TRACE_EVENT0("webrtc", "PeerConnection::CreateDataChannel"); TRACE_EVENT0("webrtc", "PeerConnection::CreateDataChannel");
@ -1291,11 +1291,13 @@ rtc::scoped_refptr<DataChannelInterface> PeerConnection::CreateDataChannel(
if (config) { if (config) {
internal_config.reset(new InternalDataChannelInit(*config)); internal_config.reset(new InternalDataChannelInit(*config));
} }
// TODO(bugs.webrtc.org/12796): Return a more specific error.
rtc::scoped_refptr<DataChannelInterface> channel( rtc::scoped_refptr<DataChannelInterface> channel(
data_channel_controller_.InternalCreateDataChannelWithProxy( data_channel_controller_.InternalCreateDataChannelWithProxy(
label, internal_config.get())); label, internal_config.get()));
if (!channel.get()) { if (!channel.get()) {
return nullptr; return RTCError(RTCErrorType::INTERNAL_ERROR,
"Data channel creation failed");
} }
// Trigger the onRenegotiationNeeded event for // Trigger the onRenegotiationNeeded event for

View File

@ -167,7 +167,7 @@ class PeerConnection : public PeerConnectionInternal,
std::vector<rtc::scoped_refptr<RtpTransceiverInterface>> GetTransceivers() std::vector<rtc::scoped_refptr<RtpTransceiverInterface>> GetTransceivers()
const override; const override;
rtc::scoped_refptr<DataChannelInterface> CreateDataChannel( RTCErrorOr<rtc::scoped_refptr<DataChannelInterface>> CreateDataChannelOrError(
const std::string& label, const std::string& label,
const DataChannelInit* config) override; const DataChannelInit* config) override;
// WARNING: LEGACY. See peerconnectioninterface.h // WARNING: LEGACY. See peerconnectioninterface.h

View File

@ -306,7 +306,14 @@ rtc::scoped_refptr<RtpSenderInterface> PeerConnectionWrapper::AddVideoTrack(
rtc::scoped_refptr<DataChannelInterface> rtc::scoped_refptr<DataChannelInterface>
PeerConnectionWrapper::CreateDataChannel(const std::string& label) { PeerConnectionWrapper::CreateDataChannel(const std::string& label) {
return pc()->CreateDataChannel(label, nullptr); auto result = pc()->CreateDataChannelOrError(label, nullptr);
if (!result.ok()) {
RTC_LOG(LS_ERROR) << "CreateDataChannel failed: "
<< ToString(result.error().type()) << " "
<< result.error().message();
return nullptr;
}
return result.MoveValue();
} }
PeerConnectionInterface::SignalingState PeerConnectionInterface::SignalingState

View File

@ -120,10 +120,11 @@ class FakePeerConnectionBase : public PeerConnectionInternal {
return nullptr; return nullptr;
} }
rtc::scoped_refptr<DataChannelInterface> CreateDataChannel( RTCErrorOr<rtc::scoped_refptr<DataChannelInterface>> CreateDataChannelOrError(
const std::string& label, const std::string& label,
const DataChannelInit* config) override { const DataChannelInit* config) override {
return nullptr; return RTCError(RTCErrorType::UNSUPPORTED_OPERATION,
"Fake function called");
} }
const SessionDescriptionInterface* local_description() const override { const SessionDescriptionInterface* local_description() const override {

View File

@ -140,7 +140,14 @@ rtc::scoped_refptr<webrtc::DataChannelInterface>
PeerConnectionTestWrapper::CreateDataChannel( PeerConnectionTestWrapper::CreateDataChannel(
const std::string& label, const std::string& label,
const webrtc::DataChannelInit& init) { const webrtc::DataChannelInit& init) {
return peer_connection_->CreateDataChannel(label, &init); auto result = peer_connection_->CreateDataChannelOrError(label, &init);
if (!result.ok()) {
RTC_LOG(LS_ERROR) << "CreateDataChannel failed: "
<< ToString(result.error().type()) << " "
<< result.error().message();
return nullptr;
}
return result.MoveValue();
} }
void PeerConnectionTestWrapper::WaitForNegotiation() { void PeerConnectionTestWrapper::WaitForNegotiation() {

View File

@ -538,10 +538,12 @@ static ScopedJavaLocalRef<jobject> JNI_PeerConnection_CreateDataChannel(
const JavaParamRef<jstring>& j_label, const JavaParamRef<jstring>& j_label,
const JavaParamRef<jobject>& j_init) { const JavaParamRef<jobject>& j_init) {
DataChannelInit init = JavaToNativeDataChannelInit(jni, j_init); DataChannelInit init = JavaToNativeDataChannelInit(jni, j_init);
rtc::scoped_refptr<DataChannelInterface> channel( auto result = ExtractNativePC(jni, j_pc)->CreateDataChannelOrError(
ExtractNativePC(jni, j_pc)->CreateDataChannel( JavaToNativeString(jni, j_label), &init);
JavaToNativeString(jni, j_label), &init)); if (!result.ok()) {
return WrapNativeDataChannel(jni, channel); return WrapNativeDataChannel(jni, nullptr);
}
return WrapNativeDataChannel(jni, result.MoveValue());
} }
static void JNI_PeerConnection_CreateOffer( static void JNI_PeerConnection_CreateOffer(

View File

@ -23,14 +23,12 @@
std::string labelString = [NSString stdStringForString:label]; std::string labelString = [NSString stdStringForString:label];
const webrtc::DataChannelInit nativeInit = const webrtc::DataChannelInit nativeInit =
configuration.nativeDataChannelInit; configuration.nativeDataChannelInit;
rtc::scoped_refptr<webrtc::DataChannelInterface> dataChannel = auto result = self.nativePeerConnection->CreateDataChannelOrError(labelString, &nativeInit);
self.nativePeerConnection->CreateDataChannel(labelString, if (!result.ok()) {
&nativeInit);
if (!dataChannel) {
return nil; return nil;
} }
return [[RTC_OBJC_TYPE(RTCDataChannel) alloc] initWithFactory:self.factory return [[RTC_OBJC_TYPE(RTCDataChannel) alloc] initWithFactory:self.factory
nativeDataChannel:dataChannel]; nativeDataChannel:result.MoveValue()];
} }
@end @end