Annotation of parser3/src/types/pa_vxnode.C, revision 1.30.2.5.2.4

1.1       parser      1: /** @node
                      2:        Parser: @b dnode parser type.
                      3: 
1.30.2.1  paf         4:        Copyright(c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
1.15      paf         5:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.1       parser      6: */
                      7: #include "pa_config_includes.h"
                      8: #ifdef XML
1.18      paf         9: 
1.30.2.5.2.4! paf        10: static const char* IDENT_VXNODE_C="$Date: 2003/03/20 08:11:16 $";
1.1       parser     11: 
                     12: #include "pa_vxnode.h"
                     13: #include "pa_vxdoc.h"
                     14: #include "pa_vstring.h"
                     15: #include "pa_vbool.h"
                     16: #include "pa_vhash.h"
1.30.2.3  paf        17: #include "pa_request_charsets.h"
                     18: #include "pa_charset.h"
1.1       parser     19: 
1.30.2.5.2.4! paf        20: Value* VXnode::get_element(const String& aname, Value& aself, bool looking_up) { 
1.12      paf        21:        // $CLASS,$method
1.30.2.5.2.4! paf        22:        if(Value* result=VStateless_object::get_element(aname, aself, looking_up))
1.12      paf        23:                return result;
                     24: 
                     25:        // fields
                     26: 
1.30.2.3  paf        27:        GdomeNode* selfNode=get_node(aname);
1.12      paf        28:        GdomeException exc;
                     29: 
1.30.2.5.2.4! paf        30:        if(aname=="nodeName") {
        !            31:                return Value*(new VString(fcharsets->source().transcode(*fgdome_n_nodeName(selfNode, &exc), aname)));
        !            32:        } else if(aname=="nodeValue") {
        !            33:                return Value*(new VString(fcharsets->source().transcode(*fgdome_n_nodeValue(selfNode, &exc), aname)));
        !            34:        } else if(aname=="nodeType") {
        !            35:                return Value*(new VInt(gdome_n_nodeType(selfNode, &exc)));
        !            36:        } else if(aname=="parentNode") {
1.30.2.3  paf        37:                if(GdomeNode* result_node=gdome_n_parentNode(selfNode, &exc))
1.30.2.5.2.4! paf        38:                        return Value*(new VXnode(ffcharsets, result_node));
        !            39:                return 0;
        !            40:        } else if(aname=="childNodes") {        
1.30.2.3  paf        41:                if(GdomeNode* currentNode=gdome_n_firstChild(selfNode, &exc)) {
1.30.2.5.2.4! paf        42:                        VHash* result(new VHash());
1.12      paf        43:                        int i=0;
                     44:                        do {
1.30.2.5.2.2  paf        45:                                result->hash(0).put(
1.30.2.5.2.1  paf        46:                                        String* (new String(fpool->format_integer(i++))), 
1.30.2.5.2.4! paf        47:                                        Value*(new VXnode(ffcharsets, currentNode))
1.30.2.3  paf        48:                                );
1.12      paf        49:                        } while(currentNode=gdome_n_nextSibling(currentNode, &exc));
1.3       parser     50:                        return result;
1.12      paf        51:                }
1.30.2.5.2.4! paf        52:                return 0;
        !            53:        } else if(aname=="firstChild") {
1.30.2.3  paf        54:                if(GdomeNode* result_node=gdome_n_firstChild(selfNode, &exc))
1.30.2.5.2.4! paf        55:                        return Value*(new VXnode(ffcharsets, result_node));
        !            56:                return 0;
        !            57:        } else if(aname=="lastChild") {
1.30.2.3  paf        58:                if(GdomeNode* result_node=gdome_n_lastChild(selfNode, &exc))
1.30.2.5.2.4! paf        59:                        return Value*(new VXnode(ffcharsets, result_node));
        !            60:                return 0;
        !            61:        } else if(aname=="previousSibling") {
1.30.2.3  paf        62:                if(GdomeNode* result_node=gdome_n_previousSibling(selfNode, &exc))
1.30.2.5.2.4! paf        63:                        return Value*(new VXnode(ffcharsets, result_node));
        !            64:                return 0;
        !            65:        } else if(aname=="nextSibling") {
1.30.2.3  paf        66:                if(GdomeNode* result_node=gdome_n_nextSibling(selfNode, &exc))
1.30.2.5.2.4! paf        67:                        return Value*(new VXnode(ffcharsets, result_node));
        !            68:                return 0;
        !            69:        } else if(aname=="ownerDocument") {
1.12      paf        70:                if(GdomeDocument *document=gdome_n_ownerDocument(selfNode, &exc))
1.30.2.5.2.4! paf        71:                        return Value*(new VXdoc(ffcharsets, document));
        !            72:                return 0;
1.13      paf        73:        } else switch(gdome_n_nodeType(selfNode, &exc)) {
                     74:                case GDOME_ELEMENT_NODE: 
1.30.2.5.2.4! paf        75:                        if(aname=="attributes") {
1.13      paf        76:                                if(GdomeNamedNodeMap *attributes=gdome_n_attributes(selfNode, &exc)) {
1.30.2.5.2.4! paf        77:                                        VHash* result(new VHash());
1.13      paf        78:                                        gulong length=gdome_nnm_length(attributes, &exc);
                     79:                                        for(gulong i=0; i<length; i++) {
1.30.2.3  paf        80:                                                GdomeNode* attr_node=gdome_nnm_item(attributes, i, &exc);
1.30.2.5.2.2  paf        81:                                                result->hash(0).put(
1.30.2.5.2.3  paf        82:                                                        fcharsets->source().transcode(*fgdome_n_nodeName(attr_node, &exc), aname), 
1.30.2.5.2.4! paf        83:                                                        Value*(new VXnode(ffcharsets, attr_node)));
1.3       parser     84:                                        }
1.12      paf        85:                                        return result;
                     86:                                }
1.30.2.5.2.4! paf        87:                                return 0;
        !            88:                        } else if(aname=="tagName") {
        !            89:                                return Value*(new VString(fcharsets->source().transcode(*fgdome_el_tagName(GDOME_EL(selfNode), &exc), aname)));
1.2       parser     90:                        }
1.12      paf        91:                        break;
1.13      paf        92:                case GDOME_ATTRIBUTE_NODE: 
1.30.2.5.2.4! paf        93:                        if(aname=="specified")
        !            94:                                return Value*(new VBool(gdome_a_specified(GDOME_A(selfNode), &exc)!=0));
        !            95:                        else if(aname=="name")
        !            96:                                return Value*(new VString(fcharsets->source().transcode(*fgdome_a_name(GDOME_A(selfNode), &exc), aname)));
        !            97:                        else if(aname=="value")
        !            98:                                return Value*(new VString(fcharsets->source().transcode(*fgdome_a_value(GDOME_A(selfNode), &exc), aname)));
1.12      paf        99:                        break;
                    100: /*
1.13      paf       101:                case GDOME_COMMENT_NODE: 
1.12      paf       102:                        substringData(unsigned int offset, unsigned int count)
                    103: */
1.13      paf       104:                case GDOME_PROCESSING_INSTRUCTION_NODE: 
1.30.2.5.2.4! paf       105:                        if(aname=="target")
        !           106:                                return Value*(new VString(fcharsets->source().transcode(*fgdome_pi_target(GDOME_PI(selfNode), &exc), aname)));
        !           107:                        else if(aname=="data")
        !           108:                                return Value*(new VString(fcharsets->source().transcode(*fgdome_pi_data(GDOME_PI(selfNode), &exc), aname)));
1.12      paf       109:                        break;
1.13      paf       110:                case GDOME_DOCUMENT_TYPE_NODE: 
1.12      paf       111:                        {
1.13      paf       112:                                GdomeDocumentType *doctype=GDOME_DT(selfNode);
1.30.2.5.2.4! paf       113:                                if(aname=="name") {
1.21      paf       114:                                        // readonly attribute DOMString aname;
                    115:                                        // The aname of DTD; i.e., the aname immediately following 
1.12      paf       116:                                        // the DOCTYPE keyword in an XML source document.
1.30.2.5.2.4! paf       117:                                        return Value*(new VString(fcharsets->source().transcode(*fgdome_dt_name(doctype, &exc), aname)));
1.1       parser    118:                                }
1.12      paf       119:                                /*
                    120:                                readonly attribute NamedNodeMap entities;
                    121:                                readonly attribute NamedNodeMap notations;
                    122:                                virtual const XalanNamedNodeMap* getEntities () const = 0 
                    123:                                This function returns a NamedNodeMap containing the general entities, both external and internal, declared in the DTD. More...
                    124:                                virtual const XalanNamedNodeMap* getNotations () const = 0 
                    125:                                This function returns a named selfNode map containing an entry for each notation declared in a document's DTD. More...
                    126:                                */
                    127:                        }
                    128:                        break;
1.13      paf       129:                case GDOME_NOTATION_NODE:
1.12      paf       130:                        {
1.13      paf       131:                                GdomeNotation *notation=GDOME_NOT(selfNode);
1.30.2.5.2.4! paf       132:                                if(aname=="publicId") {
1.12      paf       133:                                        // readonly attribute DOMString publicId;
1.30.2.5.2.4! paf       134:                                        return Value*(new VString(fcharsets->source().transcode(*fgdome_not_publicId(notation, &exc), aname)));
        !           135:                                } else if(aname=="systemId") {
1.12      paf       136:                                        // readonly attribute DOMString systemId;
1.30.2.5.2.4! paf       137:                                        return Value*(new VString(fcharsets->source().transcode(*fgdome_not_systemId(notation, &exc), aname)));
1.4       parser    138:                                }
1.12      paf       139:                        }
                    140:                        break;
                    141:        }
1.3       parser    142:                
1.30.2.5.2.4! paf       143:        bark("%s field not found", 0, aname); return 0;
1.1       parser    144: }
                    145: 
                    146: #endif

E-mail: