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

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 "JSDOMDocument.hpp"
  23. #include "JSDOMNodeList.hpp"
  24. #include "JSDOMElement.hpp"
  25. #include <xercesc/dom/DOMException.hpp>
  26. // JavaScript class definition
  27. JSClass JSDOMDocument::_jsClass = {
  28.    "Document", JSCLASS_HAS_PRIVATE,
  29.    JS_PropertyStub, JS_PropertyStub,
  30.    JSDOMDocument::JSGetProperty, JS_PropertyStub,
  31.    JS_EnumerateStub, JS_ResolveStub,
  32.    JS_ConvertStub, JSDOMDocument::JSDestructor,
  33.    0, 0, 0, 0, 
  34.    0, 0, 0, 0
  35. };
  36. // JavaScript Initialization Method
  37. JSObject *JSDOMDocument::JSInit(JSContext *cx, JSObject *obj) {
  38.    if (obj==NULL)
  39.       obj = JS_GetGlobalObject(cx);
  40.    jsval oldobj;
  41.    if (JS_TRUE == JS_LookupProperty(cx, obj, JSDOMDocument::_jsClass.name, &oldobj) && JSVAL_IS_OBJECT(oldobj))
  42.       return JSVAL_TO_OBJECT(oldobj);
  43.    JSObject *newobj = JS_InitClass(cx, obj, NULL, &JSDOMDocument::_jsClass,
  44.                                    NULL, 0,
  45.                                    JSDOMDocument::_JSPropertySpec, JSDOMDocument::_JSFunctionSpec,
  46.                                    NULL, NULL);
  47.    if (newobj) {
  48.       InitNodeObject(cx, newobj);
  49.    }
  50.    return newobj;
  51. }
  52. // JavaScript Destructor
  53. void JSDOMDocument::JSDestructor(JSContext *cx, JSObject *obj) {
  54.    JSDOMDocument *p = (JSDOMDocument*)JS_GetPrivate(cx, obj);
  55.    if (p) delete p;
  56. }
  57. // JavaScript Object Linking
  58. JSObject *JSDOMDocument::getJSObject(JSContext *cx) {
  59.    if (!cx) return NULL;
  60.    if (!_JSinternal.o) {
  61.       _JSinternal.o = newJSObject(cx);
  62.       _JSinternal.c = cx;
  63.       if (!JS_SetPrivate(cx, _JSinternal.o, this)) return NULL;
  64.    }
  65.    return _JSinternal.o;
  66. }
  67. JSObject *JSDOMDocument::newJSObject(JSContext *cx) {
  68.    return JS_NewObject(cx, &JSDOMDocument::_jsClass, NULL, NULL);
  69. }
  70. // JavaScript Variable Table
  71. JSPropertySpec JSDOMDocument::_JSPropertySpec[] = {
  72.    { "documentElement", JSDOMDocument::JSVAR_documentElement, JSPROP_ENUMERATE | JSPROP_READONLY, 0, 0},
  73.    { 0, 0, 0, 0, 0 }
  74. };
  75. // JavaScript Get Property Wrapper
  76. JSBool JSDOMDocument::JSGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
  77.   if (JSVAL_IS_INT(id)) {
  78.     if (JSVAL_TO_INT(id) < JSDOMNode::JSVAR_LASTENUM )
  79.       return JSDOMNode::JSGetProperty(cx, obj, id, vp );
  80.    try {
  81.       JSDOMDocument *priv;
  82.       switch(JSVAL_TO_INT(id)) {
  83.       case JSVAR_documentElement:
  84.         priv = (JSDOMDocument*)JS_GetPrivate(cx, obj);
  85.         if (priv==NULL)
  86.           *vp = JSVAL_NULL;
  87.         else {
  88.           JSDOMElement *elem = priv->getDocumentElement();
  89.           if (elem == NULL)
  90.             *vp = JSVAL_NULL;
  91.           else
  92.             *vp = __objectp_TO_JSVal(cx,elem);
  93.         }
  94.         break;
  95.       }
  96.     }
  97.     catch(const DOMException &dome) {
  98.       return js_throw_dom_error(cx, obj, dome.code);
  99.     }
  100.     catch( ... ) {
  101.       return js_throw_error(cx, obj, "unknown exception" );
  102.     }
  103.   }
  104.   return JS_TRUE;
  105. }
  106. // JavaScript Function Table
  107. JSFunctionSpec JSDOMDocument::_JSFunctionSpec[] = {
  108.    { "getElementById", JSFUNC_getElementById, 1, 0, 0 },
  109.    { "getElementsByTagName", JSFUNC_getElementsByTagName, 1, 0, 0 },
  110.    { "getElementsByTagNameNS", JSFUNC_getElementsByTagNameNS, 2, 0, 0 },
  111.    { 0, 0, 0, 0, 0 }
  112. };
  113. // JavaScript Function Wrappers
  114. JSBool JSDOMDocument::JSFUNC_getElementById(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
  115.    try {
  116.       JSDOMDocument *p = (JSDOMDocument*)JS_GetPrivate(cx, obj);
  117.       if (argc < 1) return JS_FALSE;
  118.       if (argc == 1) {
  119.          if (JSVAL_IS_STRING(argv[0])) {
  120.             JSDOMElement *e = p->getElementById(JSVAL_TO_STRING(argv[0]));
  121.             *rval = (e ? __objectp_TO_JSVal(cx,e) : JSVAL_NULL);
  122.             return JS_TRUE;
  123.          }
  124.       }
  125.    }
  126.    catch(const DOMException &dome) {
  127.       return js_throw_dom_error(cx, obj, dome.code);
  128.    }
  129.    catch( ... ) {
  130.       return js_throw_error(cx, obj, "unknown exception" );
  131.    }
  132.    return JS_FALSE;
  133. }
  134. JSBool JSDOMDocument::JSFUNC_getElementsByTagName(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
  135.    try {
  136.       JSDOMDocument *p = (JSDOMDocument*)JS_GetPrivate(cx, obj);
  137.       if (argc < 1) return JS_FALSE;
  138.       if (argc == 1) {
  139.          if (JSVAL_IS_STRING(argv[0])) {
  140.             JSDOMNodeList *nl = p->getElementsByTagName(JSVAL_TO_STRING(argv[0]));
  141.             *rval = (nl ? __objectp_TO_JSVal(cx,nl) : JSVAL_NULL);
  142.             return JS_TRUE;
  143.          }
  144.       }
  145.    }
  146.    catch(const DOMException &dome) {
  147.       return js_throw_dom_error(cx, obj, dome.code);
  148.    }
  149.    catch( ... ) {
  150.       return js_throw_error(cx, obj, "unknown exception" );
  151.    }
  152.    return JS_FALSE;
  153. }
  154. JSBool JSDOMDocument::JSFUNC_getElementsByTagNameNS(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
  155.    try {
  156.       JSDOMDocument *p = (JSDOMDocument*)JS_GetPrivate(cx, obj);
  157.       if (argc < 2) return JS_FALSE;
  158.       if (argc == 2) {
  159.          if (JSVAL_IS_STRING(argv[0]) && JSVAL_IS_STRING(argv[1])) {
  160.             JSDOMNodeList *nl = p->getElementsByTagNameNS(
  161.                JSVAL_TO_STRING(argv[0]),
  162.                JSVAL_TO_STRING(argv[1]));
  163.             *rval = (nl ? __objectp_TO_JSVal(cx,nl) : JSVAL_NULL);
  164.             return JS_TRUE;
  165.          }
  166.       }
  167.    }
  168.    catch(const DOMException &dome) {
  169.       return js_throw_dom_error(cx, obj, dome.code);
  170.    }
  171.    catch( ... ) {
  172.       return js_throw_error(cx, obj, "unknown exception" );
  173.    }
  174.    return JS_FALSE;
  175. }
  176. JSDOMDocument::JSDOMDocument(DOMDocument *doc) : JSDOMNode(doc, this), _doc(doc)
  177. {
  178. }
  179. JSDOMElement* JSDOMDocument::getDocumentElement()
  180. {
  181.    if (!_doc)
  182.       return NULL;
  183.    DOMElement *elem = _doc->getDocumentElement();
  184.    return elem ? new JSDOMElement(elem, this) : NULL;
  185. }
  186. JSDOMNodeList* JSDOMDocument::getElementsByTagName(JSString* tagname)
  187. {
  188.    if (!_doc) 
  189.       return new JSDOMNodeList(NULL, this);
  190.    GET_VXICHAR_FROM_JSCHAR(tmpval, JS_GetStringChars(tagname));
  191.    VXIcharToXMLCh tag(tmpval);
  192.    DOMNodeList *list = _doc->getElementsByTagName(tag.c_str());
  193.    return new JSDOMNodeList(list, this);
  194. }
  195. JSDOMNodeList* JSDOMDocument::getElementsByTagNameNS(JSString *namespaceURI, JSString *localName)
  196. {
  197.    if (!_doc) 
  198.       return new JSDOMNodeList(NULL, this);
  199.    GET_VXICHAR_FROM_JSCHAR(nsval, JS_GetStringChars(namespaceURI));
  200.    VXIcharToXMLCh xmlns(nsval);
  201.    GET_VXICHAR_FROM_JSCHAR(nameval, JS_GetStringChars(localName));
  202.    VXIcharToXMLCh xmlname(nameval);
  203.    DOMNodeList *list = _doc->getElementsByTagNameNS(xmlns.c_str(), xmlname.c_str());
  204.    return new JSDOMNodeList(list, this);
  205. }
  206. JSDOMElement* JSDOMDocument::getElementById(JSString *elementId)
  207. {
  208.    if (!_doc) 
  209.       return NULL;
  210.    GET_VXICHAR_FROM_JSCHAR(idval, JS_GetStringChars(elementId));
  211.    VXIcharToXMLCh xmlid(idval);
  212.    DOMElement *elem = _doc->getElementById(xmlid.c_str());
  213.    return elem ? new JSDOMElement(elem) : NULL;
  214. }