22#include "ksrvresolverworker_p.h"
25#include <sys/socket.h>
28#include <tqapplication.h>
32using namespace KNetwork::Internal;
36 struct KSrvStartEvent:
public TQCustomEvent
38 inline KSrvStartEvent() : TQCustomEvent(TQEvent::User) { }
42static void sortPriorityClass(KSrvResolverWorker::PriorityClass&)
47bool 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"))
61 encodedName = KResolver::domainToAscii(node);
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)
82 TQStrList names = KResolver::protocolName(protocol());
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(
"_");
107bool 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);
196bool 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);
226void KSrvResolverWorker::customEvent(TQCustomEvent*)
228 dns =
new TQDns(TQString::fromLatin1(encodedName), TQDns::Srv);
229 TQObject::connect(dns, TQ_SIGNAL(resultsReady()),
this, TQ_SLOT(dnsResultsReady()));
232void KSrvResolverWorker::dnsResultsReady()
235 rawResults = dns->servers();
245 void initSrvWorker() TDE_NO_EXPORT;
248 if (getenv(
"TDE_NO_SRV") != NULL)
251 KResolverWorkerFactoryBase::registerNewWorker(
new KResolverWorkerFactory<KSrvResolverWorker>);
257#include "ksrvresolverworker_p.moc"
Name and service resolution results.
int systemError() const
Retrieves the system error code, if any.
int error() const
Retrieves the error code associated with this resolution.
Name and service resolution class.
KResolverResults results() const
Retrieves the results of this resolution.
void setProtocol(int protonum, const char *name=0L)
Sets the protocol we want.
void setFamily(int families)
Sets the allowed socket families.
int setFlags(int flags)
Sets the flags.
void setSocketType(int type)
Sets the socket type we want.
A namespace to store all networking-related (socket) classes.
const TDEShortcut & end()
Goto end of the document.