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: