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