|
|
| version 1.2, 2001/09/26 15:43:59 | version 1.8, 2001/10/16 14:44:40 |
|---|---|
| Line 18 | Line 18 |
| #include <XalanSourceTree/XalanSourceTreeDOMSupport.hpp> | #include <XalanSourceTree/XalanSourceTreeDOMSupport.hpp> |
| #include <XPath/XPathEvaluator.hpp> | #include <XPath/XPathEvaluator.hpp> |
| #include <XPath/NodeRefList.hpp> | #include <XPath/NodeRefList.hpp> |
| #include <XalanDOM/XalanElement.hpp> | |
| #include <XalanDOM/XalanAttr.hpp> | |
| #include <XalanDOM/XalanNodeList.hpp> | |
| // defines | // defines |
| #define XNODE_CLASS_NAME "xnode" | #define XNODE_CLASS_NAME "xnode" |
| // class | // helpers |
| XalanNode& as_node(Pool& pool, const String& method_name, MethodParams *params, | |
| int index, const char *msg) { | |
| Value& value=params->as_no_junction(index, msg); | |
| if(strcmp(value.type(), VXNODE_TYPE)!=0) | |
| PTHROW(0, 0, | |
| &method_name, | |
| msg); | |
| VXnode& vnode=*static_cast<VXnode *>(&value); | |
| return vnode.get_node(pool, &method_name); | |
| } | |
| // helpers | |
| XalanAttr& as_attr(Pool& pool, const String& method_name, MethodParams *params, | |
| int index, const char *msg) { | |
| XalanNode& node=as_node(pool, method_name, params, index, msg); | |
| if(node.getNodeType()!=XalanNode::ATTRIBUTE_NODE) | |
| PTHROW(0, 0, | |
| &method_name, | |
| msg); | |
| return *reinterpret_cast<XalanAttr *>(&node); | |
| } | |
| // methods | // methods |
| // DOM1 node | |
| // Node insertBefore(in Node newChild,in Node refChild) raises(DOMException); | |
| static void _insertBefore(Request& r, const String& method_name, MethodParams *params) { | |
| Pool& pool=r.pool(); | |
| VXnode& vnode=*static_cast<VXnode *>(r.self); | |
| XalanNode& node=vnode.get_node(pool, &method_name); | |
| XalanNode& newChild=as_node(pool, method_name, params, 0, "newChild must be node"); | |
| XalanNode& refChild=as_node(pool, method_name, params, 1, "refChild must be node"); | |
| try { | |
| node.insertBefore(&newChild, &refChild); | |
| } catch(const XalanDOMException& e) { | |
| pool.exception()._throw(pool, &method_name, e); | |
| } | |
| } | |
| // Node replaceChild(in Node newChild,in Node oldChild) raises(DOMException); | |
| static void _replaceChild(Request& r, const String& method_name, MethodParams *params) { | |
| Pool& pool=r.pool(); | |
| VXnode& vnode=*static_cast<VXnode *>(r.self); | |
| XalanNode& node=vnode.get_node(pool, &method_name); | |
| XalanNode& newChild=as_node(pool, method_name, params, 0, "newChild must be node"); | |
| XalanNode& refChild=as_node(pool, method_name, params, 1, "refChild must be node"); | |
| try { | |
| node.replaceChild(&newChild, &refChild); | |
| } catch(const XalanDOMException& e) { | |
| pool.exception()._throw(pool, &method_name, e); | |
| } | |
| } | |
| // Node removeChild(in Node oldChild) raises(DOMException); | |
| static void _removeChild(Request& r, const String& method_name, MethodParams *params) { | |
| Pool& pool=r.pool(); | |
| VXnode& vnode=*static_cast<VXnode *>(r.self); | |
| XalanNode& node=vnode.get_node(pool, &method_name); | |
| XalanNode& oldChild=as_node(pool, method_name, params, 0, "oldChild must be node"); | |
| try { | |
| node.removeChild(&oldChild); | |
| } catch(const XalanDOMException& e) { | |
| pool.exception()._throw(pool, &method_name, e); | |
| } | |
| } | |
| // Node appendChild(in Node newChild) raises(DOMException); | |
| static void _appendChild(Request& r, const String& method_name, MethodParams *params) { | |
| Pool& pool=r.pool(); | |
| VXnode& vnode=*static_cast<VXnode *>(r.self); | |
| XalanNode& node=vnode.get_node(pool, &method_name); | |
| XalanNode& newChild=as_node(pool, method_name, params, 0, "newChild must be node"); | |
| try { | |
| node.appendChild(&newChild); | |
| } catch(const XalanDOMException& e) { | |
| pool.exception()._throw(pool, &method_name, e); | |
| } | |
| } | |
| // boolean hasChildNodes(); | |
| static void _hasChildNodes(Request& r, const String& method_name, MethodParams *) { | |
| Pool& pool=r.pool(); | |
| VXnode& vnode=*static_cast<VXnode *>(r.self); | |
| XalanNode& node=vnode.get_node(pool, &method_name); | |
| // write out result | |
| VBool& result=*new(pool) VBool(pool, node.hasChildNodes()); | |
| result.set_name(method_name); | |
| r.write_no_lang(result); | |
| } | |
| // Node cloneNode(in boolean deep); | |
| /// @test 1. who frees it up? 2. ownerDocument=? | |
| static void _cloneNode(Request& r, const String& method_name, MethodParams *params) { | |
| Pool& pool=r.pool(); | |
| VXnode& vnode=*static_cast<VXnode *>(r.self); | |
| XalanNode& node=vnode.get_node(pool, &method_name); | |
| bool deep=params->as_bool(0, "deep must be bool", r); | |
| // write out result | |
| VXnode& result=*new(pool) VXnode(pool, node.cloneNode(deep)); | |
| result.set_name(method_name); | |
| r.write_no_lang(result); | |
| } | |
| // DOM1 element | |
| XalanElement& get_self_element(Request& r, const String& method_name) { | |
| Pool& pool=r.pool(); | |
| VXnode& vnode=*static_cast<VXnode *>(r.self); | |
| XalanNode& node=vnode.get_node(pool, &method_name); | |
| if(node.getNodeType()!=XalanNode::ELEMENT_NODE) | |
| PTHROW(0, 0, | |
| &method_name, | |
| "method can be called on node of ELEMENT type"); | |
| return *reinterpret_cast<XalanElement *>(&node); | |
| } | |
| // DOMString getAttribute(in DOMString name); | |
| static void _getAttribute(Request& r, const String& method_name, MethodParams *params) { | |
| Pool& pool=r.pool(); | |
| XalanElement& element=get_self_element(r, method_name); | |
| const char *name=params->as_string(0, "name must not be code").cstr(String::UL_AS_IS); | |
| const XalanDOMString& attribute_value=element.getAttribute(XalanDOMString(name)); | |
| // write out result | |
| r.write_no_lang(*new(pool) VString(pool.transcode(attribute_value))); | |
| } | |
| // void setAttribute(in DOMString name, in DOMString value) raises(DOMException); | |
| static void _setAttribute(Request& r, const String& method_name, MethodParams *params) { | |
| Pool& pool=r.pool(); | |
| XalanElement& element=get_self_element(r, method_name); | |
| const char *name=params->as_string(0, "name must not be code").cstr(String::UL_AS_IS); | |
| const char *attribute_value=params->as_string(1, "value must not be code").cstr(String::UL_AS_IS); | |
| try { | |
| element.setAttribute( | |
| XalanDOMString(name), | |
| XalanDOMString(attribute_value)); | |
| } catch(const XalanDOMException& e) { | |
| pool.exception()._throw(pool, &method_name, e); | |
| } | |
| } | |
| // void removeAttribute(in DOMString name) raises(DOMException); | |
| static void _removeAttribute(Request& r, const String& method_name, MethodParams *params) { | |
| Pool& pool=r.pool(); | |
| XalanElement& element=get_self_element(r, method_name); | |
| const char *name=params->as_string(0, "name must not be code").cstr(String::UL_AS_IS); | |
| try { | |
| element.removeAttribute(XalanDOMString(name)); | |
| } catch(const XalanDOMException& e) { | |
| pool.exception()._throw(pool, &method_name, e); | |
| } | |
| } | |
| // Attr getAttributeNode(in DOMString name); | |
| static void _getAttributeNode(Request& r, const String& method_name, MethodParams *params) { | |
| Pool& pool=r.pool(); | |
| XalanElement& element=get_self_element(r, method_name); | |
| const char *name=params->as_string(0, "name must not be code").cstr(String::UL_AS_IS); | |
| if(XalanAttr *attr=element.getAttributeNode(XalanDOMString(name))) { | |
| // write out result | |
| VXnode& result=*new(pool) VXnode(pool, attr); | |
| r.write_no_lang(result); | |
| } | |
| } | |
| // Attr setAttributeNode(in Attr newAttr) raises(DOMException); | |
| static void _setAttributeNode(Request& r, const String& method_name, MethodParams *params) { | |
| Pool& pool=r.pool(); | |
| XalanElement& element=get_self_element(r, method_name); | |
| XalanAttr& newAttr=as_attr(pool, method_name, params, 0, "newAttr must be ATTRIBUTE node"); | |
| try { | |
| if(XalanAttr *returnAttr=element.setAttributeNode(&newAttr)) { | |
| // write out result | |
| VXnode& result=*new(pool) VXnode(pool, returnAttr); | |
| r.write_no_lang(result); | |
| } | |
| } catch(const XalanDOMException& e) { | |
| pool.exception()._throw(pool, &method_name, e); | |
| } | |
| } | |
| // Attr removeAttributeNode(in Attr oldAttr) raises(DOMException); | |
| static void _removeAttributeNode(Request& r, const String& method_name, MethodParams *params) { | |
| Pool& pool=r.pool(); | |
| XalanElement& element=get_self_element(r, method_name); | |
| XalanAttr& oldAttr=as_attr(pool, method_name, params, 0, "oldAttr must be ATTRIBUTE node"); | |
| try { | |
| /*XalanAttr *returnAttr*/element.removeAttributeNode(&oldAttr); | |
| } catch(const XalanDOMException& e) { | |
| pool.exception()._throw(pool, &method_name, e); | |
| } | |
| } | |
| // NodeList getElementsByTagName(in DOMString name); | |
| static void _getElementsByTagName(Request& r, const String& method_name, MethodParams *params) { | |
| Pool& pool=r.pool(); | |
| XalanElement& element=get_self_element(r, method_name); | |
| const char *name=params->as_string(0, "name must not be code").cstr(String::UL_AS_IS); | |
| VHash& result=*new(pool) VHash(pool); | |
| if(const XalanNodeList *nodes= | |
| element.getElementsByTagName(XalanDOMString(name))) { | |
| for(int i=0; i<nodes->getLength(); i++) { | |
| String& skey=*new(pool) String(pool); | |
| { | |
| char *buf=(char *)pool.malloc(MAX_NUMBER); | |
| snprintf(buf, MAX_NUMBER, "%d", i); | |
| skey << buf; | |
| } | |
| result.hash().put(skey, new(pool) VXnode(pool, nodes->item(i))); | |
| } | |
| } | |
| // write out result | |
| r.write_no_lang(result); | |
| } | |
| // void normalize(); | |
| static void _normalize(Request& r, const String& method_name, MethodParams *) { | |
| XalanElement& element=get_self_element(r, method_name); | |
| element.normalize(); | |
| } | |
| static void _select(Request& r, const String& method_name, MethodParams *params) { | static void _select(Request& r, const String& method_name, MethodParams *params) { |
| // _asm int 3; | // _asm int 3; |
| Pool& pool=r.pool(); | Pool& pool=r.pool(); |
| Line 61 static void _select(Request& r, const St | Line 313 static void _select(Request& r, const St |
| result.set_name(method_name); | result.set_name(method_name); |
| r.write_no_lang(result); | r.write_no_lang(result); |
| } catch(const XSLException& e) { | } catch(const XSLException& e) { |
| r._throw(&expression, e); | pool.exception()._throw(pool, &expression, e); |
| } | } |
| } | } |
| Line 92 static void _select_single(Request& r, c | Line 344 static void _select_single(Request& r, c |
| r.write_no_lang(result); | r.write_no_lang(result); |
| } | } |
| } catch(const XSLException& e) { | } catch(const XSLException& e) { |
| r._throw(&expression, e); | pool.exception()._throw(pool, &expression, e); |
| } | } |
| } | } |
| Line 102 MXnode::MXnode(Pool& apool) : Methoded(a | Line 354 MXnode::MXnode(Pool& apool) : Methoded(a |
| consts(apool) { | consts(apool) { |
| set_name(*NEW String(pool(), XNODE_CLASS_NAME)); | set_name(*NEW String(pool(), XNODE_CLASS_NAME)); |
| /// DOM1 node | |
| // Node insertBefore(in Node newChild,in Node refChild) raises(DOMException); | |
| add_native_method("insertBefore", Method::CT_DYNAMIC, _insertBefore, 2, 2); | |
| // Node replaceChild(in Node newChild,in Node oldChild) raises(DOMException); | |
| add_native_method("replaceChild", Method::CT_DYNAMIC, _replaceChild, 2, 2); | |
| // Node removeChild(in Node oldChild) raises(DOMException); | |
| add_native_method("removeChild", Method::CT_DYNAMIC, _removeChild, 1, 1); | |
| // Node appendChild(in Node newChild) raises(DOMException); | |
| add_native_method("appendChild", Method::CT_DYNAMIC, _appendChild, 1, 1); | |
| // boolean hasChildNodes(); | |
| add_native_method("hasChildNodes", Method::CT_DYNAMIC, _hasChildNodes, 0, 0); | |
| // Node cloneNode(in boolean deep); | |
| add_native_method("cloneNode", Method::CT_DYNAMIC, _cloneNode, 1, 1); | |
| /// DOM1 element | |
| // DOMString getAttribute(in DOMString name); | |
| add_native_method("getAttribute", Method::CT_DYNAMIC, _getAttribute, 1, 1); | |
| // void setAttribute(in DOMString name, in DOMString value) raises(DOMException); | |
| add_native_method("setAttribute", Method::CT_DYNAMIC, _setAttribute, 2, 2); | |
| // void removeAttribute(in DOMString name) raises(DOMException); | |
| add_native_method("removeAttribute", Method::CT_DYNAMIC, _removeAttribute, 1, 1); | |
| // Attr getAttributeNode(in DOMString name); | |
| add_native_method("getAttributeNode", Method::CT_DYNAMIC, _getAttributeNode, 1, 1); | |
| // Attr setAttributeNode(in Attr newAttr) raises(DOMException); | |
| add_native_method("setAttributeNode", Method::CT_DYNAMIC, _setAttributeNode, 1, 1); | |
| // Attr removeAttributeNode(in Attr oldAttr) raises(DOMException); | |
| add_native_method("removeAttributeNode", Method::CT_DYNAMIC, _removeAttributeNode, 1, 1); | |
| // NodeList getElementsByTagName(in DOMString name); | |
| add_native_method("getElementsByTagName", Method::CT_DYNAMIC, _getElementsByTagName, 1, 1); | |
| // void normalize(); | |
| add_native_method("normalize", Method::CT_DYNAMIC, _normalize, 0, 0); | |
| /// parser | |
| // ^node.select[/some/xpath/query] = hash $.#[dnode] | // ^node.select[/some/xpath/query] = hash $.#[dnode] |
| add_native_method("select", Method::CT_DYNAMIC, _select, 1, 1); | add_native_method("select", Method::CT_DYNAMIC, _select, 1, 1); |
| // ^node.select-single[/some/xpath/query] = first dnode | // ^node.selectSingle[/some/xpath/query] = first dnode |
| add_native_method("select-single", Method::CT_DYNAMIC, _select_single, 1, 1); | add_native_method("selectSingle", Method::CT_DYNAMIC, _select_single, 1, 1); |
| // consts | // consts |
| Line 127 MXnode::MXnode(Pool& apool) : Methoded(a | Line 415 MXnode::MXnode(Pool& apool) : Methoded(a |
| CONST(NOTATION_NODE, 12); | CONST(NOTATION_NODE, 12); |
| } | } |
| // global variable | // global variable |
| Methoded *Xnode_class; | Methoded *Xnode_class; |