JSDOMElement.cpp
上传用户:xqtpzdz
上传日期:2022-05-21
资源大小:1764k
文件大小:13k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. /****************License************************************************
  2.  * Vocalocity OpenVXI
  3.  * Copyright (C) 2004-2005 by Vocalocity, Inc. All Rights Reserved.
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *  
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  * Vocalocity, the Vocalocity logo, and VocalOS are trademarks or 
  18.  * registered trademarks of Vocalocity, Inc. 
  19.  * OpenVXI is a trademark of Scansoft, Inc. and used under license 
  20.  * by Vocalocity.
  21.  ***********************************************************************/
  22. #include "JSDOMElement.hpp"
  23. #include <xercesc/dom/DOMException.hpp>
  24. // JavaScript class definition
  25. JSClass JSDOMElement::_jsClass = {
  26. "Element", JSCLASS_HAS_PRIVATE,
  27. JS_PropertyStub, JS_PropertyStub,
  28. JSDOMElement::JSGetProperty, JS_PropertyStub,
  29. JS_EnumerateStub, JS_ResolveStub,
  30. JS_ConvertStub, JSDOMElement::JSDestructor,
  31. 0, 0, 0, 0, 
  32. 0, 0, 0, 0
  33. };
  34. // JavaScript Initialization Method
  35. JSObject *JSDOMElement::JSInit(JSContext *cx, JSObject *obj) {
  36. if (obj==NULL)
  37. obj = JS_GetGlobalObject(cx);
  38. jsval oldobj;
  39. if (JS_TRUE == JS_LookupProperty(cx, obj, JSDOMElement::_jsClass.name, &oldobj) && JSVAL_IS_OBJECT(oldobj))
  40. return JSVAL_TO_OBJECT(oldobj);
  41. JSObject *newobj = JS_InitClass(cx, obj, NULL, &JSDOMElement::_jsClass,
  42.                                       NULL, 0,
  43.                                       JSDOMElement::_JSPropertySpec, JSDOMElement::_JSFunctionSpec,
  44.  NULL, NULL);
  45. if (newobj) {
  46. InitNodeObject(cx, newobj);
  47. }
  48. return newobj;
  49. }
  50. // JavaScript Destructor
  51. void JSDOMElement::JSDestructor(JSContext *cx, JSObject *obj) {
  52. JSDOMElement *p = (JSDOMElement*)JS_GetPrivate(cx, obj);
  53. if (p) delete p;
  54. }
  55. // JavaScript Object Linking
  56. JSObject *JSDOMElement::getJSObject(JSContext *cx) {
  57. if (!cx) return NULL;
  58. if (!_JSinternal.o) {
  59. _JSinternal.o = newJSObject(cx);
  60. _JSinternal.c = cx;
  61. if (!JS_SetPrivate(cx, _JSinternal.o, this)) return NULL;
  62. }
  63. return _JSinternal.o;
  64. }
  65. JSObject *JSDOMElement::newJSObject(JSContext *cx) {
  66. return JS_NewObject(cx, &JSDOMElement::_jsClass, /*JSDOMNode::newJSObject(cx)*/ NULL, NULL);
  67. }
  68. // JavaScript Variable Table
  69. JSPropertySpec JSDOMElement::_JSPropertySpec[] = {
  70. { "tagName", JSDOMElement::JSVAR_tagName, JSPROP_ENUMERATE | JSPROP_READONLY, 0, 0},
  71. { 0, 0, 0, 0, 0 }
  72. };
  73. // JavaScript Get Property Wrapper
  74. JSBool JSDOMElement::JSGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
  75.    try {
  76.       if (JSVAL_IS_INT(id)) {
  77.          if (JSVAL_TO_INT(id) < JSDOMNode::JSVAR_LASTENUM )
  78.             return JSDOMNode::JSGetProperty(cx, obj, id, vp);
  79.          JSDOMElement *priv = (JSDOMElement*)JS_GetPrivate(cx, obj);
  80.          switch(JSVAL_TO_INT(id)) {
  81.          case JSVAR_tagName:
  82.             if (priv==NULL)
  83.                *vp = JSVAL_NULL;
  84.             else
  85.                *vp = __STRING_TO_JSVAL(priv->getTagName());
  86.             break;
  87.          }
  88.       }
  89.    }
  90.    catch(const DOMException &dome) {
  91.       return js_throw_dom_error(cx, obj, dome.code);
  92.    }
  93.    catch( ... ) {
  94.       return js_throw_error(cx, obj, "unknown exception" );
  95.    }
  96.    return JS_TRUE;
  97. }
  98. // JavaScript Function Table
  99. JSFunctionSpec JSDOMElement::_JSFunctionSpec[] = {
  100. { "getAttribute", JSFUNC_getAttribute, 1, 0, 0 },
  101. { "getAttributeNS", JSFUNC_getAttributeNS, 2, 0, 0 },
  102. { "getAttributeNode", JSFUNC_getAttributeNode, 1, 0, 0 },
  103. { "getAttributeNodeNS", JSFUNC_getAttributeNodeNS, 2, 0, 0 },
  104. { "getElementsByTagName", JSFUNC_getElementsByTagName, 1, 0, 0 },
  105. { "getElementsByTagNameNS", JSFUNC_getElementsByTagNameNS, 2, 0, 0 },
  106. { "hasAttribute", JSFUNC_hasAttribute, 1, 0, 0 },
  107. { "hasAttributeNS", JSFUNC_hasAttributeNS, 2, 0, 0 },
  108. { 0, 0, 0, 0, 0 }
  109. };
  110. // JavaScript Function Wrappers
  111. JSBool JSDOMElement::JSFUNC_getAttribute(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
  112.    try {
  113.       JSDOMElement *p = (JSDOMElement*)JS_GetPrivate(cx, obj);
  114.       if (argc < 1) return JS_FALSE;
  115.       if (argc == 1) {
  116.          if (JSVAL_IS_STRING(argv[0])) {
  117.             *rval = __STRING_TO_JSVAL(p->getAttribute(JSVAL_TO_STRING(argv[0])));
  118.             return JS_TRUE;
  119.          }
  120.       }
  121.    }
  122.    catch(const DOMException &dome) {
  123.       return js_throw_dom_error(cx, obj, dome.code);
  124.    }
  125.    catch( ... ) {
  126.       return js_throw_error(cx, obj, "unknown exception" );
  127.    }
  128.    return JS_FALSE;
  129. }
  130. JSBool JSDOMElement::JSFUNC_getAttributeNS(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
  131.    try {
  132.       JSDOMElement *p = (JSDOMElement*)JS_GetPrivate(cx, obj);
  133.       if (argc < 2) return JS_FALSE;
  134.       if (argc == 2) {
  135.          if (JSVAL_IS_STRING(argv[0]) && JSVAL_IS_STRING(argv[1])) {
  136.             *rval = __STRING_TO_JSVAL(p->getAttributeNS(
  137.             JSVAL_TO_STRING(argv[0]),
  138.             JSVAL_TO_STRING(argv[1])
  139.             ));
  140.             return JS_TRUE;
  141.          }
  142.       }
  143.    }
  144.    catch(const DOMException &dome) {
  145.       return js_throw_dom_error(cx, obj, dome.code);
  146.    }
  147.    catch( ... ) {
  148.       return js_throw_error(cx, obj, "unknown exception" );
  149.    }
  150.    return JS_FALSE;
  151. }
  152. JSBool JSDOMElement::JSFUNC_getAttributeNode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
  153.    try {
  154.       JSDOMElement *p = (JSDOMElement*)JS_GetPrivate(cx, obj);
  155.       if (argc < 1) return JS_FALSE;
  156.       if (argc == 1) {
  157.          if (JSVAL_IS_STRING(argv[0])) {
  158.             JSDOMAttr *attr = p->getAttributeNode(JSVAL_TO_STRING(argv[0]));
  159.             *rval = (attr ? __objectp_TO_JSVal(cx,attr) : JSVAL_NULL);
  160.             return JS_TRUE;
  161.          }
  162.       }
  163.    }
  164.    catch(const DOMException &dome) {
  165.       return js_throw_dom_error(cx, obj, dome.code);
  166.    }
  167.    catch( ... ) {
  168.       return js_throw_error(cx, obj, "unknown exception" );
  169.    }
  170.    return JS_FALSE;
  171. }
  172. JSBool JSDOMElement::JSFUNC_getAttributeNodeNS(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
  173.    try {
  174.       JSDOMElement *p = (JSDOMElement*)JS_GetPrivate(cx, obj);
  175.       if (argc < 2) return JS_FALSE;
  176.       if (argc == 2) {
  177.          if (JSVAL_IS_STRING(argv[0]) && JSVAL_IS_STRING(argv[1])) {
  178.             JSDOMAttr *attr = p->getAttributeNodeNS(
  179.                JSVAL_TO_STRING(argv[0]),
  180.                JSVAL_TO_STRING(argv[1]));
  181.             *rval = (attr ? __objectp_TO_JSVal(cx,attr) : JSVAL_NULL);
  182.             return JS_TRUE;
  183.          }
  184.       }
  185.    }
  186.    catch(const DOMException &dome) {
  187.       return js_throw_dom_error(cx, obj, dome.code);
  188.    }
  189.    catch( ... ) {
  190.       return js_throw_error(cx, obj, "unknown exception" );
  191.    }
  192.    return JS_FALSE;
  193. }
  194. JSBool JSDOMElement::JSFUNC_getElementsByTagName(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
  195.    try {
  196.       JSDOMElement *p = (JSDOMElement*)JS_GetPrivate(cx, obj);
  197.       if (argc < 1) return JS_FALSE;
  198.       if (argc == 1) {
  199.          if (JSVAL_IS_STRING(argv[0])) {
  200.             JSDOMNodeList *nl = p->getElementsByTagName(JSVAL_TO_STRING(argv[0]));
  201.             *rval = (nl ? __objectp_TO_JSVal(cx,nl) : JSVAL_NULL);
  202.             return JS_TRUE;
  203.          }
  204.       }
  205.    }
  206.    catch(const DOMException &dome) {
  207.       return js_throw_dom_error(cx, obj, dome.code);
  208.    }
  209.    catch( ... ) {
  210.       return js_throw_error(cx, obj, "unknown exception" );
  211.    }
  212.    return JS_FALSE;
  213. }
  214. JSBool JSDOMElement::JSFUNC_getElementsByTagNameNS(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
  215.    try {
  216.    JSDOMElement *p = (JSDOMElement*)JS_GetPrivate(cx, obj);
  217.       if (argc < 2) return JS_FALSE;
  218.       if (argc == 2) {
  219.          if (JSVAL_IS_STRING(argv[0]) && JSVAL_IS_STRING(argv[1])) {
  220.             JSDOMNodeList *nl = p->getElementsByTagNameNS(
  221.                JSVAL_TO_STRING(argv[0]),
  222.                JSVAL_TO_STRING(argv[1]));
  223.             *rval = (nl ? __objectp_TO_JSVal(cx,nl) : JSVAL_NULL);
  224.             return JS_TRUE;
  225.          }
  226.       }
  227.    }
  228.    catch(const DOMException &dome) {
  229.       return js_throw_dom_error(cx, obj, dome.code);
  230.    }
  231.    catch( ... ) {
  232.       return js_throw_error(cx, obj, "unknown exception" );
  233.    }
  234.    return JS_FALSE;
  235. }
  236. JSBool JSDOMElement::JSFUNC_hasAttribute(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
  237.    try {
  238.       JSDOMElement *p = (JSDOMElement*)JS_GetPrivate(cx, obj);
  239.       if (argc < 1) return JS_FALSE;
  240.       if (argc == 1) {
  241.          if (JSVAL_IS_STRING(argv[0])) {
  242.             *rval = __bool_TO_JSVal(cx,p->hasAttribute(JSVAL_TO_STRING(argv[0])));
  243.             return JS_TRUE;
  244.          }
  245.       }
  246.    }
  247.    catch(const DOMException &dome) {
  248.       return js_throw_dom_error(cx, obj, dome.code);
  249.    }
  250.    catch( ... ) {
  251.       return js_throw_error(cx, obj, "unknown exception" );
  252.    }
  253.    return JS_FALSE;
  254. }
  255. JSBool JSDOMElement::JSFUNC_hasAttributeNS(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
  256.    try {
  257.       JSDOMElement *p = (JSDOMElement*)JS_GetPrivate(cx, obj);
  258.       if (argc < 2) return JS_FALSE;
  259.       if (argc == 2) {
  260.          if (JSVAL_IS_STRING(argv[0]) && JSVAL_IS_STRING(argv[1])) {
  261.             *rval = __bool_TO_JSVal(cx,p->hasAttributeNS(
  262.                JSVAL_TO_STRING(argv[0]),
  263.                JSVAL_TO_STRING(argv[1]) ));
  264.             return JS_TRUE;
  265.          }
  266.       }
  267.    }
  268.    catch(const DOMException &dome) {
  269.       return js_throw_dom_error(cx, obj, dome.code);
  270.    }
  271.    catch( ... ) {
  272.       return js_throw_error(cx, obj, "unknown exception" );
  273.    }
  274.    return JS_FALSE;
  275. }
  276. JSDOMElement::JSDOMElement( DOMElement *elem, JSDOMDocument *doc ) : JSDOMNode( elem, doc )
  277. {
  278. _elem = elem;
  279. JSString* JSDOMElement::getTagName()
  280. {
  281. if (!_elem) return NULL;
  282. XMLChToVXIchar name(_elem->getTagName());
  283. GET_JSCHAR_FROM_VXICHAR(tmpvalue, tmpvaluelen, name.c_str());
  284. return JS_NewUCStringCopyZ(_JSinternal.c, tmpvalue);
  285. }
  286. JSString* JSDOMElement::getAttribute(JSString* name)
  287. {
  288. if (!_elem) return NULL;
  289. GET_VXICHAR_FROM_JSCHAR(nameval, JS_GetStringChars(name));
  290. VXIcharToXMLCh xmlname(nameval);
  291. XMLChToVXIchar result(_elem->getAttribute(xmlname.c_str()));
  292. GET_JSCHAR_FROM_VXICHAR(tmpvalue, tmpvaluelen, result.c_str());
  293. return JS_NewUCStringCopyZ(_JSinternal.c, tmpvalue);
  294. }
  295. JSDOMAttr* JSDOMElement::getAttributeNode(JSString* name)
  296. {
  297. if (!_elem) return NULL;
  298. GET_VXICHAR_FROM_JSCHAR(nameval, JS_GetStringChars(name));
  299. VXIcharToXMLCh xmlname(nameval);
  300. DOMAttr *attr = _elem->getAttributeNode(xmlname.c_str());
  301. return attr ? new JSDOMAttr(attr, getOwnerDocument(), this) : NULL;
  302. }
  303. JSDOMNodeList* JSDOMElement::getElementsByTagName(JSString* name)
  304. {
  305. if (!_elem) return NULL;
  306. GET_VXICHAR_FROM_JSCHAR(nameval, JS_GetStringChars(name));
  307. VXIcharToXMLCh xmlname(nameval);
  308. DOMNodeList *nl = _elem->getElementsByTagName(xmlname.c_str());
  309. return new JSDOMNodeList(nl, getOwnerDocument());
  310. }
  311. JSString* JSDOMElement::getAttributeNS(JSString* namespaceURI, JSString* localName)
  312. {
  313. if (!_elem) return NULL;
  314. GET_VXICHAR_FROM_JSCHAR(nsval, JS_GetStringChars(namespaceURI));
  315. VXIcharToXMLCh xmlns(nsval);
  316. GET_VXICHAR_FROM_JSCHAR(nameval, JS_GetStringChars(localName));
  317. VXIcharToXMLCh xmlname(nameval);
  318. XMLChToVXIchar result(_elem->getAttributeNS(xmlns.c_str(), xmlname.c_str()));
  319. GET_JSCHAR_FROM_VXICHAR(tmpvalue, tmpvaluelen, result.c_str());
  320. return JS_NewUCStringCopyZ(_JSinternal.c, tmpvalue);
  321. }
  322. JSDOMAttr* JSDOMElement::getAttributeNodeNS(JSString* namespaceURI, JSString* localName)
  323. {
  324. if (!_elem) return NULL;
  325. GET_VXICHAR_FROM_JSCHAR(nsval, JS_GetStringChars(namespaceURI));
  326. VXIcharToXMLCh xmlns(nsval);
  327. GET_VXICHAR_FROM_JSCHAR(nameval, JS_GetStringChars(localName));
  328. VXIcharToXMLCh xmlname(nameval);
  329. DOMAttr *attr = _elem->getAttributeNodeNS(xmlns.c_str(), xmlname.c_str());
  330. return attr ? new JSDOMAttr(attr, getOwnerDocument(), this) : NULL;
  331. }
  332. JSDOMNodeList* JSDOMElement::getElementsByTagNameNS(JSString* namespaceURI, JSString* localName)
  333. {
  334. if (!_elem) return NULL;
  335. GET_VXICHAR_FROM_JSCHAR(nsval, JS_GetStringChars(namespaceURI));
  336. VXIcharToXMLCh xmlns(nsval);
  337. GET_VXICHAR_FROM_JSCHAR(nameval, JS_GetStringChars(localName));
  338. VXIcharToXMLCh xmlname(nameval);
  339. DOMNodeList *nl = _elem->getElementsByTagNameNS(xmlns.c_str(), xmlname.c_str());
  340. return new JSDOMNodeList(nl, getOwnerDocument());
  341. }
  342. bool JSDOMElement::hasAttribute(JSString* name)
  343. {
  344. if (!_elem) return false;
  345. GET_VXICHAR_FROM_JSCHAR(nameval, JS_GetStringChars(name));
  346. VXIcharToXMLCh xmlname(nameval);
  347. return _elem->hasAttribute(xmlname.c_str());
  348. }
  349. bool JSDOMElement::hasAttributeNS(JSString* namespaceURI, JSString* localName)
  350. {
  351. if (!_elem) return false;;
  352. GET_VXICHAR_FROM_JSCHAR(nsval, JS_GetStringChars(namespaceURI));
  353. VXIcharToXMLCh xmlns(nsval);
  354. GET_VXICHAR_FROM_JSCHAR(nameval, JS_GetStringChars(localName));
  355. VXIcharToXMLCh xmlname(nameval);
  356. return _elem->hasAttributeNS(xmlns.c_str(), xmlname.c_str());
  357. }