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

1.1       parser      1: /** @node
                      2:        Parser: @b dnode parser type.
                      3: 
1.43      paf         4:        Copyright(c) 2001-2005 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.44    ! paf        10: static const char * const IDENT_VXNODE_C="$Date: 2005/08/09 08:14:56 $";
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.31      paf        17: #include "pa_request_charsets.h"
                     18: #include "pa_charset.h"
1.36      paf        19: #include "pa_xml_exception.h"
1.1       parser     20: 
1.44    ! paf        21: Request_charsets& VXnode::charsets() { 
        !            22:        return get_internal_vxdoc().charsets();
        !            23: }
        !            24: 
1.31      paf        25: Value* VXnode::get_element(const String& aname, Value& aself, bool looking_up) { 
1.12      paf        26:        // $CLASS,$method
1.31      paf        27:        if(Value* result=VStateless_object::get_element(aname, aself, looking_up))
1.12      paf        28:                return result;
                     29: 
                     30:        // fields
1.44    ! paf        31:        xmlNode& selfNode=get_xmlnode();
1.12      paf        32: 
1.21      paf        33:        if(aname=="nodeName") {
1.44    ! paf        34:                return new VString(charsets().source().transcode(selfNode.name));
1.21      paf        35:        } else if(aname=="nodeValue") {
1.44    ! paf        36:                return new VString(charsets().source().transcode(xmlNodeGetContent(&selfNode)));
1.21      paf        37:        } else if(aname=="nodeType") {
1.44    ! paf        38:                return new VInt(selfNode.type);
1.21      paf        39:        } else if(aname=="parentNode") {
1.44    ! paf        40:                if(xmlNode* result_node=selfNode.parent)
        !            41:                        return &get_vxdoc().wrap(*result_node);
1.25      paf        42:                return 0;
1.21      paf        43:        } else if(aname=="childNodes") {        
1.44    ! paf        44:                if(xmlNode* currentNode=selfNode.children) {
1.31      paf        45:                        VHash* result=new VHash;
1.12      paf        46:                        int i=0;
                     47:                        do {
1.31      paf        48:                                result->hash().put(
1.33      paf        49:                                        String::Body::Format(i++), 
1.44    ! paf        50:                                        &get_vxdoc().wrap(*currentNode));
        !            51:                        } while((currentNode=currentNode->next));
1.3       parser     52:                        return result;
1.12      paf        53:                }
1.25      paf        54:                return 0;
1.21      paf        55:        } else if(aname=="firstChild") {
1.44    ! paf        56:                if(xmlNode* result_node=selfNode.children)
        !            57:                        return &get_vxdoc().wrap(*result_node);
1.25      paf        58:                return 0;
1.21      paf        59:        } else if(aname=="lastChild") {
1.44    ! paf        60:                if(xmlNode* result_node=selfNode.last)
        !            61:                        return &get_vxdoc().wrap(*result_node);
1.25      paf        62:                return 0;
1.21      paf        63:        } else if(aname=="previousSibling") {
1.44    ! paf        64:                if(xmlNode* result_node=selfNode.prev)
        !            65:                        return &get_vxdoc().wrap(*result_node);
1.25      paf        66:                return 0;
1.21      paf        67:        } else if(aname=="nextSibling") {
1.44    ! paf        68:                if(xmlNode* result_node=selfNode.next)
        !            69:                        return &get_vxdoc().wrap(*result_node);
1.25      paf        70:                return 0;
1.21      paf        71:        } else if(aname=="ownerDocument") {
1.44    ! paf        72:                return &get_vxdoc();
        !            73:        } else switch(selfNode.type) {
        !            74:                case XML_ELEMENT_NODE: 
1.21      paf        75:                        if(aname=="attributes") {
1.44    ! paf        76:                                if(xmlNode* currentNode=(xmlNode*)selfNode.properties) {
1.31      paf        77:                                        VHash* result=new VHash;
1.44    ! paf        78:                                        do {
1.31      paf        79:                                                result->hash().put(
1.44    ! paf        80:                                                        charsets().source().transcode(currentNode->name),
        !            81:                                                        &get_vxdoc().wrap(*currentNode));
        !            82:                                        } while((currentNode=currentNode->next));
1.12      paf        83:                                        return result;
                     84:                                }
1.25      paf        85:                                return 0;
1.21      paf        86:                        } else if(aname=="tagName") {
1.44    ! paf        87:                                return new VString(charsets().source().transcode(selfNode.name));
1.2       parser     88:                        }
1.12      paf        89:                        break;
1.44    ! paf        90:                case XML_ATTRIBUTE_NODE: 
1.21      paf        91:                        if(aname=="specified")
1.44    ! paf        92:                                return new VBool(true); // were not working in gdome, leaving out
1.27      paf        93:                        else if(aname=="name")
1.44    ! paf        94:                                return new VString(charsets().source().transcode(selfNode.name));
1.21      paf        95:                        else if(aname=="value")
1.44    ! paf        96:                                return new VString(charsets().source().transcode(xmlNodeGetContent(&selfNode)));
1.12      paf        97:                        break;
                     98: /*
1.44    ! paf        99:                case XML_COMMENT_NODE: 
1.12      paf       100:                        substringData(unsigned int offset, unsigned int count)
                    101: */
1.44    ! paf       102:                case XML_PI_NODE: 
1.21      paf       103:                        if(aname=="target")
1.44    ! paf       104:                                return new VString(charsets().source().transcode(selfNode.name));
1.21      paf       105:                        else if(aname=="data")
1.44    ! paf       106:                                return new VString(charsets().source().transcode(xmlNodeGetContent(&selfNode)));
1.12      paf       107:                        break;
1.44    ! paf       108:                case XML_DTD_NODE: 
1.12      paf       109:                        {
1.26      paf       110:                                if(aname=="name") {
1.21      paf       111:                                        // readonly attribute DOMString aname;
                    112:                                        // The aname of DTD; i.e., the aname immediately following 
1.12      paf       113:                                        // the DOCTYPE keyword in an XML source document.
1.44    ! paf       114:                                        return new VString(charsets().source().transcode(selfNode.name));
1.1       parser    115:                                }
1.12      paf       116:                                /*
                    117:                                readonly attribute NamedNodeMap entities;
                    118:                                readonly attribute NamedNodeMap notations;
                    119:                                virtual const XalanNamedNodeMap* getEntities () const = 0 
                    120:                                This function returns a NamedNodeMap containing the general entities, both external and internal, declared in the DTD. More...
                    121:                                virtual const XalanNamedNodeMap* getNotations () const = 0 
                    122:                                This function returns a named selfNode map containing an entry for each notation declared in a document's DTD. More...
                    123:                                */
                    124:                        }
                    125:                        break;
1.44    ! paf       126:                        /* someday
        !           127:                case XML_NOTATION_NODE:
1.12      paf       128:                        {
1.44    ! paf       129:                                GdomeNotation *notation=XML_NOT(selfNode);
1.21      paf       130:                                if(aname=="publicId") {
1.12      paf       131:                                        // readonly attribute DOMString publicId;
1.44    ! paf       132:                                        return new VString(charsets().source().transcode(gdome_not_publicId(notation, &exc)));
1.21      paf       133:                                } else if(aname=="systemId") {
1.12      paf       134:                                        // readonly attribute DOMString systemId;
1.44    ! paf       135:                                        return new VString(charsets().source().transcode(gdome_not_systemId(notation, &exc)));
1.4       parser    136:                                }
1.12      paf       137:                        }
                    138:                        break;
1.44    ! paf       139:                        */
1.12      paf       140:        }
1.3       parser    141:                
1.32      paf       142:        return bark("%s field not found", &aname);
1.1       parser    143: }
                    144: 
1.42      paf       145: const VJunction* VXnode::put_element(Value& /*aself*/, const String& aname, Value* avalue, bool /*replace*/)
1.36      paf       146: { 
1.44    ! paf       147:        xmlNode& selfNode=get_xmlnode();
1.36      paf       148: 
                    149:        if(aname=="nodeValue") {
1.44    ! paf       150:                xmlNodeSetContent(&selfNode, 
        !           151:                        charsets().source().transcode(avalue->as_string()));
1.36      paf       152: 
1.39      paf       153:                return PUT_ELEMENT_REPLACED_ELEMENT;
1.36      paf       154:        }
                    155: 
1.38      paf       156:        bark("element can not be stored to %s", &aname);
1.39      paf       157:        return 0;
1.36      paf       158: }
1.1       parser    159: #endif

E-mail: