Universita' di GenovaINFN Sezione di Genova  
AIRWATCH / EUSO Genova

EsafMsgDispatcher - source file

// $Id: EsafMsgDispatcher.cc,v 1.16 2005/04/18 12:52:25 thea Exp $
// Author M. Pallavicini created Sep, 24 2004

/*****************************************************************************
 * ESAF: Euso Simulation and Analysis Framework                              *
 *                                                                           *
 *  Id: EsafMsgDispatcher                                                    *
 *  Package: Base                                                            *
 *  Coordinator: Marco.Pallavicini                                           *
 *                                                                           *
 *****************************************************************************/

//______________________________________________________________________________
// 
//  ESAF Message Dispatcher
//  =======================
// 
//  ESAF Message Dispatcher
//  This is a single to really dispatch the messages according to the
//  configuration. 
//  The user can specify the default message level for screen and log file
//  Besides, the user can also change the message level for specific classes
//  that inherit from EsafMsgSource class
//  See EsafMsgSource.cc for further details
//

#include <iostream>
#include <stdexcept>
#include "EsafMsgDispatcher.hh"

ClassImp(EsafMsgDispatcher)

EsafMsgDispatcher* EsafMsgDispatcher::fMe = 0;

const char *const EsafMsgDispatcher::kEsc       = "\033[";
const char *const EsafMsgDispatcher::kReset     = "\033[0m";
const char *const EsafMsgDispatcher::kRed       = "\033[31m";
const char *const EsafMsgDispatcher::kGreen     = "\033[32m";
const char *const EsafMsgDispatcher::kYellow    = "\033[33m";
const char *const EsafMsgDispatcher::kBlue      = "\033[34m";
const char *const EsafMsgDispatcher::kUnderline = "\033[4m";
const char *const EsafMsgDispatcher::kBlink     = "\033[5m";
const char *const EsafMsgDispatcher::kBright    = "\033[1m";
const char *const EsafMsgDispatcher::kDark      = "\033[2m";

const char *     EsafMsgDispatcher::fgColors[] = { EsafMsgDispatcher::kReset,
                                                  EsafMsgDispatcher::kBlue,
                                                  EsafMsgDispatcher::kGreen,
                                                  EsafMsgDispatcher::kYellow,
                                                  EsafMsgDispatcher::kRed
                                                };

//______________________________________________________________________________
EsafMsgDispatcher::EsafMsgDispatcher() : EsafConfigurable(),
    fHeaderLenght(40), fIsScreenFlushed(kFALSE), fIsLogFlushed(kFALSE),
    fUseColors(kTRUE),
    fDefaultLogSeverity(EsafMsg::Info), fDefaultScreenSeverity(EsafMsg::Info) {
    //
    // ctor
    //
}

//______________________________________________________________________________
 void EsafMsgDispatcher::LoadConfig() {
    //
    //
    //

    string screen = Conf()->GetStr("EsafMsgDispatcher.fScreenSeverity");
    string logfile = Conf()->GetStr("EsafMsgDispatcher.fLogFileSeverity");

    if ( screen == "Debug" )
        fDefaultScreenSeverity = EsafMsg::Debug;
    else if ( screen == "Info" )
        fDefaultScreenSeverity = EsafMsg::Info;
    else if ( screen == "Warning" )
        fDefaultScreenSeverity = EsafMsg::Warning;
    else if ( screen == "Panic" )
        fDefaultScreenSeverity = EsafMsg::Panic;
    else if ( screen == "None" )
        fDefaultScreenSeverity = EsafMsg::None;
    else
        throw runtime_error("Invalid severity type in EsafMsgDispatcher::EsafMsgDispatcher()");

    if ( logfile == "Debug" )
        fDefaultLogSeverity = EsafMsg::Debug;
    else if ( logfile == "Info" )
        fDefaultLogSeverity = EsafMsg::Info;
    else if ( logfile == "Warning" )
        fDefaultLogSeverity = EsafMsg::Warning;
    else if ( logfile == "Panic" )
        fDefaultLogSeverity = EsafMsg::Panic;
    else if ( logfile == "None" )
        fDefaultLogSeverity = EsafMsg::None;
    else 
        throw runtime_error("Invalid severity type in EsafMsgDispatcher::EsafMsgDispatcher()");


    fUseColors = Conf()->GetBool("EsafMsgDispatcher.fUseColors");
}


//______________________________________________________________________________
 void EsafMsgDispatcher::OpenLog( const char* name ) {
    //
    // Open a new log file
    //
    if (fLogFile.is_open()) fLogFile.close();

    string ext = ".log";
    
    if ( name )
        fLogFileName = name;
    else
        fLogFileName = Conf()->GetStr("EsafMsgDispatcher.fLogFileName");

    if (fLogFileName.rfind(ext) != (fLogFileName.size()-ext.size()))
        fLogFileName += ext;

    fLogFile.open( fLogFileName.c_str() );
    if (!fLogFile.is_open())
        throw runtime_error("Cannot open message output file");

}

//______________________________________________________________________________
EsafMsgDispatcher::~EsafMsgDispatcher() {
    fLogFile.close();
}

//______________________________________________________________________________
 EsafMsgDispatcher* EsafMsgDispatcher::Get() {
    
    // singleton
    
    if (!fMe)
        fMe = new EsafMsgDispatcher();
    return fMe;
}

const char* MsgStringType[] = {"",
                               "Debug:  ",
                               "Info:   ",
                               "Warning:",
                               "Panic:  "
                              };
//______________________________________________________________________________
 void EsafMsgDispatcher::Dispatch(const EsafMsg& msg, Bool_t endline) {

    // dipatch message
    // Message is written on screen and/or log file according to severity 
    // and parameter settings

    // check if message must be displayed on screen
    // default threshold is used, unless user has changed this specific sender (class name)
    bool doScreen = ( msg.GetSeverity() >= fDefaultScreenSeverity );

    map<string,EsafMsg::MsgSeverity>::const_iterator it;
    if ( ( it = fUserMap.find( msg.GetSender() ) ) != fUserMap.end() ) {
        doScreen = ( msg.GetSeverity() >= it->second );
    }


    // prepare the header
    string header;

    header = string(MsgStringType[msg.GetSeverity()])+"["+msg.GetSender()+"]"; 

    if ( header.size() < (size_t)fHeaderLenght)
        header.resize(fHeaderLenght,' ');

    if ( doScreen ) {
        if ( !fIsScreenFlushed ) 
            if ( fUseColors ) {
                cout << fgColors[msg.GetSeverity()];
                cout << header;

                cout << EsafMsgDispatcher::kReset;
            } else {
                cout << header;
            }

        cout << msg.GetText() << flush;

        if ( endline ) 
            cout << endl;

        fIsScreenFlushed = !endline;
    }

    if ( fLogFile.is_open() ) {
        // check if message must be displayed on log file
        // default threshold is used, unless user has changed this specific sender (class name)
        bool doLog = ( msg.GetSeverity() >= fDefaultLogSeverity );
        if ( ( it = fUserMap.find( msg.GetSender() ) ) != fUserMap.end() ) {
            doLog = ( msg.GetSeverity() >= it->second );
        }

        if ( doLog ) {
            if ( !fIsLogFlushed )
                fLogFile << header;

            fLogFile << msg.GetText() << flush;

            if ( endline ) 
                fLogFile << endl;

            fIsLogFlushed = !endline;
        }

    }

    if ( msg.GetSeverity() >= EsafMsg::Panic )
        exit(999);
}
About Us | EUSO Official Website | Web pages created by Roberto Pesce and Alessandro Thea - Last Update 14-May-2005 21:31