Annotation of parser3/src/classes/xnode.C, revision 1.5

1.1       parser      1: /** @file
                      2:        Parser: @b dom parser class.
                      3: 
                      4:        Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
                      5:        Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
                      6: 
1.5     ! parser      7:        $Id: xnode.C,v 1.4 2001/10/11 14:57:53 parser Exp $
1.1       parser      8: */
                      9: #include "classes.h"
                     10: #ifdef XML
                     11: 
                     12: #include "pa_request.h"
                     13: #include "pa_vxnode.h"
                     14: 
                     15: #include "xnode.h"
                     16: 
                     17: #include <util/XMLString.hpp>
                     18: #include <XalanSourceTree/XalanSourceTreeDOMSupport.hpp>
                     19: #include <XPath/XPathEvaluator.hpp>
                     20: #include <XPath/NodeRefList.hpp>
                     21: 
                     22: // defines
                     23: 
                     24: #define XNODE_CLASS_NAME "xnode"
                     25: 
                     26: // class
                     27: 
                     28: // methods
                     29: 
                     30: static void _select(Request& r, const String& method_name, MethodParams *params) {
                     31: //     _asm int 3;
                     32:        Pool& pool=r.pool();
                     33:        VXnode& vnode=*static_cast<VXnode *>(r.self);
                     34: 
                     35:        // expression
                     36:        const String& expression=params->as_string(0, "expression must not be code");
                     37:        const char *expression_cstr=expression.cstr(String::UL_AS_IS);
                     38:        XalanDOMString dstring(expression_cstr);
                     39:        const XalanDOMChar *expression_dcstr=dstring.c_str();
                     40: 
                     41:        XPathEvaluator evaluator;
                     42:        // We'll use these to parse the XML file.
                     43:        XalanSourceTreeDOMSupport dom_support;
                     44: 
                     45:        try {
                     46:                NodeRefList list=evaluator.selectNodeList(dom_support, 
                     47:                        &vnode.get_node(pool, &method_name), 
                     48:                        expression_dcstr);
                     49: 
                     50:                VHash& result=*new(pool) VHash(pool);
                     51:                for(int i=0; i<list.getLength(); i++) {
                     52:                        String& skey=*new(pool) String(pool);
                     53:                        {
                     54:                                char *buf=(char *)pool.malloc(MAX_NUMBER);
                     55:                                snprintf(buf, MAX_NUMBER, "%d", i);
                     56:                                skey << buf;
                     57:                        }
                     58: 
                     59:                        result.hash().put(skey, new(pool) VXnode(pool, list.item(i)));
                     60:                }
                     61:                result.set_name(method_name);
                     62:                r.write_no_lang(result);
                     63:        } catch(const XSLException& e) {
1.4       parser     64:                pool.exception()._throw(pool, &expression, e);
1.1       parser     65:        }
                     66: }
                     67: 
                     68: static void _select_single(Request& r, const String& method_name, MethodParams *params) {
                     69: //     _asm int 3;
                     70:        Pool& pool=r.pool();
                     71:        VXnode& vnode=*static_cast<VXnode *>(r.self);
                     72: 
                     73:        // expression
                     74:        const String& expression=params->as_string(0, "expression must not be code");
                     75:        const char *expression_cstr=expression.cstr(String::UL_AS_IS);
                     76:        XalanDOMString dstring(expression_cstr);
                     77:        const XalanDOMChar *expression_dcstr=dstring.c_str();
                     78: 
                     79:        XPathEvaluator evaluator;
                     80:        // Initialize the XalanSourceTree subsystem...
                     81: //     XalanSourceTreeInit             theSourceTreeInit;
                     82:        // We'll use these to parse the XML file.
                     83:        XalanSourceTreeDOMSupport dom_support;
                     84: 
                     85:        try {
                     86:                 if(XalanNode *node=evaluator.selectSingleNode(dom_support, 
                     87:                        &vnode.get_node(pool, &method_name), 
                     88:                        expression_dcstr)) {
                     89: 
                     90:                        VXnode& result=*new(pool) VXnode(pool, node);
                     91:                        result.set_name(method_name);
                     92:                        r.write_no_lang(result);
                     93:                }
                     94:        } catch(const XSLException& e) {
1.4       parser     95:                pool.exception()._throw(pool, &expression, e);
1.1       parser     96:        }
                     97: }
                     98: 
                     99: // constructor
                    100: 
1.2       parser    101: MXnode::MXnode(Pool& apool) : Methoded(apool), 
                    102:        consts(apool) {
1.1       parser    103:        set_name(*NEW String(pool(), XNODE_CLASS_NAME));
                    104: 
                    105:        // ^node.select[/some/xpath/query] = hash $.#[dnode]
                    106:        add_native_method("select", Method::CT_DYNAMIC, _select, 1, 1);
                    107: 
1.5     ! parser    108:        // ^node.selectSingle[/some/xpath/query] = first dnode
        !           109:        add_native_method("selectSingle", Method::CT_DYNAMIC, _select_single, 1, 1);
1.2       parser    110: 
                    111:        // consts
                    112: 
                    113: #define CONST(name, value) \
                    114:        consts.put(*new(pool()) String(pool(), #name), new(pool()) VInt(pool(), value))
                    115: 
                    116:        CONST(ELEMENT_NODE, 1);
                    117:     CONST(ATTRIBUTE_NODE,  2);
                    118:     CONST(TEXT_NODE,  3);
                    119:     CONST(CDATA_SECTION_NODE,  4);
                    120:     CONST(ENTITY_REFERENCE_NODE,  5);
                    121:     CONST(ENTITY_NODE,  6);
                    122:     CONST(PROCESSING_INSTRUCTION_NODE,  7);
                    123:     CONST(COMMENT_NODE,  8);
                    124:     CONST(DOCUMENT_NODE,  9);
                    125:     CONST(DOCUMENT_TYPE_NODE,  10);
                    126:     CONST(DOCUMENT_FRAGMENT_NODE,  11);
                    127:     CONST(NOTATION_NODE,  12);
1.1       parser    128: 
                    129: }
1.3       parser    130: 
1.1       parser    131: // global variable
                    132: 
                    133: Methoded *Xnode_class;
                    134: 
                    135: #endif
                    136: 
                    137: // creator
                    138: Methoded *MXnode_create(Pool& pool) {
                    139:        return 
                    140: #ifdef XML
                    141:                Xnode_class=new(pool) MXnode(pool)
                    142: #else
                    143:                0
                    144: #endif
                    145:                ;
                    146: }

E-mail: