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

#ifdef ERROR  // A workaround for wingdi.h
#undef ERROR
#endif

#ifndef SYSLOGSEVERITY_H_
#define SYSLOGSEVERITY_H_

/**
 *  Logging utility class that provides enumeration of the severity associated
 *  with each textual SyslogEntry object.  Also provides conversion of severity
 *  to string, to assist with SyslogEntry logging.
 *
 *  \ingroup logging
 */
class Syslog
{
public:
    /// An attempt to define different levels of syslog severity
    typedef enum { NONE = -1,
                   DEBUG    = 0x0000,   //0 -- really 2 bits
                   INFO     = 0x0004,   //1
                   ERROR    = 0x0008,   //2
                   IMPORTANT = 0x000C,  //3
                   CRITICAL = 0x0010,   //4
                   FAULT    = 0x0014,   //5  // Follows Critical for v3 unserialize compatability
                 } Severity;

    static const int SEVERITY_MASK   = 0x001C;

    static const char *SeverityToString( Severity sev )
    {
        switch( sev )
        {
        case Syslog::NONE:
            return "";
        case Syslog::DEBUG:
            return "DEBUG";
        case Syslog::INFO:
            return "INFO";
        case Syslog::ERROR:
            return "ERROR";
        case Syslog::IMPORTANT:
            return "IMPORTANT";
        case Syslog::CRITICAL:
            return "CRITICAL";
        case Syslog::FAULT:
            return "FAULT";
        }

        return "(undefined)";
    };

    static Severity StringToSeverity( const char* sev )
    {
        if( 0 == strncasecmp( "DEBUG", sev, 6 ) )
        {
            return Syslog::DEBUG;
        }
        else if( 0 == strncasecmp( "INFO", sev, 5 ) )
        {
            return Syslog::INFO;
        }
        else if( 0 == strncasecmp( "ERROR", sev, 6 ) )
        {
            return Syslog::ERROR;
        }
        else if( 0 == strncasecmp( "IMPORTANT", sev, 10 ) )
        {
            return Syslog::IMPORTANT;
        }
        else if( 0 == strncasecmp( "CRITICAL", sev, 9 ) )
        {
            return Syslog::CRITICAL;
        }
        else if( 0 == strncasecmp( "FAULT", sev, 6 ) )
        {
            return Syslog::FAULT;
        }
        else
        {
            return Syslog::NONE;
        }

    };

};

#endif /*SYSLOGSEVERITY_H_*/
