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: