#ifndef _MOD_CPP_H_
#define _MOD_CPP_H_
extern "C"
{
#include "httpd.h"
#include "http_config.h"
#include "http_core.h"
#include "http_log.h"
#include "http_main.h"
#include "http_protocol.h"
#include "util_script.h"
}

class Module
{
protected:
    //request_rec *r;
    //static server_rec *s;
public:
    static const command_rec cmds[];
    static const handler_rec handlers[];
    static Module* theModule;
public:
    /*Module(server_rec* ser)
    {
	if(!s)s=ser;
    }*/
public:
    virtual void init(server_rec *r,pool *p)
    {}
    virtual void* create_dir_config(pool* p,char* dirspec)
    {}
    virtual void* merge_dir_config(pool* p,void* parent_conf,void* newloc_conf)
    {
	return NULL;
    }
    virtual void* create_server_config(server_rec* s,pool* p)
    {
	return NULL;
    }
    virtual void* merge_server_config(pool* p,void*,void*)
    {
	return NULL;
    }
    virtual int translate_handler(request_rec *r)
    {
	return DECLINED;
    }
    virtual int check_user_id(request_rec *r)
    {
	return DECLINED;
    }
    virtual int auth_checker(request_rec *r)
    {
	return DECLINED;
    }
    virtual int access_checker(request_rec *r)
    {
	return DECLINED;
    }
    virtual int type_checker(request_rec *r)
    {
	return DECLINED;
    }
    virtual int fixer_upper(request_rec *r)
    {
	return DECLINED;
    }
    virtual int logger(request_rec *r)
    {
	return DECLINED;
    }
    virtual int header_parser(request_rec *r)
    {
	return DECLINED;
    }
    virtual void child_init(server_rec* s,pool *p)
    {
    }
    virtual void child_exit(server_rec* s,pool *p)
    {
    }
    virtual int post_read_request(request_rec *r)
    {
	return DECLINED;
    }
};
extern Module* theModule;//=new Module;
extern "C"
{
    static void init(server_rec *s,pool *p)
    {
	theModule->init(s,p);
    }
    static void* create_dir_config(pool* p,char* dirspec)
    {
	theModule->create_dir_config(p,dirspec);
    }
    static void* merge_dir_config(pool* p,void* parent_conf,void* newloc_conf)
    {
	return theModule->merge_dir_config(p,parent_conf,newloc_conf);
    }
    static void* create_server_config(pool* p,server_rec* s)
    {
	return theModule->create_server_config(s,p);
    }
    static void* merge_server_config(pool* p,void* base,void* newc)
    {
	return theModule->merge_server_config(p,base,newc);
    }
    static int translate_handler(request_rec *r)
    {
	return theModule->translate_handler(r);
    }
    static int check_user_id(request_rec *r)
    {
	return theModule->check_user_id(r);
    }
    static int auth_checker(request_rec *r)
    {
	return theModule->auth_checker(r);
    }
    static int access_checker(request_rec *r)
    {
	return theModule->access_checker(r);
    }
    static int type_checker(request_rec *r)
    {
	return theModule->type_checker(r);
    }
    static int fixer_upper(request_rec *r)
    {
	return theModule->fixer_upper(r);
    }
    static int logger(request_rec *r)
    {
	return theModule->logger(r);
    }
    static int header_parser(request_rec *r)
    {
	return theModule->header_parser(r);
    }
    static void child_init(server_rec* s,pool *p)
    {
	theModule->child_init(s,p);
    }
    static void child_exit(server_rec* s,pool *p)
    {
	theModule->child_exit(s,p);
    }
    static int post_read_request(request_rec *r)
    {
	return theModule->post_read_request(r);
    }
}
#define THE_MODULE(mod_name)\
    module mod_name##_module =\
{\
    STANDARD_MODULE_STUFF,\
    init,               /* module initializer */\
    create_dir_config,  /* per-directory config creator */\
    merge_dir_config,   /* dir config merger */\
    create_server_config,       /* server config creator */\
    merge_server_config,        /* server config merger */\
    theModule->cmds,               /* command table */\
    theModule->handlers,           /* [7] list of handlers */\
    translate_handler,  /* [2] filename-to-URI translation */\
    check_user_id,      /* [5] check/validate user_id */\
    auth_checker,       /* [6] check user_id is valid _here_ */\
    access_checker,     /* [4] check access by host address */\
    type_checker,       /* [7] MIME type checker/setter */\
    fixer_upper,        /* [8] fixups */\
    logger,             /* [10] logger */\
    header_parser,      /* [3] header parser */\
    child_init,         /* process initializer */\
    child_exit,         /* process exit/cleanup */\
    post_read_request   /* [1] post read_request handling */\
};

#endif //_MOD_CPP_H_
