From: Gonzalo A. <ga...@us...> - 2006-10-05 14:54:08
|
Update of /cvsroot/mod-c/ehtml/src In directory sc8-pr-cvs7.sourceforge.net:/tmp/cvs-serv11351/src Modified Files: Response.cpp Log Message: * Added support for apache output stream. Index: Response.cpp =================================================================== RCS file: /cvsroot/mod-c/ehtml/src/Response.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** Response.cpp 13 Sep 2006 13:57:07 -0000 1.4 --- Response.cpp 5 Oct 2006 14:53:59 -0000 1.5 *************** *** 25,30 **** Response::Response( EHTMLApplication * App ) ! : RequestContext( App->GetRequestContext() ), Application( App ) { } --- 25,32 ---- Response::Response( EHTMLApplication * App ) ! : RequestContext( App->GetRequestContext() ), Application( App ), ! _stream(&_buf), _buf(App->GetRequestContext()->r) { + _stream.rdbuf(&_buf); } *************** *** 36,37 **** --- 38,96 ---- } + ApacheResponseStreamBuf::ApacheResponseStreamBuf(request_rec* r): _r(r) { + setp(_buf, _buf + sizeof(_buf)); + } + + ApacheResponseStreamBuf::~ApacheResponseStreamBuf() { + sync(); + } + + streamsize ApacheResponseStreamBuf::sputc(char c) { + ProfileMe(); + return ap_rwrite(&c, 1, _r); + } + + streamsize ApacheResponseStreamBuf::sputn(char* s, streamsize n) { + return xsputn(const_cast<char*>(s), n); + } + + streamsize ApacheResponseStreamBuf::sputn(const char* s, streamsize n) { + return xsputn(s, n); + } + + streamsize ApacheResponseStreamBuf::xsputn(char* s, streamsize n) { + return xsputn(const_cast<char*>(s), n); + } + + streamsize ApacheResponseStreamBuf::xsputn(const char* s, streamsize n) { + ProfileMe(); + return ap_rwrite(s, n, _r); + } + + int ApacheResponseStreamBuf::sync() { + ProfileMe(); + streamsize pending (pptr() - pbase()); + int dev = 0; + + if (pending) { + streamsize nwrote = ap_rwrite(pbase(), pending, _r); + pbump(-nwrote); + if (nwrote != pending) + dev = -1; + } + return dev; + } + + char ApacheResponseStreamBuf::overflow(char c) { + ProfileMe(); + streamsize pending(pptr() - pbase()); + + if (pending && sync()) + return traits_type::eof(); + + if (c != traits_type::eof()) + ap_rwrite(&c, 1, _r); + + return c; + } + |