--- /dev/null
+/* $Id$
+
+This file is part of NetVis
+Copyright @ 2008 Mikko Rasa, Mikkosoft Productions
+Distributed unter the GPL
+*/
+
+#include <netinet/in.h>
+#include <netdb.h>
+#include <msp/time/units.h>
+#include <msp/time/utils.h>
+#include "host.h"
+#include "resolver.h"
+
+using namespace std;
+using namespace Msp;
+
+Resolver::Resolver():
+ done(false)
+{
+ launch();
+}
+
+Resolver::~Resolver()
+{
+ done=true;
+ join();
+}
+
+void Resolver::push(Host *h)
+{
+ MutexLock l_(mutex);
+
+ in_queue.push_back(h);
+}
+
+void Resolver::tick()
+{
+ MutexLock l_(mutex);
+
+ for(list<Result>::iterator i=out_queue.begin(); i!=out_queue.end(); ++i)
+ i->host->set_name(i->name);
+ out_queue.clear();
+}
+
+void Resolver::main()
+{
+ while(!done)
+ {
+ while(1)
+ {
+ Host *host;
+ {
+ MutexLock l_(mutex);
+ if(in_queue.empty())
+ break;
+ host=in_queue.front();
+ in_queue.erase(in_queue.begin());
+ }
+
+ sockaddr_in addr;
+ addr.sin_family=AF_INET;
+ addr.sin_addr.s_addr=htonl(host->get_address());
+ char buf[128];
+ int err=getnameinfo(reinterpret_cast<sockaddr *>(&addr), sizeof(addr), buf, sizeof(buf), 0, 0, NI_NOFQDN|NI_NAMEREQD);
+ if(err==0)
+ {
+ MutexLock l_(mutex);
+ out_queue.push_back(Result(host, buf));
+ }
+ }
+
+ Time::sleep(Time::sec);
+ }
+}