Annotation of parser3/src/include/pa_stylesheet_connection.h, revision 1.17
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.17 ! paf 7: $Id: pa_stylesheet_connection.h,v 1.16 2001/11/05 11:46:25 paf Exp $
1.1 parser 8: */
9:
10: #ifndef PA_STYLESHEET_CONNECTION_H
11: #define PA_STYLESHEET_CONNECTION_H
12:
13: #include "pa_pool.h"
1.14 parser 14: #include "pa_stylesheet_manager.h"
1.1 parser 15: #include "pa_exception.h"
16: #include "pa_common.h"
1.9 parser 17:
1.10 parser 18: #include "XalanTransformer2.hpp"
1.1 parser 19:
20: // defines
21:
22: #define STYLESHEET_FILENAME_STAMP_SUFFIX ".stamp"
23:
24: /** Connection with stylesheet:
25: remembers time and can figure out that it needs recompilation
26: */
27: class Stylesheet_connection : public Pooled {
28:
29: public:
30:
31: Stylesheet_connection(Pool& pool, const String& afile_spec) : Pooled(pool),
1.10 parser 32: ftransformer(new XalanTransformer2),
1.1 parser 33:
34: ffile_spec(afile_spec),
35: time_used(0),
36: prev_disk_time(0),
1.3 parser 37: fservices_pool(0),
38: fstylesheet(0) {
1.1 parser 39: }
40:
41: const String& file_spec() { return ffile_spec; }
42:
43: void set_services(Pool *aservices_pool) {
44: time_used=time(0); // they started to use at this time
45: fservices_pool=aservices_pool;
46: }
47: bool expired(time_t older_dies) {
48: return time_used<older_dies;
49: }
1.15 paf 50: time_t get_time_used() { return time_used; }
1.1 parser 51:
52: void close() {
1.14 parser 53: stylesheet_manager->close_connection(ffile_spec, *this);
1.1 parser 54: }
55:
56: void disconnect() {
57: /*ignore error*/ftransformer->destroyStylesheet(fstylesheet); fstylesheet=0;
1.2 parser 58:
59: // connection effectively useless now, free up some memory
60: delete ftransformer;
1.1 parser 61: }
62:
63: bool connected() { return fstylesheet!=0; }
64:
1.6 parser 65: const XalanCompiledStylesheet& stylesheet(bool nocache) {
66: time_t new_disk_time=get_new_disk_time();
67: if(nocache || new_disk_time)
1.1 parser 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:
1.10 parser 82: try{
1.12 parser 83: const XalanCompiledStylesheet *nstylesheet;
84: ftransformer->compileStylesheet2(ffile_spec.cstr(String::UL_FILE_SPEC), nstylesheet);
85: ftransformer->destroyStylesheet(fstylesheet);
86: fstylesheet=nstylesheet;
1.10 parser 87: }
88: catch (XSLException& e) {
1.14 parser 89: Exception::provide_source(pool, &ffile_spec, e);
1.10 parser 90: }
91: catch (SAXParseException& e) {
1.14 parser 92: Exception::provide_source(pool, &ffile_spec, e);
1.10 parser 93: }
94: catch (SAXException& e) {
1.14 parser 95: Exception::provide_source(pool, &ffile_spec, e);
1.10 parser 96: }
97: catch (XMLException& e) {
1.14 parser 98: Exception::provide_source(pool, &ffile_spec, e);
1.10 parser 99: }
100: catch(const XalanDOMException& e) {
1.14 parser 101: Exception::provide_source(pool, &ffile_spec, e);
1.10 parser 102: }
1.1 parser 103:
104: prev_disk_time=new_disk_time;
105: }
106:
107: time_t get_disk_time() {
108: size_t size;
109: time_t atime, mtime, ctime;
110: String stamp_file_spec(ffile_spec);
111: stamp_file_spec << STYLESHEET_FILENAME_STAMP_SUFFIX;
1.3 parser 112: // {file_spec}.stamp modification time OR {file_spec}
113: const String& stat_file_spec=file_readable(stamp_file_spec)?stamp_file_spec:ffile_spec;
1.14 parser 114: file_stat(stat_file_spec,
1.1 parser 115: size,
116: atime, mtime, ctime,
1.14 parser 117: true/*exception on error*/);
1.1 parser 118: return mtime;
119: }
120:
121: private:
122:
123: const String& ffile_spec;
1.4 parser 124: const XalanCompiledStylesheet *fstylesheet;
1.1 parser 125: time_t time_used;
126: time_t prev_disk_time;
127:
128: private:
129:
1.10 parser 130: XalanTransformer2 *ftransformer;
1.1 parser 131:
132: Pool *fservices_pool;
1.14 parser 133:
134: private:
135: void *malloc(size_t size) { return fservices_pool->malloc(size); }
136: void *calloc(size_t size) { return fservices_pool->calloc(size); }
1.1 parser 137: };
138:
139: #endif
E-mail: