KDECore
ksocketbase.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifdef socket
00029 #undef socket
00030 #endif
00031
00032 #ifdef bind
00033 #undef bind
00034 #endif
00035
00036 #ifdef listen
00037 #undef listen
00038 #endif
00039
00040 #ifdef connect
00041 #undef connect
00042 #endif
00043
00044 #ifdef accept
00045 #undef accept
00046 #endif
00047
00048 #ifdef getpeername
00049 #undef getpeername
00050 #endif
00051
00052 #ifdef getsockname
00053 #undef getsockname
00054 #endif
00055
00056 #ifndef KSOCKETBASE_H
00057 #define KSOCKETBASE_H
00058
00059 #include <qiodevice.h>
00060 #include <qstring.h>
00061
00062 #include "ksocketaddress.h"
00063 #include <kdelibs_export.h>
00064
00065
00066
00067
00068
00069
00070
00071
00072 #define IO_ListenError (IO_UnspecifiedError+1)
00073 #define IO_AcceptError (IO_UnspecifiedError+2)
00074 #define IO_LookupError (IO_UnspecifiedError+3)
00075 #define IO_SocketCreateError (IO_UnspecifiedError+4)
00076 #define IO_BindError (IO_UnspecifiedError+5)
00077
00078 class QMutex;
00079
00080 namespace KNetwork {
00081
00082 class KResolverEntry;
00083 class KSocketDevice;
00084
00085 class KSocketBasePrivate;
00097 class KDECORE_EXPORT KSocketBase
00098 {
00099 public:
00118 enum SocketOptions
00119 {
00120 Blocking = 0x01,
00121 AddressReuseable = 0x02,
00122 IPv6Only = 0x04,
00123 Keepalive = 0x08,
00124 Broadcast = 0x10
00125 };
00126
00152 enum SocketError
00153 {
00154 NoError = 0,
00155 LookupFailure,
00156 AddressInUse,
00157 AlreadyCreated,
00158 AlreadyBound,
00159 AlreadyConnected,
00160 NotConnected,
00161 NotBound,
00162 NotCreated,
00163 WouldBlock,
00164 ConnectionRefused,
00165 ConnectionTimedOut,
00166 InProgress,
00167 NetFailure,
00168 NotSupported,
00169 Timeout,
00170 UnknownError,
00171 RemotelyDisconnected
00172 };
00173
00174 public:
00178 KSocketBase();
00179
00183 virtual ~KSocketBase();
00184
00185
00186
00187
00188
00189
00190 protected:
00204 virtual bool setSocketOptions(int opts);
00205
00215 virtual int socketOptions() const;
00216
00217 public:
00233 virtual bool setBlocking(bool enable);
00234
00241 bool blocking() const;
00242
00257 virtual bool setAddressReuseable(bool enable);
00258
00265 bool addressReuseable() const;
00266
00282 virtual bool setIPv6Only(bool enable);
00283
00290 bool isIPv6Only() const;
00291
00303 virtual bool setBroadcast(bool enable);
00304
00311 bool broadcast() const;
00312
00319 KSocketDevice* socketDevice() const;
00320
00334 virtual void setSocketDevice(KSocketDevice* device);
00335
00357 int setRequestedCapabilities(int add, int remove = 0);
00358
00359 protected:
00364 bool hasDevice() const;
00365
00371 void setError(SocketError error);
00372
00373 public:
00378 SocketError error() const;
00379
00383 inline QString errorString() const
00384 { return errorString(error()); }
00385
00401 QMutex* mutex() const;
00402
00403 public:
00409 static QString errorString(SocketError code);
00410
00419 static bool isFatalError(int code);
00420
00421 private:
00424 void unsetSocketDevice();
00425
00426 KSocketBase(const KSocketBase&);
00427 KSocketBase& operator =(const KSocketBase&);
00428
00429 KSocketBasePrivate *d;
00430
00431 friend class KSocketDevice;
00432 };
00433
00443 class KDECORE_EXPORT KActiveSocketBase: public QIODevice, virtual public KSocketBase
00444 {
00445 public:
00449 KActiveSocketBase();
00450
00454 virtual ~KActiveSocketBase();
00455
00466 virtual bool bind(const KResolverEntry& address) = 0;
00467
00484 virtual bool connect(const KResolverEntry& address) = 0;
00485
00501 virtual bool disconnect() = 0;
00502
00507 virtual Offset size() const
00508 { return 0; }
00509
00514 virtual Offset at() const
00515 { return 0; }
00516
00521 virtual bool at(Offset)
00522 { return false; }
00523
00528 virtual bool atEnd() const
00529 { return true; }
00530
00535 virtual Q_LONG bytesAvailable() const = 0;
00536
00548 virtual Q_LONG waitForMore(int msecs, bool *timeout = 0L) = 0;
00549
00556 virtual Q_LONG readBlock(char *data, Q_ULONG len) = 0;
00557
00569 virtual Q_LONG readBlock(char *data, Q_ULONG maxlen, KSocketAddress& from) = 0;
00570
00582 virtual Q_LONG peekBlock(char *data, Q_ULONG maxlen) = 0;
00583
00596 virtual Q_LONG peekBlock(char *data, Q_ULONG maxlen, KSocketAddress& from) = 0;
00597
00604 virtual Q_LONG writeBlock(const char *data, Q_ULONG len) = 0;
00605
00617 virtual Q_LONG writeBlock(const char *data, Q_ULONG len, const KSocketAddress& to) = 0;
00618
00623 virtual int getch();
00624
00629 virtual int putch(int ch);
00630
00635 virtual int ungetch(int)
00636 { return -1; }
00637
00641 virtual KSocketAddress localAddress() const = 0;
00642
00648 virtual KSocketAddress peerAddress() const = 0;
00649
00650
00651
00652 #if 0
00653
00656 virtual KSocketAddress externalAddress() const = 0;
00657 #endif
00658
00659 protected:
00666 void setError(int status, SocketError error);
00667
00671 void resetError();
00672 };
00673
00683 class KDECORE_EXPORT KPassiveSocketBase: virtual public KSocketBase
00684 {
00685 public:
00689 KPassiveSocketBase();
00690
00694 virtual ~KPassiveSocketBase();
00695
00706 virtual bool bind(const KResolverEntry& address) = 0;
00707
00722 virtual bool listen(int backlog) = 0;
00723
00728 virtual void close() = 0;
00729
00743 virtual KActiveSocketBase* accept() = 0;
00744
00748 virtual KSocketAddress localAddress() const = 0;
00749
00753 virtual KSocketAddress externalAddress() const = 0;
00754
00755 private:
00756 KPassiveSocketBase(const KPassiveSocketBase&);
00757 KPassiveSocketBase& operator = (const KPassiveSocketBase&);
00758 };
00759
00760 }
00761
00762 #endif