--- parser3/src/include/pa_stylesheet_connection.h 2003/03/18 15:14:17 1.32.2.5.2.1 +++ parser3/src/include/pa_stylesheet_connection.h 2020/12/15 17:10:32 1.47 @@ -1,51 +1,60 @@ /** @file Parser: Stylesheet connection decl. - Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com) + Copyright (c) 2001-2020 Art. Lebedev Studio (http://www.artlebedev.com) Author: Alexandr Petrosian (http://paf.design.ru) */ #ifndef PA_STYLESHEET_CONNECTION_H #define PA_STYLESHEET_CONNECTION_H -static const char* IDENT_STYLESHEET_CONNECTION_H="$Date: 2003/03/18 15:14:17 $"; +#define IDENT_PA_STYLESHEET_CONNECTION_H "$Id: pa_stylesheet_connection.h,v 1.47 2020/12/15 17:10:32 moko Exp $" #include "libxslt/xslt.h" #include "libxslt/xsltInternals.h" -#include "pa_stylesheet_manager.h" -#include "pa_exception.h" +#include "pa_xml_exception.h" #include "pa_common.h" #include "pa_globals.h" +#include "pa_xml_io.h" // defines -#define STYLESHEET_FILENAME_STAMP_SUFFIX ".stamp" - /** Connection with stylesheet: remembers time and can figure out that it needs recompilation */ class Stylesheet_connection: public PA_Object { + + friend class Stylesheet_connection_ptr; + private: - const String& ffile_spec; + String::Body ffile_spec; xsltStylesheet *fstylesheet; + HashStringBool* dependencies; time_t time_used; time_t prev_disk_time; public: - Stylesheet_connection(const String& afile_spec): + Stylesheet_connection(String::Body afile_spec): ffile_spec(afile_spec), - prev_disk_time(0), fstylesheet(0), - time_used(0) {} + dependencies(0), + time_used(0), + prev_disk_time(0), + used(0) + {} - const String& file_spec() { return ffile_spec; } + String::Body file_spec() { return ffile_spec; } + + bool uncachable() { + return !dependencies/*means they were external*/; + } bool expired(time_t older_dies) { - return references()==1/*!used*/ && time_usedprev_disk_time?now_disk_time:0; } - void load(time_t new_disk_time) { - int saved=xmlDoValidityCheckingDefaultValue;// - xmlDoValidityCheckingDefaultValue=0;// - xsltStylesheet *nstylesheet= - xsltParseStylesheetFile(BAD_CAST ffile_spec->cstr(String::UL_FILE_SPEC).get()); - xmlDoValidityCheckingDefaultValue = saved;// - if(xmlHaveGenericErrors()) { - GdomeException exc=0; - throw Exception(ffile_spec, exc); - } - if(!nstylesheet) - throw Exception("file.missing", - ffile_spec, - "stylesheet failed to load"); - - xsltFreeStylesheet(fstylesheet); - fstylesheet=nstylesheet; - prev_disk_time=new_disk_time; - } - - time_t get_disk_time() { - size_t size; - time_t atime, mtime, ctime; - const String& stamp_file_spec(new String(*ffile_spec)); - *stamp_file_spec << STYLESHEET_FILENAME_STAMP_SUFFIX; - // {file_spec}.stamp modification time OR {file_spec} - const String& stat_file_spec=file_readable(stamp_file_spec)?stamp_file_spec:ffile_spec; - file_stat(stat_file_spec, - size, - atime, mtime, ctime, - true/*exception on error*/); - return mtime; - } + void load(time_t new_disk_time); + time_t get_disk_time(); + +private: // connection usage methods - void touch() { + int used; + void use() { time_used=time(0); // they started to use at this time + used++; + } + void unuse() { + used--; + if(!used) + close(); } }; -DECLARE_OBJECT_PTR(Stylesheet_connection); +/// Auto-object used to track Stylesheet_connection usage +class Stylesheet_connection_ptr { + Stylesheet_connection *fconnection; +public: + Stylesheet_connection_ptr(Stylesheet_connection *aconnection) : fconnection(aconnection) { + fconnection->use(); + } + ~Stylesheet_connection_ptr() { + fconnection->unuse(); + } + Stylesheet_connection* operator->() { + return fconnection; + } +}; #endif