Fawkes API Fawkes Development Version
|
00001 00002 /*************************************************************************** 00003 * resolver_thread.h - Fawkes network name resolver thread 00004 * 00005 * Created: Fri May 11 22:10:03 2007 00006 * Copyright 2006-2007 Tim Niemueller [www.niemueller.de] 00007 * 00008 ****************************************************************************/ 00009 00010 /* This program is free software; you can redistribute it and/or modify 00011 * it under the terms of the GNU General Public License as published by 00012 * the Free Software Foundation; either version 2 of the License, or 00013 * (at your option) any later version. A runtime exception applies to 00014 * this software (see LICENSE.GPL_WRE file mentioned below for details). 00015 * 00016 * This program is distributed in the hope that it will be useful, 00017 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00018 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00019 * GNU Library General Public License for more details. 00020 * 00021 * Read the full text in the LICENSE.GPL_WRE file in the doc directory. 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 /** Stub to see name in backtrace for easier debugging. @see Thread::run() */ 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 } // end namespace fawkes 00103 00104 #endif