Annotation of parser3/src/include/pa_stylesheet_connection.h, revision 1.32.2.3

1.1       parser      1: /** @file
1.7       parser      2:        Parser: Stylesheet connection decl.
1.1       parser      3: 
1.32.2.1  paf         4:        Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
1.26      paf         5:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.1       parser      6: */
                      7: 
                      8: #ifndef PA_STYLESHEET_CONNECTION_H
                      9: #define PA_STYLESHEET_CONNECTION_H
1.29      paf        10: 
1.32.2.3! paf        11: static const char* IDENT_STYLESHEET_CONNECTION_H="$Date: 2003/02/17 17:05:03 $";
1.1       parser     12: 
1.22      paf        13: #include "libxslt/xslt.h"
1.18      paf        14: #include "libxslt/xsltInternals.h"
                     15: 
1.1       parser     16: #include "pa_pool.h"
1.14      parser     17: #include "pa_stylesheet_manager.h"
1.1       parser     18: #include "pa_exception.h"
                     19: #include "pa_common.h"
1.32.2.3! paf        20: #include "pa_globals.h"
1.9       parser     21: 
1.1       parser     22: // defines
                     23: 
                     24: #define STYLESHEET_FILENAME_STAMP_SUFFIX ".stamp"
                     25: 
                     26: /**    Connection with stylesheet: 
                     27:        remembers time and can figure out that it needs recompilation
                     28: */
1.32.2.3! paf        29: class Stylesheet_connection: public PA_Object {
        !            30: private:
1.1       parser     31: 
1.32.2.3! paf        32:        StringPtr ffile_spec;
        !            33:        xsltStylesheet *fstylesheet;
        !            34:        time_t time_used;
        !            35:        time_t prev_disk_time;
1.19      paf        36: 
1.1       parser     37: public:
                     38: 
1.32.2.3! paf        39:        Stylesheet_connection(StringPtr afile_spec):
1.1       parser     40:                ffile_spec(afile_spec),
                     41:                prev_disk_time(0),
1.19      paf        42:                fstylesheet(0),
1.32.2.3! paf        43:                time_used(0) {}
1.1       parser     44:        
1.32.2.3! paf        45:        StringPtr file_spec() { return ffile_spec; }
1.1       parser     46: 
                     47:        bool expired(time_t older_dies) {
1.32.2.3! paf        48:                return references()==1/*!used*/ && time_used<older_dies;
1.1       parser     49:        }
1.15      paf        50:        time_t get_time_used() { return time_used; }
1.1       parser     51: 
                     52:        void disconnect() { 
1.18      paf        53:                xsltFreeStylesheet(fstylesheet);  fstylesheet=0; 
1.1       parser     54:        }
                     55: 
                     56:        bool connected() { return fstylesheet!=0; }
                     57: 
1.18      paf        58:        xsltStylesheet *stylesheet(bool nocache) { 
1.6       parser     59:                time_t new_disk_time=get_new_disk_time();
                     60:                if(nocache || new_disk_time)
1.1       parser     61:                        load(new_disk_time);
1.18      paf        62:                return fstylesheet; 
1.1       parser     63:        }
                     64: 
                     65: private:
                     66: 
1.19      paf        67:        /// return to cache
                     68:        void close() {
1.32.2.3! paf        69:                stylesheet_manager.close_connection(ffile_spec, *this);
1.19      paf        70:        }
                     71: 
                     72: private:
                     73: 
1.1       parser     74:        time_t get_new_disk_time() {
                     75:                time_t now_disk_time=get_disk_time();
                     76:                return now_disk_time>prev_disk_time?now_disk_time:0;
                     77:        }
                     78: 
                     79:        void load(time_t new_disk_time) {
1.31      paf        80:                int saved=xmlDoValidityCheckingDefaultValue;//
                     81:                xmlDoValidityCheckingDefaultValue=0;//
1.24      paf        82:                xsltStylesheet *nstylesheet=
1.32.2.3! paf        83:                        xsltParseStylesheetFile(BAD_CAST ffile_spec->cstr(String::UL_FILE_SPEC).get());
1.31      paf        84:                xmlDoValidityCheckingDefaultValue = saved;//
1.28      paf        85:                if(xmlHaveGenericErrors()) {
1.20      paf        86:                        GdomeException exc=0;
1.32.2.3! paf        87:                        throw Exception(ffile_spec, exc);
1.28      paf        88:                }
                     89:                if(!nstylesheet)
                     90:                        throw Exception("file.missing",
1.32.2.3! paf        91:                                ffile_spec,
1.28      paf        92:                                "stylesheet failed to load");
1.1       parser     93: 
1.18      paf        94:                xsltFreeStylesheet(fstylesheet);  
                     95:                fstylesheet=nstylesheet;
1.1       parser     96:                prev_disk_time=new_disk_time;
                     97:        }
                     98: 
                     99:        time_t get_disk_time() {
                    100:                size_t size;
                    101:                time_t atime, mtime, ctime;
1.32.2.3! paf       102:                StringPtr stamp_file_spec(ffile_spec);
1.1       parser    103:                stamp_file_spec << STYLESHEET_FILENAME_STAMP_SUFFIX;
1.3       parser    104:                // {file_spec}.stamp modification time OR {file_spec}
                    105:                const String& stat_file_spec=file_readable(stamp_file_spec)?stamp_file_spec:ffile_spec;
1.14      parser    106:                file_stat(stat_file_spec, 
1.1       parser    107:                        size,
                    108:                        atime, mtime, ctime,
1.14      parser    109:                        true/*exception on error*/);
1.1       parser    110:                return mtime;
                    111:        }
                    112: 
1.32.2.3! paf       113:        void touch() {
1.19      paf       114:                time_used=time(0); // they started to use at this time
                    115:        }
1.1       parser    116: 
1.19      paf       117: };
                    118: 
1.32.2.3! paf       119: DECLARE_OBJECT_PTR(Stylesheet_connection);
1.1       parser    120: 
                    121: #endif

E-mail: