/*
 * Modification History
 *
 * 2002-February-25    Jason Rohrer
 * Created.  
 *
 * 2002-March-30    Jason Rohrer
 * Wrapped our dynamically allocated static member in a statically
 * allocated class to avoid memory leaks at program termination.  
 */

#include "minorGems/common.h"



#ifndef APP_LOG_INCLUDED
#define APP_LOG_INCLUDED


#include "Log.h"
#include "PrintLog.h"



// internally used class
class LogPointerWrapper;



/**
 * A singleton wrapper for implementations of the Log interface.
 *
 * This class should be the interface for log-access for applications.
 *
 * @author Jason Rohrer
 */
class AppLog {
    
    
    
    public:
    
    
        /**
         * These log errors at various levels.
         *
         * All char* parameters must be \0-terminated and destroyed by caller.
         */
        
        static void criticalError( char *inString );
        static void criticalError( char *inLoggerName, char *inString );

        static void error( char *inString );
        static void error( char *inLoggerName, char *inString );

        static void warning( char *inString );
        static void warning( char *inLoggerName, char *inString );

        static void info( char *inString );
        static void info( char *inLoggerName, char *inString );

        static void detail( char *inString );
        static void detail( char *inLoggerName, char *inString );

        static void trace( char *inString );
        static void trace( char *inLoggerName, char *inString );
    


        /**
         * Sets the log to use.
         * Note that this call destroys the current log.
         *
         * @param inLog the log to use.
         *   Will be destroyed by this class.
         */
        static void setLog( Log *inLog );


        
        /**
         * Gets the log being used.
         *
         * @return the log being used.
         *   Will be destroyed by this class.
         */
        static Log *getLog();

        
        
        /**
         * Sets the logging level of the current log.
         *
         * Messages with levels above the current level will not be logged.
         *
         * @param inLevel one of the defined logging levels.
         */
        static void setLoggingLevel( int inLevel );


        
        /**
         * Gets the logging level of the current log.
         *
         * Messages with levels above the current level will not be logged.
         *
         * @return one of the defined logging levels.
         */
        static int  getLoggingLevel();



    protected:

        // note that all static objects
        // are destroyed at program termination
        //static Log *mLog;
        static LogPointerWrapper mLogPointerWrapper;
        
    };



/**
 * Wrapper for static member pointer to ensure
 * deletion of static member object at program termination.
 */
class LogPointerWrapper {


        
    public:



        /**
         * Constructor allows specification of the object
         * to wrap and destroy at program termination.
         *
         * @param inLog the log object to wrap.
         *   Will be destroyed at program termination if non-NULL.
         */
        LogPointerWrapper( Log *inLog );



        /**
         * Destructor will get called at program termination
         * if the object is statically allocated.
         */
        ~LogPointerWrapper();


        
        Log *mLog;


        
    };



#endif
