00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef KEXTSOCK_H
00021 #define KEXTSOCK_H
00022
00023 #include <sys/time.h>
00024
00025 #include <qstring.h>
00026 #include <qptrlist.h>
00027 #include <qiodevice.h>
00028
00029 #include "kbufferedio.h"
00030 #include "ksockaddr.h"
00031
00032
00033 struct addrinfo;
00034 struct kde_addrinfo;
00035 class KAddressInfo;
00036 class QSocketNotifier;
00037
00038
00039
00040
00041
00042
00043
00044
00045 #define IO_ListenError (IO_UnspecifiedError+1)
00046 #define IO_AcceptError (IO_UnspecifiedError+2)
00047 #define IO_LookupError (IO_UnspecifiedError+3)
00048
00049 class KExtendedSocketPrivate;
00083 class KExtendedSocket: public KBufferedIO
00084 {
00085 Q_OBJECT
00086
00087 public:
00091 enum Flags
00092 {
00093
00094
00095
00096
00097
00098 anySocket = 0x00,
00099 knownSocket = 0x01,
00100 unixSocket = knownSocket | 0x02,
00101 inetSocket = knownSocket | 0x04,
00102 ipv4Socket = inetSocket | 0x100,
00103 ipv6Socket = inetSocket | 0x200,
00104
00105 passiveSocket = 0x1000,
00106 canonName = 0x2000,
00107 noResolve = 0x4000,
00108
00109 streamSocket = 0x8000,
00110 datagramSocket = 0x10000,
00111 rawSocket = 0x20000,
00112
00113 inputBufferedSocket = 0x200000,
00114 outputBufferedSocket = 0x400000,
00115 bufferedSocket = 0x600000
00116 };
00117
00123 enum SockStatus
00124 {
00125
00126 error = -1,
00127
00128 nothing = 0,
00129
00130 lookupInProgress = 50,
00131 lookupDone = 70,
00132
00133
00134 created = 100,
00135 bound = 140,
00136
00137 connecting = 200,
00138 connected = 220,
00139
00140 listening = 200,
00141 accepting = 220,
00142
00143 closing = 350,
00144
00145 done = 400
00146 };
00147
00148 public:
00152 KExtendedSocket();
00153
00160 KExtendedSocket(const QString& host, int port, int flags = 0);
00161
00168 KExtendedSocket(const QString& host, const QString& service, int flags = 0);
00169
00174 virtual ~KExtendedSocket();
00175
00181 void reset();
00182
00183
00184
00185
00186
00192 int socketStatus() const;
00193
00200 int systemError() const;
00201
00207 int setSocketFlags(int flags);
00208
00214 int socketFlags() const;
00215
00221 bool setHost(const QString& host);
00222
00227 QString host() const;
00228
00233 bool setPort(int port);
00234
00240 bool setPort(const QString& service);
00241
00246 QString port() const;
00247
00254 bool setAddress(const QString& host, int port);
00255
00262 bool setAddress(const QString& host, const QString& serv);
00263
00269 bool setBindHost(const QString& host);
00270
00275 bool unsetBindHost();
00276
00281 QString bindHost() const;
00282
00288 bool setBindPort(int port);
00289
00295 bool setBindPort(const QString& service);
00296
00301 bool unsetBindPort();
00302
00307 QString bindPort() const;
00308
00316 bool setBindAddress(const QString& host, int port);
00317
00325 bool setBindAddress(const QString& host, const QString& service);
00326
00332 bool unsetBindAddress();
00333
00345 bool setTimeout(int secs, int usecs = 0);
00346
00351 timeval timeout() const;
00352
00361 bool setBlockingMode(bool enable);
00362
00367 bool blockingMode();
00368
00378 bool setAddressReusable(bool enable);
00379
00384 bool addressReusable();
00385
00404 bool setIPv6Only(bool enable);
00405
00412 bool isIPv6Only();
00413
00435 virtual bool setBufferSize(int rsize, int wsize = -2);
00436
00442 const KSocketAddress *localAddress();
00443
00450 const KSocketAddress *peerAddress();
00451
00456 inline int fd() const
00457 { return sockfd; }
00458
00459
00460
00461
00462
00470 virtual int lookup();
00471
00490 virtual int startAsyncLookup();
00491
00495 virtual void cancelAsyncLookup();
00496
00504 virtual int listen(int N = 5);
00505
00520 virtual int accept(KExtendedSocket *&sock);
00521
00545 virtual int connect();
00546
00557 virtual int startAsyncConnect();
00558
00562 virtual void cancelAsyncConnect();
00563
00574 virtual bool open(int mode = IO_Raw | IO_ReadWrite);
00575
00583 virtual void close();
00584
00590 virtual void closeNow();
00591
00605 virtual void release();
00606
00607
00608
00609
00610
00626 virtual void flush();
00627
00632 virtual inline Q_ULONG size() const
00633 { return 0; }
00634
00639 virtual inline Q_ULONG at() const
00640 { return 0; }
00641
00647 virtual inline bool at(int i)
00648 { Q_UNUSED(i);return true; }
00649
00655 virtual inline bool atEnd() const
00656 { return false; }
00657
00687 virtual Q_LONG readBlock(char *data, Q_ULONG maxlen);
00688
00712 virtual Q_LONG writeBlock(const char *data, Q_ULONG len);
00713
00728 virtual int peekBlock(char *data, uint maxlen);
00729
00736 virtual int unreadBlock(const char *data, uint len);
00737
00747 virtual int bytesAvailable() const;
00748
00758 virtual int waitForMore(int msec);
00759
00764 virtual int getch();
00765
00771 virtual int putch(int ch);
00772
00777 virtual int ungetch(int)
00778 { return -1; }
00779
00790 virtual void enableRead(bool enable);
00791
00801 virtual void enableWrite(bool enable);
00802
00803 signals:
00809 void lookupFinished(int count);
00810
00814 void connectionSuccess();
00815
00821 void connectionFailed(int error);
00822
00828 void readyAccept();
00829
00830 protected:
00831 int sockfd;
00832
00833 protected slots:
00834
00835 void socketActivityRead();
00836 void socketActivityWrite();
00837 void dnsResultsReady();
00838 void startAsyncConnectSlot();
00839 void connectionEvent();
00840
00841 protected:
00842
00843 QSocketNotifier *readNotifier();
00844 QSocketNotifier *writeNotifier();
00845
00846 private:
00847
00848
00849 KExtendedSocket(KExtendedSocket&);
00850 KExtendedSocket& operator=(KExtendedSocket&);
00851
00856 static int doLookup(const QString& host, const QString& serv, addrinfo& hint,
00857 kde_addrinfo** result);
00858
00859 protected:
00863 void setError(int errorkind, int error);
00864
00865 inline void cleanError()
00866 { setError(IO_Ok, 0); }
00867
00871 void setSocketStatus(int status);
00872
00873 public:
00886 static int resolve(sockaddr* sock, ksocklen_t len, QString& host, QString& port, int flags = 0);
00887
00900 static int resolve(KSocketAddress* sock, QString& host, QString& port, int flags = 0);
00901
00920 static QPtrList<KAddressInfo> lookup(const QString& host, const QString& port, int flags = 0, int *error = 0);
00921
00928 static KSocketAddress *localAddress(int fd);
00929
00937 static KSocketAddress *peerAddress(int fd);
00938
00945 static QString strError(int code, int syserr);
00946
00956 static bool setAddressReusable(int fd, bool enable);
00957
00958 protected:
00959 virtual void virtual_hook( int id, void* data );
00960 private:
00961 KExtendedSocketPrivate *d;
00962
00963 friend class KSocket;
00964 friend class KServerSocket;
00965 };
00966
00971 class KAddressInfo
00972 {
00973 private:
00974 addrinfo *ai;
00975 KSocketAddress *addr;
00976
00977 inline KAddressInfo() : ai(0), addr(0)
00978 { }
00979
00980 KAddressInfo(addrinfo *ai);
00981 KAddressInfo(KAddressInfo&) { }
00982 KAddressInfo& operator=(KAddressInfo&) { return *this; }
00983
00984 public:
00985 ~KAddressInfo();
00986
00991 inline operator const KSocketAddress*() const
00992 { return addr; }
00993
00997 inline operator const addrinfo&() const
00998 { return *ai; }
00999
01004 inline operator const addrinfo*() const
01005 { return ai; }
01006
01012 inline const KSocketAddress* address() const
01013 { return addr; }
01014
01019 int flags() const;
01020
01025 int family() const;
01026
01031 int socktype() const;
01032
01037 int protocol() const;
01038
01039
01045 const char* canonname() const;
01046
01051 inline int length() const
01052 { if (addr) return addr->size(); return 0; }
01053
01054 friend class KExtendedSocket;
01055 };
01056
01057 #endif // KEXTSOCK_H