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

1.1       parser      1: /** @node
                      2:        Parser: @b dnode parser type.
                      3: 
                      4:        Copyright(c) 2001 ArtLebedev Group(http://www.artlebedev.com)
                      5:        Author: Alexander Petrosyan <paf@design.ru>(http://design.ru/paf)
                      6: 
1.10    ! paf         7:        $Id: pa_vxnode.C,v 1.9 2001/11/01 15:45:28 paf Exp $
1.1       parser      8: */
                      9: #include "pa_config_includes.h"
                     10: #ifdef XML
                     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"
                     17: 
                     18: #include <util/XMLString.hpp>
                     19: #include <util/PlatformUtils.hpp>
                     20: #include <util/TransService.hpp>
                     21: #include <XalanDOM/XalanNamedNodeMap.hpp>
                     22: #include <XalanDOM/XalanAttr.hpp>
                     23: #include <XalanDOM/XalanProcessingInstruction.hpp>
1.2       parser     24: #include <XalanDOM/XalanNodeList.hpp>
1.3       parser     25: #include <XalanDOM/XalanElement.hpp>
1.4       parser     26: #include <XalanDOM/XalanDocumentType.hpp>
                     27: #include <XalanDOM/XalanNotation.hpp>
1.1       parser     28: 
                     29: void VXnode_cleanup(void *vxnode) {
                     30:        //_asm int 3;
                     31:        static_cast<VXnode *>(vxnode)->cleanup();
                     32: }
                     33: 
1.3       parser     34: Value *VXnode::get_element(const String& name) { 
                     35:        try {
                     36:                // $CLASS,$method
                     37:                if(Value *result=VStateless_object::get_element(name))
                     38:                        return result;
                     39: 
                     40:                // fields
                     41: 
1.10    ! paf        42:                XalanNode& selfNode=get_node(pool(), &name);
1.3       parser     43: 
                     44:                if(name=="nodeName") {
1.10    ! paf        45:                        return NEW VString(transcode(selfNode.getNodeName()));
1.3       parser     46:                } else if(name=="nodeValue") {
1.10    ! paf        47:                        return NEW VString(transcode(selfNode.getNodeValue()));
1.3       parser     48:                } else if(name=="nodeType") {
1.10    ! paf        49:                        return NEW VInt(pool(), selfNode.getNodeType());
1.3       parser     50:                } else if(name=="parentNode") {
1.10    ! paf        51:                        if(XalanNode *result_node=selfNode.getParentNode())
1.7       parser     52:                                return NEW VXnode(pool(), result_node, false);
1.3       parser     53:                } else if(name=="childNodes") { 
1.10    ! paf        54:                        if(XalanNode *currentNode=selfNode.getFirstChild()) {
1.3       parser     55:                                VHash *result=NEW VHash(pool());
1.10    ! paf        56:                                int i=0;
        !            57:                                do {
1.3       parser     58:                                        String& skey=*NEW String(pool());
                     59:                                        {
                     60:                                                char *buf=(char *)malloc(MAX_NUMBER);
1.10    ! paf        61:                                                snprintf(buf, MAX_NUMBER, "%d", ++i);
1.3       parser     62:                                                skey << buf;
                     63:                                        }
1.10    ! paf        64:                                        result->hash(&name).put(skey, NEW VXnode(pool(), currentNode, false));
        !            65:                                } while(currentNode=currentNode->getNextSibling());
1.3       parser     66:                                return result;
1.2       parser     67:                        }
1.3       parser     68:                } else if(name=="firstChild") {
1.10    ! paf        69:                        if(XalanNode *result_node=selfNode.getFirstChild())
1.7       parser     70:                                return NEW VXnode(pool(), result_node, false);
1.3       parser     71:                } else if(name=="lastChild") {
1.10    ! paf        72:                        if(XalanNode *result_node=selfNode.getLastChild())
1.7       parser     73:                                return NEW VXnode(pool(), result_node, false);
1.3       parser     74:                } else if(name=="previousSibling") {
1.10    ! paf        75:                        if(XalanNode *result_node=selfNode.getPreviousSibling())
1.7       parser     76:                                return NEW VXnode(pool(), result_node, false);
1.3       parser     77:                } else if(name=="nextSibling") {
1.10    ! paf        78:                        if(XalanNode *result_node=selfNode.getNextSibling())
1.7       parser     79:                                return NEW VXnode(pool(), result_node, false);
1.3       parser     80:                } else if(name=="ownerDocument") {
1.10    ! paf        81:                        if(XalanDocument *document=selfNode.getOwnerDocument())
1.5       parser     82:                                return NEW VXdoc(pool(), document, false/*owns not*/);
1.10    ! paf        83:                } else switch(selfNode.getNodeType()) {
1.3       parser     84:                        case XalanNode::ELEMENT_NODE: 
                     85:                                if(name=="attributes") {
1.10    ! paf        86:                                        if(const XalanNamedNodeMap *attributes=selfNode.getAttributes()) {
1.3       parser     87:                                                VHash *result=NEW VHash(pool());
                     88:                                                for(int i=0; i<attributes->getLength(); i++) {
                     89:                                                        XalanNode *attr_node=attributes->item(i);
1.9       paf        90:                                                        result->hash(0).put(
1.3       parser     91:                                                                transcode(attr_node->getNodeName()), 
1.7       parser     92:                                                                NEW VXnode(pool(), attr_node, false));
1.3       parser     93:                                                }
                     94:                                                return result;
1.1       parser     95:                                        }
1.3       parser     96:                                } else if(name=="tagName") {
1.10    ! paf        97:                                        return NEW VString(transcode(static_cast<XalanElement *>(&selfNode)->getTagName()));
1.1       parser     98:                                }
1.3       parser     99:                                break;
                    100:                        case XalanNode::ATTRIBUTE_NODE: 
                    101:                                if(name=="specified")
1.10    ! paf       102:                                        return NEW VBool(pool(), static_cast<XalanAttr *>(&selfNode)->getSpecified());
1.3       parser    103:                                break;
                    104:        /*
                    105:                        case XalanNode::COMMENT_NODE: 
                    106:                                substringData(unsigned int offset, unsigned int count)
                    107:        */
                    108:                        case XalanNode::PROCESSING_INSTRUCTION_NODE: 
                    109:                                if(name=="target")
1.10    ! paf       110:                                        return NEW VString(transcode(static_cast<XalanProcessingInstruction *>(&selfNode)->getTarget()));
1.3       parser    111:                                break;
                    112:                        case XalanNode::DOCUMENT_TYPE_NODE: 
1.4       parser    113:                                {
1.10    ! paf       114:                                        XalanDocumentType& doctype=*static_cast<XalanDocumentType *>(&selfNode);
1.4       parser    115:                                        if(name=="name") {
                    116:                                                // readonly attribute DOMString name;
                    117:                                                // The name of DTD; i.e., the name immediately following 
                    118:                                                // the DOCTYPE keyword in an XML source document.
                    119:                                                return NEW VString(transcode(doctype.getName()));
                    120:                                        }
                    121:                                        /*
                    122:                                        readonly attribute NamedNodeMap entities;
                    123:                                        readonly attribute NamedNodeMap notations;
                    124:                                        virtual const XalanNamedNodeMap* getEntities () const = 0 
                    125:                                        This function returns a NamedNodeMap containing the general entities, both external and internal, declared in the DTD. More...
                    126:                                        virtual const XalanNamedNodeMap* getNotations () const = 0 
1.10    ! paf       127:                                        This function returns a named selfNode map containing an entry for each notation declared in a document's DTD. More...
1.4       parser    128:                                        */
                    129:                                }
                    130:                                break;
                    131:                        case XalanNode::NOTATION_NODE:
                    132:                                {
1.10    ! paf       133:                                        XalanNotation& notation=*static_cast<XalanNotation *>(&selfNode);
1.4       parser    134:                                        if(name=="publicId") {
                    135:                                                // readonly attribute DOMString publicId;
                    136:                                                return NEW VString(transcode(notation.getPublicId()));
                    137:                                        } else if(name=="systemId") {
                    138:                                                // readonly attribute DOMString systemId;
                    139:                                                return NEW VString(transcode(notation.getSystemId()));
                    140:                                        }
                    141:                                }
                    142:                                break;
1.3       parser    143:                }
                    144:                
                    145:        } catch(const XalanDOMException& e)     {
1.8       parser    146:                Exception::provide_source(pool(), &name, e);
1.1       parser    147:        }
                    148: 
                    149:        return 0;
                    150: }
                    151: 
                    152: #endif

E-mail: