Annotation of parser3/src/types/pa_vfile.C, revision 1.48
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.48 ! misha 9: static const char * const IDENT_VFILE_C="$Date: 2010-01-26 07:21:29 $";
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.47 misha 68: void VFile::set_mode(bool aas_text){
69: ffields.put(mode_name, new VString(aas_text? text_mode_name : binary_mode_name ));
1.44 misha 70: }
71:
1.46 misha 72: void VFile::save(Request_charsets& charsets, const String& file_spec, bool is_text, Charset* asked_charset) {
73: if(fvalue_ptr)
74: file_write(charsets, file_spec, fvalue_ptr, fvalue_size, is_text, false/*do_append*/, asked_charset);
75: else
76: throw Exception(PARSER_RUNTIME,
77: &file_spec,
78: "saving stat-ed file");
79: }
80:
1.45 misha 81: Value* VFile::get_element(const String& aname) {
1.43 misha 82: Value* result;
83:
84: // $method
1.45 misha 85: if(result=VStateless_object::get_element(aname))
1.43 misha 86: return result;
87:
88: // $field
89: if(result=ffields.get(aname))
90: return result;
91:
92: // $text - if not cached
1.48 ! misha 93: if(aname == text_name && fvalue_ptr && fvalue_size){
1.43 misha 94: // assigned file have ptr and we really have some bytes
1.42 misha 95:
96: const char *premature_zero_pos=(const char *)memchr(fvalue_ptr, 0, fvalue_size);
97: size_t copy_size=premature_zero_pos?premature_zero_pos-fvalue_ptr:fvalue_size;
98:
1.43 misha 99: char *copy_ptr=0;
1.42 misha 100: if(copy_size){
1.43 misha 101: copy_ptr=strdup(fvalue_ptr, copy_size);
1.29 paf 102: fix_line_breaks(copy_ptr, copy_size);
103: }
1.42 misha 104:
1.43 misha 105: result=new VString(*new String(copy_ptr, ftext_tainted ? String::L_TAINTED : String::L_AS_IS));
106: ffields.put(text_name, result);
1.35 paf 107:
108: return result;
1.43 misha 109: }
1.35 paf 110:
1.43 misha 111: return 0;
1.3 paf 112: }
1.48 ! misha 113:
! 114: const String* VFile::get_json_string(Json_options* options){
! 115: String* result=new String("{\"class\":\"file\"");
! 116:
! 117: for(HashStringValue::Iterator i(ffields); i; i.next() ){
! 118: String::Body key=i.key();
! 119: if(key != text_name){
! 120: *result << ",\"" << String(key, String::L_JSON) << "\":" << *i.value()->get_json_string(options);
! 121: }
! 122: }
! 123:
! 124: if(fvalue_ptr){
! 125: switch(options->file){
! 126: case Json_options::F_BASE64:
! 127: {
! 128: *result << ",\"base64\":\"";
! 129: const char* encoded=pa_base64_encode(fvalue_ptr, fvalue_size);
! 130: result->append_help_length(encoded, strlen(encoded), String::L_JSON);
! 131: *result << "\"";
! 132: break;
! 133: }
! 134: case Json_options::F_TEXT:
! 135: {
! 136: *result << ",\"text\":\"";
! 137: result->append(get_element(text_name)->as_string(), String::L_JSON, true/*forced lang*/);
! 138: *result << "\"";
! 139: break;
! 140: }
! 141: }
! 142: }
! 143:
! 144: *result << "}";
! 145: return result;
! 146: }
E-mail: