Annotation of parser3/src/types/pa_vresponse.C, revision 1.11

1.1       paf         1: /** @file
                      2:        Parser: @b response class.
                      3: 
1.5       paf         4:        Copyright(c) 2001, 2002 ArtLebedev Group (http://www.artlebedev.com)
1.4       paf         5:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.6       paf         6: */
1.1       paf         7: 
1.11    ! paf         8: static const char* IDENT_VRESPONSE_C="$Date: 2002/08/14 14:18:31 $";
1.1       paf         9: 
                     10: #include "pa_vresponse.h"
                     11: #include "pa_charsets.h"
                     12: #include "pa_charset.h"
                     13: #include "pa_vstring.h"
1.11    ! paf        14: #include "pa_vdate.h"
1.1       paf        15: 
1.10      paf        16: Value *VResponse::get_element(const String& aname, Value *aself, bool looking_up) {
1.1       paf        17:        // $charset
1.8       paf        18:        if(aname==CHARSET_NAME)
1.1       paf        19:                return NEW VString(pool().get_client_charset().name());
1.8       paf        20: 
                     21:        // $method
1.10      paf        22:        if(Value *result=VStateless_object::get_element(aname, aself, looking_up))
1.8       paf        23:                return result;
                     24:        
                     25:        // $field
                     26:        return static_cast<Value *>(ffields.get(aname));
1.1       paf        27: }
                     28: 
1.8       paf        29: bool VResponse::put_element(const String& aname, Value *avalue, bool /*replace*/) { 
1.1       paf        30:        // guard charset change
1.8       paf        31:        if(aname==CHARSET_NAME)
                     32:                pool().set_client_charset(charsets->get_charset(avalue->as_string()));
1.2       paf        33:        else
1.8       paf        34:                ffields.put(aname, avalue);
                     35: 
                     36:        return true;
1.1       paf        37: }
                     38: 
1.11    ! paf        39: // helper funcs
        !            40: 
        !            41: static size_t date_attribute(const VDate& vdate, char *buf, size_t buf_size) {
        !            42:     const char month_names[12][4]={
        !            43:                "Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
        !            44:     const char days[7][4]={
        !            45:                "Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
        !            46: 
        !            47:        time_t when=vdate.get_time();
        !            48:        struct tm *tms=gmtime(&when);
        !            49:        if(!tms)
        !            50:                throw Exception(0,
        !            51:                        0,
        !            52:                        "bad time in attribute value (seconds from epoch=%ld)", when);
        !            53:        return snprintf(buf, MAX_STRING, "%s, %.2d-%s-%.4d %.2d:%.2d:%.2d GMT", 
        !            54:                days[tms->tm_wday],
        !            55:                tms->tm_mday,month_names[tms->tm_mon],tms->tm_year+1900,
        !            56:                tms->tm_hour,tms->tm_min,tms->tm_sec);
        !            57: }
        !            58: static void append_attribute_meaning(String& result,
        !            59:                                                                         Value& value, String::Untaint_lang lang,
        !            60:                                                                         bool forced=false) {
        !            61:        if(const String *string=value.get_string())
        !            62:                result.append(*string, lang, forced);
        !            63:        else
        !            64:                if(Value *vdate=value.as(VDATE_TYPE, false)) {
        !            65:                        char *buf=(char *)result.malloc(MAX_STRING);
        !            66:                        size_t size=date_attribute(*static_cast<VDate *>(vdate), 
        !            67:                                buf, MAX_STRING);
        !            68: 
        !            69:                        result.APPEND(buf, size, lang, "converted from date", 0);
        !            70:                } else
        !            71:                        throw Exception("parser.runtime",
        !            72:                                &result,
        !            73:                                "trying to append here neither string nor date (%s)",
        !            74:                                        value.type());
        !            75: }
        !            76: #ifndef DOXYGEN
        !            77: struct Attributed_meaning_info {
        !            78:        String *header; // header line being constructed
        !            79:        String::Untaint_lang lang; // language in which to append to that line
        !            80: };
        !            81: #endif
        !            82: static void append_attribute_subattribute(const Hash::Key& akey, Hash::Val *avalue, 
        !            83:                                                                                  void *info) {
        !            84:        if(akey==VALUE_NAME)
        !            85:                return;
        !            86: 
        !            87:        Attributed_meaning_info& ami=*static_cast<Attributed_meaning_info *>(info);
        !            88: 
        !            89:        // ...; charset=windows1251
        !            90:        *ami.header << "; ";
        !            91:        ami.header->append(akey, ami.lang);
        !            92:        *ami.header << "=";
        !            93:        append_attribute_meaning(*ami.header, *static_cast<Value *>(avalue), ami.lang);
        !            94: }
        !            95: const String& attributed_meaning_to_string(Value& meaning, 
        !            96:                                                                                   String::Untaint_lang lang) {
        !            97:        String &result=*new(meaning.pool()) String(meaning.pool());
        !            98:        if(Hash *hash=meaning.get_hash(0)) {
        !            99:                // $value(value) $subattribute(subattribute value)
        !           100:                if(Value *value=static_cast<Value *>(hash->get(*value_name)))
        !           101:                        append_attribute_meaning(result, *value, lang, true);
        !           102: 
        !           103:                Attributed_meaning_info attributed_meaning_info={&result, lang};
        !           104:                hash->for_each(append_attribute_subattribute, &attributed_meaning_info);
        !           105:        } else // result value
        !           106:                append_attribute_meaning(result, meaning, lang, true);
        !           107: 
        !           108:        return result;
        !           109: }

E-mail: