00001
00002 #ifndef logbuffer_h
00003 #define logbuffer_h
00004
00005 #include <sstream>
00006 #include "streamlog/logstream.h"
00007
00008 namespace streamlog{
00009
00010
00017 class logbuffer : public std::streambuf {
00018
00019 std::streambuf* _sbuf ;
00020 logstream* _ls ;
00021
00022 logbuffer();
00023
00024
00025 public:
00026
00027 logbuffer( std::streambuf* sbuf, logstream* logstream ) : _sbuf( sbuf ), _ls(logstream) {}
00028
00029 ~logbuffer() {
00030
00031 }
00032
00033
00038 inline virtual int overflow( int c = EOF ) {
00039
00040 static bool hasNewLine = true ;
00041
00042 if ( c == EOF )
00043 return EOF ;
00044
00045 bool success = true;
00046
00047 if ( hasNewLine == true ) {
00048
00049 std::string pre = (* _ls->prefix() )() ;
00050
00051 success &= ( (unsigned) _sbuf->sputn( pre.c_str() , pre.size() ) == pre.size() ) ;
00052
00053 hasNewLine = false;
00054 }
00055
00056 if ( c == '\n' )
00057 hasNewLine = true;
00058
00059 if ( success )
00060 success &= ( _sbuf->sputc(c) != EOF ) ;
00061
00062 if( success )
00063 return 0 ;
00064
00065 return EOF ;
00066 }
00067
00068 } ;
00069
00070 }
00071 #endif