/*
 * Copyright 2004,2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef AXIS2_LOG_H
#define AXIS2_LOG_H

#include <axis2_allocator.h>

#ifdef __cplusplus
extern "C"
{
#endif

    typedef struct axis2_log_ops axis2_log_ops_t;
	typedef struct axis2_log axis2_log_t;


#define AXIS2_LOG_SI __FILE__,__LINE__

/**
 * @defgroup axis2_log Log
 * @ingroup axis2_util 
 * @{
 */

/*TODO:log_xml*/

	/**
	  *Examples
	  *To write debug information to log
	  *AXIS2_LOG_DEBUG(log,AXIS2_LOG_SI,"log this %s %d","test",123);
	  *This would log
	  *"log this test 123" into the log file
	  *
	  *similar macros are defined for different log levels: CRITICAL,ERROR,WARNING and INFO
	  *
	  *CRITICAL and ERROR logs are always written to file and other logs are written 
	  *depending on the log level set (log->level)
	  */
/** 
  * \brief Axis2 log levels
  */
    typedef enum axis2_log_levels
    {
        /** Critical level, logs only critical errors */
        AXIS2_LOG_LEVEL_CRITICAL = 0,
        /** Error level, logs only errors */
        AXIS2_LOG_LEVEL_ERROR,
        /** Warning level, logs only warnings */
        AXIS2_LOG_LEVEL_WARNING,
        /** Info level, logs information */
        AXIS2_LOG_LEVEL_INFO,
        /** Debug level, logs everything */
        AXIS2_LOG_LEVEL_DEBUG,
        /** Trace level, Enable with compiler time option AXIS2_TRACE */
        AXIS2_LOG_LEVEL_TRACE
    } axis2_log_levels_t;







  /** 
    * \brief Axis2 log ops struct
    *
    * Encapsulator struct for ops of axis2_log
    */
    struct axis2_log_ops
    {
    
      /**
       * deletes the log
       * @return axis2_status_t AXIS2_SUCCESS on success else AXIS2_FAILURE
       */

       axis2_status_t (AXIS2_CALL *
		free) (axis2_allocator_t *allocator, 
			   struct axis2_log *log);

      /**
        * writes to the log
        * @param buffer buffer to be written to log
        * @param size size of the buffer to be written to log
        * @return satus of the op. AXIS2_SUCCESS on success else AXIS2_FAILURE
        */
        axis2_status_t (AXIS2_CALL *
	    write) (axis2_log_t *log, 
			    const axis2_char_t *buffer, 
			    axis2_log_levels_t level,
			    const axis2_char_t *file,
			    const int line);
    };

  /** 
    * \brief Axis2 Log struct
    *
    * Log is the encapsulating struct for all log related data and ops
    */
    struct axis2_log
    {
        /** Log related ops */
        struct axis2_log_ops *ops;
        /** Log level */
        axis2_log_levels_t level;
        /** Is logging enabled? */
        axis2_bool_t enabled;

    };

AXIS2_DECLARE(axis2_status_t) 
axis2_log_impl_log_critical(axis2_log_t *log, 
		 					const axis2_char_t *filename, 
							const int linenumber,
							const axis2_char_t *format,...);

AXIS2_DECLARE(axis2_status_t) 
axis2_log_impl_log_error(axis2_log_t *log,
						 const axis2_char_t *filename,
						 const int linenumber,
						 const axis2_char_t *format,...);

AXIS2_DECLARE(axis2_status_t) 
axis2_log_impl_log_warning(axis2_log_t *log,
						   const axis2_char_t *filename,
	                       const int linenumber,
	                       const axis2_char_t *format,...);

AXIS2_DECLARE(axis2_status_t) 
axis2_log_impl_log_info(axis2_log_t *log, 
						const axis2_char_t *format,...);

AXIS2_DECLARE(axis2_status_t) 
axis2_log_impl_log_debug(axis2_log_t *log,
						 const axis2_char_t *filename,
						 const int linenumber,
						 const axis2_char_t *format,...);

AXIS2_DECLARE(axis2_status_t) 
axis2_log_impl_log_trace(axis2_log_t *log,
                         const axis2_char_t *filename,
						 const int linenumber,
						 const axis2_char_t *format,...);

#define AXIS2_LOG_FREE(allocator, log) \
		((log->ops)->free(allocator, log))

#define AXIS2_LOG_WRITE(log, buffer, level) \
		((log)->ops->write(log, buffer, level,AXIS2_LOG_SI))

#define AXIS2_LOG_DEBUG axis2_log_impl_log_debug 
#define AXIS2_LOG_INFO axis2_log_impl_log_info 
#define AXIS2_LOG_WARNING axis2_log_impl_log_warning 
#define AXIS2_LOG_ERROR axis2_log_impl_log_error 
#define AXIS2_LOG_CRITICAL axis2_log_impl_log_critical 

#ifdef AXIS2_TRACE
#define AXIS2_LOG_TRACE axis2_log_impl_log_trace
#else
  #ifdef WIN32
  #define AXIS2_LOG_TRACE axis2_log_impl_log_trace
  #else
  #define AXIS2_LOG_TRACE(params, args ...)
  #endif
#endif

/** @} */
    
#ifdef __cplusplus
}
#endif

#endif                          /* AXIS2_LOG_H */
