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

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

E-mail: