diff options
Diffstat (limited to 'kdecore/ksock.h')
-rw-r--r-- | kdecore/ksock.h | 346 |
1 files changed, 346 insertions, 0 deletions
diff --git a/kdecore/ksock.h b/kdecore/ksock.h new file mode 100644 index 000000000..566d23236 --- /dev/null +++ b/kdecore/ksock.h @@ -0,0 +1,346 @@ +/* + * This file is part of the KDE libraries + * Copyright (C) 1997 Torben Weis (weis@kde.org) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ +#ifndef KSOCK_H +#define KSOCK_H + +#include "kdelibs_export.h" + +#ifdef Q_OS_UNIX + +#include <qobject.h> +#include <sys/types.h> +// we define STRICT_ANSI to get rid of some warnings in glibc +#ifndef __STRICT_ANSI__ +#define __STRICT_ANSI__ +#define _WE_DEFINED_IT_ +#endif +#include <sys/socket.h> +#ifdef _WE_DEFINED_IT_ +#undef __STRICT_ANSI__ +#undef _WE_DEFINED_IT_ +#endif + +#include <sys/un.h> + +#include <netinet/in.h> +class QSocketNotifier; + +#ifdef KSOCK_NO_BROKEN +// This is here for compatibility with old applications still using the constants +// Never use them in new programs + +// Here are a whole bunch of hackish macros that allow one to +// get at the correct member of ksockaddr_in +// But since ksockaddr_in is IPv4-only, and deprecated... + +typedef sockaddr_in ksockaddr_in; +#define get_sin_addr(x) x.sin_addr +#define get_sin_port(x) x.sin_port +#define get_sin_family(x) x.sin_family +#define get_sin_paddr(x) x->sin_addr +#define get_sin_pport(x) x->sin_port +#define get_sin_pfamily(x) x->sin_family +#endif + +#define KSOCK_DEFAULT_DOMAIN PF_INET + +class KSocketPrivate; +class KServerSocketPrivate; + +/** @deprecated + * You can connect this socket to any Internet address. + * + * This class is deprecated and will be removed in the future. For new + * programs, please use KExtendedSocket class. + * + * The socket gives you three signals: When ready for reading, + * ready for writing or if the connection is broken. + * Using socket() you get a file descriptor + * which you can use with the usual UNIX function like write() or + * read(). + * If you have already such a socket identifier you can construct a KSocket + * on this identifier. + * + * If socket() delivers a value of -1 or less, the connection + * was not successful. + * + * @author Torben Weis <weis@uni-frankfurt.de> + * @short A TCP/IP client socket. + */ +class KDECORE_EXPORT KSocket : public QObject +{ + Q_OBJECT +public: + /** + * Constructs a KSocket with the provided file descriptor. + * @param _sock The file descriptor to use. + */ + KSocket( int _sock ) KDE_DEPRECATED; + /** + * Creates a socket and connects to a host. + * @param _host The remote host to which to connect. + * @param _port The port on the remote host. + * @param timeOut The number of seconds waiting for connect (default 30). + */ + KSocket( const char *_host, unsigned short int _port, int timeOut = 30) KDE_DEPRECATED; + + /** + * Connects to a UNIX domain socket. + * @param _path The filename of the socket. + */ + KSocket( const char * _path ) KDE_DEPRECATED; + + /** + * Destructor. Closes the socket if it is still open. + */ + virtual ~KSocket(); + + /** + * Returns a file descriptor for this socket. + * @return the file descriptor, or -1 when an error occurred. + */ + int socket() const { return sock; } + + /** + * Enables the socket for reading. + * + * If you enable read mode, the socket will emit the signal + * readEvent() whenever there is something to read out of this + * socket. + * @param enable true to enable reading signals + */ + void enableRead( bool enable ); + + /** + * Enables the socket for writing. + * + * If you enable write mode, the socket will emit the signal + * writeEvent() whenever the socket is ready for writing. + * + * Warning: If you forget to call enableWrite(false) when you are + * not ready to send data, you will get lots of writeEvent() signals, + * in the order of thousands a second ! + * @param enable true to enable writing signals + */ + void enableWrite( bool enable ); + +#ifdef KSOCK_NO_BROKEN + // BCI: remove in libkdecore.so.4 + /** + * Return address. + * This function is dumb. Don't ever use it + * if you need the peer address of this socket, use KExtendedSocket::peerAddress(int) + * instead + * @deprecated + */ + unsigned long ipv4_addr() KDE_DEPRECATED; + + // BCI: remove in libkdecore.so.4 + /** + * A small wrapper around gethostbyname() and such. + * Don't use this in new programs. Use KExtendedSocket::lookup + * @deprecated + */ + static bool initSockaddr(ksockaddr_in *server_name, const char *hostname, unsigned short int port, int domain = PF_INET) KDE_DEPRECATED; +#endif + +signals: + /** + * Data has arrived for reading. + * + * This signal will only be raised if enableRead( @p true ) was called + * first. + * @param s the KSocket that triggered the event + */ + void readEvent( KSocket *s ); + + /** + * Socket is ready for writing. + * + * This signal will only be raised if enableWrite( @p true ) was + * called first. + * + * Warning: If you forget to call enableWrite(false) when you are + * not ready to send data, you will get lots of writeEvent() signals, + * in the order of thousands a second ! + * @param s the KSocket that triggered the event + */ + void writeEvent( KSocket *s ); + + /** + * Raised when the connection is broken. + * @param s the KSocket that triggered the event + */ + void closeEvent( KSocket *s ); + +public slots: + /** + * Connected to the writeNotifier. + * + * Called when + * the socket is ready for writing. + * @param x ignored + */ + void slotWrite( int x); + + /** + * Connected to the readNotifier. + * + * Called when + * the socket is ready for reading. + * @param x ignored + */ + void slotRead( int x ); + +protected: + bool connect( const QString& _host, unsigned short int _port, int timeout = 0 ); + bool connect( const char *_path ); + + /****************************************************** + * The file descriptor for this socket. sock may be -1. + * This indicates that it is not connected. + */ + int sock; + +private: + KSocket(const KSocket&); + KSocket& operator=(const KSocket&); + + KSocketPrivate *d; + +}; + + +/** + * @short Monitors a port for incoming TCP/IP connections. + * + * @deprecated + * This class is deprecated and will be removed in the future. + * Please use the classes in KNetwork for new programs. + * In special, this class is replaced by KNetwork::KStreamSocket + * and KNetwork::KServerSocket. + * + * You can use a KServerSocket to listen on a port for incoming + * connections. When a connection arrived in the port, a KSocket + * is created and the signal accepted is raised. Make sure you + * always connect to this signal. If you don't the ServerSocket will + * create new KSocket's and no one will delete them! + * + * If socket() is -1 or less the socket was not created properly. + * + * @author Torben Weis <weis@stud.uni-frankfurt.de> +*/ +class KDECORE_EXPORT KServerSocket : public QObject +{ + Q_OBJECT +public: + /** + * Constructor. + * @param _port the port number to monitor for incoming connections. + * @param _bind if false you need to call bindAndListen yourself. + * This gives you the opportunity to set options on the + * socket. + */ + KServerSocket( unsigned short int _port, bool _bind = true ); + + /** + * Creates a UNIX domain server socket. + * @param _path path used for the socket. + * @param _bind if false you need to call bindAndListen yourself. + * This gives you the opportunity to set options on the + * socket. + */ + KServerSocket( const char *_path, bool _bind = true); + + /** + * Destructor. Closes the socket if it was not already closed. + */ + virtual ~KServerSocket(); + + /** + * Binds the socket and start listening. This should only be called + * once when the constructor was called with _bind false. + * On error the socket will be closed. + * @return true on success. false on error. + */ + bool bindAndListen(); + + /** + * Returns the file descriptor associated with the socket. + * @return the file descriptor, -1 when an error occurred during + * construction or bindAndListen + */ + int socket() const { return sock; } + + /** + * Returns the port number which is being monitored. + * @return the port number + */ + unsigned short int port(); + +#ifdef KSOCK_NO_BROKEN + // BCI: remove in libkdecore.so.4 + /** + * The address. + * This is dumb. Don't use it + * Refer to KExtendedSocket::localAddress(int) + * @deprecated + */ + unsigned long ipv4_addr(); +#endif + +public slots: + /** + * Called when someone connected to our port. + */ + virtual void slotAccept( int ); // why is this virtual? + +signals: + /** + * A connection has been accepted. + * It is your task to delete the KSocket if it is no longer needed. + * + * WARNING: this signal is always emitted, even if you don't connect + * anything to it. That would mean memory loss, because the KSockets + * created go to oblivion. + * @param s the socket that accepted + */ + void accepted( KSocket*s ); + +protected: + bool init( unsigned short int ); + bool init( const char *_path ); + + /** + * The file descriptor for this socket. sock may be -1. + * This indicates that it is not connected. + */ + int sock; + +private: + KServerSocket(const KServerSocket&); + KServerSocket& operator=(const KServerSocket&); + + KServerSocketPrivate *d; +}; + +#endif //Q_OS_UNIX + +#endif |