xref: /aosp_15_r20/external/webrtc/api/async_dns_resolver.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2021 The WebRTC Project Authors. All rights reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef API_ASYNC_DNS_RESOLVER_H_
12*d9f75844SAndroid Build Coastguard Worker #define API_ASYNC_DNS_RESOLVER_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <functional>
15*d9f75844SAndroid Build Coastguard Worker #include <memory>
16*d9f75844SAndroid Build Coastguard Worker 
17*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
18*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/socket_address.h"
19*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/system/rtc_export.h"
20*d9f75844SAndroid Build Coastguard Worker 
21*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
22*d9f75844SAndroid Build Coastguard Worker 
23*d9f75844SAndroid Build Coastguard Worker // This interface defines the methods to resolve a hostname asynchronously.
24*d9f75844SAndroid Build Coastguard Worker // The AsyncDnsResolverInterface class encapsulates a single name query.
25*d9f75844SAndroid Build Coastguard Worker //
26*d9f75844SAndroid Build Coastguard Worker // Usage:
27*d9f75844SAndroid Build Coastguard Worker //   std::unique_ptr<AsyncDnsResolverInterface> resolver =
28*d9f75844SAndroid Build Coastguard Worker //        factory->Create(address-to-be-resolved, [r = resolver.get()]() {
29*d9f75844SAndroid Build Coastguard Worker //     if (r->result.GetResolvedAddress(AF_INET, &addr) {
30*d9f75844SAndroid Build Coastguard Worker //       // success
31*d9f75844SAndroid Build Coastguard Worker //     } else {
32*d9f75844SAndroid Build Coastguard Worker //       // failure
33*d9f75844SAndroid Build Coastguard Worker //       error = r->result().GetError();
34*d9f75844SAndroid Build Coastguard Worker //     }
35*d9f75844SAndroid Build Coastguard Worker //     // Release resolver.
36*d9f75844SAndroid Build Coastguard Worker //     resolver_list.erase(std::remove_if(resolver_list.begin(),
37*d9f75844SAndroid Build Coastguard Worker //     resolver_list.end(),
38*d9f75844SAndroid Build Coastguard Worker //                         [](refptr) { refptr.get() == r; });
39*d9f75844SAndroid Build Coastguard Worker //   });
40*d9f75844SAndroid Build Coastguard Worker //   resolver_list.push_back(std::move(resolver));
41*d9f75844SAndroid Build Coastguard Worker 
42*d9f75844SAndroid Build Coastguard Worker class AsyncDnsResolverResult {
43*d9f75844SAndroid Build Coastguard Worker  public:
44*d9f75844SAndroid Build Coastguard Worker   virtual ~AsyncDnsResolverResult() = default;
45*d9f75844SAndroid Build Coastguard Worker   // Returns true iff the address from `Start` was successfully resolved.
46*d9f75844SAndroid Build Coastguard Worker   // If the address was successfully resolved, sets `addr` to a copy of the
47*d9f75844SAndroid Build Coastguard Worker   // address from `Start` with the IP address set to the top most resolved
48*d9f75844SAndroid Build Coastguard Worker   // address of `family` (`addr` will have both hostname and the resolved ip).
49*d9f75844SAndroid Build Coastguard Worker   virtual bool GetResolvedAddress(int family,
50*d9f75844SAndroid Build Coastguard Worker                                   rtc::SocketAddress* addr) const = 0;
51*d9f75844SAndroid Build Coastguard Worker   // Returns error from resolver.
52*d9f75844SAndroid Build Coastguard Worker   virtual int GetError() const = 0;
53*d9f75844SAndroid Build Coastguard Worker };
54*d9f75844SAndroid Build Coastguard Worker 
55*d9f75844SAndroid Build Coastguard Worker // The API for a single name query.
56*d9f75844SAndroid Build Coastguard Worker // The constructor, destructor and all functions must be called from
57*d9f75844SAndroid Build Coastguard Worker // the same sequence, and the callback will also be called on that sequence.
58*d9f75844SAndroid Build Coastguard Worker // The class guarantees that the callback will not be called if the
59*d9f75844SAndroid Build Coastguard Worker // resolver's destructor has been called.
60*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT AsyncDnsResolverInterface {
61*d9f75844SAndroid Build Coastguard Worker  public:
62*d9f75844SAndroid Build Coastguard Worker   virtual ~AsyncDnsResolverInterface() = default;
63*d9f75844SAndroid Build Coastguard Worker 
64*d9f75844SAndroid Build Coastguard Worker   // Start address resolution of the hostname in `addr`.
65*d9f75844SAndroid Build Coastguard Worker   virtual void Start(const rtc::SocketAddress& addr,
66*d9f75844SAndroid Build Coastguard Worker                      std::function<void()> callback) = 0;
67*d9f75844SAndroid Build Coastguard Worker   // Start address resolution of the hostname in `addr` matching `family`.
68*d9f75844SAndroid Build Coastguard Worker   virtual void Start(const rtc::SocketAddress& addr,
69*d9f75844SAndroid Build Coastguard Worker                      int family,
70*d9f75844SAndroid Build Coastguard Worker                      std::function<void()> callback) = 0;
71*d9f75844SAndroid Build Coastguard Worker   virtual const AsyncDnsResolverResult& result() const = 0;
72*d9f75844SAndroid Build Coastguard Worker };
73*d9f75844SAndroid Build Coastguard Worker 
74*d9f75844SAndroid Build Coastguard Worker // An abstract factory for creating AsyncDnsResolverInterfaces. This allows
75*d9f75844SAndroid Build Coastguard Worker // client applications to provide WebRTC with their own mechanism for
76*d9f75844SAndroid Build Coastguard Worker // performing DNS resolution.
77*d9f75844SAndroid Build Coastguard Worker class AsyncDnsResolverFactoryInterface {
78*d9f75844SAndroid Build Coastguard Worker  public:
79*d9f75844SAndroid Build Coastguard Worker   virtual ~AsyncDnsResolverFactoryInterface() = default;
80*d9f75844SAndroid Build Coastguard Worker 
81*d9f75844SAndroid Build Coastguard Worker   // Creates an AsyncDnsResolver and starts resolving the name. The callback
82*d9f75844SAndroid Build Coastguard Worker   // will be called when resolution is finished.
83*d9f75844SAndroid Build Coastguard Worker   // The callback will be called on the sequence that the caller runs on.
84*d9f75844SAndroid Build Coastguard Worker   virtual std::unique_ptr<webrtc::AsyncDnsResolverInterface> CreateAndResolve(
85*d9f75844SAndroid Build Coastguard Worker       const rtc::SocketAddress& addr,
86*d9f75844SAndroid Build Coastguard Worker       std::function<void()> callback) = 0;
87*d9f75844SAndroid Build Coastguard Worker   // Creates an AsyncDnsResolver and starts resolving the name to an address
88*d9f75844SAndroid Build Coastguard Worker   // matching the specified family. The callback will be called when resolution
89*d9f75844SAndroid Build Coastguard Worker   // is finished. The callback will be called on the sequence that the caller
90*d9f75844SAndroid Build Coastguard Worker   // runs on.
91*d9f75844SAndroid Build Coastguard Worker   virtual std::unique_ptr<webrtc::AsyncDnsResolverInterface> CreateAndResolve(
92*d9f75844SAndroid Build Coastguard Worker       const rtc::SocketAddress& addr,
93*d9f75844SAndroid Build Coastguard Worker       int family,
94*d9f75844SAndroid Build Coastguard Worker       std::function<void()> callback) = 0;
95*d9f75844SAndroid Build Coastguard Worker   // Creates an AsyncDnsResolver and does not start it.
96*d9f75844SAndroid Build Coastguard Worker   // For backwards compatibility, will be deprecated and removed.
97*d9f75844SAndroid Build Coastguard Worker   // One has to do a separate Start() call on the
98*d9f75844SAndroid Build Coastguard Worker   // resolver to start name resolution.
99*d9f75844SAndroid Build Coastguard Worker   virtual std::unique_ptr<webrtc::AsyncDnsResolverInterface> Create() = 0;
100*d9f75844SAndroid Build Coastguard Worker };
101*d9f75844SAndroid Build Coastguard Worker 
102*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
103*d9f75844SAndroid Build Coastguard Worker 
104*d9f75844SAndroid Build Coastguard Worker #endif  // API_ASYNC_DNS_RESOLVER_H_
105