#include "mod_perl.h"
#include "mod_perl_xs.h"

#if MODULE_MAGIC_NUMBER >= MMN_132
#define HAVE_LOG_RERROR 1
#else
#define HAVE_LOG_RERROR 0
#endif

static void perl_cv_alias(char *to, char *from)
{
    GV *gp = gv_fetchpv(to, TRUE, SVt_PVCV);
    GvCV(gp) = perl_get_cv(from, TRUE);
}

static void ApacheLog(int level, SV *sv, SV *msg)
{
 dTHR;
    char *file = NULL;
    int line   = 0;
    char *str;
    SV *svstr = Nullsv;
    int lmask = level & APLOG_LEVELMASK;
    server_rec *s;
    request_rec *r = NULL;

    if(sv_isa(sv, "Apache::Log::Request") && SvROK(sv)) {
	r = (request_rec *) SvIV((SV*)SvRV(sv));
	s = r->server;
    }
    else if(sv_isa(sv, "Apache::Log::Server") && SvROK(sv)) {
	s = (server_rec *) SvIV((SV*)SvRV(sv));
    }
    else {
        croak("Argument is not an Apache or Apache::Server object");
    }

    if((lmask == APLOG_DEBUG) && (s->loglevel >= APLOG_DEBUG)) {
	SV *caller;
	bool old_T = tainting; tainting = FALSE;
	caller = perl_eval_pv("[ (caller)[1,2] ]", TRUE);
	tainting = old_T;
	file = SvPV(*av_fetch((AV *)SvRV(caller), 0, FALSE),na);
	line = (int)SvIV(*av_fetch((AV *)SvRV(caller), 1, FALSE));
    }

    if((s->loglevel >= lmask) && 
       SvROK(msg) && (SvTYPE(SvRV(msg)) == SVt_PVCV)) {
	dSP;
	ENTER;SAVETMPS;
	PUSHMARK(sp);
	(void)perl_call_sv(msg, G_SCALAR);
	SPAGAIN;
	svstr = POPs;
	++SvREFCNT(svstr);
	PUTBACK;
	FREETMPS;LEAVE;
	str = SvPV(svstr,na);
    }
    else
	str = SvPV(msg,na);

    if(r && HAVE_LOG_RERROR) {
#if HAVE_LOG_RERROR > 0
	ap_log_rerror(file, line, APLOG_NOERRNO|level, r, "%s", str);
#endif
    }
    else {
	ap_log_error(file, line, APLOG_NOERRNO|level, s, "%s", str);
    }

    SvREFCNT_dec(msg);
    if(svstr) SvREFCNT_dec(svstr);
}

#define join_stack_msg \
SV *msgstr; \
if(items > 2) { \
    msgstr = newSV(0); \
    do_join(msgstr, &sv_no, MARK+1, SP); \
} \
else { \
    msgstr = ST(1); \
    ++SvREFCNT(msgstr); \
} 

#define MP_AP_LOG(l,s) \
{ \
join_stack_msg; \
ApacheLog(l, s, msgstr); \
}

#define Apache_log_emerg(s) \
MP_AP_LOG(APLOG_EMERG, s)

#define Apache_log_alert(s) \
MP_AP_LOG(APLOG_ALERT, s)

#define Apache_log_crit(s) \
MP_AP_LOG(APLOG_CRIT, s)

#define Apache_log_error(s) \
MP_AP_LOG(APLOG_ERR, s)

#define Apache_log_warn(s) \
MP_AP_LOG(APLOG_WARNING, s)

#define Apache_log_notice(s) \
MP_AP_LOG(APLOG_NOTICE, s)

#define Apache_log_info(s) \
MP_AP_LOG(APLOG_INFO, s)

#define Apache_log_debug(s) \
MP_AP_LOG(APLOG_DEBUG, s)

MODULE = Apache::Log		PACKAGE = Apache

PROTOTYPES: DISABLE

BOOT:
    perl_cv_alias("Apache::log", "Apache::Log::log");
    perl_cv_alias("Apache::Server::log", "Apache::Log::log");
    perl_cv_alias("emergency", "emerg");
    perl_cv_alias("critical", "crit");

    av_push(perl_get_av("Apache::Log::Request::ISA",TRUE), 
	    newSVpv("Apache::Log",11));
    av_push(perl_get_av("Apache::Log::Server::ISA",TRUE), 
	    newSVpv("Apache::Log",11));

    items = items; /*avoid warning*/ 

MODULE = Apache::Log		PACKAGE = Apache::Log PREFIX=Apache_log_

void
Apache_log_log(sv)
    SV *sv

    PREINIT:
    void *retval;
    char *pclass = "Apache::Log::Request";

    CODE:
    if(!SvROK(sv))
        croak("Argument is not a reference");

    if(sv_derived_from(sv, "Apache")) {
	retval = (void*)sv2request_rec(sv, "Apache", cv);
    }
    else if(sv_derived_from(sv, "Apache::Server")) {
	pclass = "Apache::Log::Server";
	retval = (void *) SvIV((SV*)SvRV(sv));
    }
    else {
        croak("Argument is not an Apache or Apache::Server object");
    }

    ST(0) = sv_newmortal();
    sv_setref_pv(ST(0), pclass, (void*)retval);

void
Apache_log_emerg(s, ...)
	SV *s

void
Apache_log_alert(s, ...)
	SV *s

void
Apache_log_crit(s, ...)
	SV *s

void
Apache_log_error(s, ...)
	SV *s

void
Apache_log_warn(s, ...)
	SV *s

void
Apache_log_notice(s, ...)
	SV *s

void
Apache_log_info(s, ...)
	SV *s

void
Apache_log_debug(s, ...)
	SV *s

MODULE = Apache::Log		PACKAGE = Apache::Server

PROTOTYPES: DISABLE

BOOT:
#ifdef newCONSTSUB
 {
    HV *stash = gv_stashpv("Apache::Log", TRUE);
    newCONSTSUB(stash, "EMERG",   newSViv(APLOG_EMERG));
    newCONSTSUB(stash, "ALERT",   newSViv(APLOG_ALERT));
    newCONSTSUB(stash, "CRIT",    newSViv(APLOG_CRIT));
    newCONSTSUB(stash, "ERR",     newSViv(APLOG_ERR));
    newCONSTSUB(stash, "WARNING", newSViv(APLOG_WARNING));
    newCONSTSUB(stash, "NOTICE",  newSViv(APLOG_NOTICE));
    newCONSTSUB(stash, "INFO",    newSViv(APLOG_INFO));
    newCONSTSUB(stash, "DEBUG",   newSViv(APLOG_DEBUG));
 }
#endif

int
loglevel(server, ...)
    Apache::Server	server

    CODE:
    get_set_IV(server->loglevel); 

    OUTPUT:
    RETVAL
