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

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.15    ! paf         7:        $Id: pa_stylesheet_connection.h,v 1.14 2001/10/22 16:44:42 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"
1.14      parser     15: #include "pa_stylesheet_manager.h"
1.1       parser     16: #include "pa_exception.h"
                     17: #include "pa_common.h"
1.9       parser     18: 
1.10      parser     19: #include "XalanTransformer2.hpp"
1.1       parser     20: 
                     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),
1.10      parser     33:                ftransformer(new XalanTransformer2),
1.1       parser     34: 
                     35:                ffile_spec(afile_spec),
                     36:                time_used(0),
                     37:                prev_disk_time(0),
1.3       parser     38:                fservices_pool(0),
                     39:                fstylesheet(0) {
1.1       parser     40:        }
                     41:        
                     42:        const String& file_spec() { return ffile_spec; }
                     43: 
                     44:        void set_services(Pool *aservices_pool) {
                     45:                time_used=time(0); // they started to use at this time
                     46:                fservices_pool=aservices_pool;
                     47:        }
                     48:        bool expired(time_t older_dies) {
                     49:                return time_used<older_dies;
                     50:        }
1.15    ! paf        51:        time_t get_time_used() { return time_used; }
1.1       parser     52: 
                     53:        void close() {
1.14      parser     54:                stylesheet_manager->close_connection(ffile_spec, *this);
1.1       parser     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: 
1.6       parser     66:        const XalanCompiledStylesheet& stylesheet(bool nocache) { 
                     67:                time_t new_disk_time=get_new_disk_time();
                     68:                if(nocache || new_disk_time)
1.1       parser     69:                        load(new_disk_time);
                     70:                return *fstylesheet; 
                     71:        }
                     72: 
                     73: private:
                     74: 
                     75:        time_t get_new_disk_time() {
                     76:                time_t now_disk_time=get_disk_time();
                     77:                return now_disk_time>prev_disk_time?now_disk_time:0;
                     78:        }
                     79: 
                     80:        void load(time_t new_disk_time) {
                     81:                Pool& pool=*fservices_pool;
                     82: 
1.10      parser     83:                try{
1.12      parser     84:                        const XalanCompiledStylesheet *nstylesheet;
                     85:                        ftransformer->compileStylesheet2(ffile_spec.cstr(String::UL_FILE_SPEC), nstylesheet);
                     86:                        ftransformer->destroyStylesheet(fstylesheet);  
                     87:                        fstylesheet=nstylesheet;
1.10      parser     88:                }
                     89:                catch (XSLException& e) {
1.14      parser     90:                        Exception::provide_source(pool, &ffile_spec, e);
1.10      parser     91:                }
                     92:                catch (SAXParseException& e)    {
1.14      parser     93:                        Exception::provide_source(pool, &ffile_spec, e);
1.10      parser     94:                }
                     95:                catch (SAXException& e) {
1.14      parser     96:                        Exception::provide_source(pool, &ffile_spec, e);
1.10      parser     97:                }
                     98:                catch (XMLException& e) {
1.14      parser     99:                        Exception::provide_source(pool, &ffile_spec, e);
1.10      parser    100:                }
                    101:                catch(const XalanDOMException&  e)      {
1.14      parser    102:                        Exception::provide_source(pool, &ffile_spec, e);
1.10      parser    103:                }
1.1       parser    104: 
                    105:                prev_disk_time=new_disk_time;
                    106:        }
                    107: 
                    108:        time_t get_disk_time() {
                    109:                size_t size;
                    110:                time_t atime, mtime, ctime;
                    111:                String stamp_file_spec(ffile_spec); 
                    112:                stamp_file_spec << STYLESHEET_FILENAME_STAMP_SUFFIX;
1.3       parser    113:                // {file_spec}.stamp modification time OR {file_spec}
                    114:                const String& stat_file_spec=file_readable(stamp_file_spec)?stamp_file_spec:ffile_spec;
1.14      parser    115:                file_stat(stat_file_spec, 
1.1       parser    116:                        size,
                    117:                        atime, mtime, ctime,
1.14      parser    118:                        true/*exception on error*/);
1.1       parser    119:                return mtime;
                    120:        }
                    121: 
                    122: private:
                    123: 
                    124:        const String& ffile_spec;
1.4       parser    125:        const XalanCompiledStylesheet *fstylesheet;
1.1       parser    126:        time_t time_used;
                    127:        time_t prev_disk_time;
                    128: 
                    129: private:
                    130: 
1.10      parser    131:        XalanTransformer2 *ftransformer;
1.1       parser    132: 
                    133:        Pool *fservices_pool;
1.14      parser    134: 
                    135: private:
                    136:        void *malloc(size_t size) { return fservices_pool->malloc(size); }
                    137:        void *calloc(size_t size) { return fservices_pool->calloc(size); }
1.1       parser    138: };
                    139: 
                    140: #endif

E-mail: