37int JS_SetPrivateFw(JSContext *cx, JSObject* obj,
void *data);
38JSObject* JS_NewGlobalObjectFw(JSContext *cx, JSClass *clasp);
39void * JS_GetPrivateFw(JSContext *cx,JSObject*_obj);
40JSObject* JS_GetParentFw(JSContext *cx, JSObject *me);
41JSObject * JS_ConstructObjectWithArgumentsFw(JSContext *cx, JSClass *clasp, JSObject *parent,
unsigned argc, jsval *argv);
42JSObject * JS_ConstructObjectFw(JSContext *cx, JSClass *clasp,
void *whatever, JSObject *parent);
43JSObject * JS_GetPrototypeFw(JSContext *cx, JSObject * obj);
44JSClass * JS_GetClassFw(JSContext *cx, JSObject * obj);
45#define STRING_SIZE 256
49#define jsuint uint32_t
51#define jsdouble double
53#define JS_FinalizeStub NULL
54#define JSSCRIPT2 JSScript
55#define JS_GET_CLASS JS_GetClassFw
56JSBool JS_NewNumberValue(JSContext *cx, jsdouble d, jsval *rval);
69#include <system_threads.h>
73#include <libFreeWRL.h>
92#include "jsUtils_sm.h"
93#include "jsVRMLClasses_sm.h"
100void _get4f(
double *ret,
double *mat,
int row);
101void _set4f(
double len,
double *mat,
int row);
104#define ECMAValueTableSize 300
106struct ECMAValueStruct {
117typedef struct pjsVRMLClasses{
118 struct ECMAValueStruct ECMAValues[ECMAValueTableSize];
121void *jsVRMLClasses_constructor(){
122 void *v = MALLOCV(
sizeof(
struct pjsVRMLClasses));
123 memset(v,0,
sizeof(
struct pjsVRMLClasses));
126void jsVRMLClasses_init(
struct iiglobal::tjsVRMLClasses *t){
129 t->prv = jsVRMLClasses_constructor();
131 ppjsVRMLClasses p = (ppjsVRMLClasses)t->prv;
143JSClass SFColorClass = {
147 JS_DeletePropertyStub,
156JSPropertySpec (SFColorProperties)[] = {
157 {
"r", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
158 {
"g", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
159 {
"b", 2, JSPROP_SHARED | JSPROP_ENUMERATE},
165JSFunctionSpec (SFColorFunctions)[] = {
166 {
"getHSV", SFColorGetHSV, 0},
167 {
"setHSV", SFColorSetHSV, 0},
168 {
"toString", SFColorToString, 0},
169 {
"assign", SFColorAssign, 0},
175JSClass SFColorRGBAClass = {
179 JS_DeletePropertyStub,
180 SFColorRGBAGetProperty,
181 SFColorRGBASetProperty,
188JSPropertySpec (SFColorRGBAProperties)[] = {
189 {
"r", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
190 {
"g", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
191 {
"b", 2, JSPROP_SHARED | JSPROP_ENUMERATE},
192 {
"a", 3, JSPROP_SHARED | JSPROP_ENUMERATE},
196JSFunctionSpec (SFColorRGBAFunctions)[] = {
197 {
"getHSV", SFColorRGBAGetHSV, 0},
198 {
"setHSV", SFColorRGBASetHSV, 0},
199 {
"toString", SFColorRGBAToString, 0},
200 {
"assign", SFColorRGBAAssign, 0},
206JSClass SFImageClass = {
210 JS_DeletePropertyStub,
219JSPropertySpec (SFImageProperties)[] = {
220 {
"x", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
221 {
"y", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
222 {
"comp", 2, JSPROP_SHARED | JSPROP_ENUMERATE},
223 {
"array", 3, JSPROP_SHARED | JSPROP_ENUMERATE},
227JSFunctionSpec (SFImageFunctions)[] = {
228 {
"toString", SFImageToString, 0},
229 {
"assign", SFImageAssign, 0},
235JSClass SFNodeClass = {
239 JS_DeletePropertyStub,
248JSPropertySpec (SFNodeProperties)[] = {
263JSFunctionSpec (SFNodeFunctions)[] = {
265 {
"getNodeName", SFNodeGetNodeName, 0},
266 {
"getNodeType", SFNodeGetNodeType, 0},
267 {
"getFieldDefinitions",SFNodeGetFieldDefs, 0},
268 {
"toVRMLString",SFNodeToVRMLString, 0},
269 {
"toXMLString", SFNodeToXMLString, 0},
271 JS_FS(
"equals", SFNodeEquals, 1,0),
272 JS_FS(
"toString", SFNodeToString, 0, 0),
273 JS_FS(
"valueOf", SFNodeValueOf, 0, 0),
274 {
"assign", SFNodeAssign, 0, 0},
280JSClass SFRotationClass = {
284 JS_DeletePropertyStub,
285 SFRotationGetProperty,
286 SFRotationSetProperty,
293JSPropertySpec (SFRotationProperties)[] = {
294 {
"x", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
295 {
"y", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
296 {
"z", 2, JSPROP_SHARED | JSPROP_ENUMERATE},
297 {
"angle",3, JSPROP_SHARED | JSPROP_ENUMERATE},
301JSFunctionSpec (SFRotationFunctions)[] = {
302 {
"getAxis", SFRotationGetAxis, 0},
303 {
"inverse", SFRotationInverse, 0},
304 {
"multiply", SFRotationMultiply, 0},
305 {
"multVec", SFRotationMultVec, 0},
306 {
"multiVec", SFRotationMultVec, 0},
307 {
"setAxis", SFRotationSetAxis, 0},
308 {
"slerp", SFRotationSlerp, 0},
309 {
"toString", SFRotationToString, 0},
310 {
"assign", SFRotationAssign, 0},
316JSClass SFVec2fClass = {
320 JS_DeletePropertyStub,
329JSPropertySpec (SFVec2fProperties)[] = {
330 {
"x", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
331 {
"y", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
335JSFunctionSpec (SFVec2fFunctions)[] = {
336 {
"add", SFVec2fAdd, 0},
337 {
"divide", SFVec2fDivide, 0},
338 {
"dot", SFVec2fDot, 0},
339 {
"length", SFVec2fLength, 0},
340 {
"multiply", SFVec2fMultiply, 0},
341 {
"normalize", SFVec2fNormalize, 0},
342 {
"subtract", SFVec2fSubtract, 0},
343 {
"toString", SFVec2fToString, 0},
344 {
"assign", SFVec2fAssign, 0},
349JSClass SFVec2dClass = {
362JSPropertySpec (SFVec2dProperties)[] = {
363 {
"x", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
364 {
"y", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
368JSFunctionSpec (SFVec2dFunctions)[] = {
369 {
"add", SFVec2dAdd, 0},
370 {
"divide", SFVec2dDivide, 0},
371 {
"dot", SFVec2dDot, 0},
372 {
"length", SFVec2dLength, 0},
373 {
"multiply", SFVec2dMultiply, 0},
374 {
"normalize", SFVec2dNormalize, 0},
375 {
"subtract", SFVec2dSubtract, 0},
376 {
"toString", SFVec2dToString, 0},
377 {
"assign", SFVec2dAssign, 0},
383JSClass SFVec4fClass = {
387 JS_DeletePropertyStub,
396JSPropertySpec (SFVec4fProperties)[] = {
397 {
"x", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
398 {
"y", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
399 {
"z", 2, JSPROP_SHARED | JSPROP_ENUMERATE},
400 {
"w", 3, JSPROP_SHARED | JSPROP_ENUMERATE},
404JSFunctionSpec (SFVec4fFunctions)[] = {
406 {
"toString", SFVec4fToString, 0},
407 {
"assign", SFVec4fAssign, 0},
412JSClass SFVec4dClass = {
416 JS_DeletePropertyStub,
425JSPropertySpec (SFVec4dProperties)[] = {
426 {
"x", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
427 {
"y", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
428 {
"z", 2, JSPROP_SHARED | JSPROP_ENUMERATE},
429 {
"w", 3, JSPROP_SHARED | JSPROP_ENUMERATE},
433JSFunctionSpec (SFVec4dFunctions)[] = {
435 {
"toString", SFVec4dToString, 0},
436 {
"assign", SFVec4dAssign, 0},
443JSClass SFVec3fClass = {
447 JS_DeletePropertyStub,
465JSPropertySpec (SFVec3fProperties)[] = {
466 {
"x", 0, JSPROP_SHARED | JSPROP_ENUMERATE, NULL, NULL },
467 {
"y", 1, JSPROP_SHARED | JSPROP_ENUMERATE, NULL, NULL },
468 {
"z", 2, JSPROP_SHARED | JSPROP_ENUMERATE, NULL, NULL },
472JSFunctionSpec (SFVec3fFunctions)[] = {
473 {
"add", SFVec3fAdd, 0},
474 {
"cross", SFVec3fCross, 0},
475 {
"divide", SFVec3fDivide, 0},
476 {
"dot", SFVec3fDot, 0},
477 {
"length", SFVec3fLength, 0},
478 {
"multiply", SFVec3fMultiply, 0},
479 {
"negate", SFVec3fNegate, 0},
480 {
"normalize", SFVec3fNormalize, 0},
481 {
"subtract", SFVec3fSubtract, 0},
482 {
"toString", SFVec3fToString, 0},
483 {
"assign", SFVec3fAssign, 0},
488JSClass SFVec3dClass = {
492 JS_DeletePropertyStub,
501JSPropertySpec (SFVec3dProperties)[] = {
502 {
"x", 0, JSPROP_SHARED | JSPROP_ENUMERATE},
503 {
"y", 1, JSPROP_SHARED | JSPROP_ENUMERATE},
504 {
"z", 2, JSPROP_SHARED | JSPROP_ENUMERATE},
508JSFunctionSpec (SFVec3dFunctions)[] = {
509 {
"add", SFVec3dAdd, 0},
510 {
"cross", SFVec3dCross, 0},
511 {
"divide", SFVec3dDivide, 0},
512 {
"dot", SFVec3dDot, 0},
513 {
"length", SFVec3dLength, 0},
514 {
"multiply", SFVec3dMultiply, 0},
515 {
"negate", SFVec3dNegate, 0},
516 {
"normalize", SFVec3dNormalize, 0},
517 {
"subtract", SFVec3dSubtract, 0},
518 {
"toString", SFVec3dToString, 0},
519 {
"assign", SFVec3dAssign, 0},
523JSClass MFColorClass = {
527 JS_DeletePropertyStub,
536JSFunctionSpec (MFColorFunctions)[] = {
537 {
"toString", MFColorToString, 0},
538 {
"assign", MFColorAssign, 0},
544JSClass MFFloatClass = {
548 JS_DeletePropertyStub,
557JSFunctionSpec (MFFloatFunctions)[] = {
558 {
"toString", MFFloatToString, 0},
559 {
"assign", MFFloatAssign, 0},
565JSClass MFInt32Class = {
569 JS_DeletePropertyStub,
578JSFunctionSpec (MFInt32Functions)[] = {
579 {
"toString", MFInt32ToString, 0},
580 {
"assign", MFInt32Assign, 0},
585JSClass MFBoolClass = {
598JSFunctionSpec (MFBoolFunctions)[] = {
599 {
"toString", MFBoolToString, 0},
600 {
"assign", MFBoolAssign, 0},
605JSClass MFDoubleClass = {
618JSFunctionSpec (MFDoubleFunctions)[] = {
619 {
"toString", MFDoubleToString, 0},
620 {
"assign", MFDoubleAssign, 0},
626JSClass MFImageClass = {
639JSFunctionSpec (MFImageFunctions)[] = {
640 {
"toString", MFImageToString, 0},
641 {
"assign", MFImageAssign, 0},
646JSClass MFVec2dClass = {
659JSFunctionSpec (MFVec2dFunctions)[] = {
660 {
"toString", MFVec2dToString, 0},
661 {
"assign", MFVec2dAssign, 0},
665JSClass MFVec3dClass = {
678JSFunctionSpec (MFVec3dFunctions)[] = {
679 {
"toString", MFVec3dToString, 0},
680 {
"assign", MFVec3dAssign, 0},
686JSClass MFNodeClass = {
690 JS_DeletePropertyStub,
699JSFunctionSpec (MFNodeFunctions)[] = {
700 {
"toString", MFNodeToString, 0},
701 {
"assign", MFNodeAssign, 0},
707JSClass MFRotationClass = {
710 MFRotationAddProperty,
711 JS_DeletePropertyStub,
712 MFRotationGetProperty,
713 MFRotationSetProperty,
720JSFunctionSpec (MFRotationFunctions)[] = {
721 {
"toString", MFRotationToString, 0},
722 {
"assign", MFRotationAssign, 0},
729JSClass MFStringClass = {
733 MFStringDeleteProperty,
736 MFStringEnumerateProperty,
737 MFStringResolveProperty,
738 MFStringConvertProperty,
742JSFunctionSpec (MFStringFunctions)[] = {
743 {
"toString", MFStringToString, 0},
744 {
"assign", MFStringAssign, 0},
750JSClass MFTimeClass = {
754 JS_DeletePropertyStub,
763JSPropertySpec (MFTimeProperties)[] = {
767JSFunctionSpec (MFTimeFunctions)[] = {
768 {
"toString", MFTimeToString, 0},
769 {
"assign", MFTimeAssign, 0},
775JSClass MFVec2fClass = {
779 JS_DeletePropertyStub,
788JSFunctionSpec (MFVec2fFunctions)[] = {
789 {
"toString", MFVec2fToString, 0},
790 {
"assign", MFVec2fAssign, 0},
796JSClass MFVec3fClass = {
800 JS_DeletePropertyStub,
809JSFunctionSpec (MFVec3fFunctions)[] = {
810 {
"toString", MFVec3fToString, 0},
811 {
"assign", MFVec3fAssign, 0},
815JSObject *proto_VrmlMatrix;
817JSClass VrmlMatrixClass = {
820 VrmlMatrixAddProperty,
821 JS_DeletePropertyStub,
822 VrmlMatrixGetProperty,
823 VrmlMatrixSetProperty,
830JSFunctionSpec (VrmlMatrixFunctions)[] = {
831 {
"setTransform", VrmlMatrixsetTransform, 0},
832 {
"getTransform", VrmlMatrixgetTransform, 0},
833 {
"inverse", VrmlMatrixinverse, 0},
834 {
"transpose", VrmlMatrixtranspose, 0},
835 {
"multLeft", VrmlMatrixmultLeft, 0},
836 {
"multRight", VrmlMatrixmultRight, 0},
837 {
"multVecMatrix", VrmlMatrixmultVecMatrix, 0},
838 {
"multMatrixVec", VrmlMatrixmultMatrixVec, 0},
839 {
"toString", VrmlMatrixToString, 0},
840 {
"assign", VrmlMatrixAssign, 0},
847JSObject *proto_X3DMatrix3;
849JSClass X3DMatrix3Class = {
852 X3DMatrix3AddProperty,
854 X3DMatrix3GetProperty,
855 X3DMatrix3SetProperty,
862JSFunctionSpec (X3DMatrix3Functions)[] = {
863 {
"getTransform", X3DMatrix3getTransform, 0},
864 {
"setTransform", X3DMatrix3setTransform, 0},
865 {
"inverse", X3DMatrix3inverse, 0},
866 {
"transpose", X3DMatrix3transpose, 0},
867 {
"multLeft", X3DMatrix3multLeft, 0},
868 {
"multRight", X3DMatrix3multRight, 0},
869 {
"multVecMatrix", X3DMatrix3multVecMatrix, 0},
870 {
"multMatrixVec", X3DMatrix3multMatrixVec, 0},
871 {
"toString", X3DMatrix3ToString, 0},
872 {
"assign", X3DMatrix3Assign, 0},
877JSObject *proto_X3DMatrix4;
879JSClass X3DMatrix4Class = {
882 X3DMatrix4AddProperty,
884 X3DMatrix4GetProperty,
885 X3DMatrix4SetProperty,
892JSFunctionSpec (X3DMatrix4Functions)[] = {
893 {
"toString", X3DMatrix4ToString, 0},
894 {
"assign", X3DMatrix4Assign, 0},
895 {
"getTransform", X3DMatrix4getTransform, 0},
896 {
"setTransform", X3DMatrix4setTransform, 0},
897 {
"inverse", X3DMatrix4inverse, 0},
898 {
"transpose", X3DMatrix4transpose, 0},
899 {
"multLeft", X3DMatrix4multLeft, 0},
900 {
"multRight", X3DMatrix4multRight, 0},
901 {
"multVecMatrix", X3DMatrix4multVecMatrix, 0},
902 {
"multMatrixVec", X3DMatrix4multMatrixVec, 0},
919struct JSLoadPropElement {
922 JSBool (*constr)(JSContext*,
unsigned int, jsval*);
929struct JSLoadPropElement JSLoadProps [] = {
931 { &MFVec2dClass, MFVec2dConstr, &MFVec2dFunctions, &MFVec2dProperties,
"MFVec2dClass"},
932 { &MFVec3dClass, MFVec3dConstr, &MFVec3dFunctions, &MFVec3dProperties,
"MFVec3dClass"},
933 { &SFVec2dClass, SFVec2dConstr, &SFVec2dFunctions, &SFVec2dProperties,
"SFVec2dClass"},
934 { &MFBoolClass, MFBoolConstr, &MFBoolFunctions, &MFBoolProperties,
"MFBoolClass"},
935 { &MFDoubleClass, MFDoubleConstr, &MFDoubleFunctions, &MFDoubleProperties,
"MFDoubleClass"},
936 { &MFImageClass, MFImageConstr, &MFImageFunctions, &MFImageProperties,
"MFImageClass"},
937 { &X3DMatrix3Class, X3DMatrix3Constr, &X3DMatrix3Functions, &X3DMatrix3Properties,
"X3DMatrix3Class"},
938 { &X4DMatrix4Class, X4DMatrix4Constr, &X4DMatrix4Functions, &X4DMatrix4Properties,
"X4DMatrix4Class"},
941 { &SFColorClass, &SFColorConstr, &SFColorFunctions, &SFColorProperties,
"SFColorClass"},
942 { &SFVec2fClass, &SFVec2fConstr, &SFVec2fFunctions, &SFVec2fProperties,
"SFVec2fClass"},
943 { &SFColorRGBAClass, &SFColorRGBAConstr, &SFColorRGBAFunctions, &SFColorRGBAProperties,
"SFColorRGBAClass"},
944 { &SFVec3fClass, &SFVec3fConstr, &SFVec3fFunctions, &SFVec3fProperties,
"SFVec3fClass"},
945 { &SFVec3dClass, &SFVec3dConstr, &SFVec3dFunctions, &SFVec3dProperties,
"SFVec3dClass"},
946 { &SFRotationClass, &SFRotationConstr, &SFRotationFunctions, &SFRotationProperties,
"SFRotationClass"},
947 { &SFNodeClass, &SFNodeConstr, &SFNodeFunctions, &SFNodeProperties,
"SFNodeClass"},
948 { &MFFloatClass, &MFFloatConstr, &MFFloatFunctions, NULL,
"MFFloatClass"},
949 { &MFTimeClass, &MFTimeConstr, &MFTimeFunctions, &MFTimeProperties,
"MFTimeClass"},
950 { &MFInt32Class, &MFInt32Constr, &MFInt32Functions, NULL,
"MFInt32Class"},
951 { &MFColorClass, &MFColorConstr, &MFColorFunctions, NULL,
"MFColorClass"},
952 { &MFVec2fClass, &MFVec2fConstr, &MFVec2fFunctions, NULL,
"MFVec2fClass"},
954 { &MFVec3fClass, &MFVec3fConstr, &MFVec3fFunctions, NULL,
"MFVec3fClass"},
956 { &SFVec4fClass, &SFVec4fConstr, &SFVec4fFunctions, &SFVec4fProperties,
"SFVec4fClass"},
957 { &SFVec4dClass, &SFVec4dConstr, &SFVec4dFunctions, &SFVec4dProperties,
"SFVec4dClass"},
959 { &MFRotationClass, &MFRotationConstr, &MFRotationFunctions, NULL,
"MFRotationClass"},
960 { &MFNodeClass, &MFNodeConstr, &MFNodeFunctions, NULL,
"MFNodeClass"},
961 { &SFImageClass, &SFImageConstr, &SFImageFunctions, &SFImageProperties,
"SFImageClass"},
963 { &MFStringClass, &MFStringConstr, &MFStringFunctions, NULL,
"MFStringClass"},
964 { &VrmlMatrixClass, &VrmlMatrixConstr, &VrmlMatrixFunctions, NULL,
"VrmlMatrixClass"},
965 { NULL, NULL, NULL, NULL, NULL }
971const char *classToString(JSClass *myClass) {
979 while (JSLoadProps[i].fwclass != NULL) {
980 if (JSLoadProps[i].fwclass == myClass) {
982 return JSLoadProps[i].id;
986 return "class unknown";
990void printJSNodeType (JSContext *context, JSObject *myobj) {
994 #ifdef JSVRMLCLASSESVERBOSE
995 printf (
"printJSNodeType, obj pointer is %p\n",myobj);
999 while (JSLoadProps[i].fwclass != NULL) {
1000 if (JS_InstanceOf(context, myobj, JSLoadProps[i].fwclass, NULL)) {
1001 printf (
"'%s'\n",JSLoadProps[i].
id);
1006 printf (
"'unknown class'\n");
1010JSBool _simplecopyElements (JSContext *cx,
1021 #ifdef JSVRMLCLASSESVERBOSE
1022 printf (
"simpleCopyElements, count %d\n",count);
1025 for (i = 0; i < count; i++) {
1026 if (!JS_GetElement(cx, fromObj, (jsint) i, &val)) {
1027 printf(
"failed in get %d index %d.\n",type, i);
1031 if ((type == FIELDTYPE_SFFloat) || (type == FIELDTYPE_SFTime)) {
1033 if (JSVAL_IS_INT(val)) {
1034 ii = JSVAL_TO_INT(val);
1037 if (JS_NewNumberValue(cx,dd,&val) == JS_FALSE) {
1038 printf(
"JS_NewNumberValue failed for %f in simplecopyelements.\n",dd);
1052 if (!JS_SetElement(cx, toObj, (jsint) i, &val)) {
1053 printf(
"failed in set %d index %d.\n", type, i);
1062JSBool _standardMFAssign(JSContext *cx,
1070 JSObject *_from_obj;
1074 JSString *_id_jsstr;
1077 if (!JS_InstanceOf(cx, obj, myClass, argv)) {
1078 printf(
"JS_InstanceOf failed for fieldType %s.\n",stringFieldtypeType(type));
1082 if (!JS_ConvertArguments(cx, argc, argv,
"oS", &_from_obj, &_id_jsstr)) {
1083 printf(
"JS_ConvertArguments failed in %s.\n",stringFieldtypeType(type));
1088 if (!JS_InstanceOf(cx, _from_obj, myClass, argv)) {
1089 printf(
"JS_InstanceOf failed for fieldType %s.\n",stringFieldtypeType(type));
1092 if (!JS_GetProperty(cx, _from_obj, MF_LENGTH_FIELD, &val)) {
1093 printf(
"JS_GetProperty failed for \"%s\" in %s.\n",MF_LENGTH_FIELD,stringFieldtypeType(type));
1097 if (!JS_SetProperty(cx, obj, MF_LENGTH_FIELD, &val)) {
1098 printf(
"JS_SetProperty failed for \"%s\" in %s\n",MF_LENGTH_FIELD,stringFieldtypeType(type));
1102 len = JSVAL_TO_INT(val);
1104 #ifdef JSVRMLCLASSESVERBOSE
1105#if JS_VERSION >= 185
1106 _id_str = JS_EncodeString(cx,_id_jsstr);
1108 printf(
"StandardMFAssign %s: obj = %p, id = \"%s\", from = %p, len = %d\n",stringFieldtypeType(type),
1109 obj, _id_str, _from_obj, len);
1110#if JS_VERSION >= 185
1111 JS_free(cx,_id_str);
1116 *rval = OBJECT_TO_JSVAL(obj);
1120 if (type == FIELDTYPE_SFImage) {
1121 if ((ptr = (
SFImageNative *)JS_GetPrivateFw(cx, obj)) == NULL) {
1122 printf(
"JS_GetPrivate failed in standard MF assign.\n");
1125 ptr->valueChanged = 1;
1128 return _simplecopyElements(cx, _from_obj, obj, len,type);
1130void X3D_SF_TO_JS_B(JSContext *cx,
void *Data,
unsigned datalen,
int dataType,
int *valueChanged, jsval *newval);
1133_standardMFGetProperty(JSContext *cx,
1138 const char *makeNewElement,
1141 int32 _length, _index;
1150 if (!JS_IdToValue(cx,iid,&
id)) {
1155 #ifdef JSVRMLCLASSESVERBOSE
1156 printf (
"_standardMFGetProperty starting for type %d\n",type);
1157 printJSNodeType (cx,obj);
1160 if(SM_method() == 2){
1164 if ((ptr = (
AnyNative *)JS_GetPrivateFw(cx,obj)) == NULL) {
1165 printf(
"JS_GetPrivate failed in standardMFGetterProperty\n");
1168 sftype = type2SF(ptr->type);
1169 sfsize = sizeofSForMF(sftype);
1171 if (JSVAL_IS_INT(
id)) {
1175 int index = JSVAL_TO_INT(
id);
1176 if(index < 0)
return JS_FALSE;
1179 newlength = index + 1;
1180 mf_n = ptr->v->mfbool.n;
1181 mf_p = (
char *)ptr->v->mfbool.p;
1182 if(newlength > mf_n ) {
1185 mf_p = (
char *)malloc(sfsize*upper_power_of_two(newlength));
1186 memset(mf_p,0,sfsize*upper_power_of_two(newlength));
1189 mf_p = (
char *)realloc(mf_p,
sizeof(
int) + sfsize*upper_power_of_two(newlength));
1190 for(k=mf_n;k<newlength;k++)
1191 memset(mf_p + (
size_t)sfsize*k,0,sfsize);
1193 ptr->v->mfbool.n = newlength;
1195 ptr->v->mfbool.p = (
int*)mf_p;
1198 any = (
union anyVrml*)(mf_p + (index * sfsize));
1199 switch(type2SF(ptr->type)){
1200 case FIELDTYPE_SFBool:
1201 case FIELDTYPE_SFFloat:
1202 case FIELDTYPE_SFTime:
1203 case FIELDTYPE_SFDouble:
1204 case FIELDTYPE_SFInt32:
1205 X3D_ECMA_TO_JS(cx, any,sfsize,sftype,vp);
1207 case FIELDTYPE_SFString:
1208 if(any->sfstring == NULL){
1210 memset(any->sfstring,0,
sizeof(
struct Uni_String));
1212 X3D_ECMA_TO_JS(cx, any,sfsize,sftype,vp);
1214 case FIELDTYPE_SFColor:
1215 case FIELDTYPE_SFVec2f:
1216 case FIELDTYPE_SFVec3f:
1217 case FIELDTYPE_SFVec3d:
1218 case FIELDTYPE_SFRotation:
1219 X3D_SF_TO_JS_B(cx, any,sfsize, sftype, ptr->valueChanged, vp);
1221 case FIELDTYPE_SFNode:
1222 X3D_SF_TO_JS_BNode(cx, any,sfsize, sftype, ptr->valueChanged, vp);
1224 default: printf (
"invalid type in standardMFGetProperty method 2\n");
return JS_FALSE;
1227 }
else if(JSVAL_IS_STRING(
id)){
1231 _idStr = JS_ValueToString(cx,
id);
1233 _id_c = JS_EncodeString(cx,_idStr);
1234 if (strcmp (
"length",_id_c) == 0) {
1241 mf_n = ptr->v->mfbool.n;
1242 retval = INT_TO_JSVAL(mf_n);
1250 if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &_length_val)) {
1251 printf(
"JS_GetProperty failed for \"%s\" in %d.\n",MF_LENGTH_FIELD,type);
1255 _length = JSVAL_TO_INT(_length_val);
1256 #ifdef JSVRMLCLASSESVERBOSE
1257 printf (
"standarg get property, len %d\n",_length);
1260 if (JSVAL_IS_INT(
id)) {
1261 _index = JSVAL_TO_INT(
id);
1262 #ifdef JSVRMLCLASSESVERBOSE
1263 printf (
"standard get property, index requested %d length is %d\n",_index,_length);
1266 if (_index >= _length) {
1267 #ifdef JSVRMLCLASSESVERBOSE
1268 printf (
"\n\nconstructing new object\n");
1274 newElemenLen = (int)strlen(makeNewElement);
1276 if (!JS_EvaluateScript(cx, obj, makeNewElement, newElemenLen,
1277 FNAME_STUB, LINENO_STUB, &newEle)) {
1278 ConsoleMessage (
"standardMFGetProperty: JS_EvaluateScript failed for %s", makeNewElement);
1286 #ifdef JSVRMLCLASSESVERBOSE
1287 printf (
"defining element %d now... is %d %#x\n",_index,(
int)*vp,(
unsigned int)*vp);
1290 if (!JS_DefineElement(cx, obj, (jsint) _index, *vp,
1291 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_STUB8,
1292 JSPROP_ENUMERATE)) {
1293 printf(
"JS_DefineElement failed in %d.\n",type);
1297 if (!doMFSetProperty(cx,obj,
1300 printf (
"wow, cant assign property\n");
1303 #ifdef JSVRMLCLASSESVERBOSE
1304 printf (
"object might already have this index\n");
1306 if (!JS_LookupElement(cx, obj, _index, vp)) {
1307 printf(
"JS_LookupElement failed in %d.\n",type);
1310 if (JSVAL_IS_NULL(*vp)) {
1311 printf(
"warning: %d: obj = %p, jsval = %d does not exist!\n",type,
1315 }
else if (JSVAL_IS_STRING(
id)) {
1316 #ifdef JSVRMLCLASSESVERBOSE
1320 printf (
"HAVE STRING HERE!\n");
1321 _str = JS_ValueToString(cx,
id);
1322 #if JS_VERSION < 185
1323 asciiStr = JS_GetStringBytes(_str);
1325 asciiStr = JS_EncodeString(cx,_str);
1327 printf (
"we have as a parameter :%s:\n",asciiStr);
1328 #if JS_VERSION >= 185
1329 JS_free(cx,asciiStr);
1335 #ifdef JSVRMLCLASSESVERBOSE
1336 printf (
"_standardMFGetProperty finishing; element is %u\n",(
unsigned int)*vp);
1365char *mf2str(
int type,
union anyVrml *ptr);
1366char *sf2str(
int sftype,
union anyVrml *any){
1372 case FIELDTYPE_SFBool:
1373 if(any->sfbool) str = strdup(
"true");
1374 else str = strdup(
"false");
1376 case FIELDTYPE_SFInt32:
1377 sprintf(strbuf,
"%d",any->sfint32);
1378 str = strdup(strbuf);
1380 case FIELDTYPE_SFFloat:
1381 sprintf(strbuf,
"%g",any->sffloat);
1382 str = strdup(strbuf);
1384 case FIELDTYPE_SFDouble:
1385 case FIELDTYPE_SFTime:
1386 sprintf(strbuf,
"%g",any->sfdouble);
1387 str = strdup(strbuf);
1389 case FIELDTYPE_SFString:{
1390 str = (
char *)malloc(strlen(any->sfstring->strptr)+3);
1392 str = strcat(str,any->sfstring->strptr);
1393 str = strcat(str,
"\"");
1396 case FIELDTYPE_SFVec2f:
1398 sprintf(strbuf,
"%f %f",any->sfvec2f.c[0],any->sfvec2f.c[1]);
1399 str = strdup(strbuf);
1402 case FIELDTYPE_SFVec2d:
1404 sprintf(strbuf,
"%g %g",any->sfvec2d.c[0],any->sfvec2d.c[1]);
1405 str = strdup(strbuf);
1408 case FIELDTYPE_SFVec3f:
1409 case FIELDTYPE_SFColor:
1411 sprintf(strbuf,
"%f %f %f",any->sfvec3f.c[0],any->sfvec3f.c[1],any->sfvec3f.c[2]);
1412 str = strdup(strbuf);
1415 case FIELDTYPE_SFVec3d:
1417 sprintf(strbuf,
"%g %g %g",any->sfvec3d.c[0],any->sfvec3d.c[1],any->sfvec3d.c[2]);
1418 str = strdup(strbuf);
1421 case FIELDTYPE_SFColorRGBA:
1422 case FIELDTYPE_SFRotation:
1423 case FIELDTYPE_SFVec4f:
1425 sprintf(strbuf,
"%f %f %f %f",any->sfvec4f.c[0],any->sfvec4f.c[1],any->sfvec4f.c[2],any->sfvec4f.c[3]);
1426 str = strdup(strbuf);
1429 case FIELDTYPE_SFVec4d:
1431 sprintf(strbuf,
"%g %g %g %g",any->sfvec4d.c[0],any->sfvec4d.c[1],any->sfvec4d.c[2],any->sfvec4d.c[3]);
1432 str = strdup(strbuf);
1435 case FIELDTYPE_SFNode:
1436 sprintf(strbuf,
"%p",any->sfnode);
1437 str = strdup(strbuf);
1439 case FIELDTYPE_SFImage:
1440 str = mf2str(FIELDTYPE_MFInt32,any);
1442 case FIELDTYPE_SFMatrix3f:
1443 case FIELDTYPE_SFMatrix3d:
1444 case FIELDTYPE_SFMatrix4f:
1445 case FIELDTYPE_SFMatrix4d:
1452char *mf2str(
int type,
union anyVrml *ptr){
1453 int len, elen, sftype, i;
1454 char *p, *str = NULL;
1455 static int showType = 0;
1458 if(showType) len += strlen(FIELDTYPES[type]);
1459 str = (
char *)malloc(len +1);
1461 if(showType) strcat(str,FIELDTYPES[type]);
1462 str = strcat(str,
"[ ");
1464 sftype = type2SF(type);
1465 p = (
char *)ptr->mfbool.p;
1466 elen = sizeofSF(sftype);
1467 for(i=0;i<ptr->mfbool.n;i++)
1469 char * sf = sf2str(sftype,(
union anyVrml*)p);
1470 str = (
char *)realloc(str,strlen(str)+strlen(sf)+2);
1471 str = strcat(str,sf);
1472 str = strcat(str,
" ");
1476 str[strlen(str)-1] =
']';
1480JSBool doMFToString(JSContext *cx, JSObject *obj,
const char *className, jsval *rval)
1482 if(SM_method() == 2){
1487 if((ptr = (
AnyNative*)JS_GetPrivateFw(cx,obj)) == NULL){
1488 printf(
"in doMFToString - not a Native\n");
1492 str = mf2str(ptr->type,any);
1493 _str = JS_NewStringCopyZ(cx,str);
1494 *rval = STRING_TO_JSVAL(_str);
1498 JSString *_str, *_tmpStr;
1500 char *_buff, *_tmp_valStr, *_tmp_buff;
1501 const char *_empty_array =
"[]";
1503 size_t buff_size = 0, tmp_valStr_len = 0, tmp_buff_len = 0;
1504 JSBool isString = JS_FALSE;
1505 JSBool isImage = JS_FALSE;
1507 JSBool encodedTmpValstr = JS_FALSE;
1509 if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &_v)) {
1510 printf(
"JS_GetProperty failed for \"%s\" in doMFToString for %s.\n",
1511 MF_LENGTH_FIELD,className);
1514 len = JSVAL_TO_INT(_v);
1516 #ifdef JSVRMLCLASSESVERBOSE
1517 printf (
"doMFToString, obj %p len %d\n",obj, len);
1518 printJSNodeType (cx,obj);
1522 _str = JS_NewStringCopyZ(cx, _empty_array);
1523 *rval = STRING_TO_JSVAL(_str);
1524 #ifdef JSVRMLCLASSESVERBOSE
1525 printf (
"doMFToString, len is zero, returning JS_TRUE, and %d\n",(
int)*rval);
1530 if (!strcmp(className,
"MFString")) {
1533 if (!strcmp(className,
"SFImage")) {
1535 #ifdef JSVRMLCLASSESVERBOSE
1536 printf (
"doMFToString - doing an image\n");
1540 buff_size = LARGESTRING;
1541 _buff = MALLOC(
char *, buff_size *
sizeof(
char));
1542 memset(_buff, 0, buff_size);
1544 for (i = 0; i < len; i++) {
1545 if (!JS_GetElement(cx, obj, i, &_v)) {
1546 printf(
"warning, no element %d of %d in doMFToString for a type of %s.\n",
1548 _tmp_valStr = strdup(
"NULL");
1551 #ifdef JSVRMLCLASSESVERBOSE
1552 if (JSVAL_IS_NUMBER(_v)) printf (
"is a number\n");
1553 if (JSVAL_IS_INT(_v)) printf (
"is an integer\n");
1554 if (JSVAL_IS_DOUBLE(_v)) printf (
"is an double\n");
1557 _tmpStr = JS_ValueToString(cx, _v);
1558 if (_tmpStr==NULL) {
1559 _tmp_valStr = strdup(
"NULL");
1561 _tmp_valStr = JS_EncodeString(cx,_tmpStr);
1562 encodedTmpValstr = JS_TRUE;
1566 #ifdef JSVRMLCLASSESVERBOSE
1567 printf (
"doMFToString, element %d is %#x, string %s\n",i,(
unsigned int)_v,_tmp_valStr);
1570 tmp_valStr_len = strlen(_tmp_valStr) + 1;
1571 tmp_buff_len = strlen(_buff);
1573 if ((buff_size - (tmp_buff_len + 1)) < (tmp_valStr_len + 1)) {
1574 buff_size += LARGESTRING;
1577 JS_realloc(cx, _buff, buff_size *
sizeof(
char *)))
1579 printf(
"JS_realloc failed for %d in doMFToString for %s.\n", i, className);
1581 if (encodedTmpValstr == JS_TRUE) JS_free(cx,_tmp_valStr);
1582 if(_tmp_valStr) {free(_tmpStr); _tmpStr = NULL;}
1589 sprintf(_buff,
"[ \"%.*s\" ]", (
int) tmp_valStr_len, _tmp_valStr);
1591 sprintf(_buff,
"[ %.*s ]", (
int) tmp_valStr_len, _tmp_valStr);
1594 if (encodedTmpValstr == JS_TRUE) {
1595 JS_free(cx,_tmp_valStr);
1596 encodedTmpValstr = JS_FALSE;
1598 if(_tmp_valStr) {free(_tmpStr); _tmpStr = NULL;}
1603 _tmp_buff = MALLOC(
char *, (tmp_buff_len + 1) *
sizeof(
char));
1604 memset(_tmp_buff, 0, tmp_buff_len + 1);
1605 memmove(_tmp_buff, _buff, tmp_buff_len);
1606 memset(_buff, 0, buff_size);
1608 if (i == 0 && len > 1) {
1610 sprintf(_buff,
"[ \"%.*s\"",
1611 (
int) tmp_valStr_len, _tmp_valStr);
1613 sprintf(_buff,
"[ %.*s", (
int) tmp_valStr_len, _tmp_valStr);
1615 }
else if (i == (len - 1)) {
1617 sprintf(_buff,
"%.*s, \"%.*s\" ]",
1618 (
int) tmp_buff_len, _tmp_buff, (
int) tmp_valStr_len, _tmp_valStr);
1620 sprintf(_buff,
"%.*s, %.*s ]",
1621 (
int) tmp_buff_len, _tmp_buff, (
int) tmp_valStr_len, _tmp_valStr);
1625 sprintf(_buff,
"%.*s, \"%.*s\"",
1626 (
int) tmp_buff_len, _tmp_buff, (
int) tmp_valStr_len, _tmp_valStr);
1628 sprintf(_buff,
"%.*s, %.*s",
1629 (
int) tmp_buff_len, _tmp_buff, (
int) tmp_valStr_len, _tmp_valStr);
1633 FREE_IF_NZ (_tmp_buff);
1635 if (encodedTmpValstr == JS_TRUE) {
1636 JS_free(cx,_tmp_valStr);
1637 encodedTmpValstr = JS_FALSE;
1639 if(_tmp_valStr) {free(_tmpStr); _tmpStr = NULL;}
1646 for (i=0; i<(int)strlen(_buff); i++) {
1647 if (_buff[i] ==
',') _buff[i]=
' ';
1648 if (_buff[i] ==
']') _buff[i]=
' ';
1649 if (_buff[i] ==
'[') _buff[i]=
' ';
1653 _str = JS_NewStringCopyZ(cx, _buff);
1654 *rval = STRING_TO_JSVAL(_str);
1661doMFAddProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp,
const char *name) {
1669 if (!JS_IdToValue(cx,iid,&
id)) {
1670 printf(
"\tdoMFAddProperty:%s JS_IdToValue failed\n",name);
1677 #ifdef JSVRMLCLASSESVERBOSE
1678 printf(
"\tdoMFAddProperty:%s id %d (%d) NodeType: ",name,(
int)
id,ind);
1679 printJSNodeType(cx,obj);
1682 str = JS_ValueToString(cx,
id);
1683 p = JS_EncodeString(cx,str);
1685 #ifdef JSVRMLCLASSESVERBOSE
1686 printf(
"\tid string %s\n ",p);
1689 if (!strcmp(p, MF_LENGTH_FIELD) ||
1690 !strcmp(p,
"MF_ECMA_has_changed") ||
1691 !strcmp(p,
"_parentField") ||
1692 !strcmp(p,
"toString") ||
1693 !strcmp(p,
"setTransform") ||
1694 !strcmp(p,
"assign") ||
1695 !strcmp(p,
"inverse") ||
1696 !strcmp(p,
"transpose") ||
1697 !strcmp(p,
"multLeft") ||
1698 !strcmp(p,
"multRight") ||
1699 !strcmp(p,
"multVecMatrix") ||
1700 !strcmp(p,
"multMatrixVec") ||
1701 !strcmp(p,
"constructor") ||
1702 !strcmp(p,
"getTransform")) {
1703 #ifdef JSVRMLCLASSESVERBOSE
1704 printf(
"property \"%s\" is one of the standard properties. Do nothing.\n", p);
1712 #ifdef JSVRMLCLASSESVERBOSE
1713 printf(
"\tdoMFAddProperty:%s id %d NodeType: ",name,(
int)
id);
1714 printJSNodeType(cx,obj);
1715 printf(
"\tdoMFAddProperty:%s id %d string %s ",name,(
int)
id,p);
1721 if (!JSVAL_IS_INT(
id)){
1722 printf(
"JSVAL_IS_INT failed for id in doMFAddProperty.\n");
1725 if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &v)) {
1726 printf(
"JS_GetProperty failed for \"%s\" in doMFAddProperty.\n",MF_LENGTH_FIELD);
1729 ind = JSVAL_TO_INT(
id);
1731 len = JSVAL_TO_INT(v);
1735 #ifdef JSVRMLCLASSESVERBOSE
1736 printf (
"doMFAddProperty, len %d ind %d\n",len,ind);
1739 v = INT_TO_JSVAL(len);
1740 if (!JS_SetProperty(cx, obj, MF_LENGTH_FIELD, &v)) {
1741 printf(
"JS_SetProperty failed for \"%s\" in doMFAddProperty.\n",MF_LENGTH_FIELD);
1746 #ifdef JSVRMLCLASSESVERBOSE
1747 printf(
"index = %d, length = %d\n", ind, len);
1753void JS_ECMA_TO_X3D(JSContext *cx,
void *Data,
unsigned datalen,
int dataType, jsval *newval);
1754void JS_SF_TO_X3D(JSContext *cx,
void *Data,
unsigned datalen,
int dataType, jsval *newval);
1755void JS_SF_TO_X3D_B(JSContext *cx,
void *Data,
int dataType,
int *valueChanged, jsval *newval);
1758doMFSetProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp,
int type) {
1775 if (!JS_IdToValue(cx,iid,&
id)) {
1776 printf(
"doMFSetProperty, JS_IdToValue failed.\n");
1780 if(SM_method() == 2){
1786 if ((ptr = (
AnyNative *)JS_GetPrivateFw(cx,obj)) == NULL) {
1787 printf(
"JS_GetPrivate failed in standardMFGetterProperty\n");
1790 valueChanged = ptr->valueChanged;
1791 sftype = type2SF(ptr->type);
1792 sfsize = sizeofSForMF(sftype);
1794 if (JSVAL_IS_INT(
id)) {
1799 int index = JSVAL_TO_INT(
id);
1800 if(index < 0)
return JS_FALSE;
1802 newlength = index + 1;
1803 mf_n = ptr->v->mfbool.n;
1804 mf_p = (
char *)ptr->v->mfbool.p;
1805 iupper = upper_power_of_two(newlength);
1806 if(newlength > mf_n ) {
1809 mf_p = (
char *)malloc(sfsize*iupper);
1810 memset(mf_p,0,(
size_t)sfsize*iupper);
1813 mf_p = (
char *)realloc(mf_p,(
size_t)sfsize*iupper);
1814 memset(mf_p + (
size_t)sfsize*mf_n,0,(
size_t)(iupper - mf_n)*sfsize);
1816 ptr->v->mfbool.n = newlength;
1818 ptr->v->mfbool.p = (
int*)mf_p;
1819 any = (
union anyVrml*)(mf_p + (index * sfsize));
1820 switch(type2SF(ptr->type)){
1821 case FIELDTYPE_SFBool:
1822 case FIELDTYPE_SFFloat:
1823 case FIELDTYPE_SFTime:
1824 case FIELDTYPE_SFDouble:
1825 case FIELDTYPE_SFInt32:
1826 case FIELDTYPE_SFString:
1828 JS_ECMA_TO_X3D(cx, any, sfsize,sftype,vp);
1833 case FIELDTYPE_SFColor:
1834 case FIELDTYPE_SFVec2f:
1835 case FIELDTYPE_SFVec3f:
1836 case FIELDTYPE_SFVec3d:
1837 case FIELDTYPE_SFRotation:
1838 JS_SF_TO_X3D_B(cx, any, sftype, valueChanged, vp);
1841 case FIELDTYPE_SFNode:
1842 JS_SF_TO_X3D_BNode(cx, any, sftype, valueChanged, vp);
1844 default: printf (
"invalid type in standardMFGetProperty method 2\n");
return JS_FALSE;
1847 }
else if(JSVAL_IS_STRING(
id)){
1851 _idStr = JS_ValueToString(cx,
id);
1852 _id_c = JS_EncodeString(cx,_idStr);
1853 if (strcmp (
"length",_id_c) == 0) {
1857 if(JSVAL_IS_INT(*vp)){
1860 int newlength = JSVAL_TO_INT(*vp);
1862 mf_n = ptr->v->mfbool.n;
1863 mf_p = (
char *)ptr->v->mfbool.p;
1864 iupper = upper_power_of_two(newlength);
1865 if(newlength > mf_n ) {
1868 mf_p = (
char *)malloc(sfsize*iupper);
1869 memset(mf_p,0,(
size_t)sfsize*iupper);
1872 mf_p = (
char *)realloc(mf_p,(
size_t)sfsize*iupper);
1873 memset(mf_p + (
size_t)sfsize*mf_n,0,(
size_t)(iupper - mf_n)*sfsize);
1876 ptr->v->mfbool.n = newlength;
1877 ptr->v->mfbool.p = (
int*)mf_p;
1886 #ifdef JSVRMLCLASSESVERBOSE
1889 printf (
"doMFSetProperty, for object %p, vp %u\n", obj,(
unsigned int)*vp);
1890 _str = JS_ValueToString(cx,
id);
1892 _c = JS_GetStringBytes(_str);
1894 _c = JS_EncodeString(cx,_str);
1896 printf (
"id is %s\n",_c);
1898 _sstr = JS_ValueToString(cx, *vp);
1899 printf (
"looking up value for %d %#x object %p\n",(
int)*vp,(
unsigned int)*vp,obj);
1901 _cc = JS_GetStringBytes(_sstr);
1903 _cc = JS_EncodeString(cx,_sstr);
1905 printf(
"\tdoMFSetProperty:%d: obj = %p, id = %s, vp = %s\n",type,
1907 if (JSVAL_IS_OBJECT(*vp)) { printf (
"doMFSet, vp is an OBJECT\n"); }
1908 if (JSVAL_IS_PRIMITIVE(*vp)) { printf (
"doMFSet, vp is an PRIMITIVE\n"); }
1910 printf (
"parent is a "); printJSNodeType(cx,obj);
1912#if JS_VERSION >= 185
1919 if (type == FIELDTYPE_MFInt32) {
1920 #ifdef JSVRMLCLASSESVERBOSE
1921 printf (
"doMFSetProperty, this should be an int \n");
1924 if (!JSVAL_IS_INT(*vp)) {
1925 #ifdef JSVRMLCLASSESVERBOSE
1926 printf (
"is NOT an int\n");
1945 *vp = INT_TO_JSVAL(i);
1947 }
else if ((type == FIELDTYPE_MFFloat) || (type == FIELDTYPE_MFTime)) {
1948 #ifdef JSVRMLCLASSESVERBOSE
1949 printf (
"doMFSetProperty - ensure that this is a DOUBLE ");
1950 _sstr = JS_ValueToString(cx, *vp);
1952 _cc = JS_GetStringBytes(_sstr);
1954 _cc = JS_EncodeString(cx,_sstr);
1956 printf (
"value is %s \n",_cc);
1957#if JS_VERSION >= 185
1962 if (JSVAL_IS_INT(*vp)) {
1963 ii = JSVAL_TO_INT(*vp);
1966 if (JS_NewNumberValue(cx,dd,vp) == JS_FALSE) {
1967 printf(
"JS_NewNumberValue failed for %f in simplecopyelements.\n",dd);
1973 #ifdef JSVRMLCLASSESVERBOSE
1974 printf (
"setting changed flag on %p\n",obj);
1979 case FIELDTYPE_MFInt32:
1980 case FIELDTYPE_MFBool:
1981 case FIELDTYPE_MFTime:
1982 case FIELDTYPE_MFFloat:
1983 case FIELDTYPE_MFString: {
1984 SET_MF_ECMA_HAS_CHANGED
1991 if (JSVAL_IS_INT(
id)) {
1994 #ifdef JSVRMLCLASSESVERBOSE
1995 printf (
"saving element %d\n",JSVAL_TO_INT(
id));
1998 if (!JS_DefineElement(cx, obj, JSVAL_TO_INT(
id), *vp,
1999 JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK,
2000 JSPROP_ENUMERATE)) {
2001 printf(
"JS_DefineElement failed in doMFSetProperty.\n");
2006 if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &myv)) {
2007 printf(
"JS_GetProperty failed for \"%s\" in doMFSetProperty.\n", MF_LENGTH_FIELD);
2011 #ifdef JSVRMLCLASSESVERBOSE
2012 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);
2015 if (JSVAL_TO_INT(myv) < (JSVAL_TO_INT(
id)+1)) {
2016 printf (
"new length is %d\n",JSVAL_TO_INT(
id)+1);
2017 myv = INT_TO_JSVAL(JSVAL_TO_INT(
id)+1);
2018 if (!JS_SetProperty(cx, obj, MF_LENGTH_FIELD, &myv)) {
2019 printf(
"JS_SetProperty failed for \"%s\" in doMFSetProperty.\n", MF_LENGTH_FIELD);
2025 #ifdef JSVRMLCLASSESVERBOSE
2026 printf (
"doMFSetProperty, lets see if we have an SFNode somewhere up the chain...\n");
2036 par = JS_GetParentFw(cx, me);
2037 while (par != NULL) {
2038 #ifdef JSVRMLCLASSESVERBOSE
2039 printf (
"for obj %p: ",me);
2040 printJSNodeType(cx,me);
2041 printf (
"... parent %p\n",par);
2042 printJSNodeType(cx,par);
2045 if (JS_InstanceOf (cx, par, &SFNodeClass, NULL)) {
2046 #ifdef JSVRMLCLASSESVERBOSE
2047 printf (
" the parent IS AN SFNODE - it is %p\n",par);
2051 if (!JS_GetProperty(cx, obj,
"_parentField", &pf)) {
2052 printf (
"doMFSetProperty, can not get parent field from this object\n");
2056 nf = OBJECT_TO_JSVAL(me);
2058 #ifdef JSVRMLCLASSESVERBOSE
2059 #if JS_VERSION < 185
2060 printf (
"parentField is %u \"%s\"\n", (
unsigned int)pf, JS_GetStringBytes(JSVAL_TO_STRING(pf)));
2062 _cc = JS_EncodeString(cx,JSVAL_TO_STRING(pf));
2063 printf (
"parentField is %u \"%s\"\n", (
unsigned int)pf, _cc);
2068 if (!JS_ValueToId(cx,pf,&oid)) {
2069 printf(
"doMFSetProperty: JS_ValueToId failed.\n");
2072 #if JS_VERSION == 186
2075 JSHandleObject hobj;
2077 JSMutableHandleValue hvp;
2081 setSFNodeField(cx,hobj,hiid,JS_FALSE,hvp);
2097 par = JS_GetParentFw(cx, me);
2105doMFStringUnquote(JSContext *cx, jsval *vp)
2107 JSString *_str, *_vpStr;
2108 char *_buff, *_tmp_vpStr;
2110 unsigned int i, j = 0;
2112 _str = JS_ValueToString(cx, *vp);
2113 _buff = JS_EncodeString(cx,_str);
2115 _buff_len = strlen(_buff) + 1;
2117 #ifdef JSVRMLCLASSESVERBOSE
2118 printf(
"doMFStringUnquote: vp = \"%s\"\n", _buff);
2121 if (memchr(_buff,
'"', _buff_len) != NULL) {
2122 _tmp_vpStr = MALLOC(
char *, _buff_len *
sizeof(
char));
2124 memset(_tmp_vpStr, 0, _buff_len);
2126 for (i = 0; i <= (_buff_len-1); i++) {
2127 if (_buff[i] !=
'"' ||
2128 (i > 0 && _buff[i - 1] ==
'\\')) {
2129 _tmp_vpStr[j++] = _buff[i];
2132 #ifdef JSVRMLCLASSESVERBOSE
2133 printf (
"new unquoted string %s\n",_tmp_vpStr);
2136 _vpStr = JS_NewStringCopyZ(cx, _tmp_vpStr);
2137 *vp = STRING_TO_JSVAL(_vpStr);
2139 FREE_IF_NZ (_tmp_vpStr);
2149globalResolve(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid){
2150 JSObject *obj = *hobj.address();
2151 jsid
id = *hiid.address();
2161JSBool loadVrmlClasses(JSContext *context, JSObject *globalObj) {
2168 while (JSLoadProps[i].fwclass != NULL) {
2169 #ifdef JSVRMLCLASSESVERBOSE
2170 printf (
"loading %s\n",JSLoadProps[i].
id);
2174 if (( myProto = JS_InitClass(context, globalObj, NULL, JSLoadProps[i].fwclass,
2175 (JSNative)JSLoadProps[i].constr, INIT_ARGC, (
const JSPropertySpec*)JSLoadProps[i].Properties,
2176 (
const JSFunctionSpec *)JSLoadProps[i].Functions, NULL, NULL)) == NULL) {
2177 printf(
"JS_InitClass for %s failed in loadVrmlClasses.\n",JSLoadProps[i].
id);
2180 v = OBJECT_TO_JSVAL(myProto);
2181 if (!JS_SetProperty(context, globalObj, JSLoadProps[i].
id, &v)) {
2182 printf(
"JS_SetProperty for %s failed in loadVrmlClasses.\n",JSLoadProps[i].
id);
2192int findNameInECMATable(JSContext *context,
char *toFind) {
2194 ppjsVRMLClasses p = (ppjsVRMLClasses)gglobal()->jsVRMLClasses.prv;
2195 #ifdef JSVRMLCLASSESVERBOSE
2196 printf (
"findNameInECMATable, looking for %s context %p\n",toFind,context);
2200 while (i < p->maxECMAVal) {
2201 #ifdef JSVRMLCLASSESVERBOSE
2202 printf (
" %d: %s==%s cx %p==%p\n",i,p->ECMAValues[i].name,toFind,p->ECMAValues[i].context,context);
2206 if ((p->ECMAValues[i].context == context) && (strcmp(p->ECMAValues[i].name,toFind)==0)) {
2207 #ifdef JSVRMLCLASSESVERBOSE
2208 printf (
"fineInECMATable: found value at %d\n",i);
2210 return p->ECMAValues[i].valueChanged;
2216 #ifdef JSVRMLCLASSESVERBOSE
2217 printf (
"findInECMATable - did not find %s\n",toFind);
2224void resetNameInECMATable(JSContext *context,
char *toFind) {
2226 ppjsVRMLClasses p = (ppjsVRMLClasses)gglobal()->jsVRMLClasses.prv;
2227 #ifdef JSVRMLCLASSESVERBOSE
2228 printf (
"findNameInECMATable, looking for %s\n",toFind);
2232 while (i < p->maxECMAVal) {
2233 #ifdef JSVRMLCLASSESVERBOSE
2234 printf (
" %d: %s==%s cx %p==%p\n",i,p->ECMAValues[i].name,toFind,p->ECMAValues[i].context,context);
2238 if ((p->ECMAValues[i].context == context) && (strcmp(p->ECMAValues[i].name,toFind)==0)) {
2239 #ifdef JSVRMLCLASSESVERBOSE
2240 printf (
"fineInECMATable: found value at %d\n",i);
2242 p->ECMAValues[i].valueChanged = FALSE;
2253void setInECMATable(JSContext *context,
char *toFind) {
2255 ppjsVRMLClasses p = (ppjsVRMLClasses)gglobal()->jsVRMLClasses.prv;
2256 #ifdef JSVRMLCLASSESVERBOSE
2257 printf (
"setInECMATable, looking for %s\n",toFind);
2261 while (i < p->maxECMAVal) {
2262 #ifdef JSVRMLCLASSESVERBOSE
2263 printf (
" %d: %s==%s cx %p==%p\n",i,p->ECMAValues[i].name,toFind,p->ECMAValues[i].context,context);
2267 if ((p->ECMAValues[i].context == context) && (strcmp(p->ECMAValues[i].name,toFind)==0)) {
2268 #ifdef JSVRMLCLASSESVERBOSE
2269 printf (
"setInECMATable: found value at %d\n",i);
2271 p->ECMAValues[i].valueChanged = TRUE;
2278 #ifdef JSVRMLCLASSESVERBOSE
2279 printf (
"setInECMATable - new entry at %d for %s\n",p->maxECMAVal, toFind);
2283 if (p->maxECMAVal == ECMAValueTableSize) {
2284 ConsoleMessage (
"problem in setInECMATable for scripting\n");
2285 p->maxECMAVal = ECMAValueTableSize - 10;
2288 p->ECMAValues[p->maxECMAVal-1].JS_address = INT_TO_JSVAL(0);
2290 p->ECMAValues[p->maxECMAVal-1].valueChanged = TRUE;
2291 p->ECMAValues[p->maxECMAVal-1].name = STRDUP(toFind);
2292 p->ECMAValues[p->maxECMAVal-1].context = context;
2326void X3D_ECMA_TO_JS(JSContext *cx,
void *Data,
int datalen,
int dataType, jsval *newval);
2327void X3D_MF_TO_JS(JSContext *cx, JSObject *obj,
void *Data,
int dataType, jsval *newval,
char *fieldName);
2328void X3D_MF_TO_JS_B(JSContext *cx,
void *Data,
int dataType,
int *valueChanged, jsval *newval);
2329void X3D_SF_TO_JS(JSContext *cx, JSObject *obj,
void *Data,
unsigned datalen,
int dataType, jsval *newval);
2330void X3D_SF_TO_JS_B(JSContext *cx,
void *Data,
unsigned datalen,
int dataType,
int *valueChanged, jsval *newval);
2333getECMANative(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
2334 JSObject *obj = *hobj.address();
2335 jsid iid = *hiid.address();
2336 jsval *vp = hvp.address();
2338 if(SM_method() == 2){
2342 JSString *_idStr, *_vpStr;
2343 char *_id_c, *fieldname, *_vp_c;
2347 if (!JS_IdToValue(cx,iid,&
id)) {
2348 printf(
"getECMANative: JS_IdToValue failed -- returning JS_TRUE anyways\n");
2352 _idStr = JS_ValueToString(cx,
id);
2355 _id_c = JS_EncodeString(cx,_idStr);
2382 if(!strncmp(fieldname,
"__eventIn_Value_",strlen(
"__eventIn_Value_")))
2383 fieldname = &fieldname[strlen(
"__eventIn_Value_")];
2386 int type, kind, iifield, ifound, sfsize, sftype;
2393 valueChanged = NULL;
2395 ifound = getFieldFromScript(script,fieldname,&type,&kind,&iifield,&value,&valueChanged);
2397 sftype = type2SF(type);
2398 sfsize = sizeofSForMF(sftype);
2403 case FIELDTYPE_SFBool:
2404 case FIELDTYPE_SFFloat:
2405 case FIELDTYPE_SFTime:
2406 case FIELDTYPE_SFDouble:
2407 case FIELDTYPE_SFInt32:
2408 case FIELDTYPE_SFString:
2409 X3D_ECMA_TO_JS(cx, value,sfsize,type,vp);
2411 case FIELDTYPE_SFColor:
2412 case FIELDTYPE_SFNode:
2413 case FIELDTYPE_SFVec2f:
2414 case FIELDTYPE_SFVec3f:
2415 case FIELDTYPE_SFVec3d:
2416 case FIELDTYPE_SFRotation:
2418 X3D_SF_TO_JS_B(cx, value,sfsize, type, valueChanged, vp);
2420 case FIELDTYPE_MFColor:
2421 case FIELDTYPE_MFVec3f:
2422 case FIELDTYPE_MFVec2f:
2423 case FIELDTYPE_MFFloat:
2424 case FIELDTYPE_MFTime:
2425 case FIELDTYPE_MFInt32:
2426 case FIELDTYPE_MFString:
2427 case FIELDTYPE_MFNode:
2428 case FIELDTYPE_MFRotation:
2429 case FIELDTYPE_SFImage:
2431 X3D_MF_TO_JS_B(cx, value, type, valueChanged, vp);
2433 default: printf (
"unhandled type FIELDTYPE_ %d in getSFNodeField\n", type) ;
2437 printf(
"getECMANative didn't find field %s in script\n",fieldname);
2453setECMANative(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp){
2454 JSObject *obj = *hobj.address();
2455 jsid iid = *hiid.address();
2456 jsval *vp = hvp.address();
2459 JSString *_vpStr, *_newVpStr;
2460 JSBool ret = JS_TRUE;
2461 char *_id_c, *fieldname;
2463 char *_vp_c, *_new_vp_c;
2467 if (!JS_IdToValue(cx,iid,&
id)) {
2468 printf(
"JS_IdToValue failed\n");
2472 _idStr = JS_ValueToString(cx,
id);
2473 _id_c = JS_EncodeString(cx,_idStr);
2479 if(!strncmp(fieldname,
"__eventIn_Value_",strlen(
"__eventIn_Value_")))
2480 fieldname = &fieldname[strlen(
"__eventIn_Value_")];
2481 if(SM_method() == 2){
2482 int type, kind, iifield, *valueChanged, ifound;
2484 valueChanged = NULL;
2490 ifound = getFieldFromScript(script,fieldname,&type,&kind,&iifield,&value,&valueChanged);
2505 if (JSVAL_IS_NULL(*vp)){
2506 if(type == FIELDTYPE_SFNode)
2507 value->sfnode = NULL;
2511 }
else if ((*vp).isObject()) {
2513 if ((rhs = (
AnyNative *)JS_GetPrivateFw(cx, JSVAL_TO_OBJECT(*vp))) == NULL) {
2519 if(type == rhs->type){
2524 shallow_copy_field(rhs->type,rhs->v,value);
2531 int sfsize = sizeofSForMF(type);
2533 switch(type2SF(type)){
2534 case FIELDTYPE_SFBool:
2535 case FIELDTYPE_SFFloat:
2536 case FIELDTYPE_SFTime:
2537 case FIELDTYPE_SFDouble:
2538 case FIELDTYPE_SFInt32:
2539 case FIELDTYPE_SFString:
2541 JS_ECMA_TO_X3D(cx, value, sfsize,type,vp);
2554 printf(
"set didn't find field %s in script\n",fieldname);
2558 setInECMATable(cx, _id_c);
2560 if (JSVAL_IS_STRING(*vp)) {
2561 _vpStr = JS_ValueToString(cx, *vp);
2562 _vp_c = JS_EncodeString(cx,_vpStr);
2564 len = strlen(_vp_c);
2568 _new_vp_c = MALLOC(
char *, (len + 3) *
sizeof(
char));
2574 memset(_new_vp_c, 0, len);
2576 sprintf(_new_vp_c,
"%.*s", (
int) len, _vp_c);
2577 _newVpStr = JS_NewStringCopyZ(cx, _new_vp_c);
2578 *vp = STRING_TO_JSVAL(_newVpStr);
2580 #ifdef JSVRMLCLASSESVERBOSE
2581 printf(
"setECMANative: have string obj = %p, id = \"%s\", vp = %s\n",
2582 obj, _id_c, _new_vp_c);
2584 FREE_IF_NZ (_new_vp_c);
2588 #ifdef JSVRMLCLASSESVERBOSE
2589 _vpStr = JS_ValueToString(cx, *vp);
2591 _vp_c = JS_GetStringBytes(_vpStr);
2593 _vp_c = JS_EncodeString(cx,_vpStr);
2595 printf(
"setECMANative: obj = %p, id = \"%s\", vp = %s\n",
2597#if JS_VERSION >= 185
2611getAssignProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JS::MutableHandle<JS::Value> hvp){
2612 JSObject *obj = *hobj.address();
2613 jsid iid = *hiid.address();
2614 jsval *vp = hvp.address();
2618 #ifdef JSVRMLCLASSESVERBOSE
2619 JSString *_idStr, *_vpStr;
2620 char *_id_c, *_vp_c;
2622#if JS_VERSION >= 185
2624 if (!JS_IdToValue(cx,iid,&
id)) {
2625 printf(
"getAssignProperty: JS_IdToValue failed -- returning JS_TRUE anyways\n");
2629 _idStr = JS_ValueToString(cx,
id);
2630 _vpStr = JS_ValueToString(cx, *vp);
2632 _id_c = JS_GetStringBytes(_idStr);
2633 _vp_c = JS_GetStringBytes(_vpStr);
2635 _id_c = JS_EncodeString(cx,_idStr);
2636 _vp_c = JS_EncodeString(cx,_vpStr);
2638 printf(
"getAssignProperty: obj = %p, id = \"%s\", vp = %s\n",
2640 printf (
"what is vp? \n");
2641 if (JSVAL_IS_OBJECT(*vp)) printf (
"is OBJECT\n");
2642 if (JSVAL_IS_STRING(*vp)) printf (
"is STRING\n");
2643 if (JSVAL_IS_INT(*vp)) printf (
"is INT\n");
2644 if (JSVAL_IS_DOUBLE(*vp)) printf (
"is DOUBLE\n");
2646#if JS_VERSION >= 185
2658setAssignProperty(JSContext *cx, JS::Handle<JSObject*> hobj, JS::Handle<jsid> hiid, JSBool strict, JS::MutableHandle<JS::Value> hvp){
2659 JSObject *obj = *hobj.address();
2660 jsid iid = *hiid.address();
2661 jsval *vp = hvp.address();
2665 const uintN _argc = 2;
2667 jsval newVal, initVal, _argv[2];
2669 jsval newVal, initVal, _argv[_argc];
2676 if (!JS_IdToValue(cx,iid,&
id)) {
2677 printf(
"setAssignProperty: JS_IdToValue failed.\n");
2682 if (JSVAL_IS_STRING(
id)) {
2683 if (!JS_ConvertValue(cx, *vp, JSTYPE_OBJECT, &newVal)) {
2684 printf(
"JS_ConvertValue failed in setAssignProperty.\n");
2688 _str = JSVAL_TO_STRING(
id);
2689 _id_c = JS_EncodeString(cx,_str);
2690 if (!JS_GetProperty(cx, obj, _id_c, &initVal)) {
2691 printf(
"JS_GetProperty failed in setAssignProperty.\n");
2695 #ifdef JSVRMLCLASSESVERBOSE
2696 printf(
"setAssignProperty: obj = %p, id = \"%s\", from = %d, to = %d\n",
2697 obj, _id_c, (
int)newVal, (
int)initVal);
2699 if (JSVAL_IS_OBJECT(initVal)) printf (
"initVal is an OBJECT\n");
2700 if (JSVAL_IS_STRING(initVal)) printf (
"initVal is an STRING\n");
2701 if (JSVAL_IS_NUMBER(initVal)) printf (
"initVal is an NUMBER\n");
2702 if (JSVAL_IS_DOUBLE(initVal)) printf (
"initVal is an DOUBLE\n");
2703 if (JSVAL_IS_INT(initVal)) printf (
"initVal is an INT\n");
2705 if (JSVAL_IS_OBJECT(newVal)) printf (
"newVal is an OBJECT\n");
2706 if (JSVAL_IS_STRING(newVal)) printf (
"newVal is an STRING\n");
2707 if (JSVAL_IS_NUMBER(newVal)) printf (
"newVal is an NUMBER\n");
2708 if (JSVAL_IS_DOUBLE(newVal)) printf (
"newVal is an DOUBLE\n");
2709 if (JSVAL_IS_INT(newVal)) printf (
"newVal is an INT\n");
2711 if (JSVAL_IS_OBJECT(
id)) printf (
"id is an OBJECT\n");
2712 if (JSVAL_IS_STRING(
id)) printf (
"id is an STRING\n");
2713 if (JSVAL_IS_NUMBER(
id)) printf (
"id is an NUMBER\n");
2714 if (JSVAL_IS_DOUBLE(
id)) printf (
"id is an DOUBLE\n");
2715 if (JSVAL_IS_INT(
id)) printf (
"id is an INT\n");
2718 printf (
"id is %s\n",JS_GetStringBytes(JS_ValueToString(cx,
id)));
2719 printf (
"initVal is %s\n",JS_GetStringBytes(JS_ValueToString(cx,initVal)));
2720 printf (
"newVal is %s\n",JS_GetStringBytes(JS_ValueToString(cx,newVal)));
2722 printf (
"id is %s\n",JS_EncodeString(cx,JS_ValueToString(cx,
id)));
2723 printf (
"initVal is %s\n",JS_EncodeString(cx,JS_ValueToString(cx,initVal)));
2724 printf (
"newVal is %s\n",JS_EncodeString(cx,JS_ValueToString(cx,newVal)));
2730 _o = JSVAL_TO_OBJECT(initVal);
2732 #ifdef xxJSVRMLCLASSESVERBOSE
2733 printf (
"in setAssignProperty, o is %u type ",_o);
2734 printJSNodeType(cx,_o);
2741 if (!JS_CallFunctionName(cx, _o,
"assign", _argc, _argv, vp)) {
2742 printf(
"JS_CallFunctionName failed in setAssignProperty.\n");
2746 #ifdef JSVRMLCLASSESVERBOSE
2747 _str = JS_ValueToString(cx,
id);
2749 _id_c = JS_GetStringBytes(_str);
2751 _id_c = JS_EncodeString(cx,_str);
2753 printf(
"setAssignProperty: obj = %p, id = \"%s\"\n",
2755#if JS_VERSION >= 185