Annotation of parser3/src/include/pa_stylesheet_connection.h, revision 1.18
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.18 ! paf 7: $Id: pa_stylesheet_connection.h,v 1.17 2001/12/15 21:28:20 paf Exp $
1.1 parser 8: */
9:
10: #ifndef PA_STYLESHEET_CONNECTION_H
11: #define PA_STYLESHEET_CONNECTION_H
12:
1.18 ! paf 13: #include "libxslt/libxslt.h"
! 14: #include "libxslt/xsltInternals.h"
! 15:
1.1 parser 16: #include "pa_pool.h"
1.14 parser 17: #include "pa_stylesheet_manager.h"
1.1 parser 18: #include "pa_exception.h"
19: #include "pa_common.h"
1.9 parser 20:
1.1 parser 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: 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: }
1.15 paf 49: time_t get_time_used() { return time_used; }
1.1 parser 50:
51: void close() {
1.14 parser 52: stylesheet_manager->close_connection(ffile_spec, *this);
1.1 parser 53: }
54:
55: void disconnect() {
1.18 ! paf 56: xsltFreeStylesheet(fstylesheet); fstylesheet=0;
1.1 parser 57: }
58:
59: bool connected() { return fstylesheet!=0; }
60:
1.18 ! paf 61: xsltStylesheet *stylesheet(bool nocache) {
1.6 parser 62: time_t new_disk_time=get_new_disk_time();
63: if(nocache || new_disk_time)
1.1 parser 64: load(new_disk_time);
1.18 ! paf 65: return fstylesheet;
1.1 parser 66: }
67:
68: private:
69:
70: time_t get_new_disk_time() {
71: time_t now_disk_time=get_disk_time();
72: return now_disk_time>prev_disk_time?now_disk_time:0;
73: }
74:
1.18 ! paf 75: /// @test grab errors
1.1 parser 76: void load(time_t new_disk_time) {
77: Pool& pool=*fservices_pool;
78:
1.18 ! paf 79: xsltStylesheet *nstylesheet;
! 80: nstylesheet=xsltParseStylesheetFile(BAD_CAST ffile_spec.cstr(String::UL_FILE_SPEC));
! 81: if(!nstylesheet)
! 82: throw Exception(0, 0,
! 83: &ffile_spec,
! 84: "error compiling. TODO: grab errors");
1.1 parser 85:
1.18 ! paf 86: xsltFreeStylesheet(fstylesheet);
! 87: fstylesheet=nstylesheet;
1.1 parser 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;
1.14 parser 98: file_stat(stat_file_spec,
1.1 parser 99: size,
100: atime, mtime, ctime,
1.14 parser 101: true/*exception on error*/);
1.1 parser 102: return mtime;
103: }
104:
105: private:
106:
107: const String& ffile_spec;
1.18 ! paf 108: xsltStylesheet *fstylesheet;
1.1 parser 109: time_t time_used;
110: time_t prev_disk_time;
111:
112: private:
113:
114: Pool *fservices_pool;
1.14 parser 115:
116: private:
117: void *malloc(size_t size) { return fservices_pool->malloc(size); }
118: void *calloc(size_t size) { return fservices_pool->calloc(size); }
1.1 parser 119: };
120:
121: #endif
E-mail: