xref: /aosp_15_r20/external/cronet/net/dns/dns_config_service_android.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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