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

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)
                      5:        Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
                      6: 
1.8     ! parser      7:        $Id: pa_stylesheet_connection.h,v 1.7 2001/10/01 08:53:58 parser Exp $
1.1       parser      8: */
                      9: 
                     10: #ifndef PA_STYLESHEET_CONNECTION_H
                     11: #define PA_STYLESHEET_CONNECTION_H
                     12: 
                     13: #include "pa_config_includes.h"
                     14: #include "pa_pool.h"
                     15: #include "pa_xslt_stylesheet_manager.h"
                     16: #include "pa_exception.h"
                     17: #include "pa_common.h"
                     18: 
                     19: // defines
                     20: 
                     21: #define STYLESHEET_FILENAME_STAMP_SUFFIX ".stamp"
                     22: 
                     23: /**    Connection with stylesheet: 
                     24:        remembers time and can figure out that it needs recompilation
                     25: */
                     26: class Stylesheet_connection : public Pooled {
                     27: 
                     28: public:
                     29: 
                     30:        Stylesheet_connection(Pool& pool, const String& afile_spec) : Pooled(pool),
                     31:                ftransformer(new XalanTransformer),
                     32: 
                     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:        }
                     49: 
                     50:        void close() {
                     51:                XSLT_stylesheet_manager->close_connection(ffile_spec, *this);
                     52:        }
                     53: 
                     54:        void disconnect() { 
                     55:                /*ignore error*/ftransformer->destroyStylesheet(fstylesheet);  fstylesheet=0; 
1.2       parser     56: 
                     57:                // connection effectively useless now, free up some memory
                     58:                delete ftransformer; 
1.1       parser     59:        }
                     60: 
                     61:        bool connected() { return fstylesheet!=0; }
                     62: 
1.6       parser     63:        const XalanCompiledStylesheet& stylesheet(bool nocache) { 
                     64:                time_t new_disk_time=get_new_disk_time();
                     65:                if(nocache || new_disk_time)
1.1       parser     66:                        load(new_disk_time);
                     67:                return *fstylesheet; 
                     68:        }
                     69: 
                     70: private:
                     71: 
                     72:        time_t get_new_disk_time() {
                     73:                time_t now_disk_time=get_disk_time();
                     74:                return now_disk_time>prev_disk_time?now_disk_time:0;
                     75:        }
                     76: 
                     77:        void load(time_t new_disk_time) {
                     78:                Pool& pool=*fservices_pool;
                     79: 
                     80:                int error=ftransformer->compileStylesheet(ffile_spec.cstr(String::UL_FILE_SPEC), fstylesheet);
                     81:                if(error)
                     82:                        PTHROW(0, 0,
                     83:                                &ffile_spec,
                     84:                                ftransformer->getLastError());
                     85: 
                     86:                prev_disk_time=new_disk_time;
                     87:        }
                     88: 
                     89:        time_t get_disk_time() {
                     90:                size_t size;
                     91:                time_t atime, mtime, ctime;
                     92:                String stamp_file_spec(ffile_spec); 
                     93:                stamp_file_spec << STYLESHEET_FILENAME_STAMP_SUFFIX;
1.3       parser     94:                // {file_spec}.stamp modification time OR {file_spec}
                     95:                const String& stat_file_spec=file_readable(stamp_file_spec)?stamp_file_spec:ffile_spec;
                     96:                if(!file_stat(stat_file_spec, 
1.1       parser     97:                        size,
                     98:                        atime, mtime, ctime,
1.3       parser     99:                        false/*no exception on global pool[stat_file_spec], please*/))
                    100:                        mtime=1; //no file=pseudo non-zero time, see get_new_disk_time
1.1       parser    101:                return mtime;
                    102:        }
                    103: 
                    104: private:
                    105: 
                    106:        const String& ffile_spec;
1.4       parser    107:        const XalanCompiledStylesheet *fstylesheet;
1.1       parser    108:        time_t time_used;
                    109:        time_t prev_disk_time;
                    110: 
                    111: private:
                    112: 
                    113:        XalanTransformer *ftransformer;
                    114: 
                    115:        Pool *fservices_pool;
                    116: };
                    117: 
                    118: #endif

E-mail: