Using pragma once from now on, working on a dynamic library class
[ail.git] / ail / dns.hpp
blobab8b19479eeeba4b976334f8c9ced730f8999b7c
1 #pragma once
3 #include <string>
4 #include <vector>
6 #include <boost/asio.hpp>
7 #include <boost/function.hpp>
8 #include <boost/thread/mutex.hpp>
10 #include <ail/types.hpp>
11 #include <ail/memory.hpp>
13 namespace ail
15 struct dns_question
17 std::string name;
18 ulong
19 type,
20 dns_class;
23 struct dns_answer
25 std::string name;
26 ulong
27 type,
28 dns_class;
30 ulong time_to_live;
32 bool is_ip, is_unknown;
33 std::string
34 address,
35 other_data;
38 typedef std::vector<dns_question> question_vector;
39 typedef std::vector<dns_answer> answer_vector;
41 struct dns_lookup_result
43 bool success;
44 std::string
45 name,
46 error_message,
47 address;
49 question_vector questions;
50 answer_vector
51 answers,
52 authoritative_nameservers,
53 additional_records;
56 typedef boost::function<void (dns_lookup_result & result)> dns_lookup_handler_type;
58 struct dns_request
60 ushort transaction_id;
61 std::string name;
62 dns_lookup_handler_type lookup_handler;
63 char * buffer;
65 bool operator==(dns_request const & other) const;
68 class dns_client
70 public:
71 dns_client(boost::asio::io_service & io_service, std::string const & server, ushort port);
73 void lookup(std::string const & name, dns_lookup_handler_type lookup_handler);
75 private:
76 std::string server;
77 ulong port;
79 boost::asio::io_service & io_service;
81 boost::asio::ip::udp::resolver resolver;
82 boost::asio::ip::udp::socket socket;
84 bool got_endpoint;
85 boost::asio::ip::udp::endpoint endpoint;
87 boost::mutex mutex;
89 ushort current_id;
91 typedef std::vector<dns_request> request_vector;
93 request_vector pending_requests;
95 void resolve_event(boost::system::error_code const & error, boost::asio::ip::udp::resolver::iterator endpoint_iterator, dns_request & request);
96 void receive_event(boost::system::error_code const & error, std::size_t bytes_received, char * receive_buffer);
97 void send_event(boost::system::error_code const & error, std::size_t bytes_received, dns_request & request);
99 void global_error(std::string const & message);
100 void error_occured(dns_request & request, std::string const & message);
102 void receive_data();
103 void send_dns_request(dns_request & request);
104 void erase_request(dns_request & request);
105 bool get_request(ushort transaction_id, request_vector::iterator & output);
107 dns_question read_question(bit_reader & reader);
108 dns_answer read_answer(bit_reader & reader);
109 std::string read_name(bit_reader & reader);
110 void continue_processing(char * receive_buffer);