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

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 "JSDOMAttr.hpp"
  23. #include "JSDOMElement.hpp"
  24. #include <xercesc/dom/DOMException.hpp>
  25. // JavaScript class definition
  26. JSClass JSDOMAttr::_jsClass = {
  27.     "Attr", JSCLASS_HAS_PRIVATE,
  28.     JS_PropertyStub, JS_PropertyStub,
  29.     JSDOMAttr::JSGetProperty, JS_PropertyStub,
  30.     JS_EnumerateStub, JS_ResolveStub,
  31.     JS_ConvertStub, JSDOMAttr::JSDestructor,
  32.     0, 0, 0, 0, 
  33.     0, 0, 0, 0
  34. };
  35. // JavaScript Initialization Method
  36. JSObject *JSDOMAttr::JSInit(JSContext *cx, JSObject *obj) {
  37.     if (obj==NULL)
  38.         obj = JS_GetGlobalObject(cx);
  39.     jsval oldobj;
  40.     if (JS_TRUE == JS_LookupProperty(cx, obj, JSDOMAttr::_jsClass.name, &oldobj) && JSVAL_IS_OBJECT(oldobj))
  41.         return JSVAL_TO_OBJECT(oldobj);
  42.     JSObject *newobj = JS_InitClass(cx, obj, NULL, &JSDOMAttr::_jsClass,
  43.                                          NULL, 0,
  44.                                          JSDOMAttr::_JSPropertySpec, NULL,
  45.                                          NULL, NULL);
  46.     if (newobj) {
  47.         InitNodeObject(cx, newobj);
  48.     }
  49.     return newobj;
  50. }
  51. // JavaScript Destructor
  52. void JSDOMAttr::JSDestructor(JSContext *cx, JSObject *obj) {
  53.     JSDOMAttr *p = (JSDOMAttr*)JS_GetPrivate(cx, obj);
  54.     if (p) delete p;
  55. }
  56. // JavaScript Object Linking
  57. JSObject *JSDOMAttr::getJSObject(JSContext *cx) {
  58.     if (!cx) return NULL;
  59.     if (!_JSinternal.o) {
  60.         _JSinternal.o = newJSObject(cx);
  61.         _JSinternal.c = cx;
  62.         if (!JS_SetPrivate(cx, _JSinternal.o, this)) return NULL;
  63.     }
  64.     return _JSinternal.o;
  65. }
  66. JSObject *JSDOMAttr::newJSObject(JSContext *cx) {
  67.     return JS_NewObject(cx, &JSDOMAttr::_jsClass, NULL, NULL);
  68. }
  69. // JavaScript Variable Table
  70. JSPropertySpec JSDOMAttr::_JSPropertySpec[] = {
  71.     { "name", JSDOMAttr::JSVAR_name, JSPROP_ENUMERATE | JSPROP_READONLY, 0, 0},
  72.     { "specified", JSDOMAttr::JSVAR_specified, JSPROP_ENUMERATE | JSPROP_READONLY, 0, 0},
  73.     { "value", JSDOMAttr::JSVAR_value, JSPROP_ENUMERATE | JSPROP_READONLY, 0, 0},
  74.     { "ownerElement", JSDOMAttr::JSVAR_ownerElement, JSPROP_ENUMERATE | JSPROP_READONLY, 0, 0},
  75.     { 0, 0, 0, 0, 0 }
  76. };
  77. // JavaScript Get Property Wrapper
  78. JSBool JSDOMAttr::JSGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
  79.    if (JSVAL_IS_INT(id)) {
  80.       if (JSVAL_TO_INT(id) < JSDOMNode::JSVAR_LASTENUM )
  81.          return JSDOMNode::JSGetProperty(cx, obj, id, vp);
  82.       try
  83.       {
  84.          JSDOMAttr *priv;
  85.          switch(JSVAL_TO_INT(id)) {
  86.          case JSVAR_name:
  87.             priv = (JSDOMAttr*)JS_GetPrivate(cx, obj);
  88.             if (priv==NULL)
  89.                *vp = JSVAL_NULL;
  90.             else
  91.                *vp = __STRING_TO_JSVAL(priv->getName());
  92.             break;
  93.          case JSVAR_specified:
  94.             priv = (JSDOMAttr*)JS_GetPrivate(cx, obj);
  95.             if (priv==NULL)
  96.                *vp = JSVAL_NULL;
  97.             else
  98.                *vp = __bool_TO_JSVal(cx,priv->getSpecified());
  99.             break;
  100.          case JSVAR_value:
  101.             priv = (JSDOMAttr*)JS_GetPrivate(cx, obj);
  102.             if (priv==NULL)
  103.                *vp = JSVAL_NULL;
  104.             else
  105.                *vp = __STRING_TO_JSVAL(priv->getValue());
  106.             break;
  107.          case JSVAR_ownerElement:
  108.             priv = (JSDOMAttr*)JS_GetPrivate(cx, obj);
  109.             if (priv==NULL)
  110.                *vp = JSVAL_NULL;
  111.             else {
  112.                JSDOMElement *e = priv->getOwnerElement();
  113.                *vp = (e ? __objectp_TO_JSVal(cx,e) : JSVAL_NULL);
  114.             }
  115.             break;
  116.          }
  117.       }
  118.       catch(const DOMException &dome) {
  119.          return js_throw_dom_error(cx, obj, dome.code);
  120.       }
  121.       catch( ... ) {
  122.          return js_throw_error(cx, obj, "unknown exception" );
  123.       }
  124.    }
  125.    return JS_TRUE;
  126. }
  127. JSDOMAttr::JSDOMAttr( DOMAttr *attr, JSDOMDocument *doc, JSDOMElement *owner ) 
  128.     : JSDOMNode(attr,doc),_attr(attr), _owner(owner)
  129. {
  130. }
  131. JSString* JSDOMAttr::getName()
  132. {
  133.    if (_attr == NULL) return NULL;
  134.    XMLChToVXIchar name(_attr->getName());
  135.    GET_JSCHAR_FROM_VXICHAR(tmpvalue, tmpvaluelen, name.c_str());
  136.    return JS_NewUCStringCopyZ(_JSinternal.c, tmpvalue);
  137. }
  138. bool JSDOMAttr::getSpecified()
  139. {
  140.    return (_attr ? _attr->getSpecified() : false);
  141. }
  142. JSString* JSDOMAttr::getValue()
  143. {
  144.    if (_attr == NULL) return NULL;
  145.    XMLChToVXIchar value(_attr->getValue());
  146.    GET_JSCHAR_FROM_VXICHAR(tmpvalue, tmpvaluelen, value.c_str());
  147.    return JS_NewUCStringCopyZ(_JSinternal.c, tmpvalue);
  148. }
  149. JSDOMElement* JSDOMAttr::getOwnerElement()
  150. {
  151.    return _owner;
  152. }