WvStreams
|
00001 /* -*- Mode: C++ -*- 00002 * Worldvisions Weaver Software: 00003 * Copyright (C) 1997-2002 Net Integration Technologies, Inc. 00004 * 00005 * A base implementation for "listeners", streams that spawn other streams 00006 * from (presumably) incoming connections. 00007 */ 00008 #ifndef __WVLISTENER_H 00009 #define __WVLISTENER_H 00010 00011 #include "iwvlistener.h" 00012 #include "wvstreamclone.h" // FIXME needed *only* for CompatCallback 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 // IWvStream default implementation. 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 // nothing to do 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