Annotation of parser3/src/classes/xnode.C, revision 1.54.2.6
1.1 parser 1: /** @file
2: Parser: @b dom parser class.
3:
1.54.2.1 paf 4: Copyright (c) 2001-2003 ArtLebedev Group (http://www.artlebedev.com)
1.38 paf 5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.1 parser 6: */
7: #include "classes.h"
8: #ifdef XML
1.46 paf 9:
1.54.2.6! paf 10: static const char* IDENT_XNODE_C="$Date: 2003/02/17 07:18:57 $";
1.54.2.3 paf 11:
12: #include "pa_vmethod_frame.h"
1.1 parser 13:
1.21 paf 14: #include "pa_charset.h"
1.1 parser 15: #include "pa_request.h"
16: #include "pa_vxnode.h"
1.34 paf 17: #include "pa_vxdoc.h"
1.23 paf 18: #include "pa_vvoid.h"
1.1 parser 19:
20: #include "xnode.h"
21:
1.21 paf 22: extern "C" {
23: #include "gdomecore/gdome-xml-node.h"
1.27 paf 24: #include "gdomecore/gdome-xml-document.h"
1.21 paf 25: };
1.19 paf 26: #include "gdome.h"
1.21 paf 27: #include "libxml/xpath.h"
28:
1.54.2.5 paf 29: // global variable
30:
31: MethodedPtr xnode_class(new MXnode);
32:
1.21 paf 33: // classes
34:
35: class xmlXPathObject_auto_ptr {
36: public:
1.29 paf 37: explicit xmlXPathObject_auto_ptr(xmlXPathObject *_APtr = 0)
38: : _Owns(_APtr != 0), _Ptr(_APtr) {}
1.21 paf 39: xmlXPathObject_auto_ptr(const xmlXPathObject_auto_ptr& _Y)
40: : _Owns(_Y._Owns), _Ptr(_Y.release()) {}
41: xmlXPathObject_auto_ptr& operator=(const xmlXPathObject_auto_ptr& _Y)
42: {if (this != &_Y)
43: {if (_Ptr != _Y.get())
44: {if (_Owns && _Ptr)
45: xmlXPathFreeObject(_Ptr);
46: _Owns = _Y._Owns; }
47: else if (_Y._Owns)
48: _Owns = true;
49: _Ptr = _Y.release(); }
50: return (*this); }
51: ~xmlXPathObject_auto_ptr()
52: {if (_Owns && _Ptr)
53: xmlXPathFreeObject(_Ptr); }
54: xmlXPathObject& operator*() const
55: {return (*get()); }
56: xmlXPathObject *operator->() const
57: {return (get()); }
58: xmlXPathObject *get() const
59: {return (_Ptr); }
60: xmlXPathObject *release() const
61: {((xmlXPathObject_auto_ptr *)this)->_Owns = false;
62: return (_Ptr); }
63: private:
64: bool _Owns;
65: xmlXPathObject *_Ptr;
66: };
67:
68: class xmlXPathContext_auto_ptr {
69: public:
1.29 paf 70: explicit xmlXPathContext_auto_ptr(xmlXPathContext *_APtr = 0)
71: : _Owns(_APtr != 0), _Ptr(_APtr) {}
1.21 paf 72: xmlXPathContext_auto_ptr(const xmlXPathContext_auto_ptr& _Y)
73: : _Owns(_Y._Owns), _Ptr(_Y.release()) {}
74: xmlXPathContext_auto_ptr& operator=(const xmlXPathContext_auto_ptr& _Y)
75: {if (this != &_Y)
76: {if (_Ptr != _Y.get())
77: {if (_Owns && _Ptr)
78: xmlXPathFreeContext(_Ptr);
79: _Owns = _Y._Owns; }
80: else if (_Y._Owns)
81: _Owns = true;
82: _Ptr = _Y.release(); }
83: return (*this); }
84: ~xmlXPathContext_auto_ptr()
85: {if (_Owns && _Ptr)
86: xmlXPathFreeContext(_Ptr); }
87: xmlXPathContext& operator*() const
88: {return (*get()); }
89: xmlXPathContext *operator->() const
90: {return (get()); }
91: xmlXPathContext *get() const
92: {return (_Ptr); }
93: xmlXPathContext *release() const
94: {((xmlXPathContext_auto_ptr *)this)->_Owns = false;
95: return (_Ptr); }
96: private:
97: bool _Owns;
98: xmlXPathContext *_Ptr;
99: };
1.1 parser 100:
1.6 parser 101: // helpers
102:
1.54.2.2 paf 103: GdomeNode *as_node(StringPtr method_name, MethodParams& params,
1.54.2.1 paf 104: int index, const char* msg) {
1.54.2.2 paf 105: Value& value=params.as_no_junction(index, msg);
1.48 paf 106: if(Value *vxnode=value.as(VXNODE_TYPE, false))
107: return static_cast<VXnode *>(vxnode)->get_node(&method_name);
108: else
1.41 paf 109: throw Exception("parser.runtime",
1.54.2.4 paf 110: method_name,
1.6 parser 111: msg);
112: }
113:
114: // helpers
115:
1.54.2.2 paf 116: GdomeAttr * as_attr(Pool& pool, StringPtr method_name, MethodParams& params,
1.54.2.1 paf 117: int index, const char* msg) {
1.42 paf 118: GdomeNode *node=as_node(method_name, params, index, msg);
1.19 paf 119: GdomeException exc;
120: if(gdome_n_nodeType(node, &exc)!=GDOME_ATTRIBUTE_NODE)
1.41 paf 121: throw Exception("parser.runtime",
1.54.2.4 paf 122: method_name,
1.6 parser 123: msg);
124:
1.19 paf 125: return GDOME_A(node);
1.6 parser 126: }
1.1 parser 127:
128: // methods
129:
1.6 parser 130: // DOM1 node
131:
132: // Node insertBefore(in Node newChild,in Node refChild) raises(DOMException);
1.54.2.2 paf 133: static void _insertBefore(Request& r, StringPtr method_name, MethodParams& params) {
1.6 parser 134: Pool& pool=r.pool();
1.52 paf 135: VXnode& vnode=*static_cast<VXnode *>(r.get_self());
1.19 paf 136: GdomeNode *selfNode=vnode.get_node(&method_name);
1.42 paf 137: GdomeNode *newChild=as_node(method_name, params, 0, "newChild must be node");
138: GdomeNode *refChild=as_node(method_name, params, 1, "refChild must be node");
1.6 parser 139:
1.19 paf 140: GdomeException exc;
141: if(GdomeNode *retNode=gdome_n_insertBefore(selfNode, newChild, refChild, &exc)) {
142: // write out result
143: VXnode& result=*new(pool) VXnode(pool, retNode);
144: r.write_no_lang(result);
145: } else
1.41 paf 146: throw Exception(
1.54.2.4 paf 147: method_name,
1.19 paf 148: exc);
1.6 parser 149: }
150:
151: // Node replaceChild(in Node newChild,in Node oldChild) raises(DOMException);
1.54.2.2 paf 152: static void _replaceChild(Request& r, StringPtr method_name, MethodParams& params) {
1.6 parser 153: Pool& pool=r.pool();
1.52 paf 154: VXnode& vnode=*static_cast<VXnode *>(r.get_self());
1.19 paf 155: GdomeNode *selfNode=vnode.get_node(&method_name);
1.42 paf 156: GdomeNode *newChild=as_node(method_name, params, 0, "newChild must be node");
157: GdomeNode *refChild=as_node(method_name, params, 1, "refChild must be node");
1.6 parser 158:
1.19 paf 159: GdomeException exc;
160: if(GdomeNode *retNode=gdome_n_replaceChild(selfNode, newChild, refChild, &exc)) {
161: // write out result
162: r.write_no_lang(*new(pool) VXnode(pool, retNode));
163: } else
1.41 paf 164: throw Exception(
1.54.2.4 paf 165: method_name,
1.19 paf 166: exc);
1.6 parser 167: }
168:
169: // Node removeChild(in Node oldChild) raises(DOMException);
1.54.2.2 paf 170: static void _removeChild(Request& r, StringPtr method_name, MethodParams& params) {
1.6 parser 171: Pool& pool=r.pool();
1.52 paf 172: VXnode& vnode=*static_cast<VXnode *>(r.get_self());
1.19 paf 173: GdomeNode *selfNode=vnode.get_node(&method_name);
1.42 paf 174: GdomeNode *oldChild=as_node(method_name, params, 0, "oldChild must be node");
1.6 parser 175:
1.19 paf 176: GdomeException exc;
177: if(GdomeNode *retNode=gdome_n_removeChild(selfNode, oldChild, &exc)) {
178: // write out result
179: r.write_no_lang(*new(pool) VXnode(pool, retNode));
180: } else
1.41 paf 181: throw Exception(
1.54.2.4 paf 182: method_name,
1.19 paf 183: exc);
1.6 parser 184: }
185:
186: // Node appendChild(in Node newChild) raises(DOMException);
1.54.2.2 paf 187: static void _appendChild(Request& r, StringPtr method_name, MethodParams& params) {
1.6 parser 188: Pool& pool=r.pool();
1.52 paf 189: VXnode& vnode=*static_cast<VXnode *>(r.get_self());
1.19 paf 190: GdomeNode *selfNode=vnode.get_node(&method_name);
1.42 paf 191: GdomeNode *newChild=as_node(method_name, params, 0, "newChild must be node");
1.6 parser 192:
1.19 paf 193: GdomeException exc;
194: if(GdomeNode *retNode=gdome_n_appendChild(selfNode, newChild, &exc)) {
195: // write out result
196: r.write_no_lang(*new(pool) VXnode(pool, retNode));
197: } else
1.41 paf 198: throw Exception(
1.54.2.4 paf 199: method_name,
1.19 paf 200: exc);
1.6 parser 201: }
202:
203: // boolean hasChildNodes();
1.54.2.2 paf 204: static void _hasChildNodes(Request& r, StringPtr method_name, MethodParams& ) {
1.6 parser 205: Pool& pool=r.pool();
1.52 paf 206: VXnode& vnode=*static_cast<VXnode *>(r.get_self());
1.19 paf 207: GdomeNode *node=vnode.get_node(&method_name);
1.6 parser 208:
1.19 paf 209: GdomeException exc;
1.6 parser 210: // write out result
1.44 paf 211: bool result=gdome_n_hasChildNodes(node, &exc)!=0;
212: r.write_no_lang(*new(pool) VBool(pool, result));
1.6 parser 213: }
214:
215: // Node cloneNode(in boolean deep);
1.54.2.2 paf 216: static void _cloneNode(Request& r, StringPtr method_name, MethodParams& params) {
1.6 parser 217: Pool& pool=r.pool();
1.52 paf 218: VXnode& vnode=*static_cast<VXnode *>(r.get_self());
1.19 paf 219: GdomeNode *node=vnode.get_node(&method_name);
1.6 parser 220:
1.54.2.2 paf 221: bool deep=params.as_bool(0, "deep must be bool", r);
1.6 parser 222:
1.19 paf 223: GdomeException exc;
1.6 parser 224: // write out result
1.44 paf 225: r.write_no_lang(*new(pool) VXnode(pool, gdome_n_cloneNode(node, deep, &exc)));
1.6 parser 226: }
227:
228: // DOM1 element
229:
1.19 paf 230: GdomeElement *get_self_element(Request& r, const String& method_name) {
1.6 parser 231: Pool& pool=r.pool();
1.52 paf 232: VXnode& vnode=*static_cast<VXnode *>(r.get_self());
1.19 paf 233: GdomeNode *node=vnode.get_node(&method_name);
1.6 parser 234:
1.19 paf 235: GdomeException exc;
1.50 paf 236: if(gdome_n_nodeType(node, &exc)!=GDOME_ELEMENT_NODE)
1.41 paf 237: throw Exception("parser.runtime",
1.54.2.4 paf 238: method_name,
1.51 paf 239: "method can only be called on nodes of ELEMENT type");
1.6 parser 240:
1.19 paf 241: return GDOME_EL(node);
1.6 parser 242: }
243:
244: // DOMString getAttribute(in DOMString name);
1.54.2.2 paf 245: static void _getAttribute(Request& r, StringPtr method_name, MethodParams& params) {
1.6 parser 246: Pool& pool=r.pool();
1.19 paf 247: GdomeElement *element=get_self_element(r, method_name);
1.54.2.2 paf 248: const String& name=params.as_string(0, "name must be string");
1.6 parser 249:
1.19 paf 250: GdomeException exc;
251: GdomeDOMString *attribute_value=
1.21 paf 252: gdome_el_getAttribute(element, pool.transcode(name).get(), &exc);
1.6 parser 253: // write out result
1.53 paf 254: r.write_no_lang(pool.transcode(attribute_value, &name));
1.6 parser 255: }
256:
257: // void setAttribute(in DOMString name, in DOMString value) raises(DOMException);
1.54.2.2 paf 258: static void _setAttribute(Request& r, StringPtr method_name, MethodParams& params) {
1.6 parser 259: Pool& pool=r.pool();
1.19 paf 260: GdomeElement *element=get_self_element(r, method_name);
1.54.2.2 paf 261: const String& name=params.as_string(0, "name must be string");
262: const String& attribute_value=params.as_string(1, "value must be string");
1.6 parser 263:
1.19 paf 264: GdomeException exc;
265: gdome_el_setAttribute(element,
1.21 paf 266: pool.transcode(name).get(),
267: pool.transcode(attribute_value).get(),
1.19 paf 268: &exc);
269: if(exc)
1.41 paf 270: throw Exception(
1.54.2.4 paf 271: method_name,
1.19 paf 272: exc);
1.6 parser 273: }
274:
275: // void removeAttribute(in DOMString name) raises(DOMException);
1.54.2.2 paf 276: static void _removeAttribute(Request& r, StringPtr method_name, MethodParams& params) {
1.6 parser 277: Pool& pool=r.pool();
1.19 paf 278: GdomeElement *element=get_self_element(r, method_name);
1.54.2.2 paf 279: const String& name=params.as_string(0, "name must be string");
1.6 parser 280:
1.19 paf 281: GdomeException exc;
1.21 paf 282: gdome_el_removeAttribute(element, pool.transcode(name).get(), &exc);
1.19 paf 283: if(exc)
1.41 paf 284: throw Exception(
1.54.2.4 paf 285: method_name,
1.19 paf 286: exc);
1.6 parser 287: }
288:
289: // Attr getAttributeNode(in DOMString name);
1.54.2.2 paf 290: static void _getAttributeNode(Request& r, StringPtr method_name, MethodParams& params) {
1.6 parser 291: Pool& pool=r.pool();
1.19 paf 292: GdomeElement *element=get_self_element(r, method_name);
1.54.2.2 paf 293: const String& name=params.as_string(0, "name must be string");
1.6 parser 294:
1.19 paf 295: GdomeException exc;
1.21 paf 296: if(GdomeAttr *attr=gdome_el_getAttributeNode(element, pool.transcode(name).get(), &exc)) {
1.6 parser 297: // write out result
1.19 paf 298: VXnode& result=*new(pool) VXnode(pool, (GdomeNode *)attr);
1.6 parser 299: r.write_no_lang(result);
1.19 paf 300: } else if(exc)
1.41 paf 301: throw Exception(
1.54.2.4 paf 302: method_name,
1.19 paf 303: exc);
1.6 parser 304: }
305:
306: // Attr setAttributeNode(in Attr newAttr) raises(DOMException);
1.54.2.2 paf 307: static void _setAttributeNode(Request& r, StringPtr method_name, MethodParams& params) {
1.6 parser 308: Pool& pool=r.pool();
1.19 paf 309: GdomeElement *element=get_self_element(r, method_name);
310: GdomeAttr * newAttr=as_attr(pool, method_name, params, 0, "newAttr must be ATTRIBUTE node");
1.6 parser 311:
1.19 paf 312: GdomeException exc;
313: if(GdomeAttr *returnAttr=gdome_el_setAttributeNode(element, newAttr, &exc)) {
314: // write out result
315: VXnode& result=*new(pool) VXnode(pool, (GdomeNode *)returnAttr);
316: r.write_no_lang(result);
317: } else
1.41 paf 318: throw Exception(
1.54.2.4 paf 319: method_name,
1.19 paf 320: exc);
1.6 parser 321: }
322:
323: // Attr removeAttributeNode(in Attr oldAttr) raises(DOMException);
1.54.2.2 paf 324: static void _removeAttributeNode(Request& r, StringPtr method_name, MethodParams& params) {
1.6 parser 325: Pool& pool=r.pool();
1.19 paf 326: GdomeElement *element=get_self_element(r, method_name);
327: GdomeAttr * oldAttr=as_attr(pool, method_name, params, 0, "oldAttr must be ATTRIBUTE node");
1.6 parser 328:
1.19 paf 329: GdomeException exc;
330: gdome_el_removeAttributeNode(element, oldAttr, &exc);
331: if(exc)
1.41 paf 332: throw Exception(
1.54.2.4 paf 333: method_name,
1.26 paf 334: exc);
1.6 parser 335: }
336:
337: // NodeList getElementsByTagName(in DOMString name);
1.54.2.2 paf 338: static void _getElementsByTagName(Request& r, StringPtr method_name, MethodParams& params) {
1.6 parser 339: Pool& pool=r.pool();
1.19 paf 340: GdomeElement *element=get_self_element(r, method_name);
1.6 parser 341:
1.54.2.2 paf 342: const String& name=params.as_string(0, "name must be string");
1.6 parser 343:
344: VHash& result=*new(pool) VHash(pool);
1.19 paf 345: GdomeException exc;
346: if(GdomeNodeList *nodes=
1.21 paf 347: gdome_el_getElementsByTagName(element, pool.transcode(name).get(), &exc)) {
1.19 paf 348: gulong length=gdome_nl_length(nodes, &exc);
349: for(gulong i=0; i<length; i++) {
1.6 parser 350: String& skey=*new(pool) String(pool);
1.54.2.6! paf 351: skey << pool.format_integer(i);
1.6 parser 352:
1.19 paf 353: result.hash(0).put(skey, new(pool) VXnode(pool, gdome_nl_item(nodes, i, &exc)));
1.6 parser 354: }
1.19 paf 355: } else if(exc)
1.41 paf 356: throw Exception(
1.54.2.4 paf 357: method_name,
1.26 paf 358: exc);
1.6 parser 359:
360: // write out result
361: r.write_no_lang(result);
362: }
363:
1.54.2.2 paf 364: static void _getElementsByTagNameNS(Request& r, StringPtr method_name, MethodParams& params) {
1.39 paf 365: Pool& pool=r.pool();
366: GdomeElement *element=get_self_element(r, method_name);
367:
368: // namespaceURI;localName
1.54.2.2 paf 369: const String& namespaceURI=params.as_string(0, "namespaceURI must be string");
370: const String& localName=params.as_string(1, "localName must be string");
1.39 paf 371:
372: GdomeException exc;
373: VHash& result=*new(pool) VHash(pool);
374: if(GdomeNodeList *nodes=
375: gdome_el_getElementsByTagNameNS(
376: element,
377: pool.transcode(namespaceURI).get(),
378: pool.transcode(localName).get(),
379: &exc)) {
380: gulong length=gdome_nl_length(nodes, &exc);
381: for(gulong i=0; i<length; i++) {
382: String& skey=*new(pool) String(pool);
1.54.2.6! paf 383: skey << pool.format_integer(i);
1.39 paf 384:
385: result.hash(0).put(skey, new(pool) VXnode(pool, gdome_nl_item(nodes, i, &exc)));
386: }
387: }
388:
389: // write out result
390: r.write_no_lang(result);
391: }
392:
1.6 parser 393: // void normalize();
1.54.2.2 paf 394: static void _normalize(Request& r, StringPtr method_name, MethodParams& ) {
1.19 paf 395: Pool& pool=r.pool();
1.52 paf 396: VXnode& vnode=*static_cast<VXnode *>(r.get_self());
1.19 paf 397: GdomeNode *selfNode=vnode.get_node(&method_name);
1.6 parser 398:
1.19 paf 399: GdomeException exc;
400: gdome_n_normalize(selfNode, &exc);
401: if(exc)
1.41 paf 402: throw Exception(
1.54.2.4 paf 403: method_name,
1.26 paf 404: exc);
1.6 parser 405: }
1.25 paf 406:
1.54.2.2 paf 407: static void _selectX(Request& r, StringPtr method_name, MethodParams& params,
1.26 paf 408: void (*handler)(Pool& pool,
409: const String& expression,
410: xmlXPathObject_auto_ptr res,
411: Value *& result)) {
1.1 parser 412: // _asm int 3;
413: Pool& pool=r.pool();
1.52 paf 414: VXnode& vnode=*static_cast<VXnode *>(r.get_self());
1.1 parser 415:
416: // expression
1.54.2.2 paf 417: const String& expression=params.as_string(0, "expression must be string");
1.1 parser 418:
1.25 paf 419: GdomeException exc;
420: GdomeNode *dome_node=vnode.get_node(&method_name);
421: GdomeDocument *dome_document=gdome_n_ownerDocument(dome_node, &exc);
1.32 paf 422: if(!dome_document) // document does not own itself, so ownerDocument = 0
423: dome_document=GDOME_DOC(dome_node); // and we need downcast
1.33 paf 424: xmlDoc *xml_document=gdome_xml_doc_get_xmlDoc(dome_document);
1.25 paf 425: xmlXPathContext_auto_ptr ctxt(xmlXPathNewContext(xml_document));
1.32 paf 426: ctxt->node=gdome_xml_n_get_xmlNode(dome_node);
1.25 paf 427: /*error to stderr for now*/
428: xmlXPathObject_auto_ptr res(
429: xmlXPathEvalExpression(BAD_CAST pool.transcode(expression)->str, ctxt.get()));
1.28 paf 430:
431: if(xmlHaveGenericErrors()) {
432: GdomeException exc=0;
1.41 paf 433: throw Exception(&expression, exc);
1.28 paf 434: }
1.25 paf 435:
436: Value *result=0;
437: if(res.get())
1.26 paf 438: handler(pool, expression, res, result);
1.44 paf 439: if(result)
1.26 paf 440: r.write_no_lang(*result);
441: }
1.25 paf 442:
1.26 paf 443: static void selectNodesHandler(Pool& pool,
444: const String& expression,
445: xmlXPathObject_auto_ptr res,
446: Value *& result) {
1.31 paf 447: VHash *vhash=new(pool) VHash(pool); result=vhash;
1.26 paf 448: switch(res->type) {
449: case XPATH_UNDEFINED:
450: break;
451: case XPATH_NODESET:
1.40 paf 452: if(res->nodesetval)
453: if(int size=res->nodesetval->nodeNr) {
454: Hash& hash=vhash->hash(0);
455: for(int i=0; i<size; i++) {
456: String& skey=*new(pool) String(pool);
1.54.2.6! paf 457: skey << pool.format_integer(i);
1.40 paf 458:
459: hash.put(skey, new(pool) VXnode(pool,
460: gdome_xml_n_mkref(res->nodesetval->nodeTab[i])));
1.25 paf 461: }
1.1 parser 462: }
1.26 paf 463: break;
464: default:
1.41 paf 465: throw Exception(0,
1.26 paf 466: &expression,
467: "wrong xmlXPathEvalExpression result type (%d)", res->type);
468: break; // never
469: }
470: }
471:
472: static void selectNodeHandler(Pool& pool,
473: const String& expression,
474: xmlXPathObject_auto_ptr res,
475: Value *& result) {
476: switch(res->type) {
477: case XPATH_UNDEFINED:
478: break;
479: case XPATH_NODESET:
1.40 paf 480: if(res->nodesetval && res->nodesetval->nodeNr) { // empty result strangly has NODESET res->type
1.26 paf 481: if(res->nodesetval->nodeNr>1)
1.41 paf 482: throw Exception("parser.runtime",
1.25 paf 483: &expression,
1.26 paf 484: "resulted not in a single node (%d)", res->nodesetval->nodeNr);
485:
486: result=new(pool) VXnode(pool, gdome_xml_n_mkref(res->nodesetval->nodeTab[0]));
1.25 paf 487: }
1.26 paf 488: break;
489: case XPATH_BOOLEAN:
490: result=new(pool) VBool(pool, res->boolval!=0);
491: break;
492: case XPATH_NUMBER:
493: result=new(pool) VDouble(pool, res->floatval);
494: break;
495: case XPATH_STRING:
496: result=new(pool) VString(
497: pool.transcode(
498: GdomeDOMString_auto_ptr(
1.53 paf 499: gdome_str_mkref_dup((const gchar *)res->stringval)).get(), &expression));
1.26 paf 500: break;
501: default:
1.41 paf 502: throw Exception("parser.runtime",
1.26 paf 503: &expression,
504: "wrong xmlXPathEvalExpression result type (%d)", res->type);
505: break; // never
506: }
507: }
508:
509: static void selectBoolHandler(Pool& pool,
510: const String& expression,
511: xmlXPathObject_auto_ptr res,
512: Value *& result) {
513: switch(res->type) {
514: case XPATH_BOOLEAN:
515: result=new(pool) VBool(pool, res->boolval!=0);
516: break;
517: case XPATH_NODESET:
1.40 paf 518: if(!(res->nodesetval && res->nodesetval->nodeNr))
1.26 paf 519: break;
520: // else[nodeset] fall down to default
521: default:
1.41 paf 522: throw Exception("parser.runtime",
1.26 paf 523: &expression,
524: "wrong xmlXPathEvalExpression result type (%d)", res->type);
525: break; // never
526: }
527: }
1.1 parser 528:
1.26 paf 529: static void selectNumberHandler(Pool& pool,
530: const String& expression,
531: xmlXPathObject_auto_ptr res,
532: Value *& result) {
533: switch(res->type) {
534: case XPATH_NUMBER:
535: result=new(pool) VDouble(pool, res->floatval);
536: break;
537: case XPATH_NODESET:
1.40 paf 538: if(!(res->nodesetval && res->nodesetval->nodeNr))
1.26 paf 539: break;
540: // else[nodeset] fall down to default
541: default:
1.41 paf 542: throw Exception("parser.runtime",
1.26 paf 543: &expression,
544: "wrong xmlXPathEvalExpression result type (%d)", res->type);
545: break; // never
546: }
547: }
548:
549: static void selectStringHandler(Pool& pool,
550: const String& expression,
551: xmlXPathObject_auto_ptr res,
552: Value *& result) {
553: switch(res->type) {
554: case XPATH_UNDEFINED:
555: break;
556: case XPATH_STRING:
557: result=new(pool) VString(
558: pool.transcode(
559: GdomeDOMString_auto_ptr(
1.53 paf 560: gdome_str_mkref_dup((const gchar *)res->stringval)).get(), &expression));
1.26 paf 561: break;
562: case XPATH_NODESET:
1.40 paf 563: if(!(res->nodesetval && res->nodesetval->nodeNr))
1.26 paf 564: break;
565: // else[nodeset] fall down to default
566: default:
1.41 paf 567: throw Exception("parser.runtime",
1.26 paf 568: &expression,
569: "wrong xmlXPathEvalExpression result type (%d)", res->type);
570: break; // never
1.1 parser 571: }
572: }
1.25 paf 573:
1.54.2.2 paf 574: static void _select(Request& r, StringPtr method_name, MethodParams& params) {
1.26 paf 575: _selectX(r, method_name, params,
576: selectNodesHandler);
577: }
578:
1.54.2.2 paf 579: static void _selectSingle(Request& r, StringPtr method_name, MethodParams& params) {
1.26 paf 580: _selectX(r, method_name, params,
581: selectNodeHandler);
582: }
1.1 parser 583:
1.54.2.2 paf 584: static void _selectBool(Request& r, StringPtr method_name, MethodParams& params) {
1.26 paf 585: _selectX(r, method_name, params,
586: selectBoolHandler);
587: }
1.20 paf 588:
1.54.2.2 paf 589: static void _selectNumber(Request& r, StringPtr method_name, MethodParams& params) {
1.26 paf 590: _selectX(r, method_name, params,
591: selectNumberHandler);
592: }
1.24 paf 593:
1.54.2.2 paf 594: static void _selectString(Request& r, StringPtr method_name, MethodParams& params) {
1.26 paf 595: _selectX(r, method_name, params,
596: selectStringHandler);
1.1 parser 597: }
1.20 paf 598:
1.1 parser 599: // constructor
600:
1.54.2.1 paf 601: MXnode::MXnode(Pool& apool, const char* aname, VStateless_class *abase) :
1.45 paf 602: Methoded(apool, aname?aname:"xnode", abase),
603:
1.44 paf 604: consts(apool)
605: {
1.6 parser 606: /// DOM1 node
607:
608: // Node insertBefore(in Node newChild,in Node refChild) raises(DOMException);
609: add_native_method("insertBefore", Method::CT_DYNAMIC, _insertBefore, 2, 2);
610: // Node replaceChild(in Node newChild,in Node oldChild) raises(DOMException);
611: add_native_method("replaceChild", Method::CT_DYNAMIC, _replaceChild, 2, 2);
612: // Node removeChild(in Node oldChild) raises(DOMException);
613: add_native_method("removeChild", Method::CT_DYNAMIC, _removeChild, 1, 1);
614: // Node appendChild(in Node newChild) raises(DOMException);
615: add_native_method("appendChild", Method::CT_DYNAMIC, _appendChild, 1, 1);
616: // boolean hasChildNodes();
617: add_native_method("hasChildNodes", Method::CT_DYNAMIC, _hasChildNodes, 0, 0);
618: // Node cloneNode(in boolean deep);
619: add_native_method("cloneNode", Method::CT_DYNAMIC, _cloneNode, 1, 1);
620:
621: /// DOM1 element
622:
623: // DOMString getAttribute(in DOMString name);
624: add_native_method("getAttribute", Method::CT_DYNAMIC, _getAttribute, 1, 1);
625: // void setAttribute(in DOMString name, in DOMString value) raises(DOMException);
626: add_native_method("setAttribute", Method::CT_DYNAMIC, _setAttribute, 2, 2);
627: // void removeAttribute(in DOMString name) raises(DOMException);
628: add_native_method("removeAttribute", Method::CT_DYNAMIC, _removeAttribute, 1, 1);
629: // Attr getAttributeNode(in DOMString name);
630: add_native_method("getAttributeNode", Method::CT_DYNAMIC, _getAttributeNode, 1, 1);
631: // Attr setAttributeNode(in Attr newAttr) raises(DOMException);
632: add_native_method("setAttributeNode", Method::CT_DYNAMIC, _setAttributeNode, 1, 1);
633: // Attr removeAttributeNode(in Attr oldAttr) raises(DOMException);
634: add_native_method("removeAttributeNode", Method::CT_DYNAMIC, _removeAttributeNode, 1, 1);
635: // NodeList getElementsByTagName(in DOMString name);
636: add_native_method("getElementsByTagName", Method::CT_DYNAMIC, _getElementsByTagName, 1, 1);
1.39 paf 637: // NodeList getElementsByTagNameNS(in DOMString namespaceURI, in DOMString localName);
638: add_native_method("getElementsByTagNameNS", Method::CT_DYNAMIC, _getElementsByTagNameNS, 2, 2);
1.6 parser 639: // void normalize();
640: add_native_method("normalize", Method::CT_DYNAMIC, _normalize, 0, 0);
641:
642: /// parser
1.1 parser 643: // ^node.select[/some/xpath/query] = hash $.#[dnode]
1.25 paf 644: add_native_method("select", Method::CT_DYNAMIC, _select, 1, 1);
1.1 parser 645:
1.26 paf 646: // ^node.selectSingle[/some/xpath/query] = first node [if any]
1.9 parser 647: add_native_method("selectSingle", Method::CT_DYNAMIC, _selectSingle, 1, 1);
1.26 paf 648: // ^node.selectBool[/some/xpath/query] = bool value [if any]
649: add_native_method("selectBool", Method::CT_DYNAMIC, _selectBool, 1, 1);
650: // ^node.selectNumber[/some/xpath/query] = double value [if any]
651: add_native_method("selectNumber", Method::CT_DYNAMIC, _selectNumber, 1, 1);
652: // ^node.selectString[/some/xpath/query] = strinv value [if any]
653: add_native_method("selectString", Method::CT_DYNAMIC, _selectString, 1, 1);
1.20 paf 654:
1.2 parser 655: // consts
656:
1.19 paf 657: #define CONST(name) \
658: consts.put(*new(pool()) String(pool(), #name), new(pool()) VInt(pool(), GDOME_##name))
1.2 parser 659:
1.19 paf 660: CONST(ELEMENT_NODE);
661: CONST(ATTRIBUTE_NODE);
662: CONST(TEXT_NODE);
663: CONST(CDATA_SECTION_NODE);
664: CONST(ENTITY_REFERENCE_NODE);
665: CONST(ENTITY_NODE);
666: CONST(PROCESSING_INSTRUCTION_NODE);
667: CONST(COMMENT_NODE);
668: CONST(DOCUMENT_NODE);
669: CONST(DOCUMENT_TYPE_NODE);
670: CONST(DOCUMENT_FRAGMENT_NODE);
671: CONST(NOTATION_NODE);
1.1 parser 672:
673: }
1.3 parser 674:
1.54.2.5 paf 675: #else
1.1 parser 676:
1.54.2.5 paf 677: // global variable
1.1 parser 678:
1.54.2.5 paf 679: MethodedPtr xnode_class(0); // fictive
1.1 parser 680:
681: #endif
E-mail: