Annotation of parser3/src/classes/xnode.C, revision 1.54.2.5
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.5! paf 10: static const char* IDENT_XNODE_C="$Date: 2003/02/04 15:15:03 $";
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);
351: {
352: char *buf=(char *)pool.malloc(MAX_NUMBER);
353: snprintf(buf, MAX_NUMBER, "%d", i);
354: skey << buf;
355: }
356:
1.19 paf 357: result.hash(0).put(skey, new(pool) VXnode(pool, gdome_nl_item(nodes, i, &exc)));
1.6 parser 358: }
1.19 paf 359: } else if(exc)
1.41 paf 360: throw Exception(
1.54.2.4 paf 361: method_name,
1.26 paf 362: exc);
1.6 parser 363:
364: // write out result
365: r.write_no_lang(result);
366: }
367:
1.54.2.2 paf 368: static void _getElementsByTagNameNS(Request& r, StringPtr method_name, MethodParams& params) {
1.39 paf 369: Pool& pool=r.pool();
370: GdomeElement *element=get_self_element(r, method_name);
371:
372: // namespaceURI;localName
1.54.2.2 paf 373: const String& namespaceURI=params.as_string(0, "namespaceURI must be string");
374: const String& localName=params.as_string(1, "localName must be string");
1.39 paf 375:
376: GdomeException exc;
377: VHash& result=*new(pool) VHash(pool);
378: if(GdomeNodeList *nodes=
379: gdome_el_getElementsByTagNameNS(
380: element,
381: pool.transcode(namespaceURI).get(),
382: pool.transcode(localName).get(),
383: &exc)) {
384: gulong length=gdome_nl_length(nodes, &exc);
385: for(gulong i=0; i<length; i++) {
386: String& skey=*new(pool) String(pool);
387: {
388: char *buf=(char *)pool.malloc(MAX_NUMBER);
389: snprintf(buf, MAX_NUMBER, "%d", i);
390: skey << buf;
391: }
392:
393: result.hash(0).put(skey, new(pool) VXnode(pool, gdome_nl_item(nodes, i, &exc)));
394: }
395: }
396:
397: // write out result
398: r.write_no_lang(result);
399: }
400:
1.6 parser 401: // void normalize();
1.54.2.2 paf 402: static void _normalize(Request& r, StringPtr method_name, MethodParams& ) {
1.19 paf 403: Pool& pool=r.pool();
1.52 paf 404: VXnode& vnode=*static_cast<VXnode *>(r.get_self());
1.19 paf 405: GdomeNode *selfNode=vnode.get_node(&method_name);
1.6 parser 406:
1.19 paf 407: GdomeException exc;
408: gdome_n_normalize(selfNode, &exc);
409: if(exc)
1.41 paf 410: throw Exception(
1.54.2.4 paf 411: method_name,
1.26 paf 412: exc);
1.6 parser 413: }
1.25 paf 414:
1.54.2.2 paf 415: static void _selectX(Request& r, StringPtr method_name, MethodParams& params,
1.26 paf 416: void (*handler)(Pool& pool,
417: const String& expression,
418: xmlXPathObject_auto_ptr res,
419: Value *& result)) {
1.1 parser 420: // _asm int 3;
421: Pool& pool=r.pool();
1.52 paf 422: VXnode& vnode=*static_cast<VXnode *>(r.get_self());
1.1 parser 423:
424: // expression
1.54.2.2 paf 425: const String& expression=params.as_string(0, "expression must be string");
1.1 parser 426:
1.25 paf 427: GdomeException exc;
428: GdomeNode *dome_node=vnode.get_node(&method_name);
429: GdomeDocument *dome_document=gdome_n_ownerDocument(dome_node, &exc);
1.32 paf 430: if(!dome_document) // document does not own itself, so ownerDocument = 0
431: dome_document=GDOME_DOC(dome_node); // and we need downcast
1.33 paf 432: xmlDoc *xml_document=gdome_xml_doc_get_xmlDoc(dome_document);
1.25 paf 433: xmlXPathContext_auto_ptr ctxt(xmlXPathNewContext(xml_document));
1.32 paf 434: ctxt->node=gdome_xml_n_get_xmlNode(dome_node);
1.25 paf 435: /*error to stderr for now*/
436: xmlXPathObject_auto_ptr res(
437: xmlXPathEvalExpression(BAD_CAST pool.transcode(expression)->str, ctxt.get()));
1.28 paf 438:
439: if(xmlHaveGenericErrors()) {
440: GdomeException exc=0;
1.41 paf 441: throw Exception(&expression, exc);
1.28 paf 442: }
1.25 paf 443:
444: Value *result=0;
445: if(res.get())
1.26 paf 446: handler(pool, expression, res, result);
1.44 paf 447: if(result)
1.26 paf 448: r.write_no_lang(*result);
449: }
1.25 paf 450:
1.26 paf 451: static void selectNodesHandler(Pool& pool,
452: const String& expression,
453: xmlXPathObject_auto_ptr res,
454: Value *& result) {
1.31 paf 455: VHash *vhash=new(pool) VHash(pool); result=vhash;
1.26 paf 456: switch(res->type) {
457: case XPATH_UNDEFINED:
458: break;
459: case XPATH_NODESET:
1.40 paf 460: if(res->nodesetval)
461: if(int size=res->nodesetval->nodeNr) {
462: Hash& hash=vhash->hash(0);
463: for(int i=0; i<size; i++) {
464: String& skey=*new(pool) String(pool);
465: {
466: char *buf=(char *)pool.malloc(MAX_NUMBER);
467: snprintf(buf, MAX_NUMBER, "%d", i);
468: skey << buf;
469: }
470:
471: hash.put(skey, new(pool) VXnode(pool,
472: gdome_xml_n_mkref(res->nodesetval->nodeTab[i])));
1.25 paf 473: }
1.1 parser 474: }
1.26 paf 475: break;
476: default:
1.41 paf 477: throw Exception(0,
1.26 paf 478: &expression,
479: "wrong xmlXPathEvalExpression result type (%d)", res->type);
480: break; // never
481: }
482: }
483:
484: static void selectNodeHandler(Pool& pool,
485: const String& expression,
486: xmlXPathObject_auto_ptr res,
487: Value *& result) {
488: switch(res->type) {
489: case XPATH_UNDEFINED:
490: break;
491: case XPATH_NODESET:
1.40 paf 492: if(res->nodesetval && res->nodesetval->nodeNr) { // empty result strangly has NODESET res->type
1.26 paf 493: if(res->nodesetval->nodeNr>1)
1.41 paf 494: throw Exception("parser.runtime",
1.25 paf 495: &expression,
1.26 paf 496: "resulted not in a single node (%d)", res->nodesetval->nodeNr);
497:
498: result=new(pool) VXnode(pool, gdome_xml_n_mkref(res->nodesetval->nodeTab[0]));
1.25 paf 499: }
1.26 paf 500: break;
501: case XPATH_BOOLEAN:
502: result=new(pool) VBool(pool, res->boolval!=0);
503: break;
504: case XPATH_NUMBER:
505: result=new(pool) VDouble(pool, res->floatval);
506: break;
507: case XPATH_STRING:
508: result=new(pool) VString(
509: pool.transcode(
510: GdomeDOMString_auto_ptr(
1.53 paf 511: gdome_str_mkref_dup((const gchar *)res->stringval)).get(), &expression));
1.26 paf 512: break;
513: default:
1.41 paf 514: throw Exception("parser.runtime",
1.26 paf 515: &expression,
516: "wrong xmlXPathEvalExpression result type (%d)", res->type);
517: break; // never
518: }
519: }
520:
521: static void selectBoolHandler(Pool& pool,
522: const String& expression,
523: xmlXPathObject_auto_ptr res,
524: Value *& result) {
525: switch(res->type) {
526: case XPATH_BOOLEAN:
527: result=new(pool) VBool(pool, res->boolval!=0);
528: break;
529: case XPATH_NODESET:
1.40 paf 530: if(!(res->nodesetval && res->nodesetval->nodeNr))
1.26 paf 531: break;
532: // else[nodeset] fall down to default
533: default:
1.41 paf 534: throw Exception("parser.runtime",
1.26 paf 535: &expression,
536: "wrong xmlXPathEvalExpression result type (%d)", res->type);
537: break; // never
538: }
539: }
1.1 parser 540:
1.26 paf 541: static void selectNumberHandler(Pool& pool,
542: const String& expression,
543: xmlXPathObject_auto_ptr res,
544: Value *& result) {
545: switch(res->type) {
546: case XPATH_NUMBER:
547: result=new(pool) VDouble(pool, res->floatval);
548: break;
549: case XPATH_NODESET:
1.40 paf 550: if(!(res->nodesetval && res->nodesetval->nodeNr))
1.26 paf 551: break;
552: // else[nodeset] fall down to default
553: default:
1.41 paf 554: throw Exception("parser.runtime",
1.26 paf 555: &expression,
556: "wrong xmlXPathEvalExpression result type (%d)", res->type);
557: break; // never
558: }
559: }
560:
561: static void selectStringHandler(Pool& pool,
562: const String& expression,
563: xmlXPathObject_auto_ptr res,
564: Value *& result) {
565: switch(res->type) {
566: case XPATH_UNDEFINED:
567: break;
568: case XPATH_STRING:
569: result=new(pool) VString(
570: pool.transcode(
571: GdomeDOMString_auto_ptr(
1.53 paf 572: gdome_str_mkref_dup((const gchar *)res->stringval)).get(), &expression));
1.26 paf 573: break;
574: case XPATH_NODESET:
1.40 paf 575: if(!(res->nodesetval && res->nodesetval->nodeNr))
1.26 paf 576: break;
577: // else[nodeset] fall down to default
578: default:
1.41 paf 579: throw Exception("parser.runtime",
1.26 paf 580: &expression,
581: "wrong xmlXPathEvalExpression result type (%d)", res->type);
582: break; // never
1.1 parser 583: }
584: }
1.25 paf 585:
1.54.2.2 paf 586: static void _select(Request& r, StringPtr method_name, MethodParams& params) {
1.26 paf 587: _selectX(r, method_name, params,
588: selectNodesHandler);
589: }
590:
1.54.2.2 paf 591: static void _selectSingle(Request& r, StringPtr method_name, MethodParams& params) {
1.26 paf 592: _selectX(r, method_name, params,
593: selectNodeHandler);
594: }
1.1 parser 595:
1.54.2.2 paf 596: static void _selectBool(Request& r, StringPtr method_name, MethodParams& params) {
1.26 paf 597: _selectX(r, method_name, params,
598: selectBoolHandler);
599: }
1.20 paf 600:
1.54.2.2 paf 601: static void _selectNumber(Request& r, StringPtr method_name, MethodParams& params) {
1.26 paf 602: _selectX(r, method_name, params,
603: selectNumberHandler);
604: }
1.24 paf 605:
1.54.2.2 paf 606: static void _selectString(Request& r, StringPtr method_name, MethodParams& params) {
1.26 paf 607: _selectX(r, method_name, params,
608: selectStringHandler);
1.1 parser 609: }
1.20 paf 610:
1.1 parser 611: // constructor
612:
1.54.2.1 paf 613: MXnode::MXnode(Pool& apool, const char* aname, VStateless_class *abase) :
1.45 paf 614: Methoded(apool, aname?aname:"xnode", abase),
615:
1.44 paf 616: consts(apool)
617: {
1.6 parser 618: /// DOM1 node
619:
620: // Node insertBefore(in Node newChild,in Node refChild) raises(DOMException);
621: add_native_method("insertBefore", Method::CT_DYNAMIC, _insertBefore, 2, 2);
622: // Node replaceChild(in Node newChild,in Node oldChild) raises(DOMException);
623: add_native_method("replaceChild", Method::CT_DYNAMIC, _replaceChild, 2, 2);
624: // Node removeChild(in Node oldChild) raises(DOMException);
625: add_native_method("removeChild", Method::CT_DYNAMIC, _removeChild, 1, 1);
626: // Node appendChild(in Node newChild) raises(DOMException);
627: add_native_method("appendChild", Method::CT_DYNAMIC, _appendChild, 1, 1);
628: // boolean hasChildNodes();
629: add_native_method("hasChildNodes", Method::CT_DYNAMIC, _hasChildNodes, 0, 0);
630: // Node cloneNode(in boolean deep);
631: add_native_method("cloneNode", Method::CT_DYNAMIC, _cloneNode, 1, 1);
632:
633: /// DOM1 element
634:
635: // DOMString getAttribute(in DOMString name);
636: add_native_method("getAttribute", Method::CT_DYNAMIC, _getAttribute, 1, 1);
637: // void setAttribute(in DOMString name, in DOMString value) raises(DOMException);
638: add_native_method("setAttribute", Method::CT_DYNAMIC, _setAttribute, 2, 2);
639: // void removeAttribute(in DOMString name) raises(DOMException);
640: add_native_method("removeAttribute", Method::CT_DYNAMIC, _removeAttribute, 1, 1);
641: // Attr getAttributeNode(in DOMString name);
642: add_native_method("getAttributeNode", Method::CT_DYNAMIC, _getAttributeNode, 1, 1);
643: // Attr setAttributeNode(in Attr newAttr) raises(DOMException);
644: add_native_method("setAttributeNode", Method::CT_DYNAMIC, _setAttributeNode, 1, 1);
645: // Attr removeAttributeNode(in Attr oldAttr) raises(DOMException);
646: add_native_method("removeAttributeNode", Method::CT_DYNAMIC, _removeAttributeNode, 1, 1);
647: // NodeList getElementsByTagName(in DOMString name);
648: add_native_method("getElementsByTagName", Method::CT_DYNAMIC, _getElementsByTagName, 1, 1);
1.39 paf 649: // NodeList getElementsByTagNameNS(in DOMString namespaceURI, in DOMString localName);
650: add_native_method("getElementsByTagNameNS", Method::CT_DYNAMIC, _getElementsByTagNameNS, 2, 2);
1.6 parser 651: // void normalize();
652: add_native_method("normalize", Method::CT_DYNAMIC, _normalize, 0, 0);
653:
654: /// parser
1.1 parser 655: // ^node.select[/some/xpath/query] = hash $.#[dnode]
1.25 paf 656: add_native_method("select", Method::CT_DYNAMIC, _select, 1, 1);
1.1 parser 657:
1.26 paf 658: // ^node.selectSingle[/some/xpath/query] = first node [if any]
1.9 parser 659: add_native_method("selectSingle", Method::CT_DYNAMIC, _selectSingle, 1, 1);
1.26 paf 660: // ^node.selectBool[/some/xpath/query] = bool value [if any]
661: add_native_method("selectBool", Method::CT_DYNAMIC, _selectBool, 1, 1);
662: // ^node.selectNumber[/some/xpath/query] = double value [if any]
663: add_native_method("selectNumber", Method::CT_DYNAMIC, _selectNumber, 1, 1);
664: // ^node.selectString[/some/xpath/query] = strinv value [if any]
665: add_native_method("selectString", Method::CT_DYNAMIC, _selectString, 1, 1);
1.20 paf 666:
1.2 parser 667: // consts
668:
1.19 paf 669: #define CONST(name) \
670: consts.put(*new(pool()) String(pool(), #name), new(pool()) VInt(pool(), GDOME_##name))
1.2 parser 671:
1.19 paf 672: CONST(ELEMENT_NODE);
673: CONST(ATTRIBUTE_NODE);
674: CONST(TEXT_NODE);
675: CONST(CDATA_SECTION_NODE);
676: CONST(ENTITY_REFERENCE_NODE);
677: CONST(ENTITY_NODE);
678: CONST(PROCESSING_INSTRUCTION_NODE);
679: CONST(COMMENT_NODE);
680: CONST(DOCUMENT_NODE);
681: CONST(DOCUMENT_TYPE_NODE);
682: CONST(DOCUMENT_FRAGMENT_NODE);
683: CONST(NOTATION_NODE);
1.1 parser 684:
685: }
1.3 parser 686:
1.54.2.5! paf 687: #else
1.1 parser 688:
1.54.2.5! paf 689: // global variable
1.1 parser 690:
1.54.2.5! paf 691: MethodedPtr xnode_class(0); // fictive
1.1 parser 692:
693: #endif
E-mail: