/*
 * 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

    struct axis2_log;
    struct axis2_log_ops;

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

/** 
  * \brief Axis2 log levels
  */
    typedef enum axis2_log_levels
    {
        /** Debug level, logs everything */
        AXIS2_LOG_DEBUG = 0,
        /** Info level, logs information */
        AXIS2_LOG_INFO,
        /** Warning level, logs only warnings */
        AXIS2_LOG_WARNING,
        /** Error level, logs only errors */
        AXIS2_LOG_ERROR,
        /** Critical level, logs only critical errors */
        AXIS2_LOG_CRITICAL
    } axis2_log_levels_t;

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

       axis2_status_t (AXIS2_CALL *free) (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 operation. AXIS2_SUCCESS on success else AXIS2_FAILURE
        */
        axis2_status_t (AXIS2_CALL *write) (const void *buffer, size_t count);
    } axis2_log_ops_t;

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

#define AXIS2_LOG_FREE(log) ((log->ops)->free(log))
#define AXIS2_LOG_WRITE(log, buffer, count) ((log)->ops->write(buffer, count))

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

#endif                          /* AXIS2_LOG_H */
