28 #include <config-network.h>
30 #include <QSocketNotifier>
39 using namespace KNetwork;
41 class KNetwork::KServerSocketPrivate
47 enum {
None, LookupDone, Bound, Listening } state;
51 bool bindWhenFound : 1, listenWhenBound : 1, useKBufferedSocket : 1;
53 KServerSocketPrivate()
54 : state(
None),
timeout(0), bindWhenFound(false), listenWhenBound(false),
55 useKBufferedSocket(true)
63 :
QObject(parent), d(new KServerSocketPrivate)
66 this, SLOT(lookupFinishedSlot()));
70 :
QObject(parent), d(new KServerSocketPrivate)
73 this, SLOT(lookupFinishedSlot()));
74 d->resolver.setServiceName(service);
79 :
QObject(parent), d(new KServerSocketPrivate)
82 this, SLOT(lookupFinishedSlot()));
94 QMutexLocker locker(
mutex());
108 return d->resolverResults;
114 d->resolver.setFlags(d->resolver.flags() & ~
KResolver::NoResolve);
121 d->resolver.setFamily(families);
126 d->resolver.setNodeName(
QString());
127 d->resolver.setServiceName(service);
128 d->resolverResults.empty();
129 if (d->state <= KServerSocketPrivate::LookupDone)
135 d->resolver.setNodeName(node);
136 d->resolver.setServiceName(service);
137 d->resolverResults.empty();
138 if (d->state <= KServerSocketPrivate::LookupDone)
150 if (d->resolver.isRunning() && !
blocking())
153 if (d->state >= KServerSocketPrivate::LookupDone)
157 if (d->resolver.serviceName().isNull() &&
158 !d->resolver.nodeName().isNull())
159 d->resolver.setServiceName(QLatin1String(
""));
167 if (d->resolver.status() <= 0)
189 d->state = KServerSocketPrivate::Bound;
211 if (d->state >= KServerSocketPrivate::Bound)
214 if (d->state < KServerSocketPrivate::LookupDone)
218 d->bindWhenFound =
true;
220 if (d->state >= KServerSocketPrivate::Bound)
221 d->bindWhenFound =
false;
240 if (d->state == KServerSocketPrivate::Listening)
243 d->backlog = backlog;
245 if (d->state < KServerSocketPrivate::Bound)
249 d->listenWhenBound =
true;
252 d->listenWhenBound =
false;
256 if (d->state < KServerSocketPrivate::Bound)
261 d->listenWhenBound =
false;
264 if (d->state < KServerSocketPrivate::Listening)
273 if (d->resolver.isRunning())
274 d->resolver.cancel(
false);
281 d->useKBufferedSocket = enable;
286 if (d->state < KServerSocketPrivate::Listening)
323 if (d->useKBufferedSocket)
326 streamsocket->setOpenMode(KStreamSocket::ReadWrite);
331 streamsocket->setOpenMode(KStreamSocket::ReadWrite |
332 KStreamSocket::Unbuffered);
354 void KServerSocket::lookupFinishedSlot()
356 if (d->resolver.isRunning() || d->state > KServerSocketPrivate::LookupDone)
359 if (d->resolver.status() < 0)
363 d->bindWhenFound = d->listenWhenBound =
false;
369 d->resolverResults = d->resolver.results();
370 d->state = KServerSocketPrivate::LookupDone;
373 if (d->bindWhenFound)
382 bool KServerSocket::doBind()
384 d->bindWhenFound =
false;
387 KResolverResults::ConstIterator it = d->resolverResults.constBegin();
388 for ( ; it != d->resolverResults.constEnd(); ++it)
391 if (d->listenWhenBound)
403 bool KServerSocket::doListen()
413 QObject::connect(
socketDevice()->readNotifier(), SIGNAL(activated(
int)),
415 d->state = KServerSocketPrivate::Listening;
420 #include "k3serversocket.moc"