Writer.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef _WRITER_H
00023 #define _WRITER_H
00024
00025
00026 #include <fcgiapp.h>
00027 #include <cstdio>
00028
00029
00031 class Writer {
00032
00033 public:
00034
00035 virtual ~Writer() = 0;
00036
00038
00041 virtual int putStr( const char* msg, int len ) = 0;
00042
00044
00045 virtual int putS( const char* msg ) = 0;
00046
00048
00049 virtual int printf( const char* msg ) = 0;
00050
00052 virtual int flush() = 0;
00053
00054 };
00055
00056
00057
00059 class FCGIWriter {
00060
00061 private:
00062
00063
00064 FCGX_Stream *out;
00065 static const unsigned int bufsize = 65536;
00066
00068 void cpy2buf( const char* msg, unsigned int len ){
00069 if( sz + len > bufsize ) buffer = (char*) realloc( buffer, sz+len );
00070 memcpy( &buffer[sz], msg, len );
00071 sz += len;
00072 };
00073
00074
00075 public:
00076
00077 char* buffer;
00078 unsigned int sz;
00079
00081 FCGIWriter( FCGX_Stream* o ){
00082 out = o;
00083 buffer = new char[bufsize];
00084 sz = 0;
00085 };
00086
00088 ~FCGIWriter(){ if(buffer) free(buffer); };
00089
00090 int putStr( const char* msg, int len ){
00091 cpy2buf( msg, len );
00092 return FCGX_PutStr( msg, len, out );
00093 };
00094 int putS( const char* msg ){
00095 cpy2buf( msg, strlen(msg) );
00096 return FCGX_PutS( msg, out );
00097 }
00098 int printf( const char* msg ){
00099 cpy2buf( msg, strlen(msg) );
00100 return FCGX_FPrintF( out, msg );
00101 };
00102 int flush(){
00103 return FCGX_FFlush( out );
00104 };
00105
00106 };
00107
00108
00109
00111 class FileWriter {
00112
00113 private:
00114
00115 FILE* out;
00116
00117 public:
00118
00119 FileWriter( FILE* o ){ out = o; };
00120
00121 int putStr( const char* msg, int len ){
00122 return fwrite( (void*) msg, sizeof(char), len, out );
00123 };
00124 int putS( const char* msg ){
00125 return fputs( msg, out );
00126 }
00127 int printf( const char* msg ){
00128 return fprintf( out, "%s", msg );
00129 };
00130 int flush(){
00131 return fflush( out );
00132 };
00133
00134 };
00135
00136
00137
00138 #endif