2 // Provides support for FastCGI via C++ iostreams.
4 // $Id: fcgio.h,v 1.15 2002/02/25 13:16:11 robs Exp $
6 // This work is based on routines written by George Feinberg. They
7 // have been mostly re-written and extensively changed by
10 // Rewritten again with bug fixes and numerous enhancements by
13 // And rewritten again by Rob Saccoccio.
15 // Special Thanks to Dietmar Kuehl for his help and the numerous custom
16 // streambuf examples on his web site.
18 // Copyright (c) 2000 Tux the Linux Penguin
19 // Copyright (c) 2001 Rob Saccoccio and Chelsea Networks
21 // You are free to use this software without charge or royalty
22 // as long as this notice is not removed or altered, and recognition
23 // is given to the author(s)
25 // This code is offered as-is without any warranty either expressed or
26 // implied; without even the implied warranty of MERCHANTABILITY or
27 // FITNESS FOR A PARTICULAR PURPOSE. If it breaks, you get to keep
39 #define DLLAPI __declspec(dllimport)
45 #if ! HAVE_STREAMBUF_CHAR_TYPE
46 typedef char char_type;
52 class DLLAPI fcgi_streambuf : public std::streambuf
56 // Note that if no buf is assigned (the default), iostream methods
57 // such as peek(), unget() and putback() will fail. If a buf is
58 // assigned, I/O is a bit less effecient and output streams will
59 // have to be flushed (or the streambuf destroyed) before the next
61 fcgi_streambuf(FCGX_Stream * fcgx, char * buf, int len);
63 fcgi_streambuf(char_type * buf, std::streamsize len);
65 fcgi_streambuf(FCGX_Stream * fcgx = 0);
67 ~fcgi_streambuf(void);
69 int attach(FCGX_Stream * fcgx);
73 // Consume the put area (if buffered) and c (if c is not EOF).
74 virtual int overflow(int);
76 // Flush the put area (if buffered) and the FCGX buffer to the client.
79 // Remove and return the current character.
82 // Fill the get area (if buffered) and return the current character.
83 virtual int underflow();
85 // Use a buffer. The only reasons that a buffer would be useful is
86 // to support the use of the unget()/putback() or seek() methods. Using
87 // a buffer will result in less efficient I/O. Note: the underlying
88 // FastCGI library (FCGX) maintains its own input and output buffers.
89 virtual std::streambuf * setbuf(char_type * buf, std::streamsize len);
91 virtual std::streamsize xsgetn(char_type * s, std::streamsize n);
92 virtual std::streamsize xsputn(const char_type * s, std::streamsize n);
98 // buf is just handy to have around
101 // this isn't kept by the base class
102 std::streamsize bufsize;
104 void init(FCGX_Stream * fcgx, char_type * buf, std::streamsize bufsize);
110 * fcgi_istream - deprecated
112 class DLLAPI fcgi_istream : public std::istream
117 fcgi_istream(FCGX_Stream * fcgx = 0);
120 ~fcgi_istream(void) {}
123 virtual void attach(FCGX_Stream * fcgx);
127 fcgi_streambuf fcgi_strmbuf;
131 * fcgi_ostream - deprecated
133 class DLLAPI fcgi_ostream : public std::ostream
138 fcgi_ostream(FCGX_Stream * fcgx = 0);
141 ~fcgi_ostream(void) {}
144 virtual void attach(FCGX_Stream *fcgx);
148 fcgi_streambuf fcgi_strmbuf;