Diff for /parser3/src/include/pa_stylesheet_connection.h between versions 1.32.2.4 and 1.39.14.1

version 1.32.2.4, 2003/03/06 15:32:37 version 1.39.14.1, 2005/08/05 13:03:00
Line 1 Line 1
 /** @file  /** @file
         Parser: Stylesheet connection decl.          Parser: Stylesheet connection decl.
   
         Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)          Copyright (c) 2001-2005 ArtLebedev Group (http://www.artlebedev.com)
         Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)          Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
 */  */
   
 #ifndef PA_STYLESHEET_CONNECTION_H  #ifndef PA_STYLESHEET_CONNECTION_H
 #define PA_STYLESHEET_CONNECTION_H  #define PA_STYLESHEET_CONNECTION_H
   
 static const char* IDENT_STYLESHEET_CONNECTION_H="$Date$";  static const char * const IDENT_STYLESHEET_CONNECTION_H="$Date$";
   
 #include "libxslt/xslt.h"  #include "libxslt/xslt.h"
 #include "libxslt/xsltInternals.h"  #include "libxslt/xsltInternals.h"
   
 #include "pa_pool.h"  
 #include "pa_stylesheet_manager.h"  #include "pa_xml_exception.h"
 #include "pa_exception.h"  
 #include "pa_common.h"  #include "pa_common.h"
 #include "pa_globals.h"  #include "pa_globals.h"
   #include "pa_xml_io.h"
   
 // defines  // defines
   
 #define STYLESHEET_FILENAME_STAMP_SUFFIX ".stamp"  
   
 /**     Connection with stylesheet:   /**     Connection with stylesheet: 
         remembers time and can figure out that it needs recompilation          remembers time and can figure out that it needs recompilation
 */  */
 class Stylesheet_connection: public PA_Object {  class Stylesheet_connection: public PA_Object {
   
           friend class Stylesheet_connection_ptr;
   
 private:  private:
   
         StringPtr ffile_spec;          String::Body ffile_spec;
         xsltStylesheet *fstylesheet;          xsltStylesheet *fstylesheet;
           HashStringBool* dependencies;
         time_t time_used;          time_t time_used;
         time_t prev_disk_time;          time_t prev_disk_time;
   
 public:  public:
   
         Stylesheet_connection(StringPtr afile_spec):          Stylesheet_connection(String::Body afile_spec):
                 ffile_spec(afile_spec),                  ffile_spec(afile_spec),
                 prev_disk_time(0),  
                 fstylesheet(0),                  fstylesheet(0),
                 time_used(0) {}                  dependencies(0),
                   time_used(0),
                   prev_disk_time(0),
                   used(0)  
           {}
                   
         StringPtr file_spec() { return ffile_spec; }          String::Body file_spec() { return ffile_spec; }
   
           bool uncachable() {
                   return !dependencies/*means they were external*/;
           }
   
         bool expired(time_t older_dies) {          bool expired(time_t older_dies) {
                 return references()==1/*!used*/ && time_used<older_dies;                  return uncachable() || !used && time_used<older_dies;
         }          }
         time_t get_time_used() { return time_used; }          time_t get_time_used() { return time_used; }
   
Line 55  public: Line 64  public:
   
         bool connected() { return fstylesheet!=0; }          bool connected() { return fstylesheet!=0; }
   
         xsltStylesheet *stylesheet(bool nocache) {           xsltStylesheet *stylesheet() { 
                 time_t new_disk_time=get_new_disk_time();                  time_t new_disk_time=0;
                 if(nocache || new_disk_time)                  if(uncachable() || (new_disk_time=get_new_disk_time()))
                         load(new_disk_time);                          load(new_disk_time);
                 return fstylesheet;                   return fstylesheet; 
         }          }
Line 65  public: Line 74  public:
 private:  private:
   
         /// return to cache          /// return to cache
         void close() {          void close();
                 stylesheet_manager.close_connection(ffile_spec, *this);  
         }  
   
 private:  private:
   
Line 76  private: Line 83  private:
                 return now_disk_time>prev_disk_time?now_disk_time:0;                  return now_disk_time>prev_disk_time?now_disk_time:0;
         }          }
   
         void load(time_t new_disk_time) {          void load(time_t new_disk_time);
                 int saved=xmlDoValidityCheckingDefaultValue;//          time_t get_disk_time();
                 xmlDoValidityCheckingDefaultValue=0;//  
                 xsltStylesheet *nstylesheet=  
                         xsltParseStylesheetFile(BAD_CAST ffile_spec->cstr(String::UL_FILE_SPEC).get());  
                 xmlDoValidityCheckingDefaultValue = saved;//  
                 if(xmlHaveGenericErrors()) {  
                         GdomeException exc=0;  
                         throw Exception(ffile_spec, exc);  
                 }  
                 if(!nstylesheet)  
                         throw Exception("file.missing",  
                                 ffile_spec,  
                                 "stylesheet failed to load");  
   
                 xsltFreeStylesheet(fstylesheet);    
                 fstylesheet=nstylesheet;  
                 prev_disk_time=new_disk_time;  
         }  
   
         time_t get_disk_time() {  
                 size_t size;  
                 time_t atime, mtime, ctime;  
                 StringPtr stamp_file_spec(ffile_spec);  
                 *stamp_file_spec << STYLESHEET_FILENAME_STAMP_SUFFIX;  
                 // {file_spec}.stamp modification time OR {file_spec}  
                 StringPtr stat_file_spec=file_readable(stamp_file_spec)?stamp_file_spec:ffile_spec;  
                 file_stat(stat_file_spec,   
                         size,  
                         atime, mtime, ctime,  
                         true/*exception on error*/);  
                 return mtime;  
         }  
   
         void touch() {  private: // connection usage methods
   
           int used;
           void use() {
                 time_used=time(0); // they started to use at this time                  time_used=time(0); // they started to use at this time
                   used++;
           }
           void unuse() {
                   used--;
                   if(!used)
                           close();
         }          }
   
 };  };
   
 DECLARE_OBJECT_PTR(Stylesheet_connection);  /// Auto-object used to track Stylesheet_connection usage
   class Stylesheet_connection_ptr {
           Stylesheet_connection *fconnection;
   public:
           explicit Stylesheet_connection_ptr(Stylesheet_connection *aconnection) : 
                   fconnection(aconnection) {
                   fconnection->use();
           }
           ~Stylesheet_connection_ptr() {
                   fconnection->unuse();
           }
           Stylesheet_connection* operator->() {
                   return fconnection;
           }
   /*      Stylesheet_connection& operator*() {
                   return *fconnection;
           }*/
   
           // copying
           Stylesheet_connection_ptr(const Stylesheet_connection_ptr& src) : fconnection(src.fconnection) {
                   fconnection->use();
           }
           Stylesheet_connection_ptr& operator =(const Stylesheet_connection_ptr& src) {
                   // may do without this=src check
                   fconnection->unuse();
                   fconnection=src.fconnection;
                   fconnection->use();
   
                   return *this;
           }
   };
   
 #endif  #endif

Removed from v.1.32.2.4  
changed lines
  Added in v.1.39.14.1


E-mail: