--- parser3/src/classes/xnode.C 2001/10/16 14:44:40 1.8 +++ parser3/src/classes/xnode.C 2001/10/19 14:15:23 1.12 @@ -4,7 +4,7 @@ Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com) Author: Alexander Petrosyan (http://design.ru/paf) - $Id: xnode.C,v 1.8 2001/10/16 14:44:40 parser Exp $ + $Id: xnode.C,v 1.12 2001/10/19 14:15:23 parser Exp $ */ #include "classes.h" #ifdef XML @@ -32,7 +32,7 @@ XalanNode& as_node(Pool& pool, const Str int index, const char *msg) { Value& value=params->as_no_junction(index, msg); if(strcmp(value.type(), VXNODE_TYPE)!=0) - PTHROW(0, 0, + throw Exception(0, 0, &method_name, msg); @@ -47,7 +47,7 @@ XalanAttr& as_attr(Pool& pool, const Str XalanNode& node=as_node(pool, method_name, params, index, msg); if(node.getNodeType()!=XalanNode::ATTRIBUTE_NODE) - PTHROW(0, 0, + throw Exception(0, 0, &method_name, msg); @@ -62,15 +62,19 @@ XalanAttr& as_attr(Pool& pool, const Str static void _insertBefore(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); VXnode& vnode=*static_cast(r.self); - XalanNode& node=vnode.get_node(pool, &method_name); + XalanNode& selfNode=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); + if(XalanNode *retNode=selfNode.insertBefore(&newChild, &refChild)) { + // write out result + VXnode& result=*new(pool) VXnode(pool, retNode); + r.write_no_lang(result); + } } catch(const XalanDOMException& e) { - pool.exception()._throw(pool, &method_name, e); + Exception::convert(pool, &method_name, e); } } @@ -78,15 +82,19 @@ static void _insertBefore(Request& r, co static void _replaceChild(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); VXnode& vnode=*static_cast(r.self); - XalanNode& node=vnode.get_node(pool, &method_name); + XalanNode& selfNode=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); + if(XalanNode *retNode=selfNode.replaceChild(&newChild, &refChild)) { + // write out result + VXnode& result=*new(pool) VXnode(pool, retNode); + r.write_no_lang(result); + } } catch(const XalanDOMException& e) { - pool.exception()._throw(pool, &method_name, e); + Exception::convert(pool, &method_name, e); } } @@ -94,14 +102,18 @@ static void _replaceChild(Request& r, co static void _removeChild(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); VXnode& vnode=*static_cast(r.self); - XalanNode& node=vnode.get_node(pool, &method_name); + XalanNode& selfNode=vnode.get_node(pool, &method_name); XalanNode& oldChild=as_node(pool, method_name, params, 0, "oldChild must be node"); try { - node.removeChild(&oldChild); + if(XalanNode *retNode=selfNode.removeChild(&oldChild)) { + // write out result + VXnode& result=*new(pool) VXnode(pool, retNode); + r.write_no_lang(result); + } } catch(const XalanDOMException& e) { - pool.exception()._throw(pool, &method_name, e); + Exception::convert(pool, &method_name, e); } } @@ -109,14 +121,18 @@ static void _removeChild(Request& r, con static void _appendChild(Request& r, const String& method_name, MethodParams *params) { Pool& pool=r.pool(); VXnode& vnode=*static_cast(r.self); - XalanNode& node=vnode.get_node(pool, &method_name); + XalanNode& selfNode=vnode.get_node(pool, &method_name); XalanNode& newChild=as_node(pool, method_name, params, 0, "newChild must be node"); try { - node.appendChild(&newChild); + if(XalanNode *retNode=selfNode.appendChild(&newChild)) { + // write out result + VXnode& result=*new(pool) VXnode(pool, retNode); + r.write_no_lang(result); + } } catch(const XalanDOMException& e) { - pool.exception()._throw(pool, &method_name, e); + Exception::convert(pool, &method_name, e); } } @@ -155,7 +171,7 @@ XalanElement& get_self_element(Request& XalanNode& node=vnode.get_node(pool, &method_name); if(node.getNodeType()!=XalanNode::ELEMENT_NODE) - PTHROW(0, 0, + throw Exception(0, 0, &method_name, "method can be called on node of ELEMENT type"); @@ -166,9 +182,9 @@ XalanElement& get_self_element(Request& 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 String& name=params->as_string(0, "name must be string"); - const XalanDOMString& attribute_value=element.getAttribute(XalanDOMString(name)); + const XalanDOMString& attribute_value=element.getAttribute(pool.transcode(name)); // write out result r.write_no_lang(*new(pool) VString(pool.transcode(attribute_value))); } @@ -177,15 +193,15 @@ static void _getAttribute(Request& r, co 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); + const String& name=params->as_string(0, "name must be string"); + const String& attribute_value=params->as_string(1, "value must be string"); try { element.setAttribute( - XalanDOMString(name), - XalanDOMString(attribute_value)); + pool.transcode(name), + pool.transcode(attribute_value)); } catch(const XalanDOMException& e) { - pool.exception()._throw(pool, &method_name, e); + Exception::convert(pool, &method_name, e); } } @@ -193,12 +209,12 @@ static void _setAttribute(Request& r, co 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); + const String& name=params->as_string(0, "name must be string"); try { - element.removeAttribute(XalanDOMString(name)); + element.removeAttribute(pool.transcode(name)); } catch(const XalanDOMException& e) { - pool.exception()._throw(pool, &method_name, e); + Exception::convert(pool, &method_name, e); } } @@ -206,9 +222,9 @@ static void _removeAttribute(Request& r, 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); + const String& name=params->as_string(0, "name must be string"); - if(XalanAttr *attr=element.getAttributeNode(XalanDOMString(name))) { + if(XalanAttr *attr=element.getAttributeNode(pool.transcode(name))) { // write out result VXnode& result=*new(pool) VXnode(pool, attr); r.write_no_lang(result); @@ -228,7 +244,7 @@ static void _setAttributeNode(Request& r r.write_no_lang(result); } } catch(const XalanDOMException& e) { - pool.exception()._throw(pool, &method_name, e); + Exception::convert(pool, &method_name, e); } } @@ -241,7 +257,7 @@ static void _removeAttributeNode(Request try { /*XalanAttr *returnAttr*/element.removeAttributeNode(&oldAttr); } catch(const XalanDOMException& e) { - pool.exception()._throw(pool, &method_name, e); + Exception::convert(pool, &method_name, e); } } @@ -250,11 +266,11 @@ static void _getElementsByTagName(Reques 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 String& name=params->as_string(0, "name must be string"); VHash& result=*new(pool) VHash(pool); if(const XalanNodeList *nodes= - element.getElementsByTagName(XalanDOMString(name))) { + element.getElementsByTagName(pool.transcode(name))) { for(int i=0; igetLength(); i++) { String& skey=*new(pool) String(pool); { @@ -285,7 +301,7 @@ static void _select(Request& r, const St VXnode& vnode=*static_cast(r.self); // expression - const String& expression=params->as_string(0, "expression must not be code"); + const String& expression=params->as_string(0, "expression must be string"); const char *expression_cstr=expression.cstr(String::UL_AS_IS); XalanDOMString dstring(expression_cstr); const XalanDOMChar *expression_dcstr=dstring.c_str(); @@ -313,17 +329,17 @@ static void _select(Request& r, const St result.set_name(method_name); r.write_no_lang(result); } catch(const XSLException& e) { - pool.exception()._throw(pool, &expression, e); + Exception::convert(pool, &expression, e); } } -static void _select_single(Request& r, const String& method_name, MethodParams *params) { +static void _selectSingle(Request& r, const String& method_name, MethodParams *params) { // _asm int 3; Pool& pool=r.pool(); VXnode& vnode=*static_cast(r.self); // expression - const String& expression=params->as_string(0, "expression must not be code"); + const String& expression=params->as_string(0, "expression must be string"); const char *expression_cstr=expression.cstr(String::UL_AS_IS); XalanDOMString dstring(expression_cstr); const XalanDOMChar *expression_dcstr=dstring.c_str(); @@ -344,7 +360,7 @@ static void _select_single(Request& r, c r.write_no_lang(result); } } catch(const XSLException& e) { - pool.exception()._throw(pool, &expression, e); + Exception::convert(pool, &expression, e); } } @@ -394,7 +410,7 @@ MXnode::MXnode(Pool& apool) : Methoded(a add_native_method("select", Method::CT_DYNAMIC, _select, 1, 1); // ^node.selectSingle[/some/xpath/query] = first dnode - add_native_method("selectSingle", Method::CT_DYNAMIC, _select_single, 1, 1); + add_native_method("selectSingle", Method::CT_DYNAMIC, _selectSingle, 1, 1); // consts