resolver_thread.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __NETCOMM_UTILS_RESOLVER_THREAD_H_
00025 #define __NETCOMM_UTILS_RESOLVER_THREAD_H_
00026
00027 #include <core/threading/thread.h>
00028 #include <core/utils/lock_hashset.h>
00029 #include <core/utils/lock_hashmap.h>
00030 #include <utils/misc/string_compare.h>
00031 #ifdef HAVE_AVAHI
00032 #include <netcomm/dns-sd/avahi_resolver_handler.h>
00033 #endif
00034 #include <sys/socket.h>
00035 #include <netinet/in.h>
00036 #include <stdint.h>
00037 #include <cstddef>
00038 #include <utility>
00039 #include <map>
00040
00041 namespace fawkes {
00042
00043 class AvahiThread;
00044 class NetworkNameResolver;
00045 class Mutex;
00046
00047 #ifdef HAVE_AVAHI
00048 class NetworkNameResolverThread : public Thread, public AvahiResolverHandler
00049 #else
00050 class NetworkNameResolverThread : public Thread
00051 #endif
00052 {
00053 public:
00054 NetworkNameResolverThread(NetworkNameResolver *resolver,
00055 AvahiThread *avahi_thread = NULL);
00056 ~NetworkNameResolverThread();
00057
00058 void resolve_name(const char *name);
00059 void resolve_address(struct sockaddr *addr, socklen_t addrlen);
00060
00061 bool resolve_name_immediately(const char *name,
00062 struct sockaddr **addr, socklen_t *addr_len);
00063 bool resolve_address_immediately(struct sockaddr *addr, socklen_t addr_len,
00064 char **name, bool *namefound);
00065
00066 virtual void resolved_name(char *name, struct sockaddr *addr, socklen_t addrlen);
00067 virtual void resolved_address(struct sockaddr_in *addr, socklen_t addrlen, char *name);
00068 virtual void name_resolution_failed(char *name);
00069 virtual void address_resolution_failed(struct sockaddr_in *addr, socklen_t addrlen);
00070
00071 virtual void loop();
00072
00073
00074 protected: virtual void run() { Thread::run(); }
00075
00076 private:
00077 NetworkNameResolver *__resolver;
00078 #ifdef HAVE_AVAHI
00079 AvahiThread *__avahi_thread;
00080 #endif
00081
00082 Mutex *__namesq_mutex;
00083 unsigned int __namesq_active;
00084 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ > 2)
00085 typedef LockHashSet<char *, std::tr1::hash<char *>, StringEquality> NamesQMap;
00086 #else
00087 typedef LockHashSet<char *, __gnu_cxx::hash<char *>, StringEquality> NamesQMap;
00088 #endif
00089 NamesQMap __namesqs[2];
00090 NamesQMap *__namesq;
00091 NamesQMap *__namesq_proc;
00092
00093
00094 Mutex *__addrq_mutex;
00095 unsigned int __addrq_active;
00096 typedef std::map<uint32_t, std::pair<struct sockaddr *, socklen_t> > AddrQMap;
00097 AddrQMap __addrqs[2];
00098 AddrQMap *__addrq;
00099 AddrQMap *__addrq_proc;
00100 };
00101
00102 }
00103
00104 #endif