Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include <cerrno>
00034 #include <sstream>
00035 #include <iostream>
00036 #include <fstream>
00037 #include <cstring>
00038
00039 using std::ostringstream ;
00040 using std::ifstream ;
00041
00042 #include "BESInfo.h"
00043 #include "TheBESKeys.h"
00044 #include "BESInternalError.h"
00045
00046 #define BES_INFO_FILE_BUFFER_SIZE 4096
00047
00053 BESInfo::BESInfo( )
00054 : _strm( 0 ),
00055 _strm_owned( false ),
00056 _buffered( true )
00057 {
00058 _strm = new ostringstream ;
00059 _strm_owned = true ;
00060 }
00061
00075 BESInfo::BESInfo( const string &key, ostream *strm, bool strm_owned )
00076 : _strm( 0 ),
00077 _strm_owned( false ),
00078 _buffered( true )
00079 {
00080 bool found = false ;
00081 vector<string> vals ;
00082 string b ;
00083 TheBESKeys::TheKeys()->get_value( key, b, found ) ;
00084 if( b == "true" || b == "True" || b == "TRUE" ||
00085 b == "yes" || b == "Yes" || b == "YES" )
00086 {
00087 _strm = new ostringstream ;
00088 _strm_owned = true ;
00089 _buffered = true ;
00090 if( strm && strm_owned )
00091 delete strm ;
00092 }
00093 else
00094 {
00095 if( !strm )
00096 {
00097 string s = "Informational response not buffered but no stream passed" ;
00098 throw BESInternalError( s, __FILE__, __LINE__ ) ;
00099 }
00100 _strm = strm ;
00101 _strm_owned = strm_owned ;
00102 _buffered = false ;
00103 }
00104 }
00105
00106 BESInfo::~BESInfo()
00107 {
00108 if( _strm && _strm_owned )
00109 {
00110 delete _strm ;
00111 _strm = 0 ;
00112 }
00113 }
00114
00122 void
00123 BESInfo::begin_response( const string &response_name,
00124 BESDataHandlerInterface &dhi )
00125 {
00126 _response_started = true ;
00127 _response_name = response_name ;
00128 }
00129
00130 void
00131 BESInfo::end_response( )
00132 {
00133 _response_started = false ;
00134 if( _tags.size() )
00135 {
00136 string s = "Not all tags were ended in info response" ;
00137 throw BESInternalError( s, __FILE__, __LINE__ ) ;
00138 }
00139 }
00140
00141 void
00142 BESInfo::begin_tag( const string &tag_name,
00143 map<string,string> *attrs )
00144 {
00145 _tags.push( tag_name ) ;
00146 }
00147
00148 void
00149 BESInfo::end_tag( const string &tag_name )
00150 {
00151 if( _tags.size() == 0 || _tags.top() != tag_name )
00152 {
00153 string s = (string)"tag " + tag_name
00154 + " already ended or not started" ;
00155 throw BESInternalError( s, __FILE__, __LINE__ ) ;
00156 }
00157 else
00158 {
00159 _tags.pop() ;
00160 }
00161 }
00162
00168 void
00169 BESInfo::add_data( const string &s )
00170 {
00171
00172
00173 (*_strm) << s ;
00174 }
00175
00191 void
00192 BESInfo::add_data_from_file( const string &key, const string &name )
00193 {
00194 bool found = false ;
00195 string file ;
00196 try
00197 {
00198 TheBESKeys::TheKeys()->get_value( key, file, found ) ;
00199 }
00200 catch( ... )
00201 {
00202 found = false ;
00203 }
00204 if( found == false )
00205 {
00206 add_data( name + " file key " + key
00207 + " not found, information not available\n" ) ;
00208 }
00209 else
00210 {
00211 ifstream ifs( file.c_str() ) ;
00212 int myerrno = errno ;
00213 if( !ifs )
00214 {
00215 string serr = name + " file " + file
00216 + " not found, information not available: " ;
00217 char *err = strerror( myerrno ) ;
00218 if( err )
00219 serr += err ;
00220 else
00221 serr += "Unknown error" ;
00222
00223 serr += "\n" ;
00224
00225 add_data( serr ) ;
00226 }
00227 else
00228 {
00229 char line[BES_INFO_FILE_BUFFER_SIZE] ;
00230 while( !ifs.eof() )
00231 {
00232 ifs.getline( line, BES_INFO_FILE_BUFFER_SIZE ) ;
00233 if( !ifs.eof() )
00234 {
00235 add_data( line ) ;
00236 add_data( "\n" ) ;
00237 }
00238 }
00239 ifs.close() ;
00240 }
00241 }
00242 }
00243
00254 void
00255 BESInfo::add_exception( BESError &e, const string &admin )
00256 {
00257 begin_tag( "BESError" ) ;
00258 ostringstream stype ;
00259 stype << e.get_error_type() ;
00260 add_tag( "Type", stype.str() ) ;
00261 add_tag( "Message", e.get_message() ) ;
00262 add_tag( "Administrator", admin ) ;
00263 #ifdef BES_DEVELOPER
00264 begin_tag( "Location" ) ;
00265 add_tag( "File", e.get_file() ) ;
00266 ostringstream sline ;
00267 sline << e.get_line() ;
00268 add_tag( "Line", sline.str() ) ;
00269 end_tag( "Location" ) ;
00270 #endif
00271 end_tag( "BESError" ) ;
00272 }
00273
00282 void
00283 BESInfo::print( ostream &strm )
00284 {
00285 if( _buffered )
00286 {
00287 strm << ((ostringstream *)_strm)->str() ;
00288 }
00289 }
00290
00298 void
00299 BESInfo::dump( ostream &strm ) const
00300 {
00301 strm << BESIndent::LMarg << "BESInfo::dump - ("
00302 << (void *)this << ")" << endl ;
00303 BESIndent::Indent() ;
00304 strm << BESIndent::LMarg << "response name: " << _response_name << endl ;
00305 strm << BESIndent::LMarg << "is it buffered? " << _buffered << endl ;
00306 strm << BESIndent::LMarg << "has response been started? " << _response_started << endl ;
00307 if( _tags.size() )
00308 {
00309 strm << BESIndent::LMarg << "tags:" << endl ;
00310 BESIndent::Indent() ;
00311 stack<string> temp_tags = _tags ;
00312 while( !temp_tags.empty() )
00313 {
00314 string tag = temp_tags.top() ;
00315 strm << BESIndent::LMarg << tag << endl ;
00316 temp_tags.pop() ;
00317 }
00318 BESIndent::UnIndent() ;
00319 }
00320 else
00321 {
00322 strm << BESIndent::LMarg << "tags: empty" << endl ;
00323 }
00324 BESIndent::UnIndent() ;
00325 }
00326