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

1.34      paf         1: 
1.5       paf         2: /** @file
1.14      paf         3:        Parser: @b file parser type.
1.3       paf         4: 
1.36.2.4  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.36.2.6! paf         9: static const char* IDENT_VFILE_C="$Date: 2003/01/31 16:06:00 $";
1.1       paf        10: 
1.36.2.2  paf        11: #include "classes.h"
1.1       paf        12: #include "pa_vfile.h"
1.36.2.1  paf        13: #include "pa_value_includes.h"
1.1       paf        14: #include "pa_vstring.h"
1.3       paf        15: #include "pa_vint.h"
1.1       paf        16: 
1.36.2.2  paf        17: // externs
                     18: 
                     19: extern MethodedPtr file_class;
                     20: 
1.36.2.5  paf        21: // defines for statics
                     22: 
1.36.2.1  paf        23: #define SIZE_NAME "size"
                     24: #define TEXT_NAME "text"
                     25: 
                     26: // statics
                     27: 
1.36.2.5  paf        28: static StringPtr size_name(new String(SIZE_NAME));
                     29: static StringPtr text_name(new String(TEXT_NAME));
1.36.2.1  paf        30: 
                     31: // methods
1.36.2.2  paf        32: 
                     33: VStateless_class *VFile::get_class() { return file_class.get(); }
1.36.2.1  paf        34: 
                     35: void VFile::set(Pool& pool,
                     36:                                bool tainted, 
1.13      paf        37:                                const void *avalue_ptr, size_t avalue_size,
1.36.2.3  paf        38:                                StringPtr afile_name,
1.36.2.1  paf        39:                                ValuePtr acontent_type) {
                     40:        ffile_name=afile_name;
                     41:        ffile_name_cstr=ffile_name?ffile_name->cstr():CharPtr(0);
1.8       paf        42:        fvalue_ptr=avalue_ptr;
                     43:        fvalue_size=avalue_size;
                     44: 
1.36.2.6! paf        45:        const char* origin_file=ffile_name_cstr?ffile_name_cstr.get():"user (input type=file)";
1.15      paf        46: 
1.10      paf        47:        ffields.clear();
1.3       paf        48:        // $name
1.14      paf        49:        char *lfile_name;
1.36.2.1  paf        50:        if(ffile_name_cstr) {
                     51:                lfile_name=pool.copy(ffile_name_cstr);
1.10      paf        52:                if(char *after_slash=rsplit(lfile_name, '\\'))
                     53:                        lfile_name=after_slash;
                     54:                if(char *after_slash=rsplit(lfile_name, '/'))
                     55:                        lfile_name=after_slash;
1.14      paf        56:        } else
1.16      paf        57:                lfile_name=NONAME_DAT;
1.36.2.1  paf        58:        StringPtr sfile_name(new String);
                     59:        sfile_name->APPEND(lfile_name, 0, String::UL_FILE_SPEC, origin_file, 0);
                     60:        ffields.put(name_name, ValuePtr(new VString(sfile_name)));
1.3       paf        61:        // $size
1.36.2.1  paf        62:        ffields.put(size_name, ValuePtr(new VInt(fvalue_size)));
1.3       paf        63:        // $text
1.29      paf        64:        if(fvalue_ptr && fvalue_size) { // assigned files don't have ptr, and we really have some bytes
1.36.2.1  paf        65:                StringPtr text(new String);
1.14      paf        66:                char *premature_zero_pos=(char *)memchr(fvalue_ptr, 0, fvalue_size);
1.29      paf        67:                if(premature_zero_pos!=fvalue_ptr) {
                     68:                        size_t copy_size=premature_zero_pos?premature_zero_pos-(char *)fvalue_ptr:fvalue_size;
                     69:                        char *copy_ptr=(char *)malloc(copy_size);
                     70:                        memcpy(copy_ptr, fvalue_ptr, copy_size);
                     71:                        fix_line_breaks(copy_ptr, copy_size);
1.36.2.1  paf        72:                        text->APPEND(copy_ptr,  copy_size, 
1.28      paf        73:                                tainted? String::UL_TAINTED : String::UL_AS_IS,
1.18      parser     74:                                origin_file, 0);
1.29      paf        75:                }
1.36.2.1  paf        76:                ffields.put(text_name, ValuePtr(new VString(text)));
1.14      paf        77:        }
1.9       paf        78:        // $mime-type
1.36.2.1  paf        79:        if(acontent_type)
                     80:                ffields.put(content_type_name, acontent_type);
1.35      paf        81: }
                     82: 
1.36.2.3  paf        83: ValuePtr VFile::get_element(StringPtr aname, Value& aself, bool looking_up) {
1.35      paf        84:        // $method
1.36.2.1  paf        85:        if(ValuePtr result=VStateless_object::get_element(aname, aself, looking_up))
1.35      paf        86:                return result;
                     87: 
                     88:        // $field
1.36.2.1  paf        89:        return ffields.get(aname);
1.3       paf        90: }

E-mail: