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& port);
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 
00431   virtual bool setBufferSize(int rsize, int wsize = -2);
00432 
00438   const KSocketAddress *localAddress();
00439 
00446   const KSocketAddress *peerAddress();
00447 
00452   inline int fd() const
00453   { return sockfd; }
00454 
00455   
00456 
00457 
00458 
00466   virtual int lookup();
00467 
00486   virtual int startAsyncLookup();
00487 
00491   virtual void cancelAsyncLookup();
00492 
00500   virtual int listen(int N = 5); 
00501 
00516   virtual int accept(KExtendedSocket *&sock);
00517 
00541   virtual int connect();
00542 
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:
00887   static int resolve(sockaddr* sock, ksocklen_t len, QString& host, QString& port, int flags = 0);
00888 
00901   static int resolve(KSocketAddress* sock, QString& host, QString& port, int flags = 0);
00902 
00921   static QPtrList<KAddressInfo> lookup(const QString& host, const QString& port, int flags = 0, int *error = 0);
00922 
00929   static KSocketAddress *localAddress(int fd);
00930 
00938   static KSocketAddress *peerAddress(int fd);
00939 
00946   static QString strError(int code, int syserr);
00947 
00957   static bool setAddressReusable(int fd, bool enable);
00958 
00959 protected:
00960   virtual void virtual_hook( int id, void* data );
00961 private:
00962   KExtendedSocketPrivate *d;
00963 
00964   friend class KSocket;
00965   friend class KServerSocket;
00966 };
00967 
00972 class KAddressInfo
00973 {
00974 private:
00975   addrinfo *ai;
00976   KSocketAddress *addr;
00977 
00978   inline KAddressInfo() : ai(0), addr(0)
00979   { }
00980 
00981   KAddressInfo(addrinfo *ai);
00982   KAddressInfo(KAddressInfo&) { }
00983   KAddressInfo& operator=(KAddressInfo&) { return *this; }
00984 
00985 public:
00986   ~KAddressInfo();
00987 
00992   inline operator const KSocketAddress*() const
00993   { return addr; }
00994 
00998   inline operator const addrinfo&() const
00999   { return *ai; }
01000 
01005   inline operator const addrinfo*() const
01006   { return ai; }
01007 
01013   inline const KSocketAddress* address() const
01014   { return addr; }
01015 
01020   int flags() const;
01021 
01026   int family() const;
01027 
01032   int socktype() const;
01033 
01038   int protocol() const;
01039 
01040 
01046   const char* canonname() const;
01047 
01052   inline int length() const
01053   { if (addr) return addr->size(); return 0; }
01054 
01055   friend class KExtendedSocket;
01056 };
01057 
01058 #endif // KEXTSOCK_H