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

1.1       parser      1: /** @file
1.7       parser      2:        Parser: Stylesheet connection decl.
1.1       parser      3: 
                      4:        Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
1.16      paf         5:        Author: Alexander Petrosyan <paf@design.ru> (http://paf.design.ru)
1.1       parser      6: 
1.18    ! paf         7:        $Id: pa_stylesheet_connection.h,v 1.17 2001/12/15 21:28:20 paf Exp $
1.1       parser      8: */
                      9: 
                     10: #ifndef PA_STYLESHEET_CONNECTION_H
                     11: #define PA_STYLESHEET_CONNECTION_H
                     12: 
1.18    ! paf        13: #include "libxslt/libxslt.h"
        !            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.9       parser     20: 
1.1       parser     21: // defines
                     22: 
                     23: #define STYLESHEET_FILENAME_STAMP_SUFFIX ".stamp"
                     24: 
                     25: /**    Connection with stylesheet: 
                     26:        remembers time and can figure out that it needs recompilation
                     27: */
                     28: class Stylesheet_connection : public Pooled {
                     29: 
                     30: public:
                     31: 
                     32:        Stylesheet_connection(Pool& pool, const String& afile_spec) : Pooled(pool),
                     33:                ffile_spec(afile_spec),
                     34:                time_used(0),
                     35:                prev_disk_time(0),
1.3       parser     36:                fservices_pool(0),
                     37:                fstylesheet(0) {
1.1       parser     38:        }
                     39:        
                     40:        const String& file_spec() { return ffile_spec; }
                     41: 
                     42:        void set_services(Pool *aservices_pool) {
                     43:                time_used=time(0); // they started to use at this time
                     44:                fservices_pool=aservices_pool;
                     45:        }
                     46:        bool expired(time_t older_dies) {
                     47:                return time_used<older_dies;
                     48:        }
1.15      paf        49:        time_t get_time_used() { return time_used; }
1.1       parser     50: 
                     51:        void close() {
1.14      parser     52:                stylesheet_manager->close_connection(ffile_spec, *this);
1.1       parser     53:        }
                     54: 
                     55:        void disconnect() { 
1.18    ! paf        56:                xsltFreeStylesheet(fstylesheet);  fstylesheet=0; 
1.1       parser     57:        }
                     58: 
                     59:        bool connected() { return fstylesheet!=0; }
                     60: 
1.18    ! paf        61:        xsltStylesheet *stylesheet(bool nocache) { 
1.6       parser     62:                time_t new_disk_time=get_new_disk_time();
                     63:                if(nocache || new_disk_time)
1.1       parser     64:                        load(new_disk_time);
1.18    ! paf        65:                return fstylesheet; 
1.1       parser     66:        }
                     67: 
                     68: private:
                     69: 
                     70:        time_t get_new_disk_time() {
                     71:                time_t now_disk_time=get_disk_time();
                     72:                return now_disk_time>prev_disk_time?now_disk_time:0;
                     73:        }
                     74: 
1.18    ! paf        75:        /// @test grab errors
1.1       parser     76:        void load(time_t new_disk_time) {
                     77:                Pool& pool=*fservices_pool;
                     78: 
1.18    ! paf        79:                xsltStylesheet *nstylesheet;
        !            80:                nstylesheet=xsltParseStylesheetFile(BAD_CAST ffile_spec.cstr(String::UL_FILE_SPEC));
        !            81:                if(!nstylesheet)
        !            82:                        throw Exception(0, 0,
        !            83:                                &ffile_spec,
        !            84:                                "error compiling. TODO: grab errors");
1.1       parser     85: 
1.18    ! paf        86:                xsltFreeStylesheet(fstylesheet);  
        !            87:                fstylesheet=nstylesheet;
1.1       parser     88:                prev_disk_time=new_disk_time;
                     89:        }
                     90: 
                     91:        time_t get_disk_time() {
                     92:                size_t size;
                     93:                time_t atime, mtime, ctime;
                     94:                String stamp_file_spec(ffile_spec); 
                     95:                stamp_file_spec << STYLESHEET_FILENAME_STAMP_SUFFIX;
1.3       parser     96:                // {file_spec}.stamp modification time OR {file_spec}
                     97:                const String& stat_file_spec=file_readable(stamp_file_spec)?stamp_file_spec:ffile_spec;
1.14      parser     98:                file_stat(stat_file_spec, 
1.1       parser     99:                        size,
                    100:                        atime, mtime, ctime,
1.14      parser    101:                        true/*exception on error*/);
1.1       parser    102:                return mtime;
                    103:        }
                    104: 
                    105: private:
                    106: 
                    107:        const String& ffile_spec;
1.18    ! paf       108:        xsltStylesheet *fstylesheet;
1.1       parser    109:        time_t time_used;
                    110:        time_t prev_disk_time;
                    111: 
                    112: private:
                    113: 
                    114:        Pool *fservices_pool;
1.14      parser    115: 
                    116: private:
                    117:        void *malloc(size_t size) { return fservices_pool->malloc(size); }
                    118:        void *calloc(size_t size) { return fservices_pool->calloc(size); }
1.1       parser    119: };
                    120: 
                    121: #endif

E-mail: