/** \file
 *
 *  Contains the LoggerBase class implementation.
 *
 *  Copyright (c) 2007,2008,2009 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 *
 */

#include "LoggerBase.h"
#include "utils/Timestamp.h"

#include <errno.h>

/// Constructor takes a "facility" name.  Used to tag all subsequent log
/// entries.
///
/// \param facilityIn Name of module for use in logs.
LoggerBase::LoggerBase( const char *facilityIn )
    : facilityPtr_( new CodedStr( facilityIn ) ),
      facility_( *facilityPtr_ ),
      outStream_( NULL )
{}

/// Constructor takes a "facility" name.  Used to tag all subsequent log
/// entries.
///
/// \param facilityIn Name of module for use in logs.
LoggerBase::LoggerBase( const Str &facilityIn )
    : facilityPtr_( new CodedStr( facilityIn ) ),
      facility_( *facilityPtr_ ),
      outStream_( NULL )
{}

/// Protected Constructor
LoggerBase::LoggerBase( const CodedStr& facilityIn )
    : facilityPtr_( NULL ),
      facility_( facilityIn ),
      outStream_( NULL )
{}

/// Destructor
LoggerBase::~LoggerBase()
{
    if( facilityPtr_ )
    {
        delete facilityPtr_;
    }
}


/// Create a syslog entry, push into queue
void LoggerBase::syslog( const char *msg, Syslog::Severity sev, Service::ServiceType serviceType )
{
    syslog( Str( msg ), sev, serviceType );
}

/// Create a syslog entry, push into queue, dual C Str version
void LoggerBase::syslog( const char *msgA, const char *msgB, Syslog::Severity sev, Service::ServiceType serviceType )
{
    syslog( Str( msgA ) + msgB, sev, serviceType );
}

/// Create a syslog entry, push into queue, C Str + size_t version
void LoggerBase::syslog( const char *msg, const size_t intMsg, Syslog::Severity sev, Service::ServiceType serviceType )
{
    Str strm;
    strm << msg << Str( intMsg, 16 );
    syslog( strm, sev, serviceType );
}

/// Create a syslog entry, push into queue, C Str + int version
void LoggerBase::syslog( const char *msg, const int intMsg, Syslog::Severity sev, Service::ServiceType serviceType )
{
    Str strm;
    strm << msg << Str( intMsg, 10 );
    syslog( strm, sev, serviceType );
}

/// Create a syslog entry, push into queue, C Str + double version
void LoggerBase::syslog( const char *msg, const double doubleMsg, Syslog::Severity sev, Service::ServiceType serviceType )
{
    Str strm;
    strm << msg << doubleMsg;
    syslog( strm, sev, serviceType );
}

/// Create a syslog entry, push into queue
void LoggerBase::syslog( const Str &msg, Syslog::Severity sev, Service::ServiceType serviceType )
{
    if( NULL != outStream_ )
    {
        *outStream_ << Timestamp::Now().toString( 3 );
        *outStream_ << " [";
        *outStream_ << facility_;
        *outStream_ << "](";
        *outStream_ << Syslog::SeverityToString( sev );
        *outStream_ << "): ";
        *outStream_ << msg;
        *outStream_ << "\n";
    }
}

