resolver_thread.h

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

Generated on 1 Mar 2011 for Fawkes API by  doxygen 1.6.1