WvStreams
wvlistener.h
1 /* -*- Mode: C++ -*-
2  * Worldvisions Weaver Software:
3  * Copyright (C) 1997-2002 Net Integration Technologies, Inc.
4  *
5  * A base implementation for "listeners", streams that spawn other streams
6  * from (presumably) incoming connections.
7  */
8 #ifndef __WVLISTENER_H
9 #define __WVLISTENER_H
10 
11 #include "iwvlistener.h"
12 #include "wvstreamclone.h" // FIXME needed *only* for CompatCallback
13 #include "wvattrs.h"
14 
15 class WvListener : public IWvListener
16 {
17  IMPLEMENT_IOBJECT(WvListener);
18  WvAttrs attrs;
19 public:
20  IWvStream *cloned;
21  IWvListenerCallback acceptor;
22  IWvListenerWrapper wrapper;
23 
24  WvListener(IWvStream *_cloned);
25  virtual ~WvListener();
26 
27  virtual void addwrap(IWvListenerWrapper _wrapper);
28 
29  virtual IWvListenerCallback onaccept(IWvListenerCallback _cb);
30  IWvStream *wrap(IWvStream *s);
31  void runonce(time_t msec_delay);
32 
33  //
34  // IWvStream default implementation.
35  //
36  virtual void close()
37  { if (cloned) cloned->close(); }
38  virtual bool isok() const
39  { return WvErrorBase::isok() && cloned && cloned->isok(); }
40 
41  virtual void callback();
42 
43  int getfd() const
44  { return getrfd(); }
45  virtual int getrfd() const
46  { return cloned ? cloned->getrfd() : -1; }
47  virtual int getwfd() const
48  { return cloned ? cloned->getwfd() : -1; }
49 
50  virtual const WvAddr *src() const
51  { return cloned ? cloned->src() : NULL; }
52 
53  virtual void pre_select(SelectInfo &si)
54  { if (cloned) cloned->pre_select(si); }
55  virtual bool post_select(SelectInfo &si)
56  { return cloned ? cloned->post_select(si) : false; }
57 
58  virtual size_t read(void *buf, size_t count)
59  { return 0; }
60  virtual size_t write(const void *buf, size_t count)
61  { return 0; }
62  virtual size_t read(WvBuf &outbuf, size_t count)
63  { return 0; }
64  virtual size_t write(WvBuf &inbuf, size_t count = INT_MAX)
65  { return 0; }
66  virtual void noread()
67  { }
68  virtual void nowrite()
69  { }
70  virtual void maybe_autoclose()
71  { }
72  virtual bool isreadable()
73  { return false; }
74  virtual bool iswritable()
75  { return false; }
76  virtual bool flush(time_t msec_timeout)
77  { return false; }
78  virtual bool should_flush()
79  { return false; }
80  virtual IWvStreamCallback setreadcallback(IWvStreamCallback _cb)
81  { return 0; }
82  virtual IWvStreamCallback setwritecallback(IWvStreamCallback _cb)
83  { return 0; }
84  virtual IWvStreamCallback setexceptcallback(IWvStreamCallback _cb)
85  { return 0; }
86  virtual IWvStreamCallback setclosecallback(IWvStreamCallback _cb)
87  { return 0; }
88  virtual const char *wsname() const
89  { return "Listener"; }
90  virtual void set_wsname(WvStringParm name)
91  { }
92  void set_wsname(WVSTRING_FORMAT_DECL)
93  { set_wsname(WvString(WVSTRING_FORMAT_CALL)); }
94  virtual const char *wstype() const
95  { return "Listener"; }
96  virtual WSID wsid() const
97  { return 0; }
98  virtual void outbuf_limit(size_t size)
99  { }
100  virtual WvString getattr(WvStringParm name) const;
101 };
102 
108 {
109 public:
110  WvNullListener() : WvListener(NULL)
111  {
112  // nothing to do
113  }
114 
115  virtual IWvStream *accept()
116  { return NULL; }
117 
118  virtual bool isok() const
119  { return false; }
120 
121  virtual const WvAddr *src() const;
122 };
123 
124 #endif // __WVLISTENER_H