/* * Copyright 2020 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "sdk/objc/native/src/objc_network_monitor.h" #include "absl/strings/string_view.h" #include #include "rtc_base/logging.h" #include "rtc_base/string_utils.h" namespace webrtc { rtc::NetworkMonitorInterface* ObjCNetworkMonitorFactory::CreateNetworkMonitor( const FieldTrialsView& field_trials) { return new ObjCNetworkMonitor(); } ObjCNetworkMonitor::ObjCNetworkMonitor() { safety_flag_ = PendingTaskSafetyFlag::Create(); } ObjCNetworkMonitor::~ObjCNetworkMonitor() { [network_monitor_ stop]; network_monitor_ = nil; } void ObjCNetworkMonitor::Start() { if (started_) { return; } thread_ = rtc::Thread::Current(); RTC_DCHECK_RUN_ON(thread_); safety_flag_->SetAlive(); network_monitor_ = [[RTCNetworkMonitor alloc] initWithObserver:this]; if (network_monitor_ == nil) { RTC_LOG(LS_WARNING) << "Failed to create RTCNetworkMonitor; not available on this OS?"; } started_ = true; } void ObjCNetworkMonitor::Stop() { RTC_DCHECK_RUN_ON(thread_); if (!started_) { return; } safety_flag_->SetNotAlive(); [network_monitor_ stop]; network_monitor_ = nil; started_ = false; } rtc::NetworkMonitorInterface::InterfaceInfo ObjCNetworkMonitor::GetInterfaceInfo( absl::string_view interface_name) { RTC_DCHECK_RUN_ON(thread_); if (adapter_type_by_name_.empty()) { // If we have no path update, assume everything's available, because it's // preferable for WebRTC to try all interfaces rather than none at all. return { .adapter_type = rtc::ADAPTER_TYPE_UNKNOWN, .available = true, }; } auto iter = adapter_type_by_name_.find(interface_name); if (iter == adapter_type_by_name_.end()) { return { .adapter_type = rtc::ADAPTER_TYPE_UNKNOWN, .available = false, }; } return { .adapter_type = iter->second, .available = true, }; } void ObjCNetworkMonitor::OnPathUpdate( std::map adapter_type_by_name) { RTC_DCHECK(network_monitor_ != nil); thread_->PostTask(SafeTask(safety_flag_, [this, adapter_type_by_name] { RTC_DCHECK_RUN_ON(thread_); adapter_type_by_name_ = adapter_type_by_name; InvokeNetworksChangedCallback(); })); } } // namespace webrtc