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

1.1       parser      1: /** @file
                      2:        Parser: stylesheet fstylesheet decl.
                      3: 
                      4:        Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
                      5: 
                      6:        Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
                      7: 
1.3     ! parser      8:        $Id: pa_stylesheet_connection.h,v 1.2 2001/09/15 11:48:41 parser Exp $
1.1       parser      9: */
                     10: 
                     11: #ifndef PA_STYLESHEET_CONNECTION_H
                     12: #define PA_STYLESHEET_CONNECTION_H
                     13: 
                     14: #include "pa_config_includes.h"
                     15: #include "pa_pool.h"
                     16: #include "pa_xslt_stylesheet_manager.h"
                     17: #include "pa_exception.h"
                     18: #include "pa_common.h"
                     19: 
                     20: #include <XalanTransformer/XalanTransformer.hpp>
                     21: 
                     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: */
                     29: class Stylesheet_connection : public Pooled {
                     30: 
                     31: public:
                     32: 
                     33:        Stylesheet_connection(Pool& pool, const String& afile_spec) : Pooled(pool),
                     34:                ftransformer(new XalanTransformer),
                     35: 
                     36:                ffile_spec(afile_spec),
                     37:                time_used(0),
                     38:                prev_disk_time(0),
1.3     ! parser     39:                fservices_pool(0),
        !            40:                fstylesheet(0) {
1.1       parser     41:        }
                     42:        
                     43:        const String& file_spec() { return ffile_spec; }
                     44: 
                     45:        void set_services(Pool *aservices_pool) {
                     46:                time_used=time(0); // they started to use at this time
                     47:                fservices_pool=aservices_pool;
                     48:        }
                     49:        bool expired(time_t older_dies) {
                     50:                return time_used<older_dies;
                     51:        }
                     52: 
                     53:        void close() {
                     54:                XSLT_stylesheet_manager->close_connection(ffile_spec, *this);
                     55:        }
                     56: 
                     57:        void disconnect() { 
                     58:                /*ignore error*/ftransformer->destroyStylesheet(fstylesheet);  fstylesheet=0; 
1.2       parser     59: 
                     60:                // connection effectively useless now, free up some memory
                     61:                delete ftransformer; 
1.1       parser     62:        }
                     63: 
                     64:        bool connected() { return fstylesheet!=0; }
                     65: 
                     66:        XalanCompiledStylesheet& stylesheet() { 
                     67:                if(time_t new_disk_time=get_new_disk_time())
                     68:                        load(new_disk_time);
                     69:                return *fstylesheet; 
                     70:        }
                     71: 
                     72: private:
                     73: 
                     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) {
                     80:                Pool& pool=*fservices_pool;
                     81: 
                     82:                int error=ftransformer->compileStylesheet(ffile_spec.cstr(String::UL_FILE_SPEC), fstylesheet);
                     83:                if(error)
                     84:                        PTHROW(0, 0,
                     85:                                &ffile_spec,
                     86:                                ftransformer->getLastError());
                     87: 
                     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;
        !            98:                if(!file_stat(stat_file_spec, 
1.1       parser     99:                        size,
                    100:                        atime, mtime, ctime,
1.3     ! parser    101:                        false/*no exception on global pool[stat_file_spec], please*/))
        !           102:                        mtime=1; //no file=pseudo non-zero time, see get_new_disk_time
1.1       parser    103:                return mtime;
                    104:        }
                    105: 
                    106: private:
                    107: 
                    108:        const String& ffile_spec;
                    109:        XalanCompiledStylesheet *fstylesheet;
                    110:        time_t time_used;
                    111:        time_t prev_disk_time;
                    112: 
                    113: private:
                    114: 
                    115:        XalanTransformer *ftransformer;
                    116: 
                    117:        Pool *fservices_pool;
                    118: };
                    119: 
                    120: #endif

E-mail: