⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fcgio.cpp

📁 FastCGI,语言无关的、可伸缩架构的CGI开放扩展
💻 CPP
字号:
//// $Id: fcgio.cpp,v 1.13 2002/02/24 20:12:22 robs Exp $//// Allows you communicate with FastCGI streams using C++ iostreams//// ORIGINAL AUTHOR:     George Feinberg// REWRITTEN BY:        Michael Richards  06/20/1999// REWRITTEN AGAIN BY:  Michael Shell     02/23/2000// REWRITTEN AGAIN BY:  Rob Saccoccio     11 Nov 2001//// Copyright (c) 2000 Tux the Linux Penguin//// You are free to use this software without charge or royalty// as long as this notice is not removed or altered, and recognition// is given to the author(s)//// This code is offered as-is without any warranty either expressed or// implied; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE.#ifdef _WIN32#define DLLAPI  __declspec(dllexport)#endif#include <limits.h>#include "fcgio.h"using std::streambuf;using std::istream;using std::ostream;using std::streamsize;fcgi_streambuf::fcgi_streambuf(FCGX_Stream * fs, char * b, int bs){    init(fs, b, bs);}    fcgi_streambuf::fcgi_streambuf(char_type * b, streamsize bs){    init(0, b, bs);}    fcgi_streambuf::fcgi_streambuf(FCGX_Stream * fs) {     init(fs, 0, 0);}fcgi_streambuf::~fcgi_streambuf(void){    overflow(EOF);    // FCGX_Finish()/FCGX_Accept() will flush and close}void fcgi_streambuf::init(FCGX_Stream * fs, char_type * b, streamsize bs){    this->fcgx = fs;    this->buf = 0;    this->bufsize = 0;    setbuf(b, bs);    }int fcgi_streambuf::overflow(int c){    if (this->bufsize)    {        int plen = pptr() - pbase();        if (plen)         {            if (FCGX_PutStr(pbase(), plen, this->fcgx) != plen) return EOF;            pbump(-plen);        }    }    if (c != EOF)     {        if (FCGX_PutChar(c, this->fcgx) != c) return EOF;    }    return 0;}// default base class behaviour seems to be inconsistentint fcgi_streambuf::sync(){    if (overflow(EOF)) return EOF;    if (FCGX_FFlush(this->fcgx)) return EOF;    return 0;}// uflow() removes the char, underflow() doesn'tint fcgi_streambuf::uflow() {    int rv = underflow();    if (this->bufsize) gbump(1);    return rv;}				// Note that the expected behaviour when there is no buffer variesint fcgi_streambuf::underflow(){    if (this->bufsize)    {        if (in_avail() == 0)        {            int glen = FCGX_GetStr(eback(), this->bufsize, this->fcgx);            if (glen <= 0) return EOF;            setg(eback(), eback(), eback() + glen);        }        return (unsigned char) *gptr();           }    else    {        return FCGX_GetChar(this->fcgx);    } }void fcgi_streambuf::reset(void){    // it should be ok to set up both the get and put areas    setg(this->buf, this->buf, this->buf);    setp(this->buf, this->buf + this->bufsize);}std::streambuf * fcgi_streambuf::setbuf(char_type * b, streamsize bs){    // XXX support moving data from an old buffer    if (this->bufsize) return 0;    this->buf = b;    this->bufsize = bs;    // the base setbuf() *has* to be called    streambuf::setbuf(b, bs);    reset();    return this;}int fcgi_streambuf::attach(FCGX_Stream * fs){     this->fcgx = fs;    if (this->bufsize)    {        reset();    }    return 0;}streamsize fcgi_streambuf::xsgetn(char_type * s, streamsize n) {    if (n > INT_MAX) return 0;    return (this->bufsize)         ? streambuf::xsgetn(s, n)         : (streamsize) FCGX_GetStr((char *) s, (int) n, this->fcgx);}   streamsize fcgi_streambuf::xsputn(const char_type * s, streamsize n) {    if (n > INT_MAX) return 0;    return (this->bufsize)         ? streambuf::xsputn(s, n)         : (streamsize) FCGX_PutStr((char *) s, (int) n, this->fcgx);}// deprecatedfcgi_istream::fcgi_istream(FCGX_Stream * fs) :    istream(&fcgi_strmbuf){    fcgi_strmbuf.attach(fs);}// deprecatedvoid fcgi_istream::attach(FCGX_Stream * fs){    fcgi_strmbuf.attach(fs);}// deprecatedfcgi_ostream::fcgi_ostream(FCGX_Stream * fs) :    ostream(&fcgi_strmbuf){    fcgi_strmbuf.attach(fs);}// deprecatedvoid fcgi_ostream::attach(FCGX_Stream * fs){    fcgi_strmbuf.attach(fs);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -