27 #include <tqsocketnotifier.h>
30 #include "tdesocketaddress.h"
31 #include "kresolver.h"
32 #include "tdesocketbase.h"
33 #include "tdesocketdevice.h"
34 #include "kstreamsocket.h"
35 #include "kbufferedsocket.h"
36 #include "kserversocket.h"
40 class KNetwork::TDEServerSocketPrivate
46 enum { None, LookupDone, Bound, Listening } state;
50 bool bindWhenFound : 1, listenWhenBound : 1, useTDEBufferedSocket : 1;
52 TDEServerSocketPrivate()
53 : state(None), timeout(0), bindWhenFound(false), listenWhenBound(false),
54 useTDEBufferedSocket(true)
56 resolver.
setFlags(KResolver::Passive);
57 resolver.
setFamily(KResolver::KnownFamily);
62 : TQObject(parent, name), d(new TDEServerSocketPrivate)
65 this, TQT_SLOT(lookupFinishedSlot()));
69 : TQObject(parent, name), d(new TDEServerSocketPrivate)
72 this, TQT_SLOT(lookupFinishedSlot()));
73 d->resolver.setServiceName(service);
77 TQObject* parent,
const char* name)
78 : TQObject(parent, name), d(new TDEServerSocketPrivate)
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 <= TDEServerSocketPrivate::LookupDone)
129 d->state = TDEServerSocketPrivate::None;
134 d->resolver.setNodeName(node);
135 d->resolver.setServiceName(service);
136 d->resolverResults.empty();
137 if (d->state <= TDEServerSocketPrivate::LookupDone)
138 d->state = TDEServerSocketPrivate::None;
149 if (d->resolver.isRunning() && !
blocking())
152 if (d->state >= TDEServerSocketPrivate::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 = TDEServerSocketPrivate::Bound;
210 if (d->state >= TDEServerSocketPrivate::Bound)
213 if (d->state < TDEServerSocketPrivate::LookupDone)
217 d->bindWhenFound =
true;
219 if (d->state >= TDEServerSocketPrivate::Bound)
220 d->bindWhenFound =
false;
239 if (d->state == TDEServerSocketPrivate::Listening)
242 d->backlog = backlog;
244 if (d->state < TDEServerSocketPrivate::Bound)
248 d->listenWhenBound =
true;
251 d->listenWhenBound =
false;
255 if (d->state < TDEServerSocketPrivate::Bound)
260 d->listenWhenBound =
false;
263 if (d->state < TDEServerSocketPrivate::Listening)
272 if (d->resolver.isRunning())
273 d->resolver.cancel(
false);
274 d->state = TDEServerSocketPrivate::None;
280 d->useTDEBufferedSocket = enable;
285 if (d->state < TDEServerSocketPrivate::Listening)
322 if (d->useTDEBufferedSocket)
331 streamsocket->
setState(KStreamSocket::Connected);
332 streamsocket->setFlags(IO_Sequential | IO_Raw | IO_ReadWrite | IO_Open | IO_Async);
347 void TDEServerSocket::lookupFinishedSlot()
349 if (d->resolver.isRunning() || d->state > TDEServerSocketPrivate::LookupDone)
352 if (d->resolver.status() < 0)
356 d->bindWhenFound = d->listenWhenBound =
false;
357 d->state = TDEServerSocketPrivate::None;
362 d->resolverResults = d->resolver.results();
363 d->state = TDEServerSocketPrivate::LookupDone;
366 if (d->bindWhenFound)
375 bool TDEServerSocket::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 TDEServerSocket::doListen()
406 TQObject::connect(
socketDevice()->readNotifier(), TQT_SIGNAL(activated(
int)),
408 d->state = TDEServerSocketPrivate::Listening;
413 #include "kserversocket.moc"
~TDEServerSocket()
Destructor.
A generic socket address.
virtual void setSocketDevice(TDESocketDevice *device)
Sets the socket implementation to be used on this socket.
void hostFound()
This signal is emitted when the lookup is successfully completed.
virtual bool setSocketOptions(int opts)
Sets the socket options.
virtual TDESocketAddress externalAddress() const
Returns this socket's externally visible local address.
virtual TDESocketAddress externalAddress() const
Returns this socket's externally-visible address if know.
bool blocking() const
Retrieves this socket's blocking mode.
Abstract class for active sockets.
virtual TDESocketDevice * accept()
Accepts a new incoming connection.
void closed()
This signal is emitted when the socket completes the closing/shut down process.
TQMutex * mutex() const
Returns the internal mutex for this class.
void setFamily(int families)
Sets the allowed socket families.
Name and service resolution class.
void setAcceptBuffered(bool enable)
Toggles whether the accepted socket will be buffered or not.
Low-level socket functionality.
virtual bool listen(int backlog=5)
Puts this socket into listening mode.
void setAddress(const TQString &service)
Sets the address on which we will listen.
TDEServerSocket(TQObject *parent=0L, const char *name=0L)
Default constructor.
SocketError error() const
Retrieves the socket error code.
KResolver & resolver() const
Returns the internal KResolver object used for looking up the host name and service.
Name and service resolution results.
void bound(const KResolverEntry &local)
This signal is emitted when the socket successfully binds to an address.
A namespace to store all networking-related (socket) classes.
const KResolverResults & resolverResults() const
Returns the internal list of resolved results for the binding address.
void gotError(int code)
This signal is emitted when this object finds an error.
virtual TDESocketAddress localAddress() const
Returns this socket's local address.
void setTimeout(int msecs)
Sets the timeout for accepting.
void setState(SocketState state)
Sets the socket state to state.
TDESocketDevice * socketDevice() const
Retrieves the socket implementation used on this socket.
virtual KActiveSocketBase * accept()
Accepts one incoming connection and return the associated, open socket.
virtual bool lookup()
Starts the lookup for peer and local hostnames as well as their services.
virtual void close()
Closes this socket.
void setResolutionEnabled(bool enable)
Enables or disables name resolution.
void setFamily(int families)
Sets the allowed families for the resolutions.
virtual bool setSocketOptions(int opts)
This implementation sets the options on the socket.
void setError(SocketError error)
Sets the socket's error code.
int setFlags(int flags)
Sets the flags.
virtual bool bind()
Binds the socket to the addresses previously set with setAddress.
virtual bool setSocketOptions(int opts)
Set the given socket options.
virtual void close()
Closes the socket.
void copyError()
Convenience function to set this object's error code to match that of the socket device.
void readyAccept()
This signal is emitted whenever the socket is ready for accepting – i.e., there is at least one conn...
virtual TDESocketAddress localAddress() const
Returns this socket's local address.