Fix buffered reads.
[catagits/fcgi2.git] / include / fcgio.h
1 //
2 // Provides support for FastCGI via C++ iostreams.\r
3 //\r
4 // $Id: fcgio.h,v 1.8 2001/11/21 20:18:13 robs Exp $
5 //
6 // This work is based on routines written by George Feinberg. They
7 // have been mostly re-written and extensively changed by
8 // Michael Richards.
9 //
10 // Rewritten again with bug fixes and numerous enhancements by
11 // Michael Shell.\r
12 // \r
13 // And rewritten again by Rob Saccoccio. 
14 //
15 // Special Thanks to Dietmar Kuehl for his help and the numerous custom
16 // streambuf examples on his web site.
17 //
18 // Copyright (c) 2000 Tux the Linux Penguin\r
19 // Copyright (c) 2001 Rob Saccoccio and Chelsea Networks
20 //
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)
24 //
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 \r
28 // both halves.
29
30 #ifndef FCGIO_H
31 #define FCGIO_H
32
33 #include <iostream.h>
34
35 #include "fcgiapp.h"
36
37 #ifndef DLLAPI
38 #ifdef _WIN32
39 #define DLLAPI __declspec(dllimport)
40 #else
41 #define DLLAPI
42 #endif
43 #endif
44
45 /*
46  *  fcgi_streambuf
47  */
48 class fcgi_streambuf : public streambuf
49 {
50 public:
51
52     // Note that if no buf is assigned (the default), iostream methods\r
53     // such as peek(), unget() and putback() will fail.  If a buf is\r
54     // assigned, I/O is a bit less effecient and output streams will\r
55     // have to be flushed (or the streambuf destroyed) before the next \r
56     // call to "accept".\r
57     DLLAPI fcgi_streambuf(FCGX_Stream * fcgx, char * buf, int len);\r
58     \r
59     DLLAPI fcgi_streambuf(char * buf, int len);\r
60     \r
61     DLLAPI fcgi_streambuf(FCGX_Stream * fcgx = NULL);\r
62
63     DLLAPI ~fcgi_streambuf(void);
64
65     DLLAPI int attach(FCGX_Stream * fcgx);
66
67     // Consume the put area (if buffered) and c (if c is not EOF).
68     DLLAPI virtual int overflow(int);
69
70     // Flush the put area (if buffered) and the FCGX buffer to the client.\r
71     // Note: sync() is protected in some implementations.
72     DLLAPI virtual int sync();
73
74     // Fill the get area (if buffered) and return the next character.
75     DLLAPI virtual int underflow();
76
77     // Use a buffer.  The only reasons that a buffer would be useful is\r
78     // to support the use of the unget()/putback() or seek() methods.  Using\r
79     // a buffer will result in less efficient I/O.  Note: the underlying\r
80     // FastCGI library (FCGX) maintains its own input and output buffers.  \r
81     // Note: setbuf() is protected in some implementations.
82     DLLAPI virtual streambuf * setbuf(char * buf, int len);
83
84     DLLAPI virtual int xsgetn(char * s, int n);\r
85     DLLAPI virtual int xsputn(const char * s, int n);\r
86
87 private:
88
89     FCGX_Stream * fcgx;
90
91     // buf is just handy to have around\r
92     char * buf;\r
93 \r
94     // this isn't kept by the base class\r
95     int bufsize;
96     \r
97     void init(FCGX_Stream * fcgx, char * buf, int bufsize);\r
98 \r
99     void reset(void);\r
100 };
101
102 /*
103  *  fcgi_istream - deprecated
104  */
105 class fcgi_istream : public istream
106 {
107 public:
108
109     // deprecated
110     DLLAPI fcgi_istream(FCGX_Stream * fcgx = NULL);
111     
112     // deprecated
113     DLLAPI ~fcgi_istream(void) {}
114
115     // deprecated
116     DLLAPI virtual void attach(FCGX_Stream * fcgx);
117
118 private:
119
120     fcgi_streambuf fcgi_strmbuf;
121 };
122
123 /*
124  *  fcgi_ostream - deprecated
125  */
126 class fcgi_ostream : public ostream
127 {
128 public:
129     
130     // deprecated
131     DLLAPI fcgi_ostream(FCGX_Stream * fcgx = NULL);
132     
133     // deprecated
134     DLLAPI ~fcgi_ostream(void) {}
135
136     // deprecated
137     DLLAPI virtual void attach(FCGX_Stream *fcgx);
138
139 private:
140
141     fcgi_streambuf fcgi_strmbuf;
142 };
143
144 #endif /* FCGIO_H */