WvStreams
wvlistener.h
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