00001
00002
00003
00004
00005
00006
00007
00008 #ifndef __WVLISTENER_H
00009 #define __WVLISTENER_H
00010
00011 #include "iwvlistener.h"
00012 #include "wvstreamclone.h"
00013 #include "wvattrs.h"
00014
00015 class WvListener : public IWvListener
00016 {
00017 IMPLEMENT_IOBJECT(WvListener);
00018 WvAttrs attrs;
00019 public:
00020 IWvStream *cloned;
00021 IWvListenerCallback acceptor;
00022 IWvListenerWrapper wrapper;
00023
00024 WvListener(IWvStream *_cloned);
00025 virtual ~WvListener();
00026
00027 virtual void addwrap(IWvListenerWrapper _wrapper);
00028
00029 virtual IWvListenerCallback onaccept(IWvListenerCallback _cb);
00030 IWvStream *wrap(IWvStream *s);
00031 void runonce(time_t msec_delay);
00032
00033
00034
00035
00036 virtual void close()
00037 { if (cloned) cloned->close(); }
00038 virtual bool isok() const
00039 { return WvErrorBase::isok() && cloned && cloned->isok(); }
00040
00041 virtual void callback();
00042
00043 int getfd() const
00044 { return getrfd(); }
00045 virtual int getrfd() const
00046 { return cloned ? cloned->getrfd() : -1; }
00047 virtual int getwfd() const
00048 { return cloned ? cloned->getwfd() : -1; }
00049
00050 virtual const WvAddr *src() const
00051 { return cloned ? cloned->src() : NULL; }
00052
00053 virtual void pre_select(SelectInfo &si)
00054 { if (cloned) cloned->pre_select(si); }
00055 virtual bool post_select(SelectInfo &si)
00056 { return cloned ? cloned->post_select(si) : false; }
00057
00058 virtual size_t read(void *buf, size_t count)
00059 { return 0; }
00060 virtual size_t write(const void *buf, size_t count)
00061 { return 0; }
00062 virtual size_t read(WvBuf &outbuf, size_t count)
00063 { return 0; }
00064 virtual size_t write(WvBuf &inbuf, size_t count = INT_MAX)
00065 { return 0; }
00066 virtual void noread()
00067 { }
00068 virtual void nowrite()
00069 { }
00070 virtual void maybe_autoclose()
00071 { }
00072 virtual bool isreadable()
00073 { return false; }
00074 virtual bool iswritable()
00075 { return false; }
00076 virtual bool flush(time_t msec_timeout)
00077 { return false; }
00078 virtual bool should_flush()
00079 { return false; }
00080 virtual IWvStreamCallback setreadcallback(IWvStreamCallback _cb)
00081 { return 0; }
00082 virtual IWvStreamCallback setwritecallback(IWvStreamCallback _cb)
00083 { return 0; }
00084 virtual IWvStreamCallback setexceptcallback(IWvStreamCallback _cb)
00085 { return 0; }
00086 virtual IWvStreamCallback setclosecallback(IWvStreamCallback _cb)
00087 { return 0; }
00088 virtual const char *wsname() const
00089 { return "Listener"; }
00090 virtual void set_wsname(WvStringParm name)
00091 { }
00092 void set_wsname(WVSTRING_FORMAT_DECL)
00093 { set_wsname(WvString(WVSTRING_FORMAT_CALL)); }
00094 virtual const char *wstype() const
00095 { return "Listener"; }
00096 virtual WSID wsid() const
00097 { return 0; }
00098 virtual void outbuf_limit(size_t size)
00099 { }
00100 virtual WvString getattr(WvStringParm name) const;
00101 };
00102
00107 class WvNullListener : public WvListener
00108 {
00109 public:
00110 WvNullListener() : WvListener(NULL)
00111 {
00112
00113 }
00114
00115 virtual IWvStream *accept()
00116 { return NULL; }
00117
00118 virtual bool isok() const
00119 { return false; }
00120
00121 virtual const WvAddr *src() const;
00122 };
00123
00124 #endif // __WVLISTENER_H