From 7b2eddc458f10243bdc54daa7aa4f10cdb2a3b25 Mon Sep 17 00:00:00 2001 From: Edwin Wu Date: Sat, 12 Oct 2024 00:27:29 -0700 Subject: [PATCH] Add WEB_RTC_NON_CELLULAR enum, II PiperOrigin-RevId: 685103930 --- internal/platform/BUILD | 2 -- internal/platform/implementation/g3/BUILD | 1 + internal/platform/implementation/g3/webrtc.cc | 16 ++++++++++++++++ internal/platform/implementation/g3/webrtc.h | 10 ++++++++++ internal/platform/implementation/webrtc.h | 9 +++++++++ .../platform/implementation/windows/webrtc.cc | 10 ++++++++++ .../platform/implementation/windows/webrtc.h | 12 ++++++++++++ .../implementation/windows/webrtc_test.cc | 14 ++++++++++---- internal/platform/webrtc.h | 18 +++++++++++++++++- 9 files changed, 85 insertions(+), 7 deletions(-) diff --git a/internal/platform/BUILD b/internal/platform/BUILD index ddf31bc9..9ab66b12 100644 --- a/internal/platform/BUILD +++ b/internal/platform/BUILD @@ -335,11 +335,9 @@ cc_library( # TODO: Support WebRTC "@com_google_absl//absl/base:core_headers", "@com_google_absl//absl/container:flat_hash_map", - "@com_google_absl//absl/container:flat_hash_set", "@com_google_absl//absl/functional:any_invocable", "@com_google_absl//absl/status", "@com_google_absl//absl/strings", - "@com_google_absl//absl/strings:str_format", "@com_google_absl//absl/types:optional", ], ) diff --git a/internal/platform/implementation/g3/BUILD b/internal/platform/implementation/g3/BUILD index fc881b7d..7dfdf310 100644 --- a/internal/platform/implementation/g3/BUILD +++ b/internal/platform/implementation/g3/BUILD @@ -105,6 +105,7 @@ cc_library( "@com_google_absl//absl/strings", "@com_google_absl//absl/strings:str_format", "@com_google_absl//absl/synchronization", + "@com_google_absl//absl/time", ], ) diff --git a/internal/platform/implementation/g3/webrtc.cc b/internal/platform/implementation/g3/webrtc.cc index 596c97ca..386e24b3 100644 --- a/internal/platform/implementation/g3/webrtc.cc +++ b/internal/platform/implementation/g3/webrtc.cc @@ -15,9 +15,16 @@ #include "internal/platform/implementation/g3/webrtc.h" #include +#include +#include #include +#include "absl/strings/string_view.h" +#include "absl/time/clock.h" +#include "internal/platform/byte_array.h" +#include "internal/platform/implementation/webrtc.h" #include "internal/platform/medium_environment.h" +#include "webrtc/api/peer_connection_interface.h" #include "webrtc/api/task_queue/default_task_queue_factory.h" #include "webrtc/rtc_base/checks.h" @@ -56,6 +63,12 @@ const std::string WebRtcMedium::GetDefaultCountryCode() { return "US"; } void WebRtcMedium::CreatePeerConnection( webrtc::PeerConnectionObserver* observer, PeerConnectionCallback callback) { + CreatePeerConnection(std::nullopt, observer, std::move(callback)); +} + +void WebRtcMedium::CreatePeerConnection( + std::optional options, + webrtc::PeerConnectionObserver* observer, PeerConnectionCallback callback) { auto& env = MediumEnvironment::Instance(); if (!env.GetUseValidPeerConnection()) { callback(nullptr); @@ -75,6 +88,9 @@ void WebRtcMedium::CreatePeerConnection( webrtc::CreateDefaultTaskQueueFactory(); factory_dependencies.signaling_thread = signaling_thread.release(); + if (options.has_value()) { + // TODO(edwinwu): Add support for non-cellular networks. + } auto peer_connection_or_error = webrtc::CreateModularPeerConnectionFactory( std::move(factory_dependencies)) diff --git a/internal/platform/implementation/g3/webrtc.h b/internal/platform/implementation/g3/webrtc.h index bb88a0cc..cc630254 100644 --- a/internal/platform/implementation/g3/webrtc.h +++ b/internal/platform/implementation/g3/webrtc.h @@ -16,8 +16,11 @@ #define PLATFORM_IMPL_G3_WEBRTC_H_ #include +#include +#include #include "absl/strings/string_view.h" +#include "internal/platform/byte_array.h" #include "internal/platform/implementation/webrtc.h" #include "internal/platform/implementation/g3/single_thread_executor.h" #include "webrtc/api/peer_connection_interface.h" @@ -63,6 +66,13 @@ class WebRtcMedium : public api::WebRtcMedium { void CreatePeerConnection(webrtc::PeerConnectionObserver* observer, PeerConnectionCallback callback) override; + // Creates and returns a new webrtc::PeerConnectionInterface object via + // |callback| with |PeerConnectionFactoryInterface::Options|. + void CreatePeerConnection( + std::optional options, + webrtc::PeerConnectionObserver* observer, + PeerConnectionCallback callback) override; + // Returns a signaling messenger for sending WebRTC signaling messages. std::unique_ptr GetSignalingMessenger( absl::string_view self_id, diff --git a/internal/platform/implementation/webrtc.h b/internal/platform/implementation/webrtc.h index 1c0bb04e..820348b7 100644 --- a/internal/platform/implementation/webrtc.h +++ b/internal/platform/implementation/webrtc.h @@ -18,8 +18,10 @@ #ifndef NO_WEBRTC #include +#include #include +#include "absl/functional/any_invocable.h" #include "absl/strings/string_view.h" #include "connections/implementation/proto/offline_wire_formats.pb.h" #include "internal/platform/byte_array.h" @@ -60,6 +62,13 @@ class WebRtcMedium { virtual void CreatePeerConnection(webrtc::PeerConnectionObserver* observer, PeerConnectionCallback callback) = 0; + // Creates and returns a new webrtc::PeerConnectionInterface object via + // |callback| with |PeerConnectionFactoryInterface::Options|. + virtual void CreatePeerConnection( + std::optional options, + webrtc::PeerConnectionObserver* observer, + PeerConnectionCallback callback) = 0; + // Returns a signaling messenger for sending WebRTC signaling messages. virtual std::unique_ptr GetSignalingMessenger( absl::string_view self_id, diff --git a/internal/platform/implementation/windows/webrtc.cc b/internal/platform/implementation/windows/webrtc.cc index 82ab05e2..ab7cad31 100644 --- a/internal/platform/implementation/windows/webrtc.cc +++ b/internal/platform/implementation/windows/webrtc.cc @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -71,6 +72,12 @@ const std::string WebRtcMedium::GetDefaultCountryCode() { void WebRtcMedium::CreatePeerConnection( webrtc::PeerConnectionObserver* observer, PeerConnectionCallback callback) { + CreatePeerConnection(std::nullopt, observer, std::move(callback)); +} + +void WebRtcMedium::CreatePeerConnection( + std::optional options, + webrtc::PeerConnectionObserver* observer, PeerConnectionCallback callback) { webrtc::PeerConnectionInterface::RTCConfiguration rtc_config; rtc_config.sdp_semantics = webrtc::SdpSemantics::kUnifiedPlan; // TODO(b/261663238): Add the TURN servers and go beyond the default servers. @@ -94,6 +101,9 @@ void WebRtcMedium::CreatePeerConnection( webrtc::CreateDefaultTaskQueueFactory(); factory_dependencies.signaling_thread = signaling_thread.release(); + if (options.has_value()) { + // TODO(edwinwu): Add support for non-cellular networks. + } auto peer_connection_or_error = webrtc::CreateModularPeerConnectionFactory( std::move(factory_dependencies)) diff --git a/internal/platform/implementation/windows/webrtc.h b/internal/platform/implementation/windows/webrtc.h index ae9c76cf..18766870 100644 --- a/internal/platform/implementation/windows/webrtc.h +++ b/internal/platform/implementation/windows/webrtc.h @@ -15,10 +15,15 @@ #ifndef PLATFORM_IMPL_WINDOWS_WEBRTC_H_ #define PLATFORM_IMPL_WINDOWS_WEBRTC_H_ +#include +#include #include +#include "absl/strings/string_view.h" +#include "internal/platform/byte_array.h" #include "internal/platform/implementation/account_manager.h" #include "internal/platform/implementation/webrtc.h" +#include "webrtc/api/peer_connection_interface.h" namespace nearby { namespace windows { @@ -63,6 +68,13 @@ class WebRtcMedium : public api::WebRtcMedium { void CreatePeerConnection(webrtc::PeerConnectionObserver* observer, PeerConnectionCallback callback) override; + // Creates and returns a new webrtc::PeerConnectionInterface object via + // |callback| with |PeerConnectionFactoryInterface::Options|. + void CreatePeerConnection( + std::optional options, + webrtc::PeerConnectionObserver* observer, + PeerConnectionCallback callback) override; + // Returns a signaling messenger for sending WebRTC signaling messages. // TODO(b/261663238): replace with real implementation. std::unique_ptr GetSignalingMessenger( diff --git a/internal/platform/implementation/windows/webrtc_test.cc b/internal/platform/implementation/windows/webrtc_test.cc index 81331a14..5b1e5c50 100644 --- a/internal/platform/implementation/windows/webrtc_test.cc +++ b/internal/platform/implementation/windows/webrtc_test.cc @@ -15,12 +15,17 @@ #include "internal/platform/implementation/windows/webrtc.h" #include +#include #include -#include "gmock/gmock.h" -#include "protobuf-matchers/protocol-buffer-matchers.h" #include "gtest/gtest.h" +#include "internal/platform/implementation/webrtc.h" +#include "webrtc/api/jsep.h" +#include "webrtc/api/data_channel_interface.h" +#include "webrtc/api/peer_connection_interface.h" +#include "webrtc/api/scoped_refptr.h" + namespace nearby { namespace windows { @@ -58,8 +63,9 @@ TEST(WebrtcTest, CreatePeerConnectionSucceeds) { auto observer = std::make_unique(); WebRtcMedium medium; medium.CreatePeerConnection( - observer.get(), [](rtc::scoped_refptr - peer_connection) mutable { + std::nullopt, observer.get(), + [](rtc::scoped_refptr + peer_connection) mutable { if (!peer_connection) { FAIL() << "Peer connection should have been non-null"; return; diff --git a/internal/platform/webrtc.h b/internal/platform/webrtc.h index ef49ad9c..47873ddd 100644 --- a/internal/platform/webrtc.h +++ b/internal/platform/webrtc.h @@ -18,7 +18,12 @@ #ifndef NO_WEBRTC #include +#include +#include +#include +#include "absl/strings/string_view.h" +#include "internal/platform/byte_array.h" #include "internal/platform/implementation/platform.h" #include "internal/platform/implementation/webrtc.h" #include "webrtc/api/peer_connection_interface.h" @@ -74,11 +79,21 @@ class WebRtcMedium { return impl_->GetDefaultCountryCode(); } + void SetNonCellular(bool non_cellular) { + non_cellular_ = non_cellular; + } + // Creates and returns a new webrtc::PeerConnectionInterface object via // |callback|. void CreatePeerConnection(webrtc::PeerConnectionObserver* observer, PeerConnectionCallback callback) { - impl_->CreatePeerConnection(observer, std::move(callback)); + // TODO(edwinwu): Add a flag to control this and add support for + // non-cellular networks. + if (non_cellular_) { + impl_->CreatePeerConnection(std::nullopt, observer, std::move(callback)); + } else { + impl_->CreatePeerConnection(observer, std::move(callback)); + } } // Returns a signaling messenger for sending WebRTC signaling messages. @@ -93,6 +108,7 @@ class WebRtcMedium { private: std::unique_ptr impl_; + bool non_cellular_ = false; }; } // namespace nearby