|
|
| version 1.104, 2002/01/22 13:04:26 | version 1.122, 2002/04/18 10:51:01 |
|---|---|
| Line 1 | Line 1 |
| /** @file | /** @file |
| Parser: globals. | Parser: globals. |
| Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) | Copyright (c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com) |
| Author: Alexander Petrosyan <paf@design.ru> (http://paf.design.ru) | Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru) |
| $Id$ | $Id$ |
| */ | */ |
| Line 10 | Line 10 |
| #include "pa_config_includes.h" | #include "pa_config_includes.h" |
| #ifdef XML | #ifdef XML |
| //#include "libxml/parser.h" | |
| //#include "libxslt/xslt.h" | |
| //#include "libxslt/libxslt.h" | |
| #include "libxslt/extensions.h" | #include "libxslt/extensions.h" |
| #include "libxslt/xsltutils.h" | #include "libxslt/xsltutils.h" |
| extern "C" { | extern "C" { |
| Line 32 extern "C" { | Line 29 extern "C" { |
| #include "pa_charset.h" | #include "pa_charset.h" |
| #include "pa_threads.h" | #include "pa_threads.h" |
| #ifdef DB2 | |
| #include "pa_db_manager.h" | |
| #endif | |
| String *content_type_name; | String *content_type_name; |
| String *charset_name; | String *charset_name; |
| String *body_name; | String *body_name; |
| Line 46 String *name_name; | Line 39 String *name_name; |
| String *size_name; | String *size_name; |
| String *text_name; | String *text_name; |
| String *exception_method_name; | String *unhandled_exception_method_name; |
| String *post_process_method_name; | String *post_process_method_name; |
| String *content_disposition_name; | String *content_disposition_name; |
| String *content_disposition_filename_name; | String *content_disposition_filename_name; |
| String *unnamed_name; | |
| String *auto_method_name; | String *auto_method_name; |
| String *main_method_name; | String *main_method_name; |
| Line 65 String *string_pre_match_name; | Line 56 String *string_pre_match_name; |
| String *string_match_name; | String *string_match_name; |
| String *string_post_match_name; | String *string_post_match_name; |
| String *exception_var_name; | |
| String *exception_type_part_name; | |
| String *exception_source_part_name; | |
| String *exception_comment_part_name; | |
| String *exception_handled_part_name; | |
| String *charsets_name; | String *charsets_name; |
| String *mime_types_name; | String *mime_types_name; |
| String *vfile_mime_type_name; | String *vfile_mime_type_name; |
| Line 73 String *origins_mode_name; | Line 70 String *origins_mode_name; |
| String *class_path_name; | String *class_path_name; |
| String *switch_data_name; | String *switch_data_name; |
| String *case_default_value; | |
| String *cache_data_name; | |
| String *sql_limit_name; | String *sql_limit_name; |
| String *sql_offset_name; | String *sql_offset_name; |
| Line 85 String *hash_default_element_name; | Line 83 String *hash_default_element_name; |
| Hash *untaint_lang_name2enum; | Hash *untaint_lang_name2enum; |
| GdomeDOMImplementation *domimpl; | |
| Charset *utf8_charset; | Charset *utf8_charset; |
| short hex_value[0x100]; | short hex_value[0x100]; |
| #ifdef XML | |
| GdomeDOMImplementation *domimpl; | |
| #endif | |
| static void setup_hex_value() { | static void setup_hex_value() { |
| memset(hex_value, 0, sizeof(hex_value)); | memset(hex_value, 0, sizeof(hex_value)); |
| hex_value['0'] = 0; | hex_value['0'] = 0; |
| Line 193 const char *xmlGenericErrors() { | Line 193 const char *xmlGenericErrors() { |
| // it is up to caller to free it | // it is up to caller to free it |
| return result; | return result; |
| } | } |
| /** | |
| * xmlFileMatchWithLocalhostEqDocumentRoot: | |
| * filename: the URI for matching | |
| * | |
| * check if the URI matches an HTTP one | |
| * | |
| * Returns 1 if matches, 0 otherwise | |
| */ | |
| static int | |
| xmlFileMatchLocalhost(const char *filename) { | |
| if (!strncmp(filename, "http://localhost", 16)) | |
| return(1); | |
| return(0); | |
| } | |
| /** | |
| * xmlFileOpenHttpLocalhost : | |
| * filename: the URI for matching | |
| * | |
| * http://localhost/abc -> $ENV{DOCUMENT_ROOT}/abc | ./abc | |
| * | |
| * input from FILE *, supports compressed input | |
| * if filename is " " then the standard input is used | |
| * | |
| * Returns an I/O context or NULL in case of error | |
| */ | |
| static void * | |
| xmlFileOpenLocalhost (const char *filename) { | |
| FILE *fd; | |
| const char* documentRoot; | |
| char path[1000]; | |
| path[0]=0; | |
| strcat(path, (documentRoot=getenv("DOCUMENT_ROOT"))?documentRoot:"."); | |
| strcat(path, &filename[16]); | |
| #ifdef WIN32 | |
| fd = fopen(path, "rb"); | |
| #else | |
| fd = fopen(path, "r"); | |
| #endif /* WIN32 */ | |
| return((void *) fd); | |
| } | |
| /** | |
| * xmlFileRead: | |
| * @context: the I/O context | |
| * @buffer: where to drop data | |
| * @len: number of bytes to write | |
| * | |
| * Read @len bytes to @buffer from the I/O channel. | |
| * | |
| * Returns the number of bytes written | |
| */ | |
| static int | |
| xmlFileRead (void * context, char * buffer, int len) { | |
| return(fread(&buffer[0], 1, len, (FILE *) context)); | |
| } | |
| /** | |
| * xmlFileWrite: | |
| * @context: the I/O context | |
| * @buffer: where to drop data | |
| * @len: number of bytes to write | |
| * | |
| * Write @len bytes from @buffer to the I/O channel. | |
| * | |
| * Returns the number of bytes written | |
| */ | |
| static int | |
| xmlFileWrite (void * context, const char * buffer, int len) { | |
| return(fwrite(&buffer[0], 1, len, (FILE *) context)); | |
| } | |
| /** | |
| * xmlFileClose: | |
| * @context: the I/O context | |
| * | |
| * Close an I/O channel | |
| */ | |
| static int | |
| xmlFileClose (void * context) { | |
| return ( ( fclose((FILE *) context) == EOF ) ? -1 : 0 ); | |
| } | |
| #endif | #endif |
| void pa_globals_destroy(void *) { | void pa_globals_destroy(void *) { |
| Line 211 void pa_globals_destroy(void *) { | Line 298 void pa_globals_destroy(void *) { |
| } | } |
| } | } |
| /// @test // replace entities on load. WARNING: in sources there is a hint on one should call this for each thread xmlSubstituteEntitiesDefault(1); | /// @test hint on one should call this for each thread xmlSubstituteEntitiesDefault(1); |
| void pa_globals_init(Pool& pool) { | void pa_globals_init(Pool& pool) { |
| pool.register_cleanup(pa_globals_destroy, 0); | pool.register_cleanup(pa_globals_destroy, 0); |
| Line 232 void pa_globals_init(Pool& pool) { | Line 319 void pa_globals_init(Pool& pool) { |
| size_name=NEW String(pool, SIZE_NAME); | size_name=NEW String(pool, SIZE_NAME); |
| text_name=NEW String(pool, TEXT_NAME); | text_name=NEW String(pool, TEXT_NAME); |
| exception_method_name=NEW String(pool, EXCEPTION_METHOD_NAME); | unhandled_exception_method_name=NEW String(pool, UNHANDLED_EXCEPTION_METHOD_NAME); |
| post_process_method_name=NEW String(pool, POST_PROCESS_METHOD_NAME); | post_process_method_name=NEW String(pool, POST_PROCESS_METHOD_NAME); |
| content_disposition_name=NEW String(pool, CONTENT_DISPOSITION_NAME); | content_disposition_name=NEW String(pool, CONTENT_DISPOSITION_NAME); |
| content_disposition_filename_name=NEW String(pool, CONTENT_DISPOSITION_FILENAME_NAME); | content_disposition_filename_name=NEW String(pool, CONTENT_DISPOSITION_FILENAME_NAME); |
| unnamed_name=NEW String(pool, UNNAMED_NAME); | |
| auto_method_name=NEW String(pool, AUTO_METHOD_NAME); | auto_method_name=NEW String(pool, AUTO_METHOD_NAME); |
| main_method_name=NEW String(pool, MAIN_METHOD_NAME); | main_method_name=NEW String(pool, MAIN_METHOD_NAME); |
| Line 251 void pa_globals_init(Pool& pool) { | Line 336 void pa_globals_init(Pool& pool) { |
| string_match_name=NEW String(pool, STRING_MATCH_NAME); | string_match_name=NEW String(pool, STRING_MATCH_NAME); |
| string_post_match_name=NEW String(pool, STRING_POST_MATCH_NAME); | string_post_match_name=NEW String(pool, STRING_POST_MATCH_NAME); |
| exception_var_name=NEW String(pool, EXCEPTION_VAR_NAME); | |
| exception_type_part_name=NEW String(pool, EXCEPTION_TYPE_PART_NAME); | |
| exception_source_part_name=NEW String(pool, EXCEPTION_SOURCE_PART_NAME); | |
| exception_comment_part_name=NEW String(pool, EXCEPTION_COMMENT_PART_NAME); | |
| exception_handled_part_name=NEW String(pool, EXCEPTION_HANDLED_PART_NAME); | |
| charsets_name=NEW String(pool, CHARSETS_NAME); | charsets_name=NEW String(pool, CHARSETS_NAME); |
| mime_types_name=NEW String(pool, MIME_TYPES_NAME); | mime_types_name=NEW String(pool, MIME_TYPES_NAME); |
| Line 261 void pa_globals_init(Pool& pool) { | Line 351 void pa_globals_init(Pool& pool) { |
| //^switch ^case | //^switch ^case |
| switch_data_name=NEW String(pool, SWITCH_DATA_NAME); | switch_data_name=NEW String(pool, SWITCH_DATA_NAME); |
| case_default_value=NEW String(pool, CASE_DEFAULT_VALUE); | |
| //^cache | |
| cache_data_name=NEW String(pool, CACHE_DATA_NAME); | |
| // sql | // sql |
| sql_limit_name=NEW String(pool, SQL_LIMIT_NAME); | sql_limit_name=NEW String(pool, SQL_LIMIT_NAME); |
| Line 304 void pa_globals_init(Pool& pool) { | Line 396 void pa_globals_init(Pool& pool) { |
| cache_managers->put(*NEW String(pool, "sql"), | cache_managers->put(*NEW String(pool, "sql"), |
| SQL_driver_manager=NEW SQL_Driver_manager(pool)); | SQL_driver_manager=NEW SQL_Driver_manager(pool)); |
| #ifdef DB2 | |
| // DB driver manager | |
| cache_managers->put(*NEW String(pool, "db"), | |
| DB_manager=NEW DB_Manager(pool)); | |
| #endif | |
| #ifdef XML | #ifdef XML |
| // initializing xml libs | // initializing xml libs |
| Line 332 void pa_globals_init(Pool& pool) { | Line 418 void pa_globals_init(Pool& pool) { |
| * use in multithreaded programs. | * use in multithreaded programs. |
| */ | */ |
| xmlInitParser(); | xmlInitParser(); |
| // 1. this is needed for proper parsing of stylesheets | |
| // there were a situation where honest entity ruined innocent xpath compilation | |
| // doc says "you sould turn it on on stylesheet load" without deepening into details | |
| // 2. when dom tree with entites goes under transform text nodes | |
| // got [erroreosly] cut on first entity occurance | |
| // -- | |
| // that is why this is: | |
| xmlSubstituteEntitiesDefault(1); | |
| // Bit in the loadsubset context field to tell to do ID/REFs lookups | // Bit in the loadsubset context field to tell to do ID/REFs lookups |
| xmlLoadExtDtdDefaultValue |= XML_DETECT_IDS; | xmlLoadExtDtdDefaultValue |= XML_DETECT_IDS; |
| Line 340 void pa_globals_init(Pool& pool) { | Line 435 void pa_globals_init(Pool& pool) { |
| //never added yet xmlLoadExtDtdDefaultValue |= XML_COMPLETE_ATTRS; | //never added yet xmlLoadExtDtdDefaultValue |= XML_COMPLETE_ATTRS; |
| //regretfully this not only replaces entities on parse, but also on generate xmlSubstituteEntitiesDefault(1); | //regretfully this not only replaces entities on parse, but also on generate xmlSubstituteEntitiesDefault(1); |
| // never switched this on xmlIndentTreeOutput=1; | |
| memset(xml_generic_error_infos, 0, sizeof(xml_generic_error_infos)); | memset(xml_generic_error_infos, 0, sizeof(xml_generic_error_infos)); |
| xmlSetGenericErrorFunc(0, xmlParserGenericErrorFunc); | xmlSetGenericErrorFunc(0, xmlParserGenericErrorFunc); |
| xsltSetGenericErrorFunc(0, xmlParserGenericErrorFunc); | xsltSetGenericErrorFunc(0, xmlParserGenericErrorFunc); |
| FILE *f=fopen("y:\\xslt.log", "wt"); | // FILE *f=fopen("y:\\xslt.log", "wt"); |
| xsltSetGenericDebugFunc(f/*stderr*/, 0); | // xsltSetGenericDebugFunc(f/*stderr*/, 0); |
| // http://localhost/abc -> $ENV{DOCUMENT_ROOT}/abc | ./abc | |
| xmlRegisterInputCallbacks( | |
| xmlFileMatchLocalhost, xmlFileOpenLocalhost, | |
| xmlFileRead, xmlFileClose); | |
| // XSLT stylesheet manager | // XSLT stylesheet manager |
| cache_managers->put(*NEW String(pool, "stylesheet"), | cache_managers->put(*NEW String(pool, "stylesheet"), |
| Line 356 void pa_globals_init(Pool& pool) { | Line 457 void pa_globals_init(Pool& pool) { |
| #if defined(XML) && defined(_MSC_VER) | #if defined(XML) && defined(_MSC_VER) |
| # define XML_LIBS "/parser3project/win32xml" | # define XML_LIBS "/parser3project/win32xml" |
| # pragma comment(lib, XML_LIBS "/glib/lib/libglib-1.3-11.lib") | # pragma comment(lib, XML_LIBS "/glib/lib/libglib-1.3-11.lib") |
| # pragma comment(lib, XML_LIBS "/libxml2-2.4.12/win32/dsp/libxml2_so/libxml2.lib") | |
| # pragma comment(lib, XML_LIBS "/libxslt-1.0.9/win32/dsp/libexslt_so/libexslt.lib") | |
| # pragma comment(lib, XML_LIBS "/libxslt-1.0.9/win32/dsp/libxslt_a/libxslt.lib") | |
| # ifdef _DEBUG | |
| # pragma comment(lib, XML_LIBS "/gdome2-0.7.0/win32/dsp/Debug/libgdome.lib") | |
| # else | |
| # pragma comment(lib, XML_LIBS "/gdome2-0.7.0/win32/dsp/Release/libgdome.lib") | |
| # endif | |
| #endif | |
| #if defined(DB2) && defined(_MSC_VER) | |
| # define LIBDB2_WIN32_BUILD "/parser3project/win32db/lib" | |
| # ifdef _DEBUG | # ifdef _DEBUG |
| # pragma comment(lib, LIBDB2_WIN32_BUILD "/debug/libdb.lib") | # pragma comment(lib, XML_LIBS "/libxml2-x.x.x/win32/dsp/libxml2_so_debug/libxml2.lib") |
| # pragma comment(lib, XML_LIBS "/libxslt-x.x.x/win32/dsp/libexslt_so_debug/libexslt.lib") | |
| # pragma comment(lib, XML_LIBS "/libxslt-x.x.x/win32/dsp/libxslt_so_debug/libxslt.lib") | |
| # pragma comment(lib, XML_LIBS "/gdome2-x.x.x/win32/dsp/Debug/libgdome.lib") | |
| # else | # else |
| # pragma comment(lib, LIBDB2_WIN32_BUILD "/release/libdb.lib") | # pragma comment(lib, XML_LIBS "/libxml2-x.x.x/win32/dsp/libxml2_so_release/libxml2.lib") |
| # pragma comment(lib, XML_LIBS "/libxslt-x.x.x/win32/dsp/libexslt_so_release/libexslt.lib") | |
| # pragma comment(lib, XML_LIBS "/libxslt-x.x.x/win32/dsp/libxslt_so_release/libxslt.lib") | |
| # pragma comment(lib, XML_LIBS "/gdome2-x.x.x/win32/dsp/Release/libgdome.lib") | |
| # endif | # endif |
| #endif | #endif |