File indexing completed on 2024-04-14 14:19:48

0001 /*  -*- C++ -*-
0002  *  Copyright (C) 2003,2005 Thiago Macieira <thiago@kde.org>
0003  *
0004  *
0005  *  Permission is hereby granted, free of charge, to any person obtaining
0006  *  a copy of this software and associated documentation files (the
0007  *  "Software"), to deal in the Software without restriction, including
0008  *  without limitation the rights to use, copy, modify, merge, publish,
0009  *  distribute, sublicense, and/or sell copies of the Software, and to
0010  *  permit persons to whom the Software is furnished to do so, subject to
0011  *  the following conditions:
0012  *
0013  *  The above copyright notice and this permission notice shall be included
0014  *  in all copies or substantial portions of the Software.
0015  *
0016  *  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
0017  *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
0018  *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
0019  *  NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
0020  *  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
0021  *  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
0022  *  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
0023  */
0024 
0025 #ifndef KCLIENTSOCKETBASE_H
0026 #define KCLIENTSOCKETBASE_H
0027 
0028 #include <QObject>
0029 #include <QString>
0030 
0031 #include <kdelibs4support_export.h>
0032 #include "k3socketbase.h"
0033 #include "k3resolver.h"
0034 
0035 namespace KNetwork
0036 {
0037 
0038 class KClientSocketBasePrivate;
0039 /** @class KClientSocketBase k3clientsocketbase.h k3clientsocketbase.h
0040  *  @brief Abstract client socket class.
0041  *
0042  * This class provides the base functionality for client sockets,
0043  * such as, and especially, name resolution and signals.
0044  *
0045  * @note This class is abstract. If you're looking for a normal,
0046  *       client socket class, see KStreamSocket and KBufferedSocket
0047  *
0048  * @author Thiago Macieira <thiago@kde.org>
0049  * @deprecated Use KSocketFactory or KLocalSocket instead
0050  */
0051 class KDELIBS4SUPPORT_DEPRECATED_EXPORT KClientSocketBase : public KActiveSocketBase
0052 {
0053     Q_OBJECT
0054 
0055 public:
0056     /**
0057      * Socket states.
0058      *
0059      * These are the possible states for a KClientSocketBase:
0060      * - Idle: socket is not connected
0061      * - HostLookup: socket is doing host lookup prior to connecting
0062      * - HostFound: name lookup is complete
0063      * - Bound: the socket is locally bound
0064      * - Connecting: socket is attempting connection
0065      * - Open: socket is open
0066      * - Connected (=Open): socket is connected
0067      * - Connection (=Open): yet another name for a connected socket
0068      * - Closing: socket is shutting down
0069      *
0070      * Whenever the socket state changes, the stateChanged(int) signal
0071      * will be emitted.
0072      */
0073     enum SocketState {
0074         Idle,
0075         HostLookup,
0076         HostFound,
0077         Bound,
0078         Connecting,
0079         Open,
0080         Closing,
0081 
0082         Unconnected = Bound,
0083         Connected = Open,
0084         Connection = Open
0085     };
0086 
0087 public:
0088     /**
0089      * Default constructor.
0090      *
0091      * @param parent  the parent QObject object
0092      */
0093     KClientSocketBase(QObject *parent);
0094 
0095     /**
0096      * Destructor.
0097      */
0098     ~KClientSocketBase() override;
0099 
0100     /**
0101      * Returns the current state for this socket.
0102      * @see SocketState
0103      */
0104     SocketState state() const;
0105 
0106 protected:
0107     /**
0108      * Sets the socket options. Reimplemented from KSocketBase.
0109      */
0110     bool setSocketOptions(int opts) override;
0111 
0112 public:
0113     /**
0114      * Returns the internal KResolver object used for
0115      * looking up the peer host name and service.
0116      *
0117      * This can be used to set extra options to the
0118      * lookup process other than the default values, as well
0119      * as obtaining the error codes in case of lookup failure.
0120      */
0121     KResolver &peerResolver() const;
0122 
0123     /**
0124      * Returns the internal list of resolved results for the peer address.
0125      */
0126     const KResolverResults &peerResults() const;
0127 
0128     /**
0129      * Returns the internal KResolver object used for
0130      * looking up the local host name and service.
0131      *
0132      * This can be used to set extra options to the
0133      * lookup process other than the default values, as well
0134      * as obtaining the error codes in case of lookup failure.
0135      */
0136     KResolver &localResolver() const;
0137 
0138     /**
0139      * Returns the internal list of resolved results for the local address.
0140      */
0141     const KResolverResults &localResults() const;
0142 
0143     /**
0144      * Enables or disables name resolution. If this flag is set to true,
0145      * bind() and connect() operations will trigger name lookup
0146      * operations (i.e., converting a hostname into its binary form).
0147      * If the flag is set to false, those operations will instead
0148      * try to convert a string representation of an address without
0149      * attempting name resolution.
0150      *
0151      * This is useful, for instance, when IP addresses are in
0152      * their string representation (such as "1.2.3.4") or come
0153      * from other sources like KSocketAddress.
0154      *
0155      * @param enable  whether to enable
0156      */
0157     void setResolutionEnabled(bool enable);
0158 
0159     /**
0160      * Sets the allowed families for the resolutions.
0161      *
0162      * @param families        the families that we want/accept
0163      * @see KResolver::SocketFamilies for possible values
0164      */
0165     void setFamily(int families);
0166 
0167     /**
0168      * Starts the lookup for peer and local hostnames as
0169      * well as their services.
0170      *
0171      * If the blocking mode for this object is on, this function will
0172      * wait for the lookup results to be available (by calling the
0173      * KResolver::wait() method on the resolver objects).
0174      *
0175      * When the lookup is done, the signal hostFound() will be
0176      * emitted (only once, even if we're doing a double lookup).
0177      * If the lookup failed (for any of the two lookups) the
0178      * gotError() signal will be emitted with the appropriate
0179      * error condition (see KSocketBase::SocketError).
0180      *
0181      * This function returns true on success and false on error. Note that
0182      * this is not the lookup result!
0183      */
0184     virtual bool lookup();
0185 
0186     /**
0187      * Binds this socket to the given nodename and service,
0188      * or use the default ones if none are given.
0189      *
0190      * Upon successful binding, the bound() signal will be
0191      * emitted. If an error is found, the gotError()
0192      * signal will be emitted.
0193      *
0194      * @note Due to the internals of the name lookup and binding
0195      *       mechanism, some (if not most) implementations of this function
0196      *       do not actually bind the socket until the connection
0197      *       is requested (see connect()). They only set the values
0198      *       for future reference.
0199      *
0200      * This function returns true on success.
0201      *
0202      * @param node    the nodename
0203      * @param service the service
0204      */
0205     virtual bool bind(const QString &node = QString(),
0206                       const QString &service = QString()) = 0;
0207 
0208     /**
0209      * Reimplemented from KSocketBase. Connect this socket to this
0210      * specific address.
0211      *
0212      * Unlike bind(const QString&, const QString&) above, this function
0213      * really does bind the socket. No lookup is performed. The bound()
0214      * signal will be emitted.
0215      */
0216     bool bind(const KResolverEntry &address) override;
0217 
0218     /**
0219      * Attempts to connect to a given hostname and service,
0220      * or use the default ones if none are given. If a connection attempt
0221      * is already in progress, check on its state and set the error status
0222      * (NoError or InProgress).
0223      *
0224      * If the blocking mode for this object is on, this function will only
0225      * return when all the resolved peer addresses have been tried or when
0226      * a connection is established.
0227      *
0228      * Upon successfully connecting, the connected() signal
0229      * will be emitted. If an error is found, the gotError()
0230      * signal will be emitted.
0231      *
0232      * @par Note for derived classes:
0233      *      Derived classes must implement this function. The implementation
0234      *      will set the parameters for the lookup (using the peer KResolver
0235      *      object) and call lookup() to start it.
0236      *
0237      * @par
0238      *      The implementation should use the hostFound()
0239      *      signal to be notified of the completion of the lookup process and
0240      *      then proceed to start the connection itself. Care should be taken
0241      *      regarding the value of blocking() flag.
0242      *
0243      * @param node    the nodename (host to connect to)
0244      * @param service the service to connect to
0245      * @param mode        the mode to open the connection in
0246      */
0247     virtual bool connect(const QString &node = QString(),
0248                          const QString &service = QString(),
0249                          OpenMode mode = ReadWrite) = 0;
0250 
0251     /**
0252      * @overload
0253      * Reimplemented from KSocketBase.
0254      */
0255     bool connect(const KResolverEntry &address,
0256                          OpenMode mode = ReadWrite) override;
0257 
0258     /**
0259      * Disconnects the socket.
0260      * Note that not all socket types can disconnect.
0261      */
0262     bool disconnect() override;
0263 
0264     /**
0265      * Opens the socket. Reimplemented from QIODevice.
0266      *
0267      * You should not call this function; instead, use connect()
0268      */
0269     bool open(OpenMode mode) override;
0270 
0271     /**
0272      * Closes the socket. Reimplemented from QIODevice.
0273      *
0274      * The closing of the socket causes the emission of the
0275      * signal closed().
0276      */
0277     void close() override;
0278 
0279     /**
0280      * This call is not supported on unbuffered sockets.
0281      * Reimplemented from QIODevice.
0282      */
0283     virtual bool flush();
0284 
0285     /**
0286      * Returns the number of bytes available on this socket.
0287      * Reimplemented from KSocketBase.
0288      */
0289     qint64 bytesAvailable() const override;
0290 
0291     /**
0292      * Waits for more data. Reimplemented from KSocketBase.
0293      */
0294     qint64 waitForMore(int msecs, bool *timeout = nullptr) override;
0295 
0296     /**
0297      * Returns the local socket address. Reimplemented from KSocketBase.
0298      */
0299     KSocketAddress localAddress() const override;
0300 
0301     /**
0302      * Returns the peer socket address. Reimplemented from KSocketBase.
0303      */
0304     KSocketAddress peerAddress() const override;
0305 
0306     /**
0307      * Returns true if the readyRead signal is set to be emitted.
0308      */
0309     bool emitsReadyRead() const;
0310 
0311     /**
0312      * Enables the emission of the readyRead signal.
0313      * By default, this signal is enabled.
0314      *
0315      * @param enable  whether to enable the signal
0316      */
0317     virtual void enableRead(bool enable);
0318 
0319     /**
0320      * Returns true if the readyWrite signal is set to be emitted.
0321      */
0322     bool emitsReadyWrite() const;
0323 
0324     /**
0325      * Enables the emission of the readyWrite signal.
0326      * By default, this signal is disabled.
0327      *
0328      * @param enable  whether to enable the signal
0329      */
0330     virtual void enableWrite(bool enable);
0331 
0332 protected Q_SLOTS:
0333     // protected slots
0334 
0335     /**
0336      * This slot is connected to the read notifier's signal meaning
0337      * the socket can read more data.
0338      *
0339      * The default implementation only emits the readyRead signal.
0340      *
0341      * Override if your class requires processing of incoming
0342      * data.
0343      */
0344     virtual void slotReadActivity();
0345 
0346     /**
0347      * This slot is connected to the write notifier's signal
0348      * meaning the socket can write more data.
0349      *
0350      * The default implementation only emits the readyWrite signal.
0351      *
0352      * Override if your class writes data from another source
0353      * (like a buffer).
0354      */
0355     virtual void slotWriteActivity();
0356 
0357 private Q_SLOTS:
0358     void lookupFinishedSlot();
0359 
0360 Q_SIGNALS:
0361     /**
0362      * This signal is emitted whenever the socket state changes.
0363      *
0364      * Note: do not delete this object inside the slot called by this
0365      * signal.
0366      *
0367      * @param newstate    the new state of the socket object
0368      */
0369     void stateChanged(int newstate);
0370 
0371     /**
0372      * This signal is emitted when this object finds an error.
0373      * The @p code parameter contains the error code that can
0374      * also be found by calling error().
0375      */
0376     void gotError(int code);
0377 
0378     /**
0379      * This signal is emitted when the lookup is successfully completed.
0380      */
0381     void hostFound();
0382 
0383     /**
0384      * This signal is emitted when the socket successfully binds
0385      * to an address.
0386      *
0387      * @param local   the local address we bound to
0388      */
0389     void bound(const KNetwork::KResolverEntry &local);
0390 
0391     /**
0392      * This signal is emitted when the socket is about to connect
0393      * to an address (but before doing so).
0394      *
0395      * The @p skip parameter can be used to make the loop skip this address.
0396      * Its value is initially false: change it to true if you want to
0397      * skip the current address (as given by @p remote).
0398      *
0399      * This function is also useful if one wants to reset the timeout.
0400      *
0401      * @param remote  the address we're about to connect to
0402      * @param skip    set to true if you want to skip this address
0403      * @note if the connection is successful, the connected() signal will be
0404      *       emitted.
0405      */
0406     void aboutToConnect(const KNetwork::KResolverEntry &remote, bool &skip);
0407 
0408     /**
0409      * This socket is emitted when the socket successfully connects
0410      * to a remote address.
0411      *
0412      * @param remote  the remote address we did connect to
0413      */
0414     void connected(const KNetwork::KResolverEntry &remote);
0415 
0416     /**
0417      * This signal is emitted when the socket completes the
0418      * closing/shut down process.
0419      */
0420     void closed();
0421 
0422 #if 0
0423     // QIODevice already has this
0424     /**
0425      * This signal is emitted whenever the socket is ready for
0426      * reading -- i.e., there is data to be read in the buffers.
0427      * The subsequent read operation is guaranteed to be non-blocking.
0428      *
0429      * You can toggle the emission of this signal with the enableRead()
0430      * function. This signal is by default enabled.
0431      */
0432     void readyRead();
0433 #endif
0434 
0435     /**
0436      * This signal is emitted whenever the socket is ready for
0437      * writing -- i.e., whenever there's space available in the buffers
0438      * to receive more data. The subsequent write operation is
0439      * guaranteed to be non-blocking.
0440      *
0441      * You can toggle the emission of this signal with the enableWrite()
0442      * function. This signal is by default disabled. You will
0443      * want to disable this signal after the first reception, since
0444      * it'll probably fire at every event loop.
0445      */
0446     void readyWrite();
0447 
0448 protected:
0449     /**
0450      * Reads data from a socket. Reimplemented from KSocketBase.
0451      */
0452     qint64 readData(char *data, qint64 maxlen, KSocketAddress *from) override;
0453 
0454     /**
0455      * Peeks data from the socket. Reimplemented from KSocketBase.
0456      */
0457     qint64 peekData(char *data, qint64 maxlen, KSocketAddress *from) override;
0458 
0459     /**
0460      * @overload
0461      * Writes data to the socket. Reimplemented from KSocketBase.
0462      */
0463     qint64 writeData(const char *data, qint64 len, const KSocketAddress *to) override;
0464 
0465     /**
0466      * Sets the socket state to @p state. This function does not
0467      * emit the stateChanged() signal.
0468      */
0469     void setState(SocketState state);
0470 
0471     /**
0472      * This function is called by setState() whenever the state
0473      * changes. You should override it if you need to specify any
0474      * actions to be done when the state changes.
0475      *
0476      * The default implementation acts for these states only:
0477      *  - Connected: it sets up the socket notifiers to fire readyRead and
0478      *               readyWrite signals.
0479      */
0480     virtual void stateChanging(SocketState newState);
0481 
0482     /**
0483      * Convenience function to set this object's error code to match
0484      * that of the socket device.
0485      */
0486     void copyError();
0487 
0488 private:
0489     KClientSocketBase(const KClientSocketBase &);
0490     KClientSocketBase &operator=(const KClientSocketBase &);
0491 
0492     KClientSocketBasePrivate *const d;
0493 };
0494 
0495 }               // namespace KNetwork
0496 
0497 #endif