
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 AXUTIL_LOG_H
#define AXUTIL_LOG_H

#include <axutil_allocator.h>

#ifdef __cplusplus
extern "C"
{
#endif

    typedef struct axutil_log_ops axutil_log_ops_t;
    typedef struct axutil_log axutil_log_t;

#define AXIS2_LOG_SI __FILE__,__LINE__

    /**
     * @defgroup axutil_log log
     * @ingroup axis2_util
     * @{
     */

    /**
      *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
      * and SERVICE
      *
      *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 axutil_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,
        
        /** User level, logs only user level debug messages */
        AXIS2_LOG_LEVEL_USER,

        /** Trace level, Enable with compiler time option AXIS2_TRACE */
        AXIS2_LOG_LEVEL_TRACE
        
    } axutil_log_levels_t;

    /**
      * \brief Axis2 log ops struct
      *
      * Encapsulator struct for ops of axutil_log
      */
    struct axutil_log_ops
    {

        /**
         * deletes the log
         * @return axis2_status_t AXIS2_SUCCESS on success else AXIS2_FAILURE
         */

        void(
            AXIS2_CALL
            * free)(
                axutil_allocator_t * allocator,
                struct axutil_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
          */
        void(
            AXIS2_CALL
            * write)(
                axutil_log_t * log,
                const axis2_char_t * buffer,
                axutil_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 axutil_log
    {

        /** Log related ops */
        const axutil_log_ops_t *ops;

        /** Log level */
        axutil_log_levels_t level;
        
        /** Maximum log file size */
        int size;

        /** Is logging enabled? */
        axis2_bool_t enabled;

    };

    AXIS2_EXTERN void AXIS2_CALL
    axutil_log_impl_log_critical(
        axutil_log_t * log,
        const axis2_char_t * filename,
        const int linenumber,
        const axis2_char_t * format,
        ...);

    AXIS2_EXTERN void AXIS2_CALL
    axutil_log_impl_log_error(
        axutil_log_t * log,
        const axis2_char_t * filename,
        const int linenumber,
        const axis2_char_t * format,
        ...);

    AXIS2_EXTERN void AXIS2_CALL
    axutil_log_impl_log_warning(
        axutil_log_t * log,
        const axis2_char_t * filename,
        const int linenumber,
        const axis2_char_t * format,
        ...);

    AXIS2_EXTERN void AXIS2_CALL
    axutil_log_impl_log_info(
        axutil_log_t * log,
        const axis2_char_t * format,
        ...);

    AXIS2_EXTERN void AXIS2_CALL
    axutil_log_impl_log_user(
        axutil_log_t * log,
        const axis2_char_t * filename,
        const int linenumber,
        const axis2_char_t * format,
        ...);

    AXIS2_EXTERN void AXIS2_CALL
    axutil_log_impl_log_debug(
        axutil_log_t * log,
        const axis2_char_t * filename,
        const int linenumber,
        const axis2_char_t * format,
        ...);

    AXIS2_EXTERN void AXIS2_CALL
    axutil_log_impl_log_trace(
        axutil_log_t * log,
        const axis2_char_t * filename,
        const int linenumber,
        const axis2_char_t * format,
        ...);

    AXIS2_EXTERN void AXIS2_CALL
    axutil_log_free(
        axutil_allocator_t * allocator,
        struct axutil_log *log);

    AXIS2_EXTERN void AXIS2_CALL
    axutil_log_write(
        axutil_log_t * log,
        const axis2_char_t * buffer,
        axutil_log_levels_t level,
        const axis2_char_t * file,
        const int line);


#define AXIS2_LOG_FREE(allocator, log) \
      axutil_log_free(allocator, log)

#define AXIS2_LOG_WRITE(log, buffer, level, file) \
      axutil_log_write(log, buffer, level, file, AXIS2_LOG_SI)

#define AXIS2_LOG_USER axutil_log_impl_log_user
#define AXIS2_LOG_DEBUG axutil_log_impl_log_debug
#define AXIS2_LOG_INFO axutil_log_impl_log_info
#define AXIS2_LOG_WARNING axutil_log_impl_log_warning
#define AXIS2_LOG_ERROR axutil_log_impl_log_error
#define AXIS2_LOG_CRITICAL axutil_log_impl_log_critical

#ifdef AXIS2_TRACE
#define AXIS2_LOG_TRACE axutil_log_impl_log_trace
#else
# ifdef HAVE_GNUC_VARARGS
#  define AXIS2_LOG_TRACE(params, args ...)
# elif defined HAVE_ISO_VARARGS
#  define AXIS2_LOG_TRACE(params, ...)
# elif __STDC__ && __STDC_VERSION > 199901L
#  define AXIS2_LOG_TRACE(params, ...)
# elif WIN32
#  define AXIS2_LOG_TRACE axutil_log_impl_log_trace
# else
#  define AXIS2_LOG_TRACE axutil_log_impl_log_trace
# endif
#endif

#ifndef AXIS2_LOG_PROJECT_PREFIX
    /** Each module/project should undef and define the following.. */
#define AXIS2_LOG_PROJECT_PREFIX "[axis2c]"
#endif 

#define AXIS2_LOG_USER_MSG(log, msg) AXIS2_LOG_USER (log, AXIS2_LOG_SI, "%s %s", AXIS2_LOG_PROJECT_PREFIX, msg)
#define AXIS2_LOG_DEBUG_MSG(log, msg) AXIS2_LOG_DEBUG (log, AXIS2_LOG_SI, "%s %s", AXIS2_LOG_PROJECT_PREFIX, msg)
#define AXIS2_LOG_INFO_MSG(log, msg) AXIS2_LOG_INFO (log, "%s %s", AXIS2_LOG_PROJECT_PREFIX, msg)
#define AXIS2_LOG_WARNING_MSG(log, msg) AXIS2_LOG_WARNING (log, AXIS2_LOG_SI, "%s %s", AXIS2_LOG_PROJECT_PREFIX, msg)
#define AXIS2_LOG_ERROR_MSG(log, msg) AXIS2_LOG_ERROR (log, AXIS2_LOG_SI, "%s %s", AXIS2_LOG_PROJECT_PREFIX, msg)
#define AXIS2_LOG_CRITICAL_MSG(log, msg) AXIS2_LOG_CRITICAL (log, AXIS2_LOG_SI, "%s %s", AXIS2_LOG_PROJECT_PREFIX, msg)
#define AXIS2_LOG_TRACE_MSG(log, msg) AXIS2_LOG_TRACE (log, AXIS2_LOG_SI, "%s %s", AXIS2_LOG_PROJECT_PREFIX, msg)


#define IF_AXIS2_LOG_DEBUG_ENABLED(log) if(AXIS2_LOG_LEVEL_DEBUG <= log->level && log->level != AXIS2_LOG_LEVEL_USER)

    /** @} */

#ifdef __cplusplus
}
#endif

#endif                          /* AXIS2_LOG_H */
