#include "httpd.h" #include "http_config.h" #include "http_protocol.h" #include "http_log.h" #include "ap_config.h" #include "apr_hash.h" #include "ClearSilver.h" module AP_MODULE_DECLARE_DATA cs_module; typedef struct { apr_hash_t *vars; char *hdf; } cs_dir_config; static void *cs_create_config(apr_pool_t *p, char *path) { cs_dir_config *c = apr_pcalloc(p, sizeof(cs_dir_config)); c->vars = apr_hash_make(p); c->hdf = NULL; return (void *)c; } static NEOERR *render_cb(void *data, char *s) { request_rec *r = (request_rec *)data; ap_rputs(s, r); return STATUS_OK; } static int process_cs(request_rec *r) { HDF *hdf; CSPARSE *cs; apr_pool_t *p; apr_hash_index_t *hi; cs_dir_config *c = ap_get_module_config(r->per_dir_config, &cs_module); hdf_init(&hdf); if(c->hdf != NULL) hdf_read_file(hdf, c->hdf); for (hi = apr_hash_first(NULL, c->vars); hi; hi = apr_hash_next(hi)) { const char *k; const char *v; apr_hash_this(hi, (const void**)&k, NULL, (void**)&v); hdf_set_value(hdf, (char *)k, (char *)v); } cs_init(&cs, hdf); cs_parse_file(cs, r->filename); cs_render(cs, r, render_cb); cs_destroy(&cs); hdf_destroy(&hdf); return OK; } /* The sample content handler */ static int cs_handler(request_rec *r) { if (strcmp(r->handler, "cs-handler")) { return DECLINED; } r->content_type = "text/html"; process_cs(r); return OK; } static const char *cmd_set_hdf_file(cmd_parms *cmd, void *conf, const char *v1) { cs_dir_config *c = (cs_dir_config *)conf; c->hdf = ap_server_root_relative(cmd->pool, v1); return NULL; } static const char *cmd_set_hdf_value(cmd_parms *cmd, void *conf, const char *v1, const char *v2) { cs_dir_config *c = (cs_dir_config *)conf; apr_hash_set(c->vars, v1, APR_HASH_KEY_STRING, v2); return NULL; } static const command_rec command_table[] = { AP_INIT_TAKE2("HDFValue", cmd_set_hdf_value, NULL, ACCESS_CONF, "set HDF value"), AP_INIT_TAKE1("HDFFile", cmd_set_hdf_file, NULL, ACCESS_CONF, "set HDF filename"), { NULL } }; static void cs_register_hooks(apr_pool_t *p) { ap_hook_handler(cs_handler, NULL, NULL, APR_HOOK_MIDDLE); } /* Dispatch list for API hooks */ module AP_MODULE_DECLARE_DATA cs_module = { STANDARD20_MODULE_STUFF, cs_create_config, /* create per-dir config structures */ NULL, /* merge per-dir config structures */ NULL, /* create per-server config structures */ NULL, /* merge per-server config structures */ command_table, /* table of config file commands */ cs_register_hooks /* register hooks */ };