diff options
Diffstat (limited to 'kdecore/network/kbufferedsocket.h')
-rw-r--r-- | kdecore/network/kbufferedsocket.h | 253 |
1 files changed, 253 insertions, 0 deletions
diff --git a/kdecore/network/kbufferedsocket.h b/kdecore/network/kbufferedsocket.h new file mode 100644 index 000000000..b0b99f8d1 --- /dev/null +++ b/kdecore/network/kbufferedsocket.h @@ -0,0 +1,253 @@ +/* -*- C++ -*- + * Copyright (C) 2003 Thiago Macieira <thiago@kde.org> + * + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef KBUFFEREDSOCKET_H +#define KBUFFEREDSOCKET_H + +#include <qobject.h> +#include <qcstring.h> +#include <qvaluelist.h> +#include "kstreamsocket.h" +#include <kdelibs_export.h> + +class KIOBufferBase; + +namespace KNetwork { + +class KBufferedSocketPrivate; +/** @class KBufferedSocket kbufferedsocket.h kbufferedsocket.h + * @brief Buffered stream sockets. + * + * This class allows the user to create and operate buffered stream sockets + * such as those used in most Internet connections. This class is + * also the one that resembles the most to the old @ref QSocket + * implementation. + * + * Objects of this type operate only in non-blocking mode. A call to + * setBlocking(true) will result in an error. + * + * @note Buffered sockets only make sense if you're using them from + * the main (event-loop) thread. This is actually a restriction + * imposed by Qt's QSocketNotifier. If you want to use a socket + * in an auxiliary thread, please use KStreamSocket. + * + * @see KNetwork::KStreamSocket, KNetwork::KServerSocket + * @author Thiago Macieira <thiago@kde.org> + */ +class KDECORE_EXPORT KBufferedSocket: public KStreamSocket +{ + Q_OBJECT +public: + /** + * Default constructor. + * + * @param node destination host + * @param service destination service to connect to + * @param parent the parent object for this object + * @param name the internal name for this object + */ + KBufferedSocket(const QString& node = QString::null, const QString& service = QString::null, + QObject* parent = 0L, const char *name = 0L); + + /** + * Destructor. + */ + virtual ~KBufferedSocket(); + + /** + * Be sure to catch new devices. + */ + virtual void setSocketDevice(KSocketDevice* device); + +protected: + /** + * Buffered sockets can only operate in non-blocking mode. + */ + virtual bool setSocketOptions(int opts); + +public: + /** + * Closes the socket for new data, but allow data that had been buffered + * for output with @ref writeBlock to be still be written. + * + * @sa closeNow + */ + virtual void close(); + + /** + * Make use of the buffers. + */ + virtual Q_LONG bytesAvailable() const; + + /** + * Make use of buffers. + */ + virtual Q_LONG waitForMore(int msecs, bool *timeout = 0L); + + /** + * Reads data from the socket. Make use of buffers. + */ + virtual Q_LONG readBlock(char *data, Q_ULONG maxlen); + + /** + * @overload + * Reads data from a socket. + * + * The @p from parameter is always set to @ref peerAddress() + */ + virtual Q_LONG readBlock(char *data, Q_ULONG maxlen, KSocketAddress& from); + + /** + * Peeks data from the socket. + */ + virtual Q_LONG peekBlock(char *data, Q_ULONG maxlen); + + /** + * @overload + * Peeks data from the socket. + * + * The @p from parameter is always set to @ref peerAddress() + */ + virtual Q_LONG peekBlock(char *data, Q_ULONG maxlen, KSocketAddress &from); + + /** + * Writes data to the socket. + */ + virtual Q_LONG writeBlock(const char *data, Q_ULONG len); + + /** + * @overload + * Writes data to the socket. + * + * The @p to parameter is discarded. + */ + virtual Q_LONG writeBlock(const char *data, Q_ULONG len, const KSocketAddress& to); + + /** + * Catch changes. + */ + virtual void enableRead(bool enable); + + /** + * Catch changes. + */ + virtual void enableWrite(bool enable); + + /** + * Sets the use of input buffering. + */ + void setInputBuffering(bool enable); + + /** + * Retrieves the input buffer object. + */ + KIOBufferBase* inputBuffer(); + + /** + * Sets the use of output buffering. + */ + void setOutputBuffering(bool enable); + + /** + * Retrieves the output buffer object. + */ + KIOBufferBase* outputBuffer(); + + /** + * Returns the length of the output buffer. + */ + virtual Q_ULONG bytesToWrite() const; + + /** + * Closes the socket and discards any output data that had been buffered + * with @ref writeBlock but that had not yet been written. + * + * @sa close + */ + virtual void closeNow(); + + /** + * Returns true if a line can be read with @ref readLine + */ + bool canReadLine() const; + + /** + * Reads a line of data from the socket buffers. + */ + QCString readLine(); + + // KDE4: make virtual, add timeout to match the Qt4 signature + // and move to another class up the hierarchy + /** + * Blocks until the connection is either established, or completely + * failed. + */ + void waitForConnect(); + +protected: + /** + * Catch connection to clear the buffers + */ + virtual void stateChanging(SocketState newState); + +protected slots: + /** + * Slot called when there's read activity. + */ + virtual void slotReadActivity(); + + /** + * Slot called when there's write activity. + */ + virtual void slotWriteActivity(); + +signals: + /** + * This signal is emitted whenever data is written. + */ + void bytesWritten(int bytes); + +private: + KBufferedSocket(const KBufferedSocket&); + KBufferedSocket& operator=(const KBufferedSocket&); + + KBufferedSocketPrivate *d; + +public: + // KDE4: remove this function + /** + * @deprecated + * Closes the socket. + * + * This function is provided to ease porting from KExtendedSocket, + * which required a call to reset() in order to be able to connect again + * using the same device. This is not necessary in KBufferedSocket any more. + */ + inline void reset() + { closeNow(); } +}; + +} // namespace KNetwork + +#endif |