completed partial IPv6 compatibility in DNS; does retrieve and Cache IPv6 IPs
[pingcheck] / src / dns / resolverbase.h
CommitLineData
36ad976b
CH
1/*
2 The software in this package is distributed under the GNU General
3 Public License version 2 (with a special exception described below).
4
5 A copy of GNU General Public License (GPL) is included in this distribution,
6 in the file COPYING.GPL.
7
8 As a special exception, if other files instantiate templates or use macros
9 or inline functions from this file, or you compile this file and link it
10 with other works to produce a work based on this file, this file
11 does not by itself cause the resulting work to be covered
12 by the GNU General Public License.
13
14 However the source code for this file must still be made available
15 in accordance with section (3) of the GNU General Public License.
16
17 This exception does not invalidate any other reasons why a work based
18 on this file might be covered by the GNU General Public License.
19
20 Christian Herdtweck, Intra2net AG 2015
21 */
22
23#ifndef RESOLVER_BASE_H
24#define RESOLVER_BASE_H
25
26#include <boost/shared_ptr.hpp>
4e7b6ff9 27#include <boost/function.hpp>
36ad976b 28
4e7b6ff9
CH
29#include <queue>
30#include "host/pinger.h"
8f00b3df 31#include "dns/dnsipprotocol.h"
96779587 32#include "dns/hostaddress.h"
c5b4902d 33#include "dns/dnscache.h"
96779587 34
4e7b6ff9
CH
35typedef boost::function<void(const bool, const int)> callback_type;
36typedef std::queue<callback_type> callback_list_type;
96779587 37
23f51766
CH
38class ResolverBase;
39typedef boost::shared_ptr<ResolverBase> ResolverItem;
40
41
36ad976b
CH
42/**
43 * @brief: abstract base class for DnsResolver and IpPseudoResolver
44 */
45class ResolverBase
46{
47public:
4e7b6ff9
CH
48 virtual ~ResolverBase();
49
50 /**
51 * callbacks should be of type
52 * void resolve_callback(const bool was_success,
cd71d095 53 * const int recursion_count)
4e7b6ff9 54 */
cd71d095
CH
55 void async_resolve(const callback_type &callback,
56 const int recursion_count=0);
e18c1337 57 virtual void cancel_resolve() = 0;
72be9e7d
CH
58 virtual bool is_resolving() const = 0;
59 virtual bool is_waiting_to_resolve() const = 0;
36ad976b 60
26b0f687 61 virtual HostAddress get_next_ip(const bool check_up_to_date=true) = 0;
923626c0 62 virtual bool have_up_to_date_ip() = 0;
fd62d09f 63 virtual int get_resolved_ip_count(const bool check_up_to_date=true) = 0;
923626c0 64
dbe986b9
CH
65 std::string get_hostname() const;
66
26b0f687 67 std::string get_skip_cname() const;
23f51766 68
96779587 69protected:
4e7b6ff9
CH
70 ResolverBase(const IoServiceItem &io_serv,
71 const std::string &hostname,
8f00b3df 72 const DnsIpProtocol &protocol,
4e7b6ff9 73 const DnsCacheItem &cache );
96779587
CH
74
75// variables
4e7b6ff9
CH
76protected:
77 IoServiceItem IoService;
dbe986b9 78 const std::string Hostname;
8f00b3df 79 const DnsIpProtocol Protocol;
96779587 80 DnsCacheItem Cache;
4e7b6ff9 81 callback_list_type CallbackList;
96779587
CH
82
83// functions for subclasses
84protected:
cd71d095
CH
85 // recursion_count is guaranteed to be below
86 // DnsMaster::get_max_recursion_count
87 virtual void do_resolve(const int recursion_count) = 0;
4e7b6ff9 88
dbe986b9 89 // convenient forwards to DnsCache that just insert Hostname
26b0f687 90 void update_cache( const HostAddressVec &new_ips ) const;
dbe986b9 91 void update_cache( const Cname &cname ) const;
e18c1337 92 void update_cache( const std::string &hostname,
26b0f687 93 const HostAddressVec &new_ips ) const;
e18c1337 94 void update_cache( const std::string &hostname,
dbe986b9 95 const Cname &cname ) const;
4e7b6ff9 96
dbe986b9
CH
97 HostAddressVec get_cached_ips_recursively(const std::string host="",
98 const bool check_up_to_date=false) const;
4e7b6ff9
CH
99
100 void schedule_callbacks(const bool was_success,
cd71d095 101 const int recursion_count);
4e7b6ff9 102
96779587 103};
36ad976b
CH
104
105#endif
106