Diff for /parser3/src/include/pa_stylesheet_connection.h between versions 1.16 and 1.32.2.2

version 1.16, 2001/11/05 11:46:25 version 1.32.2.2, 2003/02/17 17:05:03
Line 1 Line 1
 /** @file  /** @file
         Parser: Stylesheet connection decl.          Parser: Stylesheet connection decl.
   
         Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)          Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
         Author: Alexander Petrosyan <paf@design.ru> (http://paf.design.ru)          Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
   
         $Id$  
 */  */
   
 #ifndef PA_STYLESHEET_CONNECTION_H  #ifndef PA_STYLESHEET_CONNECTION_H
 #define PA_STYLESHEET_CONNECTION_H  #define PA_STYLESHEET_CONNECTION_H
   
 #include "pa_config_includes.h"  static const char* IDENT_STYLESHEET_CONNECTION_H="$Date$";
   
   #include "libxslt/xslt.h"
   #include "libxslt/xsltInternals.h"
   
 #include "pa_pool.h"  #include "pa_pool.h"
 #include "pa_stylesheet_manager.h"  #include "pa_stylesheet_manager.h"
 #include "pa_exception.h"  #include "pa_exception.h"
 #include "pa_common.h"  #include "pa_common.h"
   
 #include "XalanTransformer2.hpp"  
   
 // defines  // defines
   
 #define STYLESHEET_FILENAME_STAMP_SUFFIX ".stamp"  #define STYLESHEET_FILENAME_STAMP_SUFFIX ".stamp"
Line 25 Line 25
 /**     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 Pooled {  class Stylesheet_connection: public Pooled {
   
           friend class Stylesheet_connection_ptr;
   
 public:  public:
   
         Stylesheet_connection(Pool& pool, const String& afile_spec) : Pooled(pool),          Stylesheet_connection(Pool& pool, const String& afile_spec) : Pooled(pool),
                 ftransformer(new XalanTransformer2),  
   
                 ffile_spec(afile_spec),                  ffile_spec(afile_spec),
                 time_used(0),  
                 prev_disk_time(0),                  prev_disk_time(0),
                 fservices_pool(0),                  fservices_pool(0),
                 fstylesheet(0) {                  fstylesheet(0),
                   time_used(0), used(0) {
         }          }
                   
         const String& file_spec() { return ffile_spec; }          const String& file_spec() { return ffile_spec; }
   
         void set_services(Pool *aservices_pool) {          void set_services(Pool *aservices_pool) {
                 time_used=time(0); // they started to use at this time  
                 fservices_pool=aservices_pool;                  fservices_pool=aservices_pool;
         }          }
         bool expired(time_t older_dies) {          bool expired(time_t older_dies) {
                 return time_used<older_dies;                  return !used && time_used<older_dies;
         }          }
         time_t get_time_used() { return time_used; }          time_t get_time_used() { return time_used; }
   
         void close() {  
                 stylesheet_manager->close_connection(ffile_spec, *this);  
         }  
   
         void disconnect() {           void disconnect() { 
                 /*ignore error*/ftransformer->destroyStylesheet(fstylesheet);  fstylesheet=0;                   xsltFreeStylesheet(fstylesheet);  fstylesheet=0; 
   
                 // connection effectively useless now, free up some memory  
                 delete ftransformer;   
         }          }
   
         bool connected() { return fstylesheet!=0; }          bool connected() { return fstylesheet!=0; }
   
         const XalanCompiledStylesheet& stylesheet(bool nocache) {           xsltStylesheet *stylesheet(bool nocache) { 
                 time_t new_disk_time=get_new_disk_time();                  time_t new_disk_time=get_new_disk_time();
                 if(nocache || new_disk_time)                  if(nocache || new_disk_time)
                         load(new_disk_time);                          load(new_disk_time);
                 return *fstylesheet;                   return fstylesheet; 
           }
   
   private:
   
           /// return to cache
           void close() {
                   stylesheet_manager->close_connection(ffile_spec, *this);
         }          }
   
 private:  private:
Line 80  private: Line 79  private:
         void load(time_t new_disk_time) {          void load(time_t new_disk_time) {
                 Pool& pool=*fservices_pool;                  Pool& pool=*fservices_pool;
   
                 try{                  int saved=xmlDoValidityCheckingDefaultValue;//
                         const XalanCompiledStylesheet *nstylesheet;                  xmlDoValidityCheckingDefaultValue=0;//
                         ftransformer->compileStylesheet2(ffile_spec.cstr(String::UL_FILE_SPEC), nstylesheet);                  xsltStylesheet *nstylesheet=
                         ftransformer->destroyStylesheet(fstylesheet);                            xsltParseStylesheetFile(BAD_CAST ffile_spec.cstr(String::UL_FILE_SPEC));
                         fstylesheet=nstylesheet;                  xmlDoValidityCheckingDefaultValue = saved;//
                 }                  if(xmlHaveGenericErrors()) {
                 catch (XSLException& e) {                          GdomeException exc=0;
                         Exception::provide_source(pool, &ffile_spec, e);                          throw Exception(&ffile_spec, exc);
                 }                  }
                 catch (SAXParseException& e)    {                  if(!nstylesheet)
                         Exception::provide_source(pool, &ffile_spec, e);                          throw Exception("file.missing",
                 }                                  &ffile_spec,
                 catch (SAXException& e) {                                  "stylesheet failed to load");
                         Exception::provide_source(pool, &ffile_spec, e);  
                 }  
                 catch (XMLException& e) {  
                         Exception::provide_source(pool, &ffile_spec, e);  
                 }  
                 catch(const XalanDOMException&  e)      {  
                         Exception::provide_source(pool, &ffile_spec, e);  
                 }  
   
                   xsltFreeStylesheet(fstylesheet);  
                   fstylesheet=nstylesheet;
                 prev_disk_time=new_disk_time;                  prev_disk_time=new_disk_time;
         }          }
   
         time_t get_disk_time() {          time_t get_disk_time() {
                 size_t size;                  size_t size;
                 time_t atime, mtime, ctime;                  time_t atime, mtime, ctime;
                 String stamp_file_spec(ffile_spec);                   String stamp_file_spec(ffile_spec);
                 stamp_file_spec << STYLESHEET_FILENAME_STAMP_SUFFIX;                  stamp_file_spec << STYLESHEET_FILENAME_STAMP_SUFFIX;
                 // {file_spec}.stamp modification time OR {file_spec}                  // {file_spec}.stamp modification time OR {file_spec}
                 const String& stat_file_spec=file_readable(stamp_file_spec)?stamp_file_spec:ffile_spec;                  const String& stat_file_spec=file_readable(stamp_file_spec)?stamp_file_spec:ffile_spec;
Line 119  private: Line 112  private:
                 return mtime;                  return mtime;
         }          }
   
   private: // connection usage methods
   
           void use() {
                   time_used=time(0); // they started to use at this time
                   used++;
           }
           void unuse() {
                   used--;
                   if(!used)
                           close();
           }
   
   private: // connection usage data
   
           int used;
   
 private:  private:
   
         const String& ffile_spec;          const String& ffile_spec;
         const XalanCompiledStylesheet *fstylesheet;          xsltStylesheet *fstylesheet;
         time_t time_used;          time_t time_used;
         time_t prev_disk_time;          time_t prev_disk_time;
   
 private:  private:
   
         XalanTransformer2 *ftransformer;  
   
         Pool *fservices_pool;          Pool *fservices_pool;
   
 private:  private:
Line 137  private: Line 144  private:
         void *calloc(size_t size) { return fservices_pool->calloc(size); }          void *calloc(size_t size) { return fservices_pool->calloc(size); }
 };  };
   
   /// 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;
           }
   
           // 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.16  
changed lines
  Added in v.1.32.2.2


E-mail: