22 #include "ksrvresolverworker_p.h"
24 #include <sys/types.h>
25 #include <sys/socket.h>
28 #include <tqapplication.h>
32 using namespace KNetwork::Internal;
36 struct KSrvStartEvent:
public TQCustomEvent
38 inline KSrvStartEvent() : TQCustomEvent(TQEvent::User) { }
42 static void sortPriorityClass(KSrvResolverWorker::PriorityClass&)
47 bool KSrvResolverWorker::preprocess()
50 if ((flags() & (KResolver::NoSrv | KResolver::UseSrv)) != KResolver::UseSrv)
53 TQString node = nodeName();
54 if (node.find(
'%') != -1)
55 node.truncate(node.find(
'%'));
57 if (node.isEmpty() || node == TQString::fromLatin1(
"*") ||
58 node == TQString::fromLatin1(
"localhost"))
62 if (encodedName.isNull())
66 if ((familyMask() & KResolver::InternetFamily) == 0)
71 serviceName().toUInt(&ok);
77 int sockettype = socketType();
78 if (!protocolName().isEmpty())
79 protoname = protocolName();
80 else if (protocol() != 0)
83 names.setAutoDelete(
true);
88 protoname += names.at(0);
90 else if (sockettype == SOCK_STREAM || sockettype == 0)
92 else if (sockettype == SOCK_DGRAM)
97 encodedName.prepend(
".");
98 encodedName.prepend(protoname);
99 encodedName.prepend(
".");
100 encodedName.prepend(serviceName().latin1());
101 encodedName.prepend(
"_");
107 bool KSrvResolverWorker::run()
109 sem =
new TQSemaphore(1);
111 sem->tryAccess(sem->available());
113 TQApplication::postEvent(
this,
new KSrvStartEvent);
120 if (rawResults.isEmpty())
124 r->
setFlags(flags() | KResolver::NoSrv);
134 cl.entries.append(e);
139 else if (rawResults.count() == 1 && rawResults.first().name ==
".")
142 setError(KResolver::NoName);
149 TQValueList<TQDns::Server>::ConstIterator it = rawResults.begin();
150 while (it != rawResults.end())
152 const TQDns::Server& srv = *it;
153 PriorityClass& r = myResults[srv.priority];
154 r.totalWeight += srv.weight;
159 e.weight = srv.weight;
167 Results::Iterator mapit;
168 for (mapit = myResults.begin(); mapit != myResults.end(); ++mapit)
171 sortPriorityClass(*mapit);
173 TQValueList<Entry>& entries = (*mapit).entries;
176 for (TQValueList<Entry>::Iterator it = entries.begin();
177 it != entries.end(); ++it)
182 r->
setFlags(flags() | KResolver::NoSrv);
196 bool KSrvResolverWorker::postprocess()
198 setError(KResolver::NoName);
199 if (myResults.isEmpty())
202 Results::Iterator mapit, mapend;
203 for (mapit = myResults.begin(), mapend = myResults.end();
204 mapit != mapend; ++mapit)
206 TQValueList<Entry>::Iterator it = (*mapit).entries.begin(),
207 end = (*mapit).entries.end();
208 for ( ; it !=
end; ++it)
212 if (r.isEmpty() && results.isEmpty())
216 setError(KResolver::NoError);
226 void KSrvResolverWorker::customEvent(TQCustomEvent*)
228 dns =
new TQDns(TQString::fromLatin1(encodedName), TQDns::Srv);
229 TQObject::connect(dns, TQT_SIGNAL(resultsReady()),
this, TQT_SLOT(dnsResultsReady()));
232 void KSrvResolverWorker::dnsResultsReady()
235 rawResults = dns->servers();
245 void initSrvWorker() KDE_NO_EXPORT;
248 if (getenv(
"TDE_NO_SRV") != NULL)
251 KResolverWorkerFactoryBase::registerNewWorker(
new KResolverWorkerFactory<KSrvResolverWorker>);
257 #include "ksrvresolverworker_p.moc"