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

1.34      paf         1: 
1.5       paf         2: /** @file
1.14      paf         3:        Parser: @b file parser type.
1.3       paf         4: 
1.37    ! paf         5:        Copyright(c) 2001-2003 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.37    ! paf         9: static const char* IDENT_VFILE_C="$Date: 2003/04/08 12:47:31 $";
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);
        !            29: 
        !            30: // methods
        !            31: 
        !            32: VStateless_class *VFile::get_class() { return file_class; }
        !            33: 
        !            34: void VFile::set(
        !            35:                bool tainted, 
        !            36:                const char* avalue_ptr, size_t avalue_size,
        !            37:                const char* afile_name_cstr,
        !            38:                Value* acontent_type) {
1.8       paf        39:        fvalue_ptr=avalue_ptr;
                     40:        fvalue_size=avalue_size;
                     41: 
1.10      paf        42:        ffields.clear();
1.3       paf        43:        // $name
1.14      paf        44:        char *lfile_name;
1.37    ! paf        45:        if(afile_name_cstr) {
        !            46:                lfile_name=strdup(afile_name_cstr);
1.10      paf        47:                if(char *after_slash=rsplit(lfile_name, '\\'))
                     48:                        lfile_name=after_slash;
                     49:                if(char *after_slash=rsplit(lfile_name, '/'))
                     50:                        lfile_name=after_slash;
1.14      paf        51:        } else
1.16      paf        52:                lfile_name=NONAME_DAT;
1.37    ! paf        53:        String& sfile_name=*new String;
        !            54:        sfile_name.append_help_length(lfile_name, 0, String::L_FILE_SPEC);
        !            55:        ffields.put(name_name, new VString(sfile_name));
1.3       paf        56:        // $size
1.37    ! paf        57:        ffields.put(size_name, new VInt(fvalue_size));
1.3       paf        58:        // $text
1.29      paf        59:        if(fvalue_ptr && fvalue_size) { // assigned files don't have ptr, and we really have some bytes
1.37    ! paf        60:                String& text=*new String;
1.14      paf        61:                char *premature_zero_pos=(char *)memchr(fvalue_ptr, 0, fvalue_size);
1.29      paf        62:                if(premature_zero_pos!=fvalue_ptr) {
                     63:                        size_t copy_size=premature_zero_pos?premature_zero_pos-(char *)fvalue_ptr:fvalue_size;
1.37    ! paf        64:                        char *copy_ptr=strdup(fvalue_ptr, copy_size);
1.29      paf        65:                        fix_line_breaks(copy_ptr, copy_size);
1.37    ! paf        66:                        text.append_know_length(copy_ptr, copy_size, tainted? String::L_TAINTED : String::L_AS_IS);
1.29      paf        67:                }
1.37    ! paf        68:                ffields.put(text_name, new VString(text));
1.14      paf        69:        }
1.9       paf        70:        // $mime-type
1.37    ! paf        71:        if(acontent_type)
        !            72:                ffields.put(content_type_name, acontent_type);
1.35      paf        73: }
                     74: 
1.37    ! paf        75: Value* VFile::get_element(const String& aname, Value& aself, bool looking_up) {
1.35      paf        76:        // $method
1.37    ! paf        77:        if(Value* result=VStateless_object::get_element(aname, aself, looking_up))
1.35      paf        78:                return result;
                     79: 
                     80:        // $field
1.37    ! paf        81:        return ffields.get(aname);
1.3       paf        82: }

E-mail: