Annotation of parser3/src/types/pa_vfile.C, revision 1.45

1.34      paf         1: 
1.5       paf         2: /** @file
1.14      paf         3:        Parser: @b file parser type.
1.3       paf         4: 
1.43      misha       5:        Copyright(c) 2001-2009 ArtLebedev Group (http://www.artlebedev.com)
1.26      paf         6:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.30      paf         7: */
1.3       paf         8: 
1.45    ! misha       9: static const char * const IDENT_VFILE_C="$Date: 2009-06-24 09:02:43 $";
1.1       paf        10: 
1.37      paf        11: #include "classes.h"
1.1       paf        12: #include "pa_vfile.h"
                     13: #include "pa_vstring.h"
1.3       paf        14: #include "pa_vint.h"
1.1       paf        15: 
1.37      paf        16: // externs
                     17: 
                     18: extern Methoded* file_class;
                     19: 
                     20: // defines for statics
                     21: 
                     22: #define SIZE_NAME "size"
                     23: #define TEXT_NAME "text"
                     24: 
                     25: // statics
                     26: 
                     27: static const String size_name(SIZE_NAME);
                     28: static const String text_name(TEXT_NAME);
1.44      misha      29: static const String mode_name("mode");
1.37      paf        30: 
                     31: // methods
                     32: 
                     33: VStateless_class *VFile::get_class() { return file_class; }
                     34: 
                     35: void VFile::set(
1.43      misha      36:                bool atainted, 
1.37      paf        37:                const char* avalue_ptr, size_t avalue_size,
                     38:                const char* afile_name_cstr,
                     39:                Value* acontent_type) {
1.8       paf        40:        fvalue_ptr=avalue_ptr;
                     41:        fvalue_size=avalue_size;
1.43      misha      42:        ftext_tainted=atainted;
1.8       paf        43: 
1.10      paf        44:        ffields.clear();
1.43      misha      45: 
1.3       paf        46:        // $name
1.14      paf        47:        char *lfile_name;
1.37      paf        48:        if(afile_name_cstr) {
                     49:                lfile_name=strdup(afile_name_cstr);
1.10      paf        50:                if(char *after_slash=rsplit(lfile_name, '\\'))
                     51:                        lfile_name=after_slash;
                     52:                if(char *after_slash=rsplit(lfile_name, '/'))
                     53:                        lfile_name=after_slash;
1.14      paf        54:        } else
1.16      paf        55:                lfile_name=NONAME_DAT;
1.37      paf        56:        String& sfile_name=*new String;
                     57:        sfile_name.append_help_length(lfile_name, 0, String::L_FILE_SPEC);
                     58:        ffields.put(name_name, new VString(sfile_name));
1.43      misha      59: 
1.3       paf        60:        // $size
1.37      paf        61:        ffields.put(size_name, new VInt(fvalue_size));
1.43      misha      62: 
                     63:        // $mime-type
                     64:        if(acontent_type)
                     65:                ffields.put(content_type_name, acontent_type);
                     66: }
                     67: 
1.44      misha      68: void VFile::set_mode(bool as_text){
                     69:        ffields.put(mode_name, new VString(as_text? text_mode_name : binary_mode_name ));
                     70: }
                     71: 
1.45    ! misha      72: Value* VFile::get_element(const String& aname) {
1.43      misha      73:        Value* result;
                     74: 
                     75:        // $method
1.45    ! misha      76:        if(result=VStateless_object::get_element(aname))
1.43      misha      77:                return result;
                     78: 
                     79:        // $field
                     80:        if(result=ffields.get(aname))
                     81:                return result;
                     82: 
                     83:        // $text - if not cached
                     84:        if (aname == text_name && fvalue_ptr && fvalue_size){
                     85:                // assigned file have ptr and we really have some bytes
1.42      misha      86: 
                     87:                const char *premature_zero_pos=(const char *)memchr(fvalue_ptr, 0, fvalue_size);
                     88:                size_t copy_size=premature_zero_pos?premature_zero_pos-fvalue_ptr:fvalue_size;
                     89: 
1.43      misha      90:                char *copy_ptr=0;
1.42      misha      91:                if(copy_size){
1.43      misha      92:                        copy_ptr=strdup(fvalue_ptr, copy_size);
1.29      paf        93:                        fix_line_breaks(copy_ptr, copy_size);
                     94:                }
1.42      misha      95: 
1.43      misha      96:                result=new VString(*new String(copy_ptr, ftext_tainted ? String::L_TAINTED : String::L_AS_IS));
                     97:                ffields.put(text_name, result);
1.35      paf        98: 
                     99:                return result;
1.43      misha     100:        }
1.35      paf       101: 
1.43      misha     102:        return 0;
1.3       paf       103: }

E-mail: