Diff for /parser3/src/main/pa_xml_io.C between versions 1.5 and 1.9

version 1.5, 2003/11/28 09:35:02 version 1.9, 2003/11/28 10:40:19
Line 16  static const char * const IDENT="$Date$" Line 16  static const char * const IDENT="$Date$"
 #include "pa_globals.h"  #include "pa_globals.h"
 #include "pa_request.h"  #include "pa_request.h"
   
   #ifndef DOXYGEN
   struct MemoryStream {
           const char* m_buf;
           size_t m_size;
           size_t m_position;
   
           int read(char* a_buffer, size_t a_size) {
                   size_t left=m_size-m_position;
                   if(!left)
                           return 0;
   
                   size_t to_read=min(a_size, left);
                   memcpy(a_buffer, m_buf, to_read);
                   m_position+=to_read;
                   return to_read;
           }
   
   };
   #endif
   
   
   #ifdef PA_SAFE_MODE
   static int
   xmlFileMatchSafeMode(const char* file_spec_cstr) {
           if(strstr(filename, "://")) {
                   String* file_spec=new String(file_spec_cstr, true);
                   struct stat finfo;
                   if(stat(file_spec_cstr, &finfo)!=0)
                           throw Exception("file.missing", 
                                   file_spec, 
                                   "stat failed: %s (%d)", 
                                           strerror(errno), errno);
   
                   check_safe_mode(finfo, file_spec, file_spec_cstr);
           }
           return 0;
   }
   #endif
   
   
 /**  /**
  * xmlFileMatchWithLocalhostEqDocumentRoot:   * xmlFileMatchWithLocalhostEqDocumentRoot:
  * filename:  the URI for matching   * filename:  the URI for matching
Line 45  xmlFileMatchLocalhost(const char* filena Line 85  xmlFileMatchLocalhost(const char* filena
  */   */
 static void *  static void *
 xmlFileOpenLocalhost (const char* filename) {  xmlFileOpenLocalhost (const char* filename) {
         //_asm int 3;          Request& r=pa_thread_request();
         FILE *fd;          FILE *fd;
         const char* document_root=pa_thread_request().request_info.document_root;          const char* document_root=r.request_info.document_root;
         if(!document_root)          if(!document_root)
                 document_root=".";                  document_root=".";
   
Line 55  xmlFileOpenLocalhost (const char* filena Line 95  xmlFileOpenLocalhost (const char* filena
         path[0]=0;          path[0]=0;
         strcat(path, document_root);          strcat(path, document_root);
         strcat(path, &filename[16]);          strcat(path, &filename[16]);
           
 #ifdef WIN32  
         fd = fopen(path, "rb");  
 #else  
         fd = fopen(path, "r");  
 #endif /* WIN32 */  
         return((void *) fd);  
 }  
   
 /**          MemoryStream *stream=new(UseGC) MemoryStream;
  * xmlFileRead:          stream->m_buf=file_read_text(r.charsets, *new String(filename), true);
  * @context:  the I/O context          stream->m_size=strlen(stream->m_buf);
  * @buffer:  where to drop data  
  * @len:  number of bytes to write  
  *  
  * Read @len bytes to @buffer from the I/O channel.  
  *  
  * Returns the number of bytes written  
  */  
 static int  
 pa_xmlFileRead (void * context, char * buffer, int len) {  
         return(fread(&buffer[0], 1,  len, (FILE *) context));  
 }  
   
 /**          return (void *)stream;
  * xmlFileClose:  
  * @context:  the I/O context  
  *  
  * Close an I/O channel  
  */  
 static int  
 pa_xmlFileClose (void * context) {  
         return ( ( fclose((FILE *) context) == EOF ) ? -1 : 0 );  
 }  }
   
 //////////////////////////  
   
 #ifndef DOXYGEN  
 struct MemoryStream {  
         const char* m_buf;  
         size_t m_size;  
         size_t m_position;  
   
         int read(char* a_buffer, size_t a_size) {  
                 size_t left=m_size-m_position;  
                 if(!left)  
                         return 0;  
   
                 size_t to_read=min(a_size, left);  
                 memcpy(a_buffer, m_buf, to_read);  
                 m_position+=to_read;  
                 return to_read;  
         }  
   
 };  
 #endif  
   
 static int  static int
 xmlFileMatchMethod(const char* filename) {  xmlFileMatchMethod(const char* filename) {
         if (!strncmp(filename, "parser://", 9 /*strlen("parser://"), and check xmlFileOpenMethod*/))          if (!strncmp(filename, "parser://", 9 /*strlen("parser://"), and check xmlFileOpenMethod*/))
Line 122  xmlFileMatchMethod(const char* filename) Line 113  xmlFileMatchMethod(const char* filename)
 /// parser://method/param/here -> ^MAIN:method[/params/here]  /// parser://method/param/here -> ^MAIN:method[/params/here]
 static void *  static void *
 xmlFileOpenMethod (const char* afilename) {  xmlFileOpenMethod (const char* afilename) {
         //_asm int 3;  
         Request& r=pa_thread_request();          Request& r=pa_thread_request();
   
         char* s=pa_strdup(afilename+9 /*strlen("parser://")*/);          char* s=pa_strdup(afilename+9 /*strlen("parser://")*/);
Line 160  pa_xmlFileReadMethod (void * context, // Line 150  pa_xmlFileReadMethod (void * context, //
         return stream.read(buffer, len);          return stream.read(buffer, len);
 }  }
   
 /**  
  * xmlFileClose:  
  * @context:  the I/O context  
  *  
  * Close an I/O channel  
  */  
 static int  static int
 pa_xmlFileCloseMethod (void * /*context*/) {  pa_xmlFileCloseMethod (void * /*context*/) {
         return 0;          return 0;
Line 174  pa_xmlFileCloseMethod (void * /*context* Line 158  pa_xmlFileCloseMethod (void * /*context*
   
   
 void pa_xml_io_init() {  void pa_xml_io_init() {
   #ifdef PA_SAFE_MODE
           // safe mode checker, always fail match, but checks non-"://" there
           xmlRegisterInputCallbacks(
                   xmlFileMatchSafeMode, 0,
                   0, 0);
   #endif
         // http://localhost/abc -> $ENV{DOCUMENT_ROOT}/abc | ./abc          // http://localhost/abc -> $ENV{DOCUMENT_ROOT}/abc | ./abc
         xmlRegisterInputCallbacks(          xmlRegisterInputCallbacks(
                 xmlFileMatchLocalhost, xmlFileOpenLocalhost,                  xmlFileMatchLocalhost, xmlFileOpenLocalhost,
                 pa_xmlFileRead, pa_xmlFileClose);                  pa_xmlFileReadMethod, pa_xmlFileCloseMethod);
   
         // parser://method/param/here -> ^MAIN:method[/params/here]          // parser://method/param/here -> ^MAIN:method[/params/here]
         xmlRegisterInputCallbacks(          xmlRegisterInputCallbacks(

Removed from v.1.5  
changed lines
  Added in v.1.9


E-mail: