27 #include <tqsocketnotifier.h>
30 #include "ksocketaddress.h"
31 #include "kresolver.h"
32 #include "ksocketbase.h"
33 #include "ksocketdevice.h"
34 #include "kstreamsocket.h"
35 #include "kbufferedsocket.h"
36 #include "kserversocket.h"
38 using namespace KNetwork;
40 class KNetwork::KServerSocketPrivate
46 enum { None, LookupDone, Bound, Listening } state;
50 bool bindWhenFound : 1, listenWhenBound : 1, useKBufferedSocket : 1;
52 KServerSocketPrivate()
53 : state(None), timeout(0), bindWhenFound(false), listenWhenBound(false),
54 useKBufferedSocket(true)
56 resolver.setFlags(KResolver::Passive);
57 resolver.setFamily(KResolver::KnownFamily);
62 : TQObject(parent, name), d(new KServerSocketPrivate)
65 this, TQT_SLOT(lookupFinishedSlot()));
69 : TQObject(parent, name), d(new KServerSocketPrivate)
72 this, TQT_SLOT(lookupFinishedSlot()));
73 d->resolver.setServiceName(service);
77 TQObject* parent,
const char* name)
78 : TQObject(parent, name), d(new KServerSocketPrivate)
81 this, TQT_SLOT(lookupFinishedSlot()));
93 TQMutexLocker locker(
mutex());
107 return d->resolverResults;
113 d->resolver.setFlags(d->resolver.flags() & ~
KResolver::NoResolve);
115 d->resolver.setFlags(d->resolver.flags() | KResolver::NoResolve);
120 d->resolver.setFamily(families);
125 d->resolver.setNodeName(TQString::null);
126 d->resolver.setServiceName(service);
127 d->resolverResults.empty();
128 if (d->state <= KServerSocketPrivate::LookupDone)
129 d->state = KServerSocketPrivate::None;
134 d->resolver.setNodeName(node);
135 d->resolver.setServiceName(service);
136 d->resolverResults.empty();
137 if (d->state <= KServerSocketPrivate::LookupDone)
138 d->state = KServerSocketPrivate::None;
149 if (d->resolver.isRunning() && !
blocking())
152 if (d->state >= KServerSocketPrivate::LookupDone)
156 if (d->resolver.serviceName().isNull() &&
157 !d->resolver.nodeName().isNull())
158 d->resolver.setServiceName(TQString::fromLatin1(
""));
166 if (d->resolver.status() <= 0)
188 d->state = KServerSocketPrivate::Bound;
210 if (d->state >= KServerSocketPrivate::Bound)
213 if (d->state < KServerSocketPrivate::LookupDone)
217 d->bindWhenFound =
true;
219 if (d->state >= KServerSocketPrivate::Bound)
220 d->bindWhenFound =
false;
239 if (d->state == KServerSocketPrivate::Listening)
242 d->backlog = backlog;
244 if (d->state < KServerSocketPrivate::Bound)
248 d->listenWhenBound =
true;
251 d->listenWhenBound =
false;
255 if (d->state < KServerSocketPrivate::Bound)
260 d->listenWhenBound =
false;
263 if (d->state < KServerSocketPrivate::Listening)
272 if (d->resolver.isRunning())
273 d->resolver.cancel(
false);
274 d->state = KServerSocketPrivate::None;
280 d->useKBufferedSocket = enable;
285 if (d->state < KServerSocketPrivate::Listening)
322 if (d->useKBufferedSocket)
331 streamsocket->
setState(KStreamSocket::Connected);
332 streamsocket->setFlags(IO_Sequential | IO_Raw | IO_ReadWrite | IO_Open | IO_Async);
347 void KServerSocket::lookupFinishedSlot()
349 if (d->resolver.isRunning() || d->state > KServerSocketPrivate::LookupDone)
352 if (d->resolver.status() < 0)
356 d->bindWhenFound = d->listenWhenBound =
false;
357 d->state = KServerSocketPrivate::None;
362 d->resolverResults = d->resolver.results();
363 d->state = KServerSocketPrivate::LookupDone;
366 if (d->bindWhenFound)
375 bool KServerSocket::doBind()
377 d->bindWhenFound =
false;
380 KResolverResults::ConstIterator it = d->resolverResults.begin();
381 for ( ; it != d->resolverResults.end(); ++it)
384 if (d->listenWhenBound)
396 bool KServerSocket::doListen()
406 TQObject::connect(
socketDevice()->readNotifier(), TQT_SIGNAL(activated(
int)),
408 d->state = KServerSocketPrivate::Listening;
413 #include "kserversocket.moc"