Annotation of parser3/src/include/pa_stylesheet_connection.h, revision 1.32.2.3
1.1 parser 1: /** @file
1.7 parser 2: Parser: Stylesheet connection decl.
1.1 parser 3:
1.32.2.1 paf 4: Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
1.26 paf 5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.1 parser 6: */
7:
8: #ifndef PA_STYLESHEET_CONNECTION_H
9: #define PA_STYLESHEET_CONNECTION_H
1.29 paf 10:
1.32.2.3! paf 11: static const char* IDENT_STYLESHEET_CONNECTION_H="$Date: 2003/02/17 17:05:03 $";
1.1 parser 12:
1.22 paf 13: #include "libxslt/xslt.h"
1.18 paf 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.32.2.3! paf 20: #include "pa_globals.h"
1.9 parser 21:
1.1 parser 22: // defines
23:
24: #define STYLESHEET_FILENAME_STAMP_SUFFIX ".stamp"
25:
26: /** Connection with stylesheet:
27: remembers time and can figure out that it needs recompilation
28: */
1.32.2.3! paf 29: class Stylesheet_connection: public PA_Object {
! 30: private:
1.1 parser 31:
1.32.2.3! paf 32: StringPtr ffile_spec;
! 33: xsltStylesheet *fstylesheet;
! 34: time_t time_used;
! 35: time_t prev_disk_time;
1.19 paf 36:
1.1 parser 37: public:
38:
1.32.2.3! paf 39: Stylesheet_connection(StringPtr afile_spec):
1.1 parser 40: ffile_spec(afile_spec),
41: prev_disk_time(0),
1.19 paf 42: fstylesheet(0),
1.32.2.3! paf 43: time_used(0) {}
1.1 parser 44:
1.32.2.3! paf 45: StringPtr file_spec() { return ffile_spec; }
1.1 parser 46:
47: bool expired(time_t older_dies) {
1.32.2.3! paf 48: return references()==1/*!used*/ && time_used<older_dies;
1.1 parser 49: }
1.15 paf 50: time_t get_time_used() { return time_used; }
1.1 parser 51:
52: void disconnect() {
1.18 paf 53: xsltFreeStylesheet(fstylesheet); fstylesheet=0;
1.1 parser 54: }
55:
56: bool connected() { return fstylesheet!=0; }
57:
1.18 paf 58: xsltStylesheet *stylesheet(bool nocache) {
1.6 parser 59: time_t new_disk_time=get_new_disk_time();
60: if(nocache || new_disk_time)
1.1 parser 61: load(new_disk_time);
1.18 paf 62: return fstylesheet;
1.1 parser 63: }
64:
65: private:
66:
1.19 paf 67: /// return to cache
68: void close() {
1.32.2.3! paf 69: stylesheet_manager.close_connection(ffile_spec, *this);
1.19 paf 70: }
71:
72: private:
73:
1.1 parser 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) {
1.31 paf 80: int saved=xmlDoValidityCheckingDefaultValue;//
81: xmlDoValidityCheckingDefaultValue=0;//
1.24 paf 82: xsltStylesheet *nstylesheet=
1.32.2.3! paf 83: xsltParseStylesheetFile(BAD_CAST ffile_spec->cstr(String::UL_FILE_SPEC).get());
1.31 paf 84: xmlDoValidityCheckingDefaultValue = saved;//
1.28 paf 85: if(xmlHaveGenericErrors()) {
1.20 paf 86: GdomeException exc=0;
1.32.2.3! paf 87: throw Exception(ffile_spec, exc);
1.28 paf 88: }
89: if(!nstylesheet)
90: throw Exception("file.missing",
1.32.2.3! paf 91: ffile_spec,
1.28 paf 92: "stylesheet failed to load");
1.1 parser 93:
1.18 paf 94: xsltFreeStylesheet(fstylesheet);
95: fstylesheet=nstylesheet;
1.1 parser 96: prev_disk_time=new_disk_time;
97: }
98:
99: time_t get_disk_time() {
100: size_t size;
101: time_t atime, mtime, ctime;
1.32.2.3! paf 102: StringPtr stamp_file_spec(ffile_spec);
1.1 parser 103: stamp_file_spec << STYLESHEET_FILENAME_STAMP_SUFFIX;
1.3 parser 104: // {file_spec}.stamp modification time OR {file_spec}
105: const String& stat_file_spec=file_readable(stamp_file_spec)?stamp_file_spec:ffile_spec;
1.14 parser 106: file_stat(stat_file_spec,
1.1 parser 107: size,
108: atime, mtime, ctime,
1.14 parser 109: true/*exception on error*/);
1.1 parser 110: return mtime;
111: }
112:
1.32.2.3! paf 113: void touch() {
1.19 paf 114: time_used=time(0); // they started to use at this time
115: }
1.1 parser 116:
1.19 paf 117: };
118:
1.32.2.3! paf 119: DECLARE_OBJECT_PTR(Stylesheet_connection);
1.1 parser 120:
121: #endif
E-mail: