Annotation of parser3/src/classes/dom.C, revision 1.25

1.2       parser      1: /** @file
                      2:        Parser: @b dom parser class.
                      3: 
                      4:        Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
                      5: 
                      6:        Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
                      7: */
1.25    ! parser      8: static const char *RCSId="$Id: dom.C,v 1.24 2001/09/17 16:49:15 parser Exp $"; 
1.2       parser      9: 
                     10: #if _MSC_VER
                     11: #      pragma warning(disable:4291)   // disable warning 
                     12: //     "no matching operator delete found; memory will not be freed if initialization throws an exception
                     13: #endif
                     14: 
                     15: #include "classes.h"
                     16: #include "pa_request.h"
                     17: #include "pa_vdom.h"
1.20      parser     18: #include "pa_xslt_stylesheet_manager.h"
                     19: #include "pa_stylesheet_connection.h"
1.23      parser     20: #include "dnode.h"
1.2       parser     21: 
1.16      parser     22: #include <strstream>
1.2       parser     23: #include <Include/PlatformDefinitions.hpp>
                     24: #include <util/PlatformUtils.hpp>
                     25: #include <XalanTransformer/XalanTransformer.hpp>
1.4       parser     26: #include <XalanTransformer/XalanParsedSource.hpp>
1.6       parser     27: 
1.2       parser     28: // defines
                     29: 
1.4       parser     30: #define DOM_CLASS_NAME "dom"
1.2       parser     31: 
                     32: // class
                     33: 
1.24      parser     34: class MDom : public MDnode {
1.2       parser     35: public: // VStateless_class
1.11      parser     36:        Value *create_new_value(Pool& pool) { return new(pool) VDom(pool); }
1.2       parser     37: 
                     38: public:
                     39:        MDom(Pool& pool);
                     40: 
                     41: public: // Methoded
                     42:        bool used_directly() { return true; }
                     43: };
                     44: 
                     45: // methods
                     46: 
1.16      parser     47: static void _set(Request& r, const String& method_name, MethodParams *params) {
                     48:        Pool& pool=r.pool();
                     49:        VDom& vDom=*static_cast<VDom *>(r.self);
                     50: 
1.17      parser     51:        Value& vxml=params->as_junction(0, "xml must be code");
                     52:        Temp_lang temp_lang(r, String::UL_XML);
                     53:        const String& xml=r.process(vxml).as_string();
                     54: 
                     55:        std::istrstream stream(xml.cstr());
1.16      parser     56:        XalanParsedSource* parsedSource;
1.22      parser     57:        int error=vDom.transformer().parseSource(&stream, parsedSource);
1.16      parser     58: 
                     59:        if(error)
                     60:                PTHROW(0, 0,
                     61:                        &method_name,
1.22      parser     62:                        vDom.transformer().getLastError());
1.16      parser     63: 
                     64:        // replace any previous parsed source
                     65:        vDom.set_parsed_source(*parsedSource);
                     66: }
                     67: 
1.2       parser     68: static void _load(Request& r, const String& method_name, MethodParams *params) {
                     69:        Pool& pool=r.pool();
1.10      parser     70:        VDom& vDom=*static_cast<VDom *>(r.self);
1.2       parser     71: 
1.10      parser     72:        // filespec
1.20      parser     73:        const String& file_name=params->as_string(0, "file name must not be code");
                     74:        const char *filespec=r.absolute(file_name).cstr(String::UL_FILE_SPEC);
1.2       parser     75:        
                     76:        XalanParsedSource* parsedSource;
1.22      parser     77:        int error=vDom.transformer().parseSource(filespec, parsedSource);
1.2       parser     78: 
                     79:        if(error)
                     80:                PTHROW(0, 0,
1.20      parser     81:                        &file_name,
1.22      parser     82:                        vDom.transformer().getLastError());
1.2       parser     83: 
1.15      parser     84:        // replace any previous parsed source
1.11      parser     85:        vDom.set_parsed_source(*parsedSource);
1.2       parser     86: }
                     87: 
1.12      parser     88: static void add_xslt_param(const Hash::Key& aattribute, Hash::Val *ameaning, 
1.20      parser     89:                                                   void *info) {
1.12      parser     90:        XalanTransformer& transformer=*static_cast<XalanTransformer *>(info);
                     91:        const char *attribute_cstr=aattribute.cstr();
                     92:        const char *meaning_cstr=static_cast<Value *>(ameaning)->as_string().cstr();
                     93: 
                     94:        transformer.setStylesheetParam(
1.23      parser     95:                XalanDOMString(attribute_cstr),  
                     96:                XalanDOMString(meaning_cstr));
1.12      parser     97: }
1.10      parser     98: static void _xslt(Request& r, const String& method_name, MethodParams *params) {
                     99:        Pool& pool=r.pool();
                    100:        VDom& vDom=*static_cast<VDom *>(r.self);
                    101: 
1.12      parser    102:        // params
                    103:        if(params->size()>1) {
1.18      parser    104:                Value& vparams=params->as_no_junction(1, "transform parameters parameter must not be code");
1.12      parser    105:                if(vparams.is_defined())
                    106:                        if(Hash *params=vparams.get_hash())
1.22      parser    107:                                params->for_each(add_xslt_param, &vDom.transformer());
1.12      parser    108:                        else
                    109:                                PTHROW(0, 0,
                    110:                                        &method_name,
1.18      parser    111:                                        "transform parameters parameter must be hash");
1.12      parser    112:        }
                    113: 
1.10      parser    114:        // source
1.11      parser    115:        XalanParsedSource &parsed_source=vDom.get_parsed_source(pool, &method_name);
1.10      parser    116: 
                    117:        // stylesheet
1.20      parser    118:        const String& stylesheet_file_name=params->as_string(0, "file name must not be code");
                    119:        const String& stylesheet_filespec=r.absolute(stylesheet_file_name);
                    120:        //_asm int 3;
                    121:        Stylesheet_connection& connection=XSLT_stylesheet_manager->get_connection(stylesheet_filespec);
1.10      parser    122: 
                    123:        // target
1.22      parser    124:        XalanDocument* target=vDom.parser_liaison().createDocument();
1.10      parser    125:        XSLTResultTarget domResultTarget(target);
                    126: 
                    127:        // transform
1.22      parser    128:        int error=vDom.transformer().transform(
1.20      parser    129:                parsed_source, 
                    130:                &connection.stylesheet(), 
                    131:                domResultTarget);
                    132:        connection.close();
1.10      parser    133:        if(error)
                    134:                PTHROW(0, 0,
1.20      parser    135:                        &stylesheet_file_name,
1.22      parser    136:                        vDom.transformer().getLastError());
1.10      parser    137: 
                    138:        // write out result
1.11      parser    139:        VDom& result=*new(pool) VDom(pool);
                    140:        result.set_document(*target);
                    141:        r.write_no_lang(result);
1.10      parser    142: }
                    143: 
1.2       parser    144: // constructor
                    145: 
1.24      parser    146: MDom::MDom(Pool& apool) : MDnode(apool) {
1.4       parser    147:        set_name(*NEW String(pool(), DOM_CLASS_NAME));
1.16      parser    148: 
                    149:        // ^dom::set[<some>xml</some>]
                    150:        add_native_method("set", Method::CT_DYNAMIC, _set, 1, 1);
1.2       parser    151: 
1.3       parser    152:        // ^dom::load[some.xml]
1.2       parser    153:        add_native_method("load", Method::CT_DYNAMIC, _load, 1, 1);
1.10      parser    154: 
1.20      parser    155:        // ^dom.xslt[stylesheet file_name]
                    156:        // ^dom.xslt[stylesheet file_name;params hash]
1.12      parser    157:        add_native_method("xslt", Method::CT_DYNAMIC, _xslt, 1, 2);
1.6       parser    158: 
1.2       parser    159: }
                    160: // global variable
                    161: 
                    162: Methoded *Dom_class;
                    163: 
                    164: // creator
                    165: 
                    166: Methoded *MDom_create(Pool& pool) {
                    167:        return Dom_class=new(pool) MDom(pool);
                    168: }

E-mail: