1 #include "mod_xmltools.h"
4 /* Configuration handlers -------------------------------------------------------- */
5 static const char* mod_xmltools_set_locale_dir(cmd_parms *parms, void *config, const char *arg) {
6 mod_xmltools_config *cfg = ap_get_module_config(parms->server->module_config, &mod_xmltools);
7 cfg->locale_dir = (char*) arg;
11 static const char* mod_xmltools_set_default_locale(cmd_parms *parms, void *config, const char *arg) {
12 mod_xmltools_config *cfg = ap_get_module_config(parms->server->module_config, &mod_xmltools);
13 cfg->default_locale = (char*) arg;
17 /* tell apache about our commands */
18 static const command_rec mod_xmltools_cmds[] = {
19 AP_INIT_TAKE1( "XMLToolsDefaultLocale", mod_xmltools_set_default_locale,
20 NULL, RSRC_CONF, "XMLToolsDefaultLocale - Test"),
21 AP_INIT_TAKE1( "XMLToolsLocaleDir", mod_xmltools_set_locale_dir,
22 NULL, RSRC_CONF, "XMLToolsLocaleDir - Test"),
26 /* build the config object */
27 static void* mod_xmltools_create_config( apr_pool_t* p, server_rec* s) {
28 mod_xmltools_config* cfg =
29 (mod_xmltools_config*) apr_palloc(p, sizeof(mod_xmltools_config));
30 cfg->default_locale = DEFAULT_LOCALE;
31 cfg->locale_dir = DEFAULT_LOCALE_DIR;
36 /* Child Init handler ----------------------------------------------------------- */
37 static void mod_xmltools_child_init(apr_pool_t *p, server_rec *s) {
41 /* Request handler -------------------------------------------------------------- */
42 static int mod_xmltools_handler (request_rec* r) {
44 /* make sure we're needed first thing*/
45 if (strcmp(r->handler, MODULE_NAME ))
48 mod_xmltools_config *cfg = ap_get_module_config(r->server->module_config, &mod_xmltools);
49 char* locale_dir = cfg->locale_dir;
50 char* default_locale = cfg->default_locale;
52 fprintf(stderr, "%s : %s\n", locale_dir, default_locale );
55 /* we accept get/post requests */
56 r->allowed |= (AP_METHOD_BIT << M_GET);
57 r->allowed |= (AP_METHOD_BIT << M_POST);
59 ap_set_content_type(r, "text/html");
61 string_array* params = apacheParseParms(r);
63 char* file = r->filename;
64 char* dtdfile = get_dtd_lang_file(params, default_locale, locale_dir );
69 xmlSubstituteEntitiesDefault(0);
72 if( (doc = xmlParseFile(file)) == NULL) {
73 fprintf(stderr, "\n ^-- Error parsing XML file %s\n", file);
75 return HTTP_INTERNAL_SERVER_ERROR;
78 /* process xincludes */
79 if( xmlXIncludeProcess(doc) < 0 ) {
80 fprintf(stderr, "\n ^-- Error processing XIncludes for file %s\n", file);
82 return HTTP_INTERNAL_SERVER_ERROR;
87 if(xmlReplaceDtd(doc, dtdfile) < 0) {
88 fprintf(stderr, "Error replacing DTD file with file %s\n", dtdfile);
90 return HTTP_INTERNAL_SERVER_ERROR;
94 /* force DTD entity replacement */
95 doc = xmlProcessDtdEntities(doc);
98 char* xml = xmlDocToString(doc, 0);
107 xmlCleanupCharEncodingHandlers();
115 /* register callbacks */
116 static void mod_xmltools_register_hooks (apr_pool_t *p) {
117 ap_hook_handler(mod_xmltools_handler, NULL, NULL, APR_HOOK_MIDDLE);
118 ap_hook_child_init(mod_xmltools_child_init,NULL,NULL,APR_HOOK_MIDDLE);
122 /* finally, flesh the module */
123 module AP_MODULE_DECLARE_DATA mod_xmltools = {
124 STANDARD20_MODULE_STUFF,
127 mod_xmltools_create_config,
130 mod_xmltools_register_hooks,
135 /* UTILITY FUNCTIONS ----------------------------------------------------- */
136 char* get_dtd_lang_file(string_array* params, char* default_locale, char* locale_dir) {
138 /* if no locale is provided via URL, we use the default */
139 char* locale = apacheGetFirstParamValue(params, PARAM_LOCALE);
140 if(!locale) locale = default_locale;
141 if(!locale) return NULL;
143 int len = strlen(LANG_DTD) + strlen(locale) + strlen(locale_dir) + 1;
148 sprintf(dtdfile, "%s/%s/%s", locale_dir, locale, LANG_DTD );
150 return strdup(dtdfile);