--- parser3/src/main/pa_xml_io.C 2004/04/08 08:46:16 1.18 +++ parser3/src/main/pa_xml_io.C 2010/11/24 00:44:09 1.27 @@ -1,7 +1,7 @@ /** @file Parser: plugins to xml library, controlling i/o; implementation - Copyright (c) 2001-2004 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001-2009 ArtLebedev Group (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ @@ -9,7 +9,7 @@ #ifdef XML -static const char * const IDENT="$Date: 2004/04/08 08:46:16 $"; +static const char * const IDENT="$Date: 2010/11/24 00:44:09 $"; #include "libxslt/extensions.h" @@ -17,50 +17,25 @@ static const char * const IDENT="$Date: #include "pa_globals.h" #include "pa_request.h" -static Hash xml_dependencies; +THREAD_LOCAL HashStringBool* xml_dependencies = NULL; static void add_dependency(const String::Body url) { - pa_thread_t thread_id=pa_get_thread_id(); - HashStringBool* urls; - { - SYNCHRONIZED; - - // try to get existing for this thread_id - urls=xml_dependencies.get(thread_id); - } - - if(urls) // do we need to monitor now? - urls->put(url, true); + if(xml_dependencies) // do we need to monitor now? + xml_dependencies->put(url, true); } void pa_xmlStartMonitoringDependencies() { - pa_thread_t thread_id=pa_get_thread_id(); - HashStringBool* urls=new HashStringBool; - { - SYNCHRONIZED; // find+fill blocked - - xml_dependencies.put(thread_id, urls); - } + xml_dependencies=new HashStringBool; } void pa_xmlStopMonitoringDependencies() { - pa_thread_t thread_id=pa_get_thread_id(); - { - SYNCHRONIZED; // find+fill blocked - - xml_dependencies.put(thread_id, 0); - } + xml_dependencies=NULL; } HashStringBool* pa_xmlGetDependencies() { - pa_thread_t thread_id=pa_get_thread_id(); - { - SYNCHRONIZED; // find+remove blocked - - HashStringBool* result=xml_dependencies.get(thread_id); - xml_dependencies.remove(thread_id); - return result; - } + HashStringBool* result=xml_dependencies; + xml_dependencies=NULL; + return result; } #ifndef DOXYGEN @@ -105,19 +80,34 @@ xmlFileOpen_ReadIntoStream (const char* strcat(adjust_buf, &do_not_store_filename[16]); do_not_store_filename=adjust_buf; } else - if(strstr(do_not_store_filename, "file://")) - do_not_store_filename+=7/*strlen("file://")*/; - else if(*do_not_store_filename && do_not_store_filename[1]!=':' && strstr(do_not_store_filename, "://")) { - pa_xmlStopMonitoringDependencies(); - return 0; // plug out [do not handle other prefixes] - } + if(!strstr(do_not_store_filename, "http://")) + if(strstr(do_not_store_filename, "file://")){ + do_not_store_filename+=7/*strlen("file://")*/; +#ifdef WIN32 + if( + do_not_store_filename[0]=='/' + && do_not_store_filename[1] + && do_not_store_filename[2]==':' + && do_not_store_filename[3]=='/' + ){ + // skip leading slash for absolute path file:///C:/path/to/file + do_not_store_filename++; + } +#endif + } else if(*do_not_store_filename && do_not_store_filename[1]!=':' && strstr(do_not_store_filename, "://")) { + pa_xmlStopMonitoringDependencies(); + return 0; // plug out [do not handle other prefixes] + } const char* can_store_filename=pa_strdup(do_not_store_filename); add_dependency(can_store_filename); const char *buf; try { - buf=file_read_text(r.charsets, *new String(can_store_filename)); + buf=file_load_text(r, *new String(can_store_filename), + true/*fail_on_read_problem*/, + 0/*params*/, + false/*don't transcode result because it must be fit with @encoding value!*/); } catch(const Exception& e) { if(strcmp(e.type(), "file.missing")==0) return 0; // let the library try that and report an error properly @@ -197,7 +187,7 @@ xmlFileOpenMethod (const char* afilename Request::Execute_nonvirtual_method_result body= r.execute_nonvirtual_method(r.main_class, *method, vparam, true); if(body.string) { - buf=body.string->cstr(String::L_UNSPECIFIED); + buf=body.string->untaint_cstr(r.flang); } else throw Exception(0, new String(afilename),