JSDOMCharacterData.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 "JSDOMCharacterData.hpp"
  23. #include <xercesc/dom/DOMException.hpp>
  24. // JavaScript class definition
  25. JSClass JSDOMCharacterData::_jsClass = {
  26.   "CharacterData", JSCLASS_HAS_PRIVATE,
  27.   JS_PropertyStub, JS_PropertyStub,
  28.   JSDOMCharacterData::JSGetProperty, JS_PropertyStub,
  29.   JS_EnumerateStub, JS_ResolveStub,
  30.   JS_ConvertStub, JSDOMCharacterData::JSDestructor,
  31.   0, 0, 0, 0, 
  32.   0, 0, 0, 0
  33. };
  34. // JavaScript Initialization Method
  35. JSObject *JSDOMCharacterData::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, JSDOMCharacterData::_jsClass.name, &oldobj) && JSVAL_IS_OBJECT(oldobj))
  40.     return JSVAL_TO_OBJECT(oldobj);
  41.   JSObject *newobj = JS_InitClass(cx, obj, NULL, &JSDOMCharacterData::_jsClass,
  42.                                   NULL, 0,
  43.                                   JSDOMCharacterData::_JSPropertySpec, JSDOMCharacterData::_JSFunctionSpec,
  44.                                   NULL, NULL);
  45.   if (newobj) {
  46.     InitNodeObject(cx, newobj);
  47.   }
  48.   return newobj;
  49. }
  50. bool JSDOMCharacterData::InitCharacterDataObject(JSContext *cx, JSObject *obj)
  51. {
  52.   JS_DefineProperties( cx, obj, JSDOMCharacterData::_JSPropertySpec );
  53.   JS_DefineFunctions( cx, obj, JSDOMCharacterData::_JSFunctionSpec );
  54.   return InitNodeObject(cx, obj);
  55. }
  56. // JavaScript Destructor
  57. void JSDOMCharacterData::JSDestructor(JSContext *cx, JSObject *obj) {
  58.   JSDOMCharacterData *p = (JSDOMCharacterData*)JS_GetPrivate(cx, obj);
  59.   if (p) delete p;
  60. }
  61. // JavaScript Object Linking
  62. JSObject *JSDOMCharacterData::getJSObject(JSContext *cx) {
  63.   if (!cx) return NULL;
  64.   if (!_JSinternal.o) {
  65.     _JSinternal.o = newJSObject(cx);
  66.     _JSinternal.c = cx;
  67.     if (!JS_SetPrivate(cx, _JSinternal.o, this)) return NULL;
  68.   }
  69.   return _JSinternal.o;
  70. }
  71. JSObject *JSDOMCharacterData::newJSObject(JSContext *cx) {
  72.   return JS_NewObject(cx, &JSDOMCharacterData::_jsClass, NULL, NULL);
  73. }
  74. // JavaScript Variable Table
  75. JSPropertySpec JSDOMCharacterData::_JSPropertySpec[] = {
  76.     { "data", JSDOMCharacterData::JSVAR_data, JSPROP_ENUMERATE | JSPROP_READONLY, 0, 0},
  77.     { "length", JSDOMCharacterData::JSVAR_length, JSPROP_ENUMERATE | JSPROP_READONLY, 0, 0},
  78.     { 0, 0, 0, 0, 0 }
  79. };
  80. // JavaScript Get Property Wrapper
  81. JSBool JSDOMCharacterData::JSGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
  82.   if (JSVAL_IS_INT(id)) {
  83.     if (JSVAL_TO_INT(id) < JSDOMNode::JSVAR_LASTENUM )
  84.       return JSDOMNode::JSGetProperty(cx, obj, id, vp);
  85.     try {
  86.       JSDOMCharacterData *priv;
  87.       switch(JSVAL_TO_INT(id)) {
  88.       case JSVAR_data:
  89.         priv = (JSDOMCharacterData*)JS_GetPrivate(cx, obj);
  90.         if (priv==NULL)
  91.           *vp = JSVAL_NULL;
  92.         else
  93.           *vp = __STRING_TO_JSVAL(priv->getData());
  94.         break;
  95.       case JSVAR_length:
  96.         priv = (JSDOMCharacterData*)JS_GetPrivate(cx, obj);
  97.         if (priv==NULL)
  98.           *vp = JSVAL_NULL;
  99.         else
  100.           *vp = __int_TO_JSVal(cx,priv->getLength());
  101.         break;
  102.       }
  103.     }
  104.     catch(const DOMException &dome) {
  105.       return js_throw_dom_error(cx, obj, dome.code);
  106.     }
  107.     catch( ... ) {
  108.       return js_throw_error(cx, obj, "unknown exception" );
  109.     }
  110.   }
  111.   return JS_TRUE;
  112. }
  113. // JavaScript Function Table
  114. JSFunctionSpec JSDOMCharacterData::_JSFunctionSpec[] = {
  115.     { "substringData", JSFUNC_substringData, 2, 0, 0 },
  116.     { 0, 0, 0, 0, 0 }
  117. };
  118. // JavaScript Function Wrappers
  119. JSBool JSDOMCharacterData::JSFUNC_substringData(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
  120.   JSDOMCharacterData *p = (JSDOMCharacterData*)JS_GetPrivate(cx, obj);
  121.   if (argc < 2) return JS_FALSE;
  122.   if (argc == 2) {
  123.     try {
  124.       if (JSVAL_IS_NUMBER(argv[0]) && JSVAL_IS_NUMBER(argv[1])) {
  125.         *rval = __STRING_TO_JSVAL(p->substringData(
  126.         __JSVal_TO_int(argv[0]),
  127.         __JSVal_TO_int(argv[1])));
  128.       }
  129.     }
  130.     catch(const DOMException &dome) {
  131.       return js_throw_dom_error(cx, obj, dome.code);
  132.     }
  133.     catch( ... ) {
  134.       return js_throw_error(cx, obj, "unknown exception" );
  135.     }
  136.     return JS_TRUE;
  137.   }
  138.   return JS_FALSE;
  139. }
  140. JSDOMCharacterData::JSDOMCharacterData( DOMCharacterData *chardata, JSDOMDocument *doc ) : JSDOMNode(chardata,doc), _chardata(chardata)
  141. {
  142. }
  143. JSString* JSDOMCharacterData::getData()
  144. {
  145.   if (!_chardata)
  146.     return NULL;
  147.   XMLChToVXIchar data(_chardata->getData());
  148.   GET_JSCHAR_FROM_VXICHAR(tmpvalue, tmpvaluelen, data.c_str());
  149.   return JS_NewUCStringCopyZ(_JSinternal.c, tmpvalue);
  150. }
  151. int JSDOMCharacterData::getLength()
  152. {
  153.   return ( _chardata ? _chardata->getLength() : 0 );
  154. }
  155. JSString* JSDOMCharacterData::substringData(int offset, int count)
  156. {
  157.   if (!_chardata)
  158.     return NULL;
  159.   XMLChToVXIchar data(_chardata->substringData(offset, count));
  160.   GET_JSCHAR_FROM_VXICHAR(tmpvalue, tmpvaluelen, data.c_str());
  161.   return JS_NewUCStringCopyZ(_JSinternal.c, tmpvalue);
  162. }