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: