Annotation of parser3/src/include/pa_stylesheet_connection.h, revision 1.7
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.7 ! parser 7: $Id: pa_stylesheet_connection.h,v 1.6 2001/09/28 15:58:26 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: #include <XalanTransformer/XalanTransformer.hpp>
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),
33: ftransformer(new XalanTransformer),
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: }
51:
52: void close() {
53: XSLT_stylesheet_manager->close_connection(ffile_spec, *this);
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:
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;
1.4 parser 109: const XalanCompiledStylesheet *fstylesheet;
1.1 parser 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: