1 // Copyright 2021 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef NET_DNS_DNS_CONFIG_SERVICE_ANDROID_H_ 6 #define NET_DNS_DNS_CONFIG_SERVICE_ANDROID_H_ 7 8 #include <memory> 9 10 #include "base/time/time.h" 11 #include "net/android/network_library.h" 12 #include "net/base/net_export.h" 13 #include "net/base/network_change_notifier.h" 14 #include "net/dns/dns_config_service.h" 15 16 namespace net { 17 18 // Use DnsConfigService::CreateSystemService to use it outside of tests. 19 namespace internal { 20 21 // Service for reading and watching Android system DNS settings. This object is 22 // not thread-safe and methods may perform blocking I/O so methods must be 23 // called on a sequence that allows blocking (i.e. base::MayBlock). It may be 24 // constructed on a different sequence than which it's later called on. 25 class NET_EXPORT_PRIVATE DnsConfigServiceAndroid 26 : public DnsConfigService, 27 public NetworkChangeNotifier::NetworkChangeObserver { 28 public: 29 static constexpr base::TimeDelta kConfigChangeDelay = base::Milliseconds(50); 30 31 DnsConfigServiceAndroid(); 32 ~DnsConfigServiceAndroid() override; 33 34 DnsConfigServiceAndroid(const DnsConfigServiceAndroid&) = delete; 35 DnsConfigServiceAndroid& operator=(const DnsConfigServiceAndroid&) = delete; 36 37 // To be effective, must be called before the first config read. Also, may 38 // outlive `this` and be run on other sequences. set_dns_server_getter_for_testing(android::DnsServerGetter dns_server_getter)39 void set_dns_server_getter_for_testing( 40 android::DnsServerGetter dns_server_getter) { 41 dns_server_getter_ = std::move(dns_server_getter); 42 } 43 44 protected: 45 // DnsConfigService: 46 void ReadConfigNow() override; 47 bool StartWatching() override; 48 49 private: 50 class ConfigReader; 51 52 // NetworkChangeNotifier::NetworkChangeObserver: 53 void OnNetworkChanged(NetworkChangeNotifier::ConnectionType type) override; 54 55 bool is_watching_network_change_ = false; 56 std::unique_ptr<ConfigReader> config_reader_; 57 android::DnsServerGetter dns_server_getter_; 58 }; 59 60 } // namespace internal 61 } // namespace net 62 63 #endif // NET_DNS_DNS_CONFIG_SERVICE_ANDROID_H_ 64