33#include <system_threads.h>
37#include <libFreeWRL.h>
40#include "../vrml_parser/Structs.h"
41#include "../main/headers.h"
42#include "../vrml_parser/CParseGeneral.h"
43#include "../main/Snapshot.h"
44#include "../scenegraph/Collision.h"
45#include "../scenegraph/quaternion.h"
46#include "../scenegraph/Viewer.h"
47#include "../input/SensInterps.h"
48#include "../x3d_parser/Bindable.h"
54#include "jsVRMLClasses.h"
63void _get4f(
double *ret,
double *mat,
int row);
64void _set4f(
double len,
double *mat,
int row);
67#define ECMAValueTableSize 300
69struct ECMAValueStruct {
79typedef struct pjsVRMLClasses{
80 struct ECMAValueStruct ECMAValues[ECMAValueTableSize];
83void *jsVRMLClasses_constructor(){
84 void *v = MALLOCV(
sizeof(
struct pjsVRMLClasses));
85 memset(v,0,
sizeof(
struct pjsVRMLClasses));
88void jsVRMLClasses_init(
struct tjsVRMLClasses *t){
91 t->prv = jsVRMLClasses_constructor();
93 ppjsVRMLClasses p = (ppjsVRMLClasses)t->prv;
105JSClass SFColorClass = {
118JSPropertySpec (SFColorProperties)[] = {
119 {
"r", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
120 {
"g", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
121 {
"b", 2, JSPROP_SHARED | JSPROP_ENUMERATE},
127JSFunctionSpec (SFColorFunctions)[] = {
128 {
"getHSV", SFColorGetHSV, 0},
129 {
"setHSV", SFColorSetHSV, 0},
130 {
"toString", SFColorToString, 0},
131 {
"assign", SFColorAssign, 0},
137JSClass SFColorRGBAClass = {
142 SFColorRGBAGetProperty,
143 SFColorRGBASetProperty,
150JSPropertySpec (SFColorRGBAProperties)[] = {
151 {
"r", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
152 {
"g", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
153 {
"b", 2, JSPROP_SHARED | JSPROP_ENUMERATE},
154 {
"a", 3, JSPROP_SHARED | JSPROP_ENUMERATE},
158JSFunctionSpec (SFColorRGBAFunctions)[] = {
159 {
"getHSV", SFColorRGBAGetHSV, 0},
160 {
"setHSV", SFColorRGBASetHSV, 0},
161 {
"toString", SFColorRGBAToString, 0},
162 {
"assign", SFColorRGBAAssign, 0},
168JSClass SFImageClass = {
181JSPropertySpec (SFImageProperties)[] = {
182 {
"x", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
183 {
"y", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
184 {
"comp", 2, JSPROP_SHARED | JSPROP_ENUMERATE},
185 {
"array", 3, JSPROP_SHARED | JSPROP_ENUMERATE},
189JSFunctionSpec (SFImageFunctions)[] = {
190 {
"toString", SFImageToString, 0},
191 {
"assign", SFImageAssign, 0},
197JSClass SFNodeClass = {
210JSPropertySpec (SFNodeProperties)[] = {
225JSFunctionSpec (SFNodeFunctions)[] = {
227 {
"getNodeName", SFNodeGetNodeName, 0},
228 {
"getNodeType", SFNodeGetNodeType, 0},
229 {
"getFieldDefinitions",SFNodeGetFieldDefs, 0},
230 {
"toVRMLString",SFNodeToVRMLString, 0},
231 {
"toXMLString", SFNodeToXMLString, 0},
233 JS_FS(
"equals", SFNodeEquals, 1,0),
234 JS_FS(
"toString", SFNodeToString, 0, 0),
235 JS_FS(
"valueOf", SFNodeValueOf, 0, 0),
236 {
"assign", SFNodeAssign, 0, 0},
242JSClass SFRotationClass = {
247 SFRotationGetProperty,
248 SFRotationSetProperty,
255JSPropertySpec (SFRotationProperties)[] = {
256 {
"x", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
257 {
"y", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
258 {
"z", 2, JSPROP_SHARED | JSPROP_ENUMERATE},
259 {
"angle",3, JSPROP_SHARED | JSPROP_ENUMERATE},
263JSFunctionSpec (SFRotationFunctions)[] = {
264 {
"getAxis", SFRotationGetAxis, 0},
265 {
"inverse", SFRotationInverse, 0},
266 {
"multiply", SFRotationMultiply, 0},
267 {
"multVec", SFRotationMultVec, 0},
268 {
"multiVec", SFRotationMultVec, 0},
269 {
"setAxis", SFRotationSetAxis, 0},
270 {
"slerp", SFRotationSlerp, 0},
271 {
"toString", SFRotationToString, 0},
272 {
"assign", SFRotationAssign, 0},
278JSClass SFVec2fClass = {
291JSPropertySpec (SFVec2fProperties)[] = {
292 {
"x", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
293 {
"y", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
297JSFunctionSpec (SFVec2fFunctions)[] = {
298 {
"add", SFVec2fAdd, 0},
299 {
"divide", SFVec2fDivide, 0},
300 {
"dot", SFVec2fDot, 0},
301 {
"length", SFVec2fLength, 0},
302 {
"multiply", SFVec2fMultiply, 0},
303 {
"normalize", SFVec2fNormalize, 0},
304 {
"subtract", SFVec2fSubtract, 0},
305 {
"toString", SFVec2fToString, 0},
306 {
"assign", SFVec2fAssign, 0},
311JSClass SFVec2dClass = {
324JSPropertySpec (SFVec2dProperties)[] = {
325 {
"x", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
326 {
"y", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
330JSFunctionSpec (SFVec2dFunctions)[] = {
331 {
"add", SFVec2dAdd, 0},
332 {
"divide", SFVec2dDivide, 0},
333 {
"dot", SFVec2dDot, 0},
334 {
"length", SFVec2dLength, 0},
335 {
"multiply", SFVec2dMultiply, 0},
336 {
"normalize", SFVec2dNormalize, 0},
337 {
"subtract", SFVec2dSubtract, 0},
338 {
"toString", SFVec2dToString, 0},
339 {
"assign", SFVec2dAssign, 0},
345JSClass SFVec4fClass = {
358JSPropertySpec (SFVec4fProperties)[] = {
359 {
"x", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
360 {
"y", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
361 {
"z", 2, JSPROP_SHARED | JSPROP_ENUMERATE},
362 {
"w", 3, JSPROP_SHARED | JSPROP_ENUMERATE},
366JSFunctionSpec (SFVec4fFunctions)[] = {
368 {
"toString", SFVec4fToString, 0},
369 {
"assign", SFVec4fAssign, 0},
374JSClass SFVec4dClass = {
387JSPropertySpec (SFVec4dProperties)[] = {
388 {
"x", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
389 {
"y", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
390 {
"z", 2, JSPROP_SHARED | JSPROP_ENUMERATE},
391 {
"w", 3, JSPROP_SHARED | JSPROP_ENUMERATE},
395JSFunctionSpec (SFVec4dFunctions)[] = {
397 {
"toString", SFVec4dToString, 0},
398 {
"assign", SFVec4dAssign, 0},
405JSClass SFVec3fClass = {
427JSPropertySpec (SFVec3fProperties)[] = {
428 {
"x", 0, JSPROP_SHARED | JSPROP_ENUMERATE, NULL, NULL },
429 {
"y", 1, JSPROP_SHARED | JSPROP_ENUMERATE, NULL, NULL },
430 {
"z", 2, JSPROP_SHARED | JSPROP_ENUMERATE, NULL, NULL },
434JSFunctionSpec (SFVec3fFunctions)[] = {
435 {
"add", SFVec3fAdd, 0},
436 {
"cross", SFVec3fCross, 0},
437 {
"divide", SFVec3fDivide, 0},
438 {
"dot", SFVec3fDot, 0},
439 {
"length", SFVec3fLength, 0},
440 {
"multiply", SFVec3fMultiply, 0},
441 {
"negate", SFVec3fNegate, 0},
442 {
"normalize", SFVec3fNormalize, 0},
443 {
"subtract", SFVec3fSubtract, 0},
444 {
"toString", SFVec3fToString, 0},
445 {
"assign", SFVec3fAssign, 0},
450JSClass SFVec3dClass = {
463JSPropertySpec (SFVec3dProperties)[] = {
464 {
"x", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
465 {
"y", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
466 {
"z", 2, JSPROP_SHARED | JSPROP_ENUMERATE},
470JSFunctionSpec (SFVec3dFunctions)[] = {
471 {
"add", SFVec3dAdd, 0},
472 {
"cross", SFVec3dCross, 0},
473 {
"divide", SFVec3dDivide, 0},
474 {
"dot", SFVec3dDot, 0},
475 {
"length", SFVec3dLength, 0},
476 {
"multiply", SFVec3dMultiply, 0},
477 {
"negate", SFVec3dNegate, 0},
478 {
"normalize", SFVec3dNormalize, 0},
479 {
"subtract", SFVec3dSubtract, 0},
480 {
"toString", SFVec3dToString, 0},
481 {
"assign", SFVec3dAssign, 0},
485JSClass MFColorClass = {
498JSFunctionSpec (MFColorFunctions)[] = {
499 {
"toString", MFColorToString, 0},
500 {
"assign", MFColorAssign, 0},
506JSClass MFFloatClass = {
519JSFunctionSpec (MFFloatFunctions)[] = {
520 {
"toString", MFFloatToString, 0},
521 {
"assign", MFFloatAssign, 0},
527JSClass MFInt32Class = {
540JSFunctionSpec (MFInt32Functions)[] = {
541 {
"toString", MFInt32ToString, 0},
542 {
"assign", MFInt32Assign, 0},
547JSClass MFBoolClass = {
560JSFunctionSpec (MFBoolFunctions)[] = {
561 {
"toString", MFBoolToString, 0},
562 {
"assign", MFBoolAssign, 0},
567JSClass MFDoubleClass = {
580JSFunctionSpec (MFDoubleFunctions)[] = {
581 {
"toString", MFDoubleToString, 0},
582 {
"assign", MFDoubleAssign, 0},
588JSClass MFImageClass = {
601JSFunctionSpec (MFImageFunctions)[] = {
602 {
"toString", MFImageToString, 0},
603 {
"assign", MFImageAssign, 0},
608JSClass MFVec2dClass = {
621JSFunctionSpec (MFVec2dFunctions)[] = {
622 {
"toString", MFVec2dToString, 0},
623 {
"assign", MFVec2dAssign, 0},
627JSClass MFVec3dClass = {
640JSFunctionSpec (MFVec3dFunctions)[] = {
641 {
"toString", MFVec3dToString, 0},
642 {
"assign", MFVec3dAssign, 0},
648JSClass MFNodeClass = {
661JSFunctionSpec (MFNodeFunctions)[] = {
662 {
"toString", MFNodeToString, 0},
663 {
"assign", MFNodeAssign, 0},
669JSClass MFRotationClass = {
672 MFRotationAddProperty,
674 MFRotationGetProperty,
675 MFRotationSetProperty,
682JSFunctionSpec (MFRotationFunctions)[] = {
683 {
"toString", MFRotationToString, 0},
684 {
"assign", MFRotationAssign, 0},
691JSClass MFStringClass = {
695 MFStringDeleteProperty,
698 MFStringEnumerateProperty,
699 MFStringResolveProperty,
700 MFStringConvertProperty,
704JSFunctionSpec (MFStringFunctions)[] = {
705 {
"toString", MFStringToString, 0},
706 {
"assign", MFStringAssign, 0},
712JSClass MFTimeClass = {
725JSPropertySpec (MFTimeProperties)[] = {
729JSFunctionSpec (MFTimeFunctions)[] = {
730 {
"toString", MFTimeToString, 0},
731 {
"assign", MFTimeAssign, 0},
737JSClass MFVec2fClass = {
750JSFunctionSpec (MFVec2fFunctions)[] = {
751 {
"toString", MFVec2fToString, 0},
752 {
"assign", MFVec2fAssign, 0},
758JSClass MFVec3fClass = {
771JSFunctionSpec (MFVec3fFunctions)[] = {
772 {
"toString", MFVec3fToString, 0},
773 {
"assign", MFVec3fAssign, 0},
777JSObject *proto_VrmlMatrix;
779JSClass VrmlMatrixClass = {
782 VrmlMatrixAddProperty,
784 VrmlMatrixGetProperty,
785 VrmlMatrixSetProperty,
792JSFunctionSpec (VrmlMatrixFunctions)[] = {
793 {
"setTransform", VrmlMatrixsetTransform, 0},
794 {
"getTransform", VrmlMatrixgetTransform, 0},
795 {
"inverse", VrmlMatrixinverse, 0},
796 {
"transpose", VrmlMatrixtranspose, 0},
797 {
"multLeft", VrmlMatrixmultLeft, 0},
798 {
"multRight", VrmlMatrixmultRight, 0},
799 {
"multVecMatrix", VrmlMatrixmultVecMatrix, 0},
800 {
"multMatrixVec", VrmlMatrixmultMatrixVec, 0},
801 {
"toString", VrmlMatrixToString, 0},
802 {
"assign", VrmlMatrixAssign, 0},
809JSObject *proto_X3DMatrix3;
811JSClass X3DMatrix3Class = {
814 X3DMatrix3AddProperty,
816 X3DMatrix3GetProperty,
817 X3DMatrix3SetProperty,
824JSFunctionSpec (X3DMatrix3Functions)[] = {
825 {
"getTransform", X3DMatrix3getTransform, 0},
826 {
"setTransform", X3DMatrix3setTransform, 0},
827 {
"inverse", X3DMatrix3inverse, 0},
828 {
"transpose", X3DMatrix3transpose, 0},
829 {
"multLeft", X3DMatrix3multLeft, 0},
830 {
"multRight", X3DMatrix3multRight, 0},
831 {
"multVecMatrix", X3DMatrix3multVecMatrix, 0},
832 {
"multMatrixVec", X3DMatrix3multMatrixVec, 0},
833 {
"toString", X3DMatrix3ToString, 0},
834 {
"assign", X3DMatrix3Assign, 0},
839JSObject *proto_X3DMatrix4;
841JSClass X3DMatrix4Class = {
844 X3DMatrix4AddProperty,
846 X3DMatrix4GetProperty,
847 X3DMatrix4SetProperty,
854JSFunctionSpec (X3DMatrix4Functions)[] = {
855 {
"toString", X3DMatrix4ToString, 0},
856 {
"assign", X3DMatrix4Assign, 0},
857 {
"getTransform", X3DMatrix4getTransform, 0},
858 {
"setTransform", X3DMatrix4setTransform, 0},
859 {
"inverse", X3DMatrix4inverse, 0},
860 {
"transpose", X3DMatrix4transpose, 0},
861 {
"multLeft", X3DMatrix4multLeft, 0},
862 {
"multRight", X3DMatrix4multRight, 0},
863 {
"multVecMatrix", X3DMatrix4multVecMatrix, 0},
864 {
"multMatrixVec", X3DMatrix4multMatrixVec, 0},
881struct JSLoadPropElement {
890struct JSLoadPropElement (JSLoadProps) [] = {
892 { &MFVec2dClass, MFVec2dConstr, &MFVec2dFunctions, &MFVec2dProperties,
"MFVec2dClass"},
893 { &MFVec3dClass, MFVec3dConstr, &MFVec3dFunctions, &MFVec3dProperties,
"MFVec3dClass"},
894 { &SFVec2dClass, SFVec2dConstr, &SFVec2dFunctions, &SFVec2dProperties,
"SFVec2dClass"},
895 { &MFBoolClass, MFBoolConstr, &MFBoolFunctions, &MFBoolProperties,
"MFBoolClass"},
896 { &MFDoubleClass, MFDoubleConstr, &MFDoubleFunctions, &MFDoubleProperties,
"MFDoubleClass"},
897 { &MFImageClass, MFImageConstr, &MFImageFunctions, &MFImageProperties,
"MFImageClass"},
898 { &X3DMatrix3Class, X3DMatrix3Constr, &X3DMatrix3Functions, &X3DMatrix3Properties,
"X3DMatrix3Class"},
899 { &X4DMatrix4Class, X4DMatrix4Constr, &X4DMatrix4Functions, &X4DMatrix4Properties,
"X4DMatrix4Class"},
902 { &SFColorClass, SFColorConstr, &SFColorFunctions, &SFColorProperties,
"SFColorClass"},
903 { &SFVec2fClass, SFVec2fConstr, &SFVec2fFunctions, &SFVec2fProperties,
"SFVec2fClass"},
904 { &SFColorRGBAClass, SFColorRGBAConstr, &SFColorRGBAFunctions, &SFColorRGBAProperties,
"SFColorRGBAClass"},
905 { &SFVec3fClass, SFVec3fConstr, &SFVec3fFunctions, &SFVec3fProperties,
"SFVec3fClass"},
906 { &SFVec3dClass, SFVec3dConstr, &SFVec3dFunctions, &SFVec3dProperties,
"SFVec3dClass"},
907 { &SFRotationClass, SFRotationConstr, &SFRotationFunctions, &SFRotationProperties,
"SFRotationClass"},
908 { &SFNodeClass, SFNodeConstr, &SFNodeFunctions, &SFNodeProperties,
"SFNodeClass"},
909 { &MFFloatClass, MFFloatConstr, &MFFloatFunctions, NULL,
"MFFloatClass"},
910 { &MFTimeClass, MFTimeConstr, &MFTimeFunctions, &MFTimeProperties,
"MFTimeClass"},
911 { &MFInt32Class, MFInt32Constr, &MFInt32Functions, NULL,
"MFInt32Class"},
912 { &MFColorClass, MFColorConstr, &MFColorFunctions, NULL,
"MFColorClass"},
913 { &MFVec2fClass, MFVec2fConstr, &MFVec2fFunctions, NULL,
"MFVec2fClass"},
915 { &MFVec3fClass, MFVec3fConstr, &MFVec3fFunctions, NULL,
"MFVec3fClass"},
917 { &SFVec4fClass, SFVec4fConstr, &SFVec4fFunctions, &SFVec4fProperties,
"SFVec4fClass"},
918 { &SFVec4dClass, SFVec4dConstr, &SFVec4dFunctions, &SFVec4dProperties,
"SFVec4dClass"},
920 { &MFRotationClass, MFRotationConstr, &MFRotationFunctions, NULL,
"MFRotationClass"},
921 { &MFNodeClass, MFNodeConstr, &MFNodeFunctions, NULL,
"MFNodeClass"},
922 { &SFImageClass, SFImageConstr, &SFImageFunctions, &SFImageProperties,
"SFImageClass"},
924 { &MFStringClass, MFStringConstr, &MFStringFunctions, NULL,
"MFStringClass"},
925 { &VrmlMatrixClass, VrmlMatrixConstr, &VrmlMatrixFunctions, NULL,
"VrmlMatrixClass"},
932const char *classToString(JSClass *myClass) {
940 while (JSLoadProps[i].
class != NULL) {
941 if (JSLoadProps[i].
class == myClass) {
943 return JSLoadProps[i].id;
947 return "class unknown";
951void printJSNodeType (JSContext *context, JSObject *myobj) {
955 #ifdef JSVRMLCLASSESVERBOSE
956 printf (
"printJSNodeType, obj pointer is %p\n",myobj);
960 while (JSLoadProps[i].
class != NULL) {
961 if (JS_InstanceOf(context, myobj, JSLoadProps[i].
class, NULL)) {
962 printf (
"'%s'\n",JSLoadProps[i].
id);
967 printf (
"'unknown class'\n");
971JSBool _simplecopyElements (JSContext *cx,
982 #ifdef JSVRMLCLASSESVERBOSE
983 printf (
"simpleCopyElements, count %d\n",count);
986 for (i = 0; i < count; i++) {
987 if (!JS_GetElement(cx, fromObj, (jsint) i, &val)) {
988 printf(
"failed in get %d index %d.\n",type, i);
992 if ((type == FIELDTYPE_SFFloat) || (type == FIELDTYPE_SFTime)) {
994 if (JSVAL_IS_INT(val)) {
995 ii = JSVAL_TO_INT(val);
998 if (JS_NewNumberValue(cx,dd,&val) == JS_FALSE) {
999 printf(
"JS_NewNumberValue failed for %f in simplecopyelements.\n",dd);
1013 if (!JS_SetElement(cx, toObj, (jsint) i, &val)) {
1014 printf(
"failed in set %d index %d.\n", type, i);
1023JSBool _standardMFAssign(JSContext *cx,
1031 JSObject *_from_obj;
1038 JSString *_id_jsstr;
1041 if (!JS_InstanceOf(cx, obj, myClass, argv)) {
1042 printf(
"JS_InstanceOf failed for fieldType %s.\n",stringFieldtypeType(type));
1047 if (!JS_ConvertArguments(cx, argc, argv,
"o s", &_from_obj, &_id_str)) {
1049 if (!JS_ConvertArguments(cx, argc, argv,
"oS", &_from_obj, &_id_jsstr)) {
1051 printf(
"JS_ConvertArguments failed in %s.\n",stringFieldtypeType(type));
1056 if (!JS_InstanceOf(cx, _from_obj, myClass, argv)) {
1057 printf(
"JS_InstanceOf failed for fieldType %s.\n",stringFieldtypeType(type));
1060 if (!JS_GetProperty(cx, _from_obj, MF_LENGTH_FIELD, &val)) {
1061 printf(
"JS_GetProperty failed for \"%s\" in %s.\n",MF_LENGTH_FIELD,stringFieldtypeType(type));
1065 if (!JS_SetProperty(cx, obj, MF_LENGTH_FIELD, &val)) {
1066 printf(
"JS_SetProperty failed for \"%s\" in %s\n",MF_LENGTH_FIELD,stringFieldtypeType(type));
1070 len = JSVAL_TO_INT(val);
1072 #ifdef JSVRMLCLASSESVERBOSE
1073#if JS_VERSION >= 185
1074 _id_str = JS_EncodeString(cx,_id_jsstr);
1076 printf(
"StandardMFAssign %s: obj = %p, id = \"%s\", from = %p, len = %d\n",stringFieldtypeType(type),
1077 obj, _id_str, _from_obj, len);
1078#if JS_VERSION >= 185
1079 JS_free(cx,_id_str);
1084 *rval = OBJECT_TO_JSVAL(obj);
1088 if (type == FIELDTYPE_SFImage) {
1089 if ((ptr = (
SFImageNative *)JS_GetPrivateFw(cx, obj)) == NULL) {
1090 printf(
"JS_GetPrivate failed in standard MF assign.\n");
1093 ptr->valueChanged = 1;
1096 return _simplecopyElements(cx, _from_obj, obj, len,type);
1098void X3D_SF_TO_JS_B(JSContext *cx,
void *Data,
unsigned datalen,
int dataType,
int *valueChanged, jsval *newval);
1101_standardMFGetProperty(JSContext *cx,
1109 char *makeNewElement,
1112 int32 _length, _index;
1118#if JS_VERSION >= 185
1121 if (!JS_IdToValue(cx,iid,&
id)) {
1127 #ifdef JSVRMLCLASSESVERBOSE
1128 printf (
"_standardMFGetProperty starting for type %d\n",type);
1129 printJSNodeType (cx,obj);
1132 if(SM_method() == 2){
1136 if ((ptr = (
AnyNative *)JS_GetPrivateFw(cx,obj)) == NULL) {
1137 printf(
"JS_GetPrivate failed in standardMFGetterProperty\n");
1140 sftype = type2SF(ptr->type);
1141 sfsize = sizeofSForMF(sftype);
1143 if (JSVAL_IS_INT(
id)) {
1147 int index = JSVAL_TO_INT(
id);
1148 if(index < 0)
return JS_FALSE;
1151 newlength = index + 1;
1152 mf_n = ptr->v->mfbool.n;
1153 mf_p = (
char *)ptr->v->mfbool.p;
1154 if(newlength > mf_n ) {
1157 mf_p = malloc(sfsize*upper_power_of_two(newlength));
1158 memset(mf_p,0,sfsize*upper_power_of_two(newlength));
1161 mf_p = realloc(mf_p,
sizeof(
int) + sfsize*upper_power_of_two(newlength));
1162 for(k=mf_n;k<newlength;k++)
1163 memset(mf_p + (
size_t)sfsize*k,0,sfsize);
1165 ptr->v->mfbool.n = newlength;
1167 ptr->v->mfbool.p = (
int*)mf_p;
1170 any = (
union anyVrml*)(mf_p + (index * sfsize));
1171 switch(type2SF(ptr->type)){
1172 case FIELDTYPE_SFBool:
1173 case FIELDTYPE_SFFloat:
1174 case FIELDTYPE_SFTime:
1175 case FIELDTYPE_SFDouble:
1176 case FIELDTYPE_SFInt32:
1177 X3D_ECMA_TO_JS(cx, any,sfsize,sftype,vp);
1179 case FIELDTYPE_SFString:
1180 if(any->sfstring == NULL){
1182 memset(any->sfstring,0,
sizeof(
struct Uni_String));
1184 X3D_ECMA_TO_JS(cx, any,sfsize,sftype,vp);
1186 case FIELDTYPE_SFColor:
1187 case FIELDTYPE_SFVec2f:
1188 case FIELDTYPE_SFVec3f:
1189 case FIELDTYPE_SFVec3d:
1190 case FIELDTYPE_SFRotation:
1191 X3D_SF_TO_JS_B(cx, any,sfsize, sftype, ptr->valueChanged, vp);
1193 case FIELDTYPE_SFNode:
1194 X3D_SF_TO_JS_BNode(cx, any,sfsize, sftype, ptr->valueChanged, vp);
1196 default: printf (
"invalid type in standardMFGetProperty method 2\n");
return JS_FALSE;
1199 }
else if(JSVAL_IS_STRING(
id)){
1203 _idStr = JS_ValueToString(cx,
id);
1206 _id_c = JS_GetStringBytes(_idStr);
1208 _id_c = JS_EncodeString(cx,_idStr);
1210 if (strcmp (
"length",_id_c) == 0) {
1217 mf_n = ptr->v->mfbool.n;
1218 retval = INT_TO_JSVAL(mf_n);
1226 if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &_length_val)) {
1227 printf(
"JS_GetProperty failed for \"%s\" in %d.\n",MF_LENGTH_FIELD,type);
1231 _length = JSVAL_TO_INT(_length_val);
1232 #ifdef JSVRMLCLASSESVERBOSE
1233 printf (
"standarg get property, len %d\n",_length);
1236 if (JSVAL_IS_INT(
id)) {
1237 _index = JSVAL_TO_INT(
id);
1238 #ifdef JSVRMLCLASSESVERBOSE
1239 printf (
"standard get property, index requested %d length is %d\n",_index,_length);
1242 if (_index >= _length) {
1243 #ifdef JSVRMLCLASSESVERBOSE
1244 printf (
"\n\nconstructing new object\n");
1250 newElemenLen = (int)strlen(makeNewElement);
1252 if (!JS_EvaluateScript(cx, obj, makeNewElement, newElemenLen,
1253 FNAME_STUB, LINENO_STUB, &newEle)) {
1254 ConsoleMessage (
"standardMFGetProperty: JS_EvaluateScript failed for %s", makeNewElement);
1262 #ifdef JSVRMLCLASSESVERBOSE
1263 printf (
"defining element %d now... is %d %#x\n",_index,(
int)*vp,(
unsigned int)*vp);
1266 if (!JS_DefineElement(cx, obj, (jsint) _index, *vp,
1267 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB8,
1268 JSPROP_ENUMERATE)) {
1269 printf(
"JS_DefineElement failed in %d.\n",type);
1273 if (!doMFSetProperty(cx,obj,
1274 #
if JS_VERSION < 185
1280 printf (
"wow, cant assign property\n");
1283 #ifdef JSVRMLCLASSESVERBOSE
1284 printf (
"object might already have this index\n");
1286 if (!JS_LookupElement(cx, obj, _index, vp)) {
1287 printf(
"JS_LookupElement failed in %d.\n",type);
1290 if (JSVAL_IS_NULL(*vp)) {
1291 printf(
"warning: %d: obj = %p, jsval = %d does not exist!\n",type,
1295 }
else if (JSVAL_IS_STRING(
id)) {
1296 #ifdef JSVRMLCLASSESVERBOSE
1300 printf (
"HAVE STRING HERE!\n");
1301 _str = JS_ValueToString(cx,
id);
1302 #if JS_VERSION < 185
1303 asciiStr = JS_GetStringBytes(_str);
1305 asciiStr = JS_EncodeString(cx,_str);
1307 printf (
"we have as a parameter :%s:\n",asciiStr);
1308 #if JS_VERSION >= 185
1309 JS_free(cx,asciiStr);
1315 #ifdef JSVRMLCLASSESVERBOSE
1316 printf (
"_standardMFGetProperty finishing; element is %u\n",(
unsigned int)*vp);
1345char *mf2str(
int type,
union anyVrml *ptr);
1346char *sf2str(
int sftype,
union anyVrml *any){
1352 case FIELDTYPE_SFBool:
1353 if(any->sfbool) str = strdup(
"true");
1354 else str = strdup(
"false");
1356 case FIELDTYPE_SFInt32:
1357 sprintf(strbuf,
"%d",any->sfint32);
1358 str = strdup(strbuf);
1360 case FIELDTYPE_SFFloat:
1361 sprintf(strbuf,
"%g",any->sffloat);
1362 str = strdup(strbuf);
1364 case FIELDTYPE_SFDouble:
1365 case FIELDTYPE_SFTime:
1366 sprintf(strbuf,
"%g",any->sfdouble);
1367 str = strdup(strbuf);
1369 case FIELDTYPE_SFString:{
1370 str = malloc(strlen(any->sfstring->strptr)+3);
1372 str = strcat(str,any->sfstring->strptr);
1373 str = strcat(str,
"\"");
1376 case FIELDTYPE_SFVec2f:
1378 sprintf(strbuf,
"%f %f",any->sfvec2f.c[0],any->sfvec2f.c[1]);
1379 str = strdup(strbuf);
1382 case FIELDTYPE_SFVec2d:
1384 sprintf(strbuf,
"%g %g",any->sfvec2d.c[0],any->sfvec2d.c[1]);
1385 str = strdup(strbuf);
1388 case FIELDTYPE_SFVec3f:
1389 case FIELDTYPE_SFColor:
1391 sprintf(strbuf,
"%f %f %f",any->sfvec3f.c[0],any->sfvec3f.c[1],any->sfvec3f.c[2]);
1392 str = strdup(strbuf);
1395 case FIELDTYPE_SFVec3d:
1397 sprintf(strbuf,
"%g %g %g",any->sfvec3d.c[0],any->sfvec3d.c[1],any->sfvec3d.c[2]);
1398 str = strdup(strbuf);
1401 case FIELDTYPE_SFColorRGBA:
1402 case FIELDTYPE_SFRotation:
1403 case FIELDTYPE_SFVec4f:
1405 sprintf(strbuf,
"%f %f %f %f",any->sfvec4f.c[0],any->sfvec4f.c[1],any->sfvec4f.c[2],any->sfvec4f.c[3]);
1406 str = strdup(strbuf);
1409 case FIELDTYPE_SFVec4d:
1411 sprintf(strbuf,
"%g %g %g %g",any->sfvec4d.c[0],any->sfvec4d.c[1],any->sfvec4d.c[2],any->sfvec4d.c[3]);
1412 str = strdup(strbuf);
1415 case FIELDTYPE_SFNode:
1416 sprintf(strbuf,
"%zx",any->sfnode);
1417 str = strdup(strbuf);
1419 case FIELDTYPE_SFImage:
1420 str = mf2str(FIELDTYPE_MFInt32,any);
1422 case FIELDTYPE_SFMatrix3f:
1423 case FIELDTYPE_SFMatrix3d:
1424 case FIELDTYPE_SFMatrix4f:
1425 case FIELDTYPE_SFMatrix4d:
1432char *mf2str(
int type,
union anyVrml *ptr){
1433 int len, elen, sftype, i;
1434 char *p, *str = NULL;
1435 static int showType = 0;
1438 if(showType) len += strlen(FIELDTYPES[type]);
1439 str = malloc(len +1);
1441 if(showType) strcat(str,FIELDTYPES[type]);
1442 str = strcat(str,
"[ ");
1444 sftype = type2SF(type);
1445 p = (
char *)ptr->mfbool.p;
1446 elen = sizeofSF(sftype);
1447 for(i=0;i<ptr->mfbool.n;i++)
1449 char * sf = sf2str(sftype,(
union anyVrml*)p);
1450 str = realloc(str,strlen(str)+strlen(sf)+2);
1451 str = strcat(str,sf);
1452 str = strcat(str,
" ");
1456 str[strlen(str)-1] =
']';
1460JSBool doMFToString(JSContext *cx, JSObject *obj,
const char *className, jsval *rval)
1462 if(SM_method() == 2){
1467 if((ptr = (
AnyNative*)JS_GetPrivateFw(cx,obj)) == NULL){
1468 printf(
"in doMFToString - not a Native\n");
1472 str = mf2str(ptr->type,any);
1473 _str = JS_NewStringCopyZ(cx,str);
1474 *rval = STRING_TO_JSVAL(_str);
1478 JSString *_str, *_tmpStr;
1480 char *_buff, *_tmp_valStr, *_tmp_buff;
1481 const char *_empty_array =
"[]";
1483 size_t buff_size = 0, tmp_valStr_len = 0, tmp_buff_len = 0;
1484 JSBool isString = JS_FALSE;
1485 JSBool isImage = JS_FALSE;
1486#if JS_VERSION >= 185
1487 JSBool encodedTmpValstr = JS_FALSE;
1490 if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &_v)) {
1491 printf(
"JS_GetProperty failed for \"%s\" in doMFToString for %s.\n",
1492 MF_LENGTH_FIELD,className);
1495 len = JSVAL_TO_INT(_v);
1497 #ifdef JSVRMLCLASSESVERBOSE
1498 printf (
"doMFToString, obj %p len %d\n",obj, len);
1499 printJSNodeType (cx,obj);
1503 _str = JS_NewStringCopyZ(cx, _empty_array);
1504 *rval = STRING_TO_JSVAL(_str);
1505 #ifdef JSVRMLCLASSESVERBOSE
1506 printf (
"doMFToString, len is zero, returning JS_TRUE, and %d\n",(
int)*rval);
1511 if (!strcmp(className,
"MFString")) {
1514 if (!strcmp(className,
"SFImage")) {
1516 #ifdef JSVRMLCLASSESVERBOSE
1517 printf (
"doMFToString - doing an image\n");
1521 buff_size = LARGESTRING;
1522 _buff = MALLOC(
char *, buff_size *
sizeof(
char));
1523 memset(_buff, 0, buff_size);
1525 for (i = 0; i < len; i++) {
1526 if (!JS_GetElement(cx, obj, i, &_v)) {
1527 printf(
"warning, no element %d of %d in doMFToString for a type of %s.\n",
1529 _tmp_valStr =
"NULL";
1532 #ifdef JSVRMLCLASSESVERBOSE
1533 if (JSVAL_IS_NUMBER(_v)) printf (
"is a number\n");
1534 if (JSVAL_IS_INT(_v)) printf (
"is an integer\n");
1535 if (JSVAL_IS_DOUBLE(_v)) printf (
"is an double\n");
1538 _tmpStr = JS_ValueToString(cx, _v);
1539 if (_tmpStr==NULL) {
1540 _tmp_valStr =
"NULL";
1543 _tmp_valStr = JS_GetStringBytes(_tmpStr);
1545 _tmp_valStr = JS_EncodeString(cx,_tmpStr);
1546 encodedTmpValstr = JS_TRUE;
1551 #ifdef JSVRMLCLASSESVERBOSE
1552 printf (
"doMFToString, element %d is %#x, string %s\n",i,(
unsigned int)_v,_tmp_valStr);
1555 tmp_valStr_len = strlen(_tmp_valStr) + 1;
1556 tmp_buff_len = strlen(_buff);
1558 if ((buff_size - (tmp_buff_len + 1)) < (tmp_valStr_len + 1)) {
1559 buff_size += LARGESTRING;
1562 JS_realloc(cx, _buff, buff_size *
sizeof(
char *)))
1564 printf(
"JS_realloc failed for %d in doMFToString for %s.\n", i, className);
1565#if JS_VERSION >= 185
1566 if (encodedTmpValstr == JS_TRUE) JS_free(cx,_tmp_valStr);
1574 sprintf(_buff,
"[ \"%.*s\" ]", (
int) tmp_valStr_len, _tmp_valStr);
1576 sprintf(_buff,
"[ %.*s ]", (
int) tmp_valStr_len, _tmp_valStr);
1578#if JS_VERSION >= 185
1579 if (encodedTmpValstr == JS_TRUE) {
1580 JS_free(cx,_tmp_valStr);
1581 encodedTmpValstr = JS_FALSE;
1587 _tmp_buff = MALLOC(
char *, (tmp_buff_len + 1) *
sizeof(
char));
1588 memset(_tmp_buff, 0, tmp_buff_len + 1);
1589 memmove(_tmp_buff, _buff, tmp_buff_len);
1590 memset(_buff, 0, buff_size);
1592 if (i == 0 && len > 1) {
1594 sprintf(_buff,
"[ \"%.*s\"",
1595 (
int) tmp_valStr_len, _tmp_valStr);
1597 sprintf(_buff,
"[ %.*s", (
int) tmp_valStr_len, _tmp_valStr);
1599 }
else if (i == (len - 1)) {
1601 sprintf(_buff,
"%.*s, \"%.*s\" ]",
1602 (
int) tmp_buff_len, _tmp_buff, (
int) tmp_valStr_len, _tmp_valStr);
1604 sprintf(_buff,
"%.*s, %.*s ]",
1605 (
int) tmp_buff_len, _tmp_buff, (
int) tmp_valStr_len, _tmp_valStr);
1609 sprintf(_buff,
"%.*s, \"%.*s\"",
1610 (
int) tmp_buff_len, _tmp_buff, (
int) tmp_valStr_len, _tmp_valStr);
1612 sprintf(_buff,
"%.*s, %.*s",
1613 (
int) tmp_buff_len, _tmp_buff, (
int) tmp_valStr_len, _tmp_valStr);
1617 FREE_IF_NZ (_tmp_buff);
1618#if JS_VERSION >= 185
1619 if (encodedTmpValstr == JS_TRUE) {
1620 JS_free(cx,_tmp_valStr);
1621 encodedTmpValstr = JS_FALSE;
1629 for (i=0; i<(int)strlen(_buff); i++) {
1630 if (_buff[i] ==
',') _buff[i]=
' ';
1631 if (_buff[i] ==
']') _buff[i]=
' ';
1632 if (_buff[i] ==
'[') _buff[i]=
' ';
1636 _str = JS_NewStringCopyZ(cx, _buff);
1637 *rval = STRING_TO_JSVAL(_str);
1645doMFAddProperty(JSContext *cx, JSObject *obj, jsval
id, jsval *vp,
char *name) {
1647doMFAddProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp,
char *name) {
1653#if JS_VERSION >= 185
1655 if (!JS_IdToValue(cx,iid,&
id)) {
1656 printf(
"\tdoMFAddProperty:%s JS_IdToValue failed\n",name);
1663 #ifdef JSVRMLCLASSESVERBOSE
1664 printf(
"\tdoMFAddProperty:%s id %d (%d) NodeType: ",name,(
int)
id,ind);
1665 printJSNodeType(cx,obj);
1668 str = JS_ValueToString(cx,
id);
1670 p = JS_GetStringBytes(str);
1672 p = JS_EncodeString(cx,str);
1674 #ifdef JSVRMLCLASSESVERBOSE
1675 printf(
"\tid string %s\n ",p);
1678 if (!strcmp(p, MF_LENGTH_FIELD) ||
1679 !strcmp(p,
"MF_ECMA_has_changed") ||
1680 !strcmp(p,
"_parentField") ||
1681 !strcmp(p,
"toString") ||
1682 !strcmp(p,
"setTransform") ||
1683 !strcmp(p,
"assign") ||
1684 !strcmp(p,
"inverse") ||
1685 !strcmp(p,
"transpose") ||
1686 !strcmp(p,
"multLeft") ||
1687 !strcmp(p,
"multRight") ||
1688 !strcmp(p,
"multVecMatrix") ||
1689 !strcmp(p,
"multMatrixVec") ||
1690 !strcmp(p,
"constructor") ||
1691 !strcmp(p,
"getTransform")) {
1692 #ifdef JSVRMLCLASSESVERBOSE
1693 printf(
"property \"%s\" is one of the standard properties. Do nothing.\n", p);
1695#if JS_VERSION >= 185
1701 #ifdef JSVRMLCLASSESVERBOSE
1702 printf(
"\tdoMFAddProperty:%s id %d NodeType: ",name,(
int)
id);
1703 printJSNodeType(cx,obj);
1704 printf(
"\tdoMFAddProperty:%s id %d string %s ",name,(
int)
id,p);
1706#if JS_VERSION >= 185
1710 if (!JSVAL_IS_INT(
id)){
1711 printf(
"JSVAL_IS_INT failed for id in doMFAddProperty.\n");
1714 if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &v)) {
1715 printf(
"JS_GetProperty failed for \"%s\" in doMFAddProperty.\n",MF_LENGTH_FIELD);
1718 ind = JSVAL_TO_INT(
id);
1720 len = JSVAL_TO_INT(v);
1724 #ifdef JSVRMLCLASSESVERBOSE
1725 printf (
"doMFAddProperty, len %d ind %d\n",len,ind);
1728 v = INT_TO_JSVAL(len);
1729 if (!JS_SetProperty(cx, obj, MF_LENGTH_FIELD, &v)) {
1730 printf(
"JS_SetProperty failed for \"%s\" in doMFAddProperty.\n",MF_LENGTH_FIELD);
1735 #ifdef JSVRMLCLASSESVERBOSE
1736 printf(
"index = %d, length = %d\n", ind, len);
1742void JS_ECMA_TO_X3D(JSContext *cx,
void *Data,
unsigned datalen,
int dataType, jsval *newval);
1743void JS_SF_TO_X3D(JSContext *cx,
void *Data,
unsigned datalen,
int dataType, jsval *newval);
1744void JS_SF_TO_X3D_B(JSContext *cx,
void *Data,
int dataType,
int *valueChanged, jsval *newval);
1748doMFSetProperty(JSContext *cx, JSObject *obj, jsval
id, jsval *vp,
int type) {
1750doMFSetProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp,
int type) {
1765#if JS_VERSION >= 185
1767 if (!JS_IdToValue(cx,iid,&
id)) {
1768 printf(
"doMFSetProperty, JS_IdToValue failed.\n");
1772 if(SM_method() == 2){
1778 if ((ptr = (
AnyNative *)JS_GetPrivateFw(cx,obj)) == NULL) {
1779 printf(
"JS_GetPrivate failed in standardMFGetterProperty\n");
1782 valueChanged = ptr->valueChanged;
1783 sftype = type2SF(ptr->type);
1784 sfsize = sizeofSForMF(sftype);
1786 if (JSVAL_IS_INT(
id)) {
1791 int index = JSVAL_TO_INT(
id);
1792 if(index < 0)
return JS_FALSE;
1794 newlength = index + 1;
1795 mf_n = ptr->v->mfbool.n;
1796 mf_p = (
char *)ptr->v->mfbool.p;
1797 iupper = upper_power_of_two(newlength);
1798 if(newlength > mf_n ) {
1801 mf_p = malloc(sfsize*iupper);
1802 memset(mf_p,0,(
size_t)sfsize*iupper);
1805 mf_p = realloc(mf_p,(
size_t)sfsize*iupper);
1806 memset(mf_p + (
size_t)sfsize*mf_n,0,(
size_t)(iupper - mf_n)*sfsize);
1808 ptr->v->mfbool.n = newlength;
1810 ptr->v->mfbool.p = (
int*)mf_p;
1811 any = (
union anyVrml*)(mf_p + (index * sfsize));
1812 switch(type2SF(ptr->type)){
1813 case FIELDTYPE_SFBool:
1814 case FIELDTYPE_SFFloat:
1815 case FIELDTYPE_SFTime:
1816 case FIELDTYPE_SFDouble:
1817 case FIELDTYPE_SFInt32:
1818 case FIELDTYPE_SFString:
1820 JS_ECMA_TO_X3D(cx, any, sfsize,sftype,vp);
1825 case FIELDTYPE_SFColor:
1826 case FIELDTYPE_SFVec2f:
1827 case FIELDTYPE_SFVec3f:
1828 case FIELDTYPE_SFVec3d:
1829 case FIELDTYPE_SFRotation:
1830 JS_SF_TO_X3D_B(cx, any, sftype, valueChanged, vp);
1833 case FIELDTYPE_SFNode:
1834 JS_SF_TO_X3D_BNode(cx, any, sftype, valueChanged, vp);
1836 default: printf (
"invalid type in standardMFGetProperty method 2\n");
return JS_FALSE;
1839 }
else if(JSVAL_IS_STRING(
id)){
1843 _idStr = JS_ValueToString(cx,
id);
1845 _ id_c = JS_GetStringBytes(_idStr);
1847 _id_c = JS_EncodeString(cx,_idStr);
1849 if (strcmp (
"length",_id_c) == 0) {
1853 if(JSVAL_IS_INT(*vp)){
1856 int newlength = JSVAL_TO_INT(*vp);
1858 mf_n = ptr->v->mfbool.n;
1859 mf_p = (
char *)ptr->v->mfbool.p;
1860 iupper = upper_power_of_two(newlength);
1861 if(newlength > mf_n ) {
1864 mf_p = malloc(sfsize*iupper);
1865 memset(mf_p,0,(
size_t)sfsize*iupper);
1868 mf_p = realloc(mf_p,(
size_t)sfsize*iupper);
1869 memset(mf_p + (
size_t)sfsize*mf_n,0,(
size_t)(iupper - mf_n)*sfsize);
1872 ptr->v->mfbool.n = newlength;
1873 ptr->v->mfbool.p = (
int*)mf_p;
1882 #ifdef JSVRMLCLASSESVERBOSE
1885 printf (
"doMFSetProperty, for object %p, vp %u\n", obj,(
unsigned int)*vp);
1886 _str = JS_ValueToString(cx,
id);
1888 _c = JS_GetStringBytes(_str);
1890 _c = JS_EncodeString(cx,_str);
1892 printf (
"id is %s\n",_c);
1894 _sstr = JS_ValueToString(cx, *vp);
1895 printf (
"looking up value for %d %#x object %p\n",(
int)*vp,(
unsigned int)*vp,obj);
1897 _cc = JS_GetStringBytes(_sstr);
1899 _cc = JS_EncodeString(cx,_sstr);
1901 printf(
"\tdoMFSetProperty:%d: obj = %p, id = %s, vp = %s\n",type,
1903 if (JSVAL_IS_OBJECT(*vp)) { printf (
"doMFSet, vp is an OBJECT\n"); }
1904 if (JSVAL_IS_PRIMITIVE(*vp)) { printf (
"doMFSet, vp is an PRIMITIVE\n"); }
1906 printf (
"parent is a "); printJSNodeType(cx,obj);
1908#if JS_VERSION >= 185
1915 if (type == FIELDTYPE_MFInt32) {
1916 #ifdef JSVRMLCLASSESVERBOSE
1917 printf (
"doMFSetProperty, this should be an int \n");
1920 if (!JSVAL_IS_INT(*vp)) {
1921 #ifdef JSVRMLCLASSESVERBOSE
1922 printf (
"is NOT an int\n");
1925 if (!JS_ValueToInt32(cx, *vp, &i)) {
1926 _sstr = JS_ValueToString(cx, *vp);
1928 _cc = JS_GetStringBytes(_sstr);
1930 _cc = JS_EncodeString(cx,_sstr);
1932 printf (
"can not convert %s to an integer in doMFAddProperty for type %d\n",_cc,type);
1933#if JS_VERSION >= 185
1939 *vp = INT_TO_JSVAL(i);
1941 }
else if ((type == FIELDTYPE_MFFloat) || (type == FIELDTYPE_MFTime)) {
1942 #ifdef JSVRMLCLASSESVERBOSE
1943 printf (
"doMFSetProperty - ensure that this is a DOUBLE ");
1944 _sstr = JS_ValueToString(cx, *vp);
1946 _cc = JS_GetStringBytes(_sstr);
1948 _cc = JS_EncodeString(cx,_sstr);
1950 printf (
"value is %s \n",_cc);
1951#if JS_VERSION >= 185
1956 if (JSVAL_IS_INT(*vp)) {
1957 ii = JSVAL_TO_INT(*vp);
1960 if (JS_NewNumberValue(cx,dd,vp) == JS_FALSE) {
1961 printf(
"JS_NewNumberValue failed for %f in simplecopyelements.\n",dd);
1967 #ifdef JSVRMLCLASSESVERBOSE
1968 printf (
"setting changed flag on %p\n",obj);
1973 case FIELDTYPE_MFInt32:
1974 case FIELDTYPE_MFBool:
1975 case FIELDTYPE_MFTime:
1976 case FIELDTYPE_MFFloat:
1977 case FIELDTYPE_MFString: {
1978 SET_MF_ECMA_HAS_CHANGED
1985 if (JSVAL_IS_INT(
id)) {
1988 #ifdef JSVRMLCLASSESVERBOSE
1989 printf (
"saving element %d\n",JSVAL_TO_INT(
id));
1992 if (!JS_DefineElement(cx, obj, JSVAL_TO_INT(
id), *vp,
1993 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK,
1994 JSPROP_ENUMERATE)) {
1995 printf(
"JS_DefineElement failed in doMFSetProperty.\n");
2000 if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &myv)) {
2001 printf(
"JS_GetProperty failed for \"%s\" in doMFSetProperty.\n", MF_LENGTH_FIELD);
2005 #ifdef JSVRMLCLASSESVERBOSE
2006 printf (
"object %p old length %d, possibly new length is going to be %d\n",obj,JSVAL_TO_INT(myv), JSVAL_TO_INT(
id)+1);
2009 if (JSVAL_TO_INT(myv) < (JSVAL_TO_INT(
id)+1)) {
2010 printf (
"new length is %d\n",JSVAL_TO_INT(
id)+1);
2011 myv = INT_TO_JSVAL(JSVAL_TO_INT(
id)+1);
2012 if (!JS_SetProperty(cx, obj, MF_LENGTH_FIELD, &myv)) {
2013 printf(
"JS_SetProperty failed for \"%s\" in doMFSetProperty.\n", MF_LENGTH_FIELD);
2019 #ifdef JSVRMLCLASSESVERBOSE
2020 printf (
"doMFSetProperty, lets see if we have an SFNode somewhere up the chain...\n");
2030 par = JS_GetParentFw(cx, me);
2031 while (par != NULL) {
2032 #ifdef JSVRMLCLASSESVERBOSE
2033 printf (
"for obj %p: ",me);
2034 printJSNodeType(cx,me);
2035 printf (
"... parent %p\n",par);
2036 printJSNodeType(cx,par);
2039 if (JS_InstanceOf (cx, par, &SFNodeClass, NULL)) {
2040 #ifdef JSVRMLCLASSESVERBOSE
2041 printf (
" the parent IS AN SFNODE - it is %p\n",par);
2045 if (!JS_GetProperty(cx, obj,
"_parentField", &pf)) {
2046 printf (
"doMFSetProperty, can not get parent field from this object\n");
2050 nf = OBJECT_TO_JSVAL(me);
2052 #ifdef JSVRMLCLASSESVERBOSE
2053 #if JS_VERSION < 185
2054 printf (
"parentField is %u \"%s\"\n", (
unsigned int)pf, JS_GetStringBytes(JSVAL_TO_STRING(pf)));
2056 _cc = JS_EncodeString(cx,JSVAL_TO_STRING(pf));
2057 printf (
"parentField is %u \"%s\"\n", (
unsigned int)pf, _cc);
2062 if (!JS_ValueToId(cx,pf,&oid)) {
2063 printf(
"doMFSetProperty: JS_ValueToId failed.\n");
2066 #if JS_VERSION == 186
2068 JSHandleObject hobj;
2070 JSMutableHandleValue hvp;
2074 setSFNodeField(cx,hobj,hiid,JS_FALSE,hvp);
2078 if (!setSFNodeField (cx, par, oid,
2079#
if JS_VERSION >= 185
2083 printf (
"could not set field of SFNode\n");
2089 par = JS_GetParentFw(cx, me);
2097doMFStringUnquote(JSContext *cx, jsval *vp)
2099 JSString *_str, *_vpStr;
2100 char *_buff, *_tmp_vpStr;
2102 unsigned int i, j = 0;
2104 _str = JS_ValueToString(cx, *vp);
2106 _buff = JS_GetStringBytes(_str);
2108 _buff = JS_EncodeString(cx,_str);
2110 _buff_len = strlen(_buff) + 1;
2112 #ifdef JSVRMLCLASSESVERBOSE
2113 printf(
"doMFStringUnquote: vp = \"%s\"\n", _buff);
2116 if (memchr(_buff,
'"', _buff_len) != NULL) {
2117 _tmp_vpStr = MALLOC(
char *, _buff_len *
sizeof(
char));
2119 memset(_tmp_vpStr, 0, _buff_len);
2121 for (i = 0; i <= (_buff_len-1); i++) {
2122 if (_buff[i] !=
'"' ||
2123 (i > 0 && _buff[i - 1] ==
'\\')) {
2124 _tmp_vpStr[j++] = _buff[i];
2127 #ifdef JSVRMLCLASSESVERBOSE
2128 printf (
"new unquoted string %s\n",_tmp_vpStr);
2131 _vpStr = JS_NewStringCopyZ(cx, _tmp_vpStr);
2132 *vp = STRING_TO_JSVAL(_vpStr);
2134 FREE_IF_NZ (_tmp_vpStr);
2136#if JS_VERSION >= 185
2146globalResolve(JSContext *cx, JSObject *obj, jsval
id){
2147#elif JS_VERSION == 185
2148globalResolve(JSContext *cx, JSObject *obj, jsid
id){
2150globalResolve(JSContext *cx, JSHandleObject hobj, JSHandleId hiid){
2151 JSObject *obj = *hobj._;
2162JSBool loadVrmlClasses(JSContext *context, JSObject *globalObj) {
2169 while (JSLoadProps[i].
class != NULL) {
2170 #ifdef JSVRMLCLASSESVERBOSE
2171 printf (
"loading %s\n",JSLoadProps[i].
id);
2175 if (( myProto = JS_InitClass(context, globalObj, NULL, JSLoadProps[i].
class,
2176 JSLoadProps[i].constr, INIT_ARGC, JSLoadProps[i].Properties,
2177 JSLoadProps[i].Functions, NULL, NULL)) == NULL) {
2178 printf(
"JS_InitClass for %s failed in loadVrmlClasses.\n",JSLoadProps[i].
id);
2181 v = OBJECT_TO_JSVAL(myProto);
2182 if (!JS_SetProperty(context, globalObj, JSLoadProps[i].
id, &v)) {
2183 printf(
"JS_SetProperty for %s failed in loadVrmlClasses.\n",JSLoadProps[i].
id);
2193int findNameInECMATable(JSContext *context,
char *toFind) {
2195 ppjsVRMLClasses p = (ppjsVRMLClasses)gglobal()->jsVRMLClasses.prv;
2196 #ifdef JSVRMLCLASSESVERBOSE
2197 printf (
"findNameInECMATable, looking for %s context %p\n",toFind,context);
2201 while (i < p->maxECMAVal) {
2202 #ifdef JSVRMLCLASSESVERBOSE
2203 printf (
" %d: %s==%s cx %p==%p\n",i,p->ECMAValues[i].name,toFind,p->ECMAValues[i].context,context);
2207 if ((p->ECMAValues[i].context == context) && (strcmp(p->ECMAValues[i].name,toFind)==0)) {
2208 #ifdef JSVRMLCLASSESVERBOSE
2209 printf (
"fineInECMATable: found value at %d\n",i);
2211 return p->ECMAValues[i].valueChanged;
2217 #ifdef JSVRMLCLASSESVERBOSE
2218 printf (
"findInECMATable - did not find %s\n",toFind);
2225void resetNameInECMATable(JSContext *context,
char *toFind) {
2227 ppjsVRMLClasses p = (ppjsVRMLClasses)gglobal()->jsVRMLClasses.prv;
2228 #ifdef JSVRMLCLASSESVERBOSE
2229 printf (
"findNameInECMATable, looking for %s\n",toFind);
2233 while (i < p->maxECMAVal) {
2234 #ifdef JSVRMLCLASSESVERBOSE
2235 printf (
" %d: %s==%s cx %p==%p\n",i,p->ECMAValues[i].name,toFind,p->ECMAValues[i].context,context);
2239 if ((p->ECMAValues[i].context == context) && (strcmp(p->ECMAValues[i].name,toFind)==0)) {
2240 #ifdef JSVRMLCLASSESVERBOSE
2241 printf (
"fineInECMATable: found value at %d\n",i);
2243 p->ECMAValues[i].valueChanged = FALSE;
2254void setInECMATable(JSContext *context,
char *toFind) {
2256 ppjsVRMLClasses p = (ppjsVRMLClasses)gglobal()->jsVRMLClasses.prv;
2257 #ifdef JSVRMLCLASSESVERBOSE
2258 printf (
"setInECMATable, looking for %s\n",toFind);
2262 while (i < p->maxECMAVal) {
2263 #ifdef JSVRMLCLASSESVERBOSE
2264 printf (
" %d: %s==%s cx %p==%p\n",i,p->ECMAValues[i].name,toFind,p->ECMAValues[i].context,context);
2268 if ((p->ECMAValues[i].context == context) && (strcmp(p->ECMAValues[i].name,toFind)==0)) {
2269 #ifdef JSVRMLCLASSESVERBOSE
2270 printf (
"setInECMATable: found value at %d\n",i);
2272 p->ECMAValues[i].valueChanged = TRUE;
2279 #ifdef JSVRMLCLASSESVERBOSE
2280 printf (
"setInECMATable - new entry at %d for %s\n",p->maxECMAVal, toFind);
2284 if (p->maxECMAVal == ECMAValueTableSize) {
2285 ConsoleMessage (
"problem in setInECMATable for scripting\n");
2286 p->maxECMAVal = ECMAValueTableSize - 10;
2290 p->ECMAValues[p->maxECMAVal-1].JS_address = (jsval) toFind;
2293 p->ECMAValues[p->maxECMAVal-1].JS_address = INT_TO_JSVAL(0);
2295 p->ECMAValues[p->maxECMAVal-1].valueChanged = TRUE;
2296 p->ECMAValues[p->maxECMAVal-1].name = STRDUP(toFind);
2297 p->ECMAValues[p->maxECMAVal-1].context = context;
2332void X3D_ECMA_TO_JS(JSContext *cx,
void *Data,
int datalen,
int dataType, jsval *newval);
2333void X3D_MF_TO_JS(JSContext *cx, JSObject *obj,
void *Data,
int dataType, jsval *newval,
char *fieldName);
2334void X3D_MF_TO_JS_B(JSContext *cx,
void *Data,
int dataType,
int *valueChanged, jsval *newval);
2335void X3D_SF_TO_JS(JSContext *cx, JSObject *obj,
void *Data,
unsigned datalen,
int dataType, jsval *newval);
2336void X3D_SF_TO_JS_B(JSContext *cx,
void *Data,
unsigned datalen,
int dataType,
int *valueChanged, jsval *newval);
2340getECMANative(JSContext *cx, JSObject *obj, jsval
id, jsval *vp){
2341#elif JS_VERSION == 185
2342getECMANative(JSContext *cx, JSObject *obj, jsid iid, jsval *vp){
2344getECMANative(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
2345 JSObject *obj = *hobj._;
2349 if(SM_method() == 2){
2353 JSString *_idStr, *_vpStr;
2354 char *_id_c, *fieldname, *_vp_c;
2356#if JS_VERSION >= 185
2358 if (!JS_IdToValue(cx,iid,&
id)) {
2359 printf(
"getECMANative: JS_IdToValue failed -- returning JS_TRUE anyways\n");
2363 _idStr = JS_ValueToString(cx,
id);
2366 _id_c = JS_GetStringBytes(_idStr);
2367 _vp_c = JS_GetStringBytes(_vpStr);
2369 _id_c = JS_EncodeString(cx,_idStr);
2396 if(!strncmp(fieldname,
"__eventIn_Value_",strlen(
"__eventIn_Value_")))
2397 fieldname = &fieldname[strlen(
"__eventIn_Value_")];
2400 int type, kind, iifield, ifound, sfsize, sftype;
2405 script = JS_GetPrivateFw(cx,obj);
2407 valueChanged = NULL;
2409 ifound = getFieldFromScript(script,fieldname,&type,&kind,&iifield,&value,&valueChanged);
2411 sftype = type2SF(type);
2412 sfsize = sizeofSForMF(sftype);
2417 case FIELDTYPE_SFBool:
2418 case FIELDTYPE_SFFloat:
2419 case FIELDTYPE_SFTime:
2420 case FIELDTYPE_SFDouble:
2421 case FIELDTYPE_SFInt32:
2422 case FIELDTYPE_SFString:
2423 X3D_ECMA_TO_JS(cx, value,sfsize,type,vp);
2425 case FIELDTYPE_SFColor:
2426 case FIELDTYPE_SFNode:
2427 case FIELDTYPE_SFVec2f:
2428 case FIELDTYPE_SFVec3f:
2429 case FIELDTYPE_SFVec3d:
2430 case FIELDTYPE_SFRotation:
2432 X3D_SF_TO_JS_B(cx, value,sfsize, type, valueChanged, vp);
2434 case FIELDTYPE_MFColor:
2435 case FIELDTYPE_MFVec3f:
2436 case FIELDTYPE_MFVec2f:
2437 case FIELDTYPE_MFFloat:
2438 case FIELDTYPE_MFTime:
2439 case FIELDTYPE_MFInt32:
2440 case FIELDTYPE_MFString:
2441 case FIELDTYPE_MFNode:
2442 case FIELDTYPE_MFRotation:
2443 case FIELDTYPE_SFImage:
2445 X3D_MF_TO_JS_B(cx, value, type, valueChanged, vp);
2447 default: printf (
"unhandled type FIELDTYPE_ %d in getSFNodeField\n", type) ;
2451 printf(
"getECMANative didn't find field %s in script\n",fieldname);
2456#if JS_VERSION >= 185
2468setECMANative(JSContext *cx, JSObject *obj, jsval
id, jsval *vp){
2469#elif JS_VERSION == 185
2470setECMANative(JSContext *cx, JSObject *obj, jsid iid, JSBool strict, jsval *vp){
2472setECMANative(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSBool strict, JSMutableHandleValue hvp){
2473 JSObject *obj = *hobj._;
2478 JSString *_vpStr, *_newVpStr;
2479 JSBool ret = JS_TRUE;
2480 char *_id_c, *fieldname;
2482 char *_vp_c, *_new_vp_c;
2484#if JS_VERSION >= 185
2486 if (!JS_IdToValue(cx,iid,&
id)) {
2487 printf(
"JS_IdToValue failed\n");
2492 _idStr = JS_ValueToString(cx,
id);
2494 _id_c = JS_GetStringBytes(_idStr);
2496 _id_c = JS_EncodeString(cx,_idStr);
2502 if(!strncmp(fieldname,
"__eventIn_Value_",strlen(
"__eventIn_Value_")))
2503 fieldname = &fieldname[strlen(
"__eventIn_Value_")];
2504 if(SM_method() == 2){
2505 int type, kind, iifield, *valueChanged, ifound;
2507 valueChanged = NULL;
2511 script = JS_GetPrivateFw(cx,obj);
2513 ifound = getFieldFromScript(script,fieldname,&type,&kind,&iifield,&value,&valueChanged);
2528 if (JSVAL_IS_NULL(*vp)){
2529 if(type == FIELDTYPE_SFNode)
2530 value->sfnode = NULL;
2533 }
else if (JSVAL_IS_OBJECT(*vp)) {
2535 if ((rhs = (
AnyNative *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(*vp))) == NULL) {
2541 if(type == rhs->type){
2546 shallow_copy_field(rhs->type,rhs->v,value);
2553 int sfsize = sizeofSForMF(type);
2555 switch(type2SF(type)){
2556 case FIELDTYPE_SFBool:
2557 case FIELDTYPE_SFFloat:
2558 case FIELDTYPE_SFTime:
2559 case FIELDTYPE_SFDouble:
2560 case FIELDTYPE_SFInt32:
2561 case FIELDTYPE_SFString:
2563 JS_ECMA_TO_X3D(cx, value, sfsize,type,vp);
2576 printf(
"set didn't find field %s in script\n",fieldname);
2580 setInECMATable(cx, _id_c);
2582 if (JSVAL_IS_STRING(*vp)) {
2583 _vpStr = JS_ValueToString(cx, *vp);
2585 _vp_c = JS_GetStringBytes(_vpStr);
2587 _vp_c = JS_EncodeString(cx,_vpStr);
2590 len = strlen(_vp_c);
2594 _new_vp_c = MALLOC(
char *, (len + 3) *
sizeof(
char));
2600 memset(_new_vp_c, 0, len);
2602 sprintf(_new_vp_c,
"%.*s", (
int) len, _vp_c);
2603 _newVpStr = JS_NewStringCopyZ(cx, _new_vp_c);
2604 *vp = STRING_TO_JSVAL(_newVpStr);
2606 #ifdef JSVRMLCLASSESVERBOSE
2607 printf(
"setECMANative: have string obj = %p, id = \"%s\", vp = %s\n",
2608 obj, _id_c, _new_vp_c);
2610 FREE_IF_NZ (_new_vp_c);
2611#if JS_VERSION >= 185
2615 #ifdef JSVRMLCLASSESVERBOSE
2616 _vpStr = JS_ValueToString(cx, *vp);
2618 _vp_c = JS_GetStringBytes(_vpStr);
2620 _vp_c = JS_EncodeString(cx,_vpStr);
2622 printf(
"setECMANative: obj = %p, id = \"%s\", vp = %s\n",
2624#if JS_VERSION >= 185
2630#if JS_VERSION >= 185
2639getAssignProperty(JSContext *cx, JSObject *obj, jsval
id, jsval *vp){
2640#elif JS_VERSION == 185
2641getAssignProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp){
2643getAssignProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
2644 JSObject *obj = *hobj._;
2650 #ifdef JSVRMLCLASSESVERBOSE
2651 JSString *_idStr, *_vpStr;
2652 char *_id_c, *_vp_c;
2654#if JS_VERSION >= 185
2656 if (!JS_IdToValue(cx,iid,&
id)) {
2657 printf(
"getAssignProperty: JS_IdToValue failed -- returning JS_TRUE anyways\n");
2661 _idStr = JS_ValueToString(cx,
id);
2662 _vpStr = JS_ValueToString(cx, *vp);
2664 _id_c = JS_GetStringBytes(_idStr);
2665 _vp_c = JS_GetStringBytes(_vpStr);
2667 _id_c = JS_EncodeString(cx,_idStr);
2668 _vp_c = JS_EncodeString(cx,_vpStr);
2670 printf(
"getAssignProperty: obj = %p, id = \"%s\", vp = %s\n",
2672 printf (
"what is vp? \n");
2673 if (JSVAL_IS_OBJECT(*vp)) printf (
"is OBJECT\n");
2674 if (JSVAL_IS_STRING(*vp)) printf (
"is STRING\n");
2675 if (JSVAL_IS_INT(*vp)) printf (
"is INT\n");
2676 if (JSVAL_IS_DOUBLE(*vp)) printf (
"is DOUBLE\n");
2678#if JS_VERSION >= 185
2690setAssignProperty(JSContext *cx, JSObject *obj, jsval
id, jsval *vp){
2691#elif JS_VERSION == 185
2692setAssignProperty(JSContext *cx, JSObject *obj, jsid iid, JSBool strict, jsval *vp){
2694setAssignProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSBool strict, JSMutableHandleValue hvp){
2695 JSObject *obj = *hobj._;
2701 const uintN _argc = 2;
2703 jsval newVal, initVal, _argv[2];
2705 jsval newVal, initVal, _argv[_argc];
2708#if JS_VERSION >= 185
2712 if (!JS_IdToValue(cx,iid,&
id)) {
2713 printf(
"setAssignProperty: JS_IdToValue failed.\n");
2718 if (JSVAL_IS_STRING(
id)) {
2719 if (!JS_ConvertValue(cx, *vp, JSTYPE_OBJECT, &newVal)) {
2720 printf(
"JS_ConvertValue failed in setAssignProperty.\n");
2724 _str = JSVAL_TO_STRING(
id);
2726 _id_c = JS_GetStringBytes(_str);
2728 _id_c = JS_EncodeString(cx,_str);
2730 if (!JS_GetProperty(cx, obj, _id_c, &initVal)) {
2731 printf(
"JS_GetProperty failed in setAssignProperty.\n");
2732#if JS_VERSION >= 185
2737 #ifdef JSVRMLCLASSESVERBOSE
2738 printf(
"setAssignProperty: obj = %p, id = \"%s\", from = %d, to = %d\n",
2739 obj, _id_c, (
int)newVal, (
int)initVal);
2741 if (JSVAL_IS_OBJECT(initVal)) printf (
"initVal is an OBJECT\n");
2742 if (JSVAL_IS_STRING(initVal)) printf (
"initVal is an STRING\n");
2743 if (JSVAL_IS_NUMBER(initVal)) printf (
"initVal is an NUMBER\n");
2744 if (JSVAL_IS_DOUBLE(initVal)) printf (
"initVal is an DOUBLE\n");
2745 if (JSVAL_IS_INT(initVal)) printf (
"initVal is an INT\n");
2747 if (JSVAL_IS_OBJECT(newVal)) printf (
"newVal is an OBJECT\n");
2748 if (JSVAL_IS_STRING(newVal)) printf (
"newVal is an STRING\n");
2749 if (JSVAL_IS_NUMBER(newVal)) printf (
"newVal is an NUMBER\n");
2750 if (JSVAL_IS_DOUBLE(newVal)) printf (
"newVal is an DOUBLE\n");
2751 if (JSVAL_IS_INT(newVal)) printf (
"newVal is an INT\n");
2753 if (JSVAL_IS_OBJECT(
id)) printf (
"id is an OBJECT\n");
2754 if (JSVAL_IS_STRING(
id)) printf (
"id is an STRING\n");
2755 if (JSVAL_IS_NUMBER(
id)) printf (
"id is an NUMBER\n");
2756 if (JSVAL_IS_DOUBLE(
id)) printf (
"id is an DOUBLE\n");
2757 if (JSVAL_IS_INT(
id)) printf (
"id is an INT\n");
2760 printf (
"id is %s\n",JS_GetStringBytes(JS_ValueToString(cx,
id)));
2761 printf (
"initVal is %s\n",JS_GetStringBytes(JS_ValueToString(cx,initVal)));
2762 printf (
"newVal is %s\n",JS_GetStringBytes(JS_ValueToString(cx,newVal)));
2764 printf (
"id is %s\n",JS_EncodeString(cx,JS_ValueToString(cx,
id)));
2765 printf (
"initVal is %s\n",JS_EncodeString(cx,JS_ValueToString(cx,initVal)));
2766 printf (
"newVal is %s\n",JS_EncodeString(cx,JS_ValueToString(cx,newVal)));
2769#if JS_VERSION >= 185
2774 _o = JSVAL_TO_OBJECT(initVal);
2776 #ifdef xxJSVRMLCLASSESVERBOSE
2777 printf (
"in setAssignProperty, o is %u type ",_o);
2778 printJSNodeType(cx,_o);
2785 if (!JS_CallFunctionName(cx, _o,
"assign", _argc, _argv, vp)) {
2786 printf(
"JS_CallFunctionName failed in setAssignProperty.\n");
2790 #ifdef JSVRMLCLASSESVERBOSE
2791 _str = JS_ValueToString(cx,
id);
2793 _id_c = JS_GetStringBytes(_str);
2795 _id_c = JS_EncodeString(cx,_str);
2797 printf(
"setAssignProperty: obj = %p, id = \"%s\"\n",
2799#if JS_VERSION >= 185