/* ====================================================================
 * The Apache Software License, Version 1.1
 *
 * Copyright (c) 2000-2003 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Apache" and "Apache Software Foundation" must
 *    not be used to endorse or promote products derived from this
 *    software without prior written permission. For written
 *    permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache",
 *    nor may "Apache" appear in their name, without prior written
 *    permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 *
 * Portions of this software are based upon public domain software
 * originally written at the National Center for Supercomputing Applications,
 * University of Illinois, Urbana-Champaign.
 */

#include "apr_optional.h"
#include "httpd.h"
#include "scoreboard.h"

#ifndef _MOD_LOG_CONFIG_H
#define _MOD_LOG_CONFIG_H 1

/** 
 * callback function prototype for an external log handler
 */

/* types of returned data */
#define AP_LOG_EHANDLER_RETURN_CONST    -1 /* the text between %-items */
#define AP_LOG_EHANDLER_RETURN_OLDSTYLE  0 /* ap_escape_logitem() string */
#define AP_LOG_EHANDLER_RETURN_STRING    1 /* raw string, not escaped */
#define AP_LOG_EHANDLER_RETURN_NUMBER    2 /* signed number, ap_log_number_t */
#define AP_LOG_EHANDLER_RETURN_UNUMBER   3 /* unsigned number, ap_log_unumber_t */
#define AP_LOG_EHANDLER_RETURN_DATETIME  4 /* time, apr_time_t */

#define ap_log_number_t apr_int64_t
#define ap_log_unumber_t apr_uint64_t
#define AP_LOG_NUMBER_T_FMT APR_INT64_T_FMT
#define AP_LOG_UNUMBER_T_FMT APR_UINT64_T_FMT

/* struct to hold returned data */
typedef struct ap_log_ehandler_data {
    int type;   /* AP_LOG_EHANDLER_RETURN_*, see above */
    char *arg;  /* log item argument, as given in e.g. %{arg}t */
    void *data; /* pointer to data or null if n/a */
} ap_log_ehandler_data;

typedef const char *ap_log_handler_fn_t(request_rec *r, char *a);
typedef void *ap_log_ehandler_fn_t(request_rec *r, char *a, ap_log_ehandler_data *d);

APR_DECLARE_OPTIONAL_FN(void, ap_register_log_handler, 
                        (apr_pool_t *p, char *tag, ap_log_handler_fn_t *func,
                         int def));
APR_DECLARE_OPTIONAL_FN(void, ap_register_log_ehandler, 
                        (apr_pool_t *p, char *tag, ap_log_ehandler_fn_t *func,
                         int def));

/**
 * callback function prototype for an external writer's initialization.
 */
typedef void *ap_log_writer_init(apr_pool_t *p, server_rec *s, 
                                 const char *name);
typedef void *ap_log_ewriter_setup(apr_pool_t *p, server_rec *s, 
                                  const char *name);

/**
 * callback which gets called when there is a log line to write.
 */
typedef apr_status_t ap_log_writer(
                            request_rec *r,
                            void *handle, 
                            const char **portions,
                            int *lengths,
                            int nelts,
                            apr_size_t len);
typedef apr_status_t ap_log_ewriter(
                            request_rec *r,
                            void *handle, 
                            apr_array_header_t *data);

/**
 * callback function prototypes for each child's external writer init and exit
 */
typedef void ap_log_ewriter_init(apr_pool_t *p, server_rec *s, void *data);
typedef void ap_log_ewriter_exit(server_rec *s, void *data);

/**
 * you will need to set your init handler *BEFORE* the open_logs 
 * in mod_log_config gets executed
 * you should probably set the writer at the same time (ie..before open_logs)
 *
 * ap_log_set_writer() deprecated, better use ap_register_log_ewriter()
 */

APR_DECLARE_OPTIONAL_FN(ap_log_writer_init*, ap_log_set_writer_init,(ap_log_writer_init *func));
APR_DECLARE_OPTIONAL_FN(ap_log_writer*, ap_log_set_writer, (ap_log_writer* func));

/*
 * Register a new log writer.
 * p     pool, you get this as argument to your pre_config hook
 * key   the scheme part of a CustomLog uri, identifies this log writer
 * write write a line of log data
 * setup called during ap_hook_open_logs
 * init  called during ap_hook_child_init
 * exit  called upon child exit (registered as pool cleanup from ap_hook_child_init())
 */
APR_DECLARE_OPTIONAL_FN(void, ap_register_log_ewriter, 
                        (apr_pool_t *p, char *key, 
                         ap_log_ewriter_setup *setup,
                         ap_log_ewriter *write,
                         ap_log_ewriter_init *init,
                         ap_log_ewriter_exit *exit)
                       );

#endif /* MOD_LOG_CONFIG */
