FreeWRL / FreeX3D 4.3.0
jsVRML_MFClasses.c
1/*
2
3
4???
5
6*/
7
8/****************************************************************************
9 This file is part of the FreeWRL/FreeX3D Distribution.
10
11 Copyright 2009 CRC Canada. (http://www.crc.gc.ca)
12
13 FreeWRL/FreeX3D is free software: you can redistribute it and/or modify
14 it under the terms of the GNU Lesser Public License as published by
15 the Free Software Foundation, either version 3 of the License, or
16 (at your option) any later version.
17
18 FreeWRL/FreeX3D is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with FreeWRL/FreeX3D. If not, see <http://www.gnu.org/licenses/>.
25****************************************************************************/
26
27
28
29#include <config.h>
30#if !defined(JS_SMCPP)
31#include <system.h>
32//#if !(defined(JAVASCRIPT_STUB) || defined(JAVASCRIPT_DUK))
33#ifdef JAVASCRIPT_SM
34
35#include <system_threads.h>
36#include <display.h>
37#include <internal.h>
38
39#include <libFreeWRL.h>
40
41#include "../vrml_parser/Structs.h"
42#include "../main/headers.h"
43#include "../vrml_parser/CParseGeneral.h"
44#include "../main/Snapshot.h"
45#include "../scenegraph/Collision.h"
46#include "../scenegraph/quaternion.h"
47#include "../scenegraph/Viewer.h"
48#include "../input/SensInterps.h"
49#include "../x3d_parser/Bindable.h"
50#include "../scenegraph/LinearAlgebra.h"
51
52#include "JScript.h"
53#include "CScripts.h"
54#include "jsUtils.h"
55#include "jsNative.h"
56#include "jsVRMLClasses.h"
57#include "JScript.h"
58
59
60
61/********************************************************/
62/* */
63/* Third part - MF classes */
64/* */
65/********************************************************/
66
67/* remove any private data from this datatype, and let the garbage collector handle the object */
68
69void
70#if JS_VERSION < 186
71JS_MY_Finalize(JSContext *cx, JSObject *obj){
72#else
73JS_MY_Finalize(JSFreeOp *fop, JSObject *obj){
74JSContext *cx = NULL;
75#endif
76
77 void *ptr;
78 #ifdef JSVRMLCLASSESVERBOSE
79 printf ("finalizing %p\n",obj);
80 //printJSNodeType(cx,obj);
81 #endif
82
83 REMOVE_ROOT(cx,obj)
84
85 if ((ptr = (void *)JS_GetPrivateFw(cx, obj)) != NULL) {
86
87 if(SM_method() == 0)
88 FREE_IF_NZ (ptr);
89 if(SM_method() == 2){
90 AnyNative *any = (AnyNative*)ptr;
91 if(any->gc) FREE_IF_NZ(any->v);
92 }
93
94 JS_SetPrivateFw(cx,obj,NULL);
95 FREE_IF_NZ(ptr);
96
97 }
98
99 #ifdef JSVRMLCLASSESVERBOSE
100 } else {
101 printf ("Finalize - no private data!\n");
102 }
103 #endif
104
105}
106
107
108JSBool
109#if JS_VERSION < 185
110MFColorToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
111#else
112MFColorToString(JSContext *cx, uintN argc, jsval *vp) {
113 JSObject *obj = JS_THIS_OBJECT(cx,vp);
114 jsval *argv = JS_ARGV(cx,vp);
115 jsval rval;
116#endif
117 UNUSED(argc);
118 UNUSED(argv);
119#if JS_VERSION < 185
120 return doMFToString(cx, obj, "MFColor", rval);
121#else
122 if (!doMFToString(cx, obj, "MFColor", &rval)) { return JS_FALSE; }
123 JS_SET_RVAL(cx,vp,rval);
124 return JS_TRUE;
125#endif
126}
127
128JSBool
129#if JS_VERSION < 185
130MFColorAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
131 return _standardMFAssign (cx, obj, argc, argv, rval, &MFColorClass,FIELDTYPE_SFColor);
132#else
133MFColorAssign(JSContext *cx, uintN argc, jsval *vp) {
134 JSObject *obj = JS_THIS_OBJECT(cx,vp);
135 jsval *argv = JS_ARGV(cx,vp);
136 jsval rval;
137 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFColorClass,FIELDTYPE_SFColor)) { return JS_FALSE; }
138 JS_SET_RVAL(cx,vp,rval);
139 return JS_TRUE;
140#endif
141}
142
143JSBool
144#if JS_VERSION < 185
145MFColorConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
146#else
147MFColorConstr(JSContext *cx, uintN argc, jsval *vp) {
148 JSObject *obj = JS_NewObject(cx,&MFColorClass,NULL,NULL);
149 jsval *argv = JS_ARGV(cx,vp);
150 jsval rval = OBJECT_TO_JSVAL(obj);
151 if (!MFColorConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
152 JS_SET_RVAL(cx,vp,rval);
153 return JS_TRUE;
154}
155JSBool MFColorConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
156#endif
157 JSObject *_arrayObj;
158 int isArray;
159 JSObject *_obj;
160 unsigned int i;
161 union anyVrml *anyv;
162
163 ADD_ROOT(cx,obj)
164
165 isArray = FALSE;
166 if(argc == 1 && argv){
167 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
168 // tests/JohnCarlson/Arc1A.x3d
169 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
170 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
171 return JS_FALSE;
172 }
173
174 if(JS_IsArrayObject(cx, _arrayObj)){
175 jsuint lengthp;
176 jsval vp;
177 //printf("its an array\n");
178 isArray = TRUE;
179 JS_GetArrayLength(cx,_arrayObj, &lengthp);
180 argc = lengthp;
181 }
182 }
183
184 if(SM_method() == 2){
185 AnyNative *any;
186 int newsize;
187 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFColor,NULL,NULL)) == NULL){
188 printf( "AnyfNativeNew failed in MFColorConstr.\n");
189 return JS_FALSE;
190 }
191 if (!JS_SetPrivateFw(cx, obj, any)) {
192 printf( "JS_SetPrivate failed in MFColorConstr.\n");
193 return JS_FALSE;
194 }
195 anyv = any->v;
196 newsize = sizeof(struct SFColor)*upper_power_of_two(argc);
197 if(argc > 0){
198 anyv->mfcolor.p = MALLOC(struct SFColor*,newsize);
199 memset(anyv->mfcolor.p,0,newsize);
200 }
201
202 }else{
203 DEFINE_LENGTH(cx,obj,argc)
204 }
205 if (!argv) {
206 return JS_TRUE;
207 }
208
209 #ifdef JSVRMLCLASSESVERBOSE
210 printf("MFColorConstr: obj = %p, %u args\n",
211 obj, argc);
212 #endif
213
214 for (i = 0; i < argc; i++) {
215 jsval vp;
216 if(isArray){
217 JS_GetElement(cx, _arrayObj, i, &vp);
218
219 }else{
220 vp = argv[i];
221 }
222 if (!JS_ValueToObject(cx, vp, &_obj)) {
223 printf(
224 "JS_ValueToObject failed in MFColorConstr.\n");
225 return JS_FALSE;
226 }
227
228 CHECK_CLASS(cx,_obj,NULL,__FUNCTION__,SFColorClass)
229 if(SM_method()==2){
230 AnyNative *any2;
231 if((any2 = JS_GetPrivateFw(cx,_obj)) != NULL){
232 //2018 I think as long as its 3+ contiguous floats, we can use it as a color,
233 // but in future internal types might change
234 if(any2->type == FIELDTYPE_SFColor || any2->type == FIELDTYPE_SFVec3f || any2->type == FIELDTYPE_SFColorRGBA){
235 shallow_copy_field(FIELDTYPE_SFColor,any2->v,(union anyVrml*)&anyv->mfcolor.p[i]);
236 anyv->mfcolor.n = i+1;
237 }
238 }
239 // else for now we'll leave zeros
240 }else{
241 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
242 printf( "JS_DefineElement failed for arg %u in MFColorConstr.\n", i);
243 return JS_FALSE;
244 }
245 }
246 }
247 *rval = OBJECT_TO_JSVAL(obj);
248 return JS_TRUE;
249}
250
251JSBool
252#if JS_VERSION < 185
253MFColorAddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
254#elif JS_VERSION == 185
255MFColorAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){
256#else
257MFColorAddProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
258 JSObject *obj = *hobj._;
259 jsid id = *hiid._;
260 jsval *vp = hvp._;
261#endif
262 return doMFAddProperty(cx, obj, id, vp,"MFColorAddProperty");
263}
264
265JSBool
266#if JS_VERSION < 185
267MFColorGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
268#elif JS_VERSION == 185
269MFColorGetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){
270#else
271MFColorGetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
272 JSObject *obj = *hobj._;
273 jsid id = *hiid._;
274 jsval *vp = hvp._;
275#endif
276 return _standardMFGetProperty(cx, obj, id, vp,
277 "_FreeWRL_Internal = new SFColor()", FIELDTYPE_MFColor);
278}
279
280JSBool
281#if JS_VERSION < 185
282MFColorSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
283#elif JS_VERSION == 185
284MFColorSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp){
285#else
286MFColorSetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSBool strict, JSMutableHandleValue hvp){
287 JSObject *obj = *hobj._;
288 jsid id = *hiid._;
289 jsval *vp = hvp._;
290#endif
291
292 return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFColor);
293}
294
295JSBool
296#if JS_VERSION < 185
297MFFloatToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
298#else
299MFFloatToString(JSContext *cx, uintN argc, jsval *vp) {
300 JSObject *obj = JS_THIS_OBJECT(cx,vp);
301 jsval *argv = JS_ARGV(cx,vp);
302 jsval rval;
303#endif
304 UNUSED(argc);
305 UNUSED(argv);
306#if JS_VERSION < 185
307 return doMFToString(cx, obj, "MFFloat", rval);
308#else
309 if (!doMFToString(cx, obj, "MFFloat", &rval)) {
310 return JS_FALSE; }
311 JS_SET_RVAL(cx,vp,rval);
312 return JS_TRUE;
313#endif
314}
315
316JSBool
317#if JS_VERSION < 185
318MFFloatAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
319#else
320MFFloatAssign(JSContext *cx, uintN argc, jsval *vp) {
321 JSObject *obj = JS_THIS_OBJECT(cx,vp);
322 jsval *argv = JS_ARGV(cx,vp);
323 jsval rval;
324#endif
325 SET_MF_ECMA_HAS_CHANGED
326
327#if JS_VERSION < 185
328 return _standardMFAssign (cx, obj, argc, argv, rval, &MFFloatClass,FIELDTYPE_SFFloat);
329#else
330 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFFloatClass,FIELDTYPE_SFFloat)) { return JS_FALSE; }
331 JS_SET_RVAL(cx,vp,rval);
332 return JS_TRUE;
333#endif
334}
335
336JSBool
337#if JS_VERSION < 185
338MFFloatConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
339#else
340MFFloatConstr(JSContext *cx, uintN argc, jsval *vp) {
341 JSObject *obj = JS_NewObject(cx,&MFFloatClass,NULL,NULL);
342 jsval *argv = JS_ARGV(cx,vp);
343 jsval rval = OBJECT_TO_JSVAL(obj);
344 if (!MFFloatConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
345 JS_SET_RVAL(cx,vp,rval);
346 return JS_TRUE;
347}
348JSBool MFFloatConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
349#endif
350 JSObject *_arrayObj;
351 int isArray;
352
353 jsdouble _d;
354 unsigned int i;
355 union anyVrml *anyv;
356
357 ADD_ROOT(cx,obj)
358
359 isArray = FALSE;
360 if(argc == 1 && argv){
361 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
362 // tests/JohnCarlson/Arc1A.x3d
363 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
364 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
365 return JS_FALSE;
366 }
367
368 if(JS_IsArrayObject(cx, _arrayObj)){
369 jsuint lengthp;
370 jsval vp;
371 //printf("its an array\n");
372 isArray = TRUE;
373 JS_GetArrayLength(cx,_arrayObj, &lengthp);
374 argc = lengthp;
375 }
376 }
377
378 if(SM_method() == 2){
379 AnyNative *any;
380 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFFloat,NULL,NULL)) == NULL){
381 printf( "AnyfNativeNew failed in MFFloatConstr.\n");
382 return JS_FALSE;
383 }
384 if (!JS_SetPrivateFw(cx, obj, any)) {
385 printf( "JS_SetPrivate failed in MFFloatConstr.\n");
386 return JS_FALSE;
387 }
388 anyv = any->v;
389 if(argc > 0)
390 anyv->mffloat.p = malloc(sizeof(float)*upper_power_of_two(argc));
391
392 }else{
393 DEFINE_LENGTH(cx,obj,argc)
394 DEFINE_MF_ECMA_HAS_CHANGED
395 }
396
397 if (!argv) {
398 return JS_TRUE;
399 }
400
401 #ifdef JSVRMLCLASSESVERBOSE
402 printf("MFFloatConstr: obj = %p, %u args\n", obj, argc);
403 #endif
404 for (i = 0; i < argc; i++) {
405 jsval vp;
406 if(isArray){
407 JS_GetElement(cx, _arrayObj, i, &vp);
408
409 }else{
410 vp = argv[i];
411 }
412 if (!JS_ValueToNumber(cx, vp, &_d)) {
413 printf( "JS_ValueToNumber failed in MFFloatConstr.\n");
414 return JS_FALSE;
415 }
416 if(SM_method()==2){
417 anyv->mffloat.p[i] = _d;
418 anyv->mffloat.n = i+1;
419 }else{
420 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
421 printf( "JS_DefineElement failed for arg %u in MFFloatConstr.\n", i);
422 return JS_FALSE;
423 }
424 }
425 }
426 *rval = OBJECT_TO_JSVAL(obj);
427 return JS_TRUE;
428}
429
430JSBool
431#if JS_VERSION < 185
432MFFloatAddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
433#elif JS_VERSION == 185
434MFFloatAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){
435#else
436MFFloatAddProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
437 JSObject *obj = *hobj._;
438 jsid id = *hiid._;
439 jsval *vp = hvp._;
440#endif
441 return doMFAddProperty(cx, obj, id, vp,"MFFloatAddProperty");
442}
443
444JSBool
445#if JS_VERSION < 185
446MFFloatGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
447#elif JS_VERSION == 185
448MFFloatGetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){
449#else
450MFFloatGetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
451 JSObject *obj = *hobj._;
452 jsid id = *hiid._;
453 jsval *vp = hvp._;
454#endif
455 return _standardMFGetProperty(cx, obj, id, vp,
456 "_FreeWRL_Internal = 0.0", FIELDTYPE_MFFloat);
457}
458
459JSBool
460#if JS_VERSION < 185
461MFFloatSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
462#elif JS_VERSION == 185
463MFFloatSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp){
464#else
465MFFloatSetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSBool strict, JSMutableHandleValue hvp){
466 JSObject *obj = *hobj._;
467 jsid id = *hiid._;
468 jsval *vp = hvp._;
469#endif
470 return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFFloat);
471}
472
473
474JSBool
475#if JS_VERSION < 185
476MFInt32ToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
477#else
478MFInt32ToString(JSContext *cx, uintN argc, jsval *vp) {
479 JSObject *obj = JS_THIS_OBJECT(cx,vp);
480 jsval *argv = JS_ARGV(cx,vp);
481 jsval rval;
482#endif
483 UNUSED(argc);
484 UNUSED(argv);
485 #ifdef JSVRMLCLASSESVERBOSE
486 printf ("start of MFInt32ToString\n");
487 #endif
488
489#if JS_VERSION < 185
490 return doMFToString(cx, obj, "MFInt32", rval);
491#else
492 if (!doMFToString(cx, obj, "MFInt32", &rval)) { return JS_FALSE; }
493 JS_SET_RVAL(cx,vp,rval);
494 return JS_TRUE;
495#endif
496}
497
498JSBool
499#if JS_VERSION < 185
500MFInt32Assign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
501#else
502MFInt32Assign(JSContext *cx, uintN argc, jsval *vp) {
503 JSObject *obj = JS_THIS_OBJECT(cx,vp);
504 jsval *argv = JS_ARGV(cx,vp);
505 jsval rval;
506#endif
507 #ifdef JSVRMLCLASSESVERBOSE
508 printf ("start of MFInt32Assign\n");
509 #endif
510
511 SET_MF_ECMA_HAS_CHANGED
512
513#if JS_VERSION < 185
514 return _standardMFAssign (cx, obj, argc, argv, rval, &MFInt32Class,FIELDTYPE_SFInt32);
515#else
516 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFInt32Class,FIELDTYPE_SFInt32)) { return JS_FALSE; }
517 JS_SET_RVAL(cx,vp,rval);
518 return JS_TRUE;
519#endif
520}
521
522
523JSBool
524#if JS_VERSION < 185
525MFInt32Constr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
526#else
527MFInt32Constr(JSContext *cx, uintN argc, jsval *vp) {
528 JSObject *obj = JS_NewObject(cx,&MFInt32Class,NULL,NULL);
529 jsval *argv = JS_ARGV(cx,vp);
530 jsval rval = OBJECT_TO_JSVAL(obj);
531 if (!MFInt32ConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
532 JS_SET_RVAL(cx,vp,rval);
533 return JS_TRUE;
534}
535JSBool MFInt32ConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
536#endif
537 JSObject *_arrayObj;
538 int isArray;
539 int32 _i;
540 unsigned int i;
541 union anyVrml *anyv;
542 #ifdef JSVRMLCLASSESVERBOSE
543 printf ("start of MFInt32Constr\n");
544 #endif
545
546 ADD_ROOT(cx,obj)
547 isArray = FALSE;
548 if(argc == 1 && argv){
549 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
550 // tests/JohnCarlson/Arc1A.x3d
551 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
552 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
553 return JS_FALSE;
554 }
555
556 if(JS_IsArrayObject(cx, _arrayObj)){
557 jsuint lengthp;
558 jsval vp;
559 //printf("its an array\n");
560 isArray = TRUE;
561 JS_GetArrayLength(cx,_arrayObj, &lengthp);
562 argc = lengthp;
563 }
564 }
565
566 if(SM_method() == 2){
567 AnyNative *any;
568 int newsize;
569 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFInt32,NULL,NULL)) == NULL){
570 printf( "AnyfNativeNew failed in MFInt32Constr.\n");
571 return JS_FALSE;
572 }
573 if (!JS_SetPrivateFw(cx, obj, any)) {
574 printf( "JS_SetPrivate failed in MFInt32Constr.\n");
575 return JS_FALSE;
576 }
577 anyv = any->v;
578 newsize = sizeof(int) * upper_power_of_two(argc); //newsize in bytes
579 if(argc > 0){
580 anyv->mfint32.p = MALLOC(int*,newsize);
581 memset(anyv->mfint32.p,0,newsize);
582 }
583
584 }else{
585 DEFINE_LENGTH(cx,obj,argc)
586 DEFINE_MF_ECMA_HAS_CHANGED
587 }
588 if (!argv) {
589 return JS_TRUE;
590 }
591
592 #ifdef JSVRMLCLASSESVERBOSE
593 printf("MFInt32Constr: obj = %p, %u args\n", obj, argc);
594 #endif
595
596 /* any values here that we should add in? */
597 for (i = 0; i < argc; i++) {
598 jsval vp;
599 if(isArray){
600 JS_GetElement(cx, _arrayObj, i, &vp);
601
602 }else{
603 vp = argv[i];
604 }
605 if (!JS_ValueToInt32(cx, vp, &_i)) {
606 printf( "JS_ValueToInt32 failed in MFInt32Constr.\n");
607 return JS_FALSE;
608 }
609 #ifdef JSVRMLCLASSESVERBOSE
610 printf ("value at %d is %d\n",i,_i);
611 #endif
612 if(SM_method()==2){
613 anyv->mfint32.p[i] = _i;
614 anyv->mfint32.n = i+1;
615 }else{
616 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
617 printf( "JS_DefineElement failed for arg %u in MFInt32Constr.\n", i);
618 return JS_FALSE;
619 }
620 }
621 }
622
623 *rval = OBJECT_TO_JSVAL(obj);
624 return JS_TRUE;
625}
626
627JSBool
628#if JS_VERSION < 185
629MFInt32AddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
630#elif JS_VERSION == 185
631MFInt32AddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){
632#else
633MFInt32AddProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
634 JSObject *obj = *hobj._;
635 jsid id = *hiid._;
636 jsval *vp = hvp._;
637#endif
638 #ifdef JSVRMLCLASSESVERBOSE
639 printf ("start of MFInt32AddProperty\n");
640 #endif
641
642 return doMFAddProperty(cx, obj, id, vp,"MFInt32AddProperty");
643}
644
645JSBool
646#if JS_VERSION < 185
647MFInt32GetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
648#elif JS_VERSION == 185
649MFInt32GetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){
650#else
651MFInt32GetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
652 JSObject *obj = *hobj._;
653 jsid id = *hiid._;
654 jsval *vp = hvp._;
655#endif
656 #ifdef JSVRMLCLASSESVERBOSE
657 printf ("start of MFInt32GetProperty\n");
658 #endif
659
660 return _standardMFGetProperty(cx, obj, id, vp,
661 "_FreeWRL_Internal = 0", FIELDTYPE_MFInt32);
662}
663
664JSBool
665#if JS_VERSION < 185
666MFInt32SetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
667#elif JS_VERSION == 185
668MFInt32SetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp){
669#else
670MFInt32SetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSBool strict, JSMutableHandleValue hvp){
671 JSObject *obj = *hobj._;
672 jsid id = *hiid._;
673 jsval *vp = hvp._;
674#endif
675 #ifdef JSVRMLCLASSESVERBOSE
676 printf ("start of MFInt32SetProperty\n");
677 #endif
678
679 return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFInt32);
680}
681
682
683JSBool
684#if JS_VERSION < 185
685MFNodeToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
686#else
687MFNodeToString(JSContext *cx, uintN argc, jsval *vp) {
688 JSObject *obj = JS_THIS_OBJECT(cx,vp);
689 jsval *argv = JS_ARGV(cx,vp);
690 jsval rval;
691#endif
692 UNUSED(argc);
693 UNUSED(argv);
694
695 #ifdef JSVRMLCLASSESVERBOSE
696 printf ("start of MFNODETOSTRING, obj %p\n",obj);
697 #endif
698#if JS_VERSION < 185
699 return doMFToString(cx, obj, "MFNode", rval);
700#else
701 if (!doMFToString(cx, obj, "MFNode", &rval)) { return JS_FALSE; }
702 JS_SET_RVAL(cx,vp,rval);
703 return JS_TRUE;
704#endif
705}
706
707JSBool
708#if JS_VERSION < 185
709MFNodeAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
710#else
711MFNodeAssign(JSContext *cx, uintN argc, jsval *vp) {
712 JSObject *obj = JS_THIS_OBJECT(cx,vp);
713 jsval *argv = JS_ARGV(cx,vp);
714 jsval rval;
715#endif
716 #ifdef JSVRMLCLASSESVERBOSE
717 printf ("start of MFNODEASSIGN, obj %p\n",obj);
718 #endif
719
720#if JS_VERSION < 185
721 return _standardMFAssign (cx, obj, argc, argv, rval, &MFNodeClass,FIELDTYPE_SFNode);
722#else
723 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFNodeClass,FIELDTYPE_SFNode)) { return JS_FALSE; }
724 JS_SET_RVAL(cx,vp,rval);
725 return JS_TRUE;
726#endif
727}
728
729JSBool
730#if JS_VERSION < 185
731MFNodeConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
732#else
733MFNodeConstr(JSContext *cx, uintN argc, jsval *vp) {
734 JSObject *obj = JS_NewObject(cx,&MFNodeClass,NULL,NULL);
735 jsval *argv = JS_ARGV(cx,vp);
736 jsval rval = OBJECT_TO_JSVAL(obj);
737 if (!MFNodeConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
738 JS_SET_RVAL(cx,vp,rval);
739 return JS_TRUE;
740}
741JSBool MFNodeConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
742#endif
743 JSObject *_arrayObj;
744 int isArray;
745 JSObject *_obj;
746 unsigned int i;
747 union anyVrml *anyv;
748
749 ADD_ROOT(cx,obj)
750 isArray = FALSE;
751 if(argc == 1 && argv){
752 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
753 // tests/JohnCarlson/Arc1A.x3d
754 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
755 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
756 return JS_FALSE;
757 }
758
759 if(JS_IsArrayObject(cx, _arrayObj)){
760 jsuint lengthp;
761 jsval vp;
762 //printf("its an array\n");
763 isArray = TRUE;
764 JS_GetArrayLength(cx,_arrayObj, &lengthp);
765 argc = lengthp;
766 }
767 }
768
769 if(SM_method() == 2){
770 AnyNative *any;
771 int newsize;
772 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFNode,NULL,NULL)) == NULL){
773 printf( "AnyfNativeNew failed in MFNodeConstr.\n");
774 return JS_FALSE;
775 }
776 if (!JS_SetPrivateFw(cx, obj, any)) {
777 printf( "JS_SetPrivate failed in MFNodeConstr.\n");
778 return JS_FALSE;
779 }
780 anyv = any->v;
781 newsize = sizeof(struct X3D_Node *) * upper_power_of_two(argc); //newsize in bytes
782 if(argc > 0){
783 anyv->mfnode.p = MALLOC(struct X3D_Node**,newsize);
784 memset(anyv->mfnode.p,0,newsize);
785 }
786
787 }else{
788 DEFINE_LENGTH(cx,obj,argc)
789 }
790 if (!argv) {
791 return JS_TRUE;
792 }
793
794 #ifdef JSVRMLCLASSESVERBOSE
795 printf("MFNodeConstr: obj = %p, %u args\n", obj, argc);
796 #endif
797
798 for (i = 0; i < argc; i++) {
799 jsval vp;
800 if(isArray){
801 JS_GetElement(cx, _arrayObj, i, &vp);
802
803 }else{
804 vp = argv[i];
805 }
806 if (JSVAL_IS_OBJECT(vp)) {
807
808 if (!JS_ValueToObject(cx, vp, &_obj)) {
809 printf( "JS_ValueToObject failed in MFNodeConstr.\n");
810 return JS_FALSE;
811 }
812
813 CHECK_CLASS(cx,_obj,NULL,__FUNCTION__,SFNodeClass)
814 if(SM_method()==2){
815 AnyNative *any2;
816 if((any2 = JS_GetPrivateFw(cx,_obj)) != NULL){
817 if(any2->type == FIELDTYPE_SFNode){
818 shallow_copy_field(FIELDTYPE_SFNode,any2->v,(union anyVrml*)&anyv->mfnode.p[i]);
819 anyv->mfnode.n = i+1;
820 }
821 }
822 // else for now we'll leave zeros
823 }else{
824 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
825 printf( "JS_DefineElement failed for arg %d in MFNodeConstr.\n", i);
826 return JS_FALSE;
827 }
828 }
829 } else {
830 /* if a NULL is passed in, eg, we have a script with an MFNode eventOut, and
831 nothing sets it, we have a NULL here. Lets just ignore it */
832 /* hmmm - this is not an object - lets see... */
833 #ifdef JSVRMLCLASSESVERBOSE
834 if (JSVAL_IS_NULL(argv[i])) { printf ("MFNodeConstr - its a NULL\n");}
835 if (JSVAL_IS_INT(argv[i])) { printf ("MFNodeConstr - its a INT\n");}
836 if (JSVAL_IS_STRING(argv[i])) { printf ("MFNodeConstr - its a STRING\n");}
837 #endif
838 }
839 }
840 *rval = OBJECT_TO_JSVAL(obj);
841 return JS_TRUE;
842}
843
844JSBool
845#if JS_VERSION < 185
846MFNodeAddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
847#elif JS_VERSION == 185
848MFNodeAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){
849#else
850MFNodeAddProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
851 JSObject *obj = *hobj._;
852 jsid id = *hiid._;
853 jsval *vp = hvp._;
854#endif
855 #ifdef JSVRMLCLASSESVERBOSE
856 printf ("startof MFNODEADDPROPERTY\n");
857 #endif
858 return doMFAddProperty(cx, obj, id, vp,"MFNodeAddProperty");
859}
860
861JSBool
862#if JS_VERSION < 185
863MFNodeGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
864#elif JS_VERSION == 185
865MFNodeGetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){
866#else
867MFNodeGetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
868 JSObject *obj = *hobj._;
869 jsid id = *hiid._;
870 jsval *vp = hvp._;
871#endif
872 #ifdef JSVRMLCLASSESVERBOSE
873 printf ("start of MFNODEGETPROPERTY obj %p\n",obj);
874 #endif
875 return _standardMFGetProperty(cx, obj, id, vp,
876 "_FreeWRL_Internal = 0",
877 FIELDTYPE_MFNode);
878}
879
880JSBool
881#if JS_VERSION < 185
882MFNodeSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
883#elif JS_VERSION == 185
884MFNodeSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp){
885#else
886MFNodeSetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSBool strict, JSMutableHandleValue hvp){
887 JSObject *obj = *hobj._;
888 jsid id = *hiid._;
889 jsval *vp = hvp._;
890#endif /* printf ("start of MFNODESETPROPERTY obj %d\n",obj); */
891 return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFNode);
892}
893
894
895JSBool
896#if JS_VERSION < 185
897MFTimeAddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
898#elif JS_VERSION == 185
899MFTimeAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){
900#else
901MFTimeAddProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
902 JSObject *obj = *hobj._;
903 jsid id = *hiid._;
904 jsval *vp = hvp._;
905#endif
906 return doMFAddProperty(cx, obj, id, vp,"MFTimeAddProperty");
907}
908
909JSBool
910#if JS_VERSION < 185
911MFTimeGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
912#elif JS_VERSION == 185
913MFTimeGetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){
914#else
915MFTimeGetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
916 JSObject *obj = *hobj._;
917 jsid id = *hiid._;
918 jsval *vp = hvp._;
919#endif
920 return _standardMFGetProperty(cx, obj, id, vp,
921 "_FreeWRL_Internal = 0.0",
922 FIELDTYPE_MFTime);
923}
924
925JSBool
926#if JS_VERSION < 185
927MFTimeSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
928#elif JS_VERSION == 185
929MFTimeSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp){
930#else
931MFTimeSetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSBool strict, JSMutableHandleValue hvp){
932 JSObject *obj = *hobj._;
933 jsid id = *hiid._;
934 jsval *vp = hvp._;
935#endif
936 return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFTime);
937}
938
939JSBool
940#if JS_VERSION < 185
941MFTimeToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
942#else
943MFTimeToString(JSContext *cx, uintN argc, jsval *vp) {
944 JSObject *obj = JS_THIS_OBJECT(cx,vp);
945 jsval *argv = JS_ARGV(cx,vp);
946 jsval rval;
947#endif
948 UNUSED(argc);
949 UNUSED(argv);
950#if JS_VERSION < 185
951 return doMFToString(cx, obj, "MFTime", rval);
952#else
953 if (!doMFToString(cx, obj, "MFTime", &rval)) { return JS_FALSE; }
954 JS_SET_RVAL(cx,vp,rval);
955 return JS_TRUE;
956#endif
957}
958
959JSBool
960#if JS_VERSION < 185
961MFTimeConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
962#else
963MFTimeConstr(JSContext *cx, uintN argc, jsval *vp) {
964 JSObject *obj = JS_NewObject(cx,&MFTimeClass,NULL,NULL);
965 jsval *argv = JS_ARGV(cx,vp);
966 jsval rval = OBJECT_TO_JSVAL(obj);
967 if (!MFTimeConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
968 JS_SET_RVAL(cx,vp,rval);
969 return JS_TRUE;
970}
971JSBool MFTimeConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
972#endif
973 JSObject *_arrayObj;
974 int isArray;
975 jsdouble _d;
976 unsigned int i;
977 union anyVrml *anyv;
978
979 ADD_ROOT(cx,obj)
980 isArray = FALSE;
981 if(argc == 1 && argv){
982 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
983 // tests/JohnCarlson/Arc1A.x3d
984 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
985 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
986 return JS_FALSE;
987 }
988
989 if(JS_IsArrayObject(cx, _arrayObj)){
990 jsuint lengthp;
991 jsval vp;
992 //printf("its an array\n");
993 isArray = TRUE;
994 JS_GetArrayLength(cx,_arrayObj, &lengthp);
995 argc = lengthp;
996 }
997 }
998
999 if(SM_method() == 2){
1000 AnyNative *any;
1001 int newsize;
1002 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFTime,NULL,NULL)) == NULL){
1003 printf( "AnyfNativeNew failed in MFTimeConstr.\n");
1004 return JS_FALSE;
1005 }
1006 if (!JS_SetPrivateFw(cx, obj, any)) {
1007 printf( "JS_SetPrivate failed in MFTimeConstr.\n");
1008 return JS_FALSE;
1009 }
1010 anyv = any->v;
1011 newsize = sizeof(double) * upper_power_of_two(argc); //newsize in bytes
1012 if(argc > 0){
1013 anyv->mftime.p = MALLOC(double*,newsize);
1014 memset(anyv->mftime.p,0,newsize);
1015 }
1016
1017 }else{
1018 DEFINE_LENGTH(cx,obj,argc)
1019 DEFINE_MF_ECMA_HAS_CHANGED
1020 }
1021 if (!argv) {
1022 return JS_TRUE;
1023 }
1024
1025 #ifdef JSVRMLCLASSESVERBOSE
1026 printf("MFTimeConstr: obj = %p, %u args\n", obj, argc);
1027 #endif
1028 for (i = 0; i < argc; i++) {
1029 jsval vp;
1030 if(isArray){
1031 JS_GetElement(cx, _arrayObj, i, &vp);
1032
1033 }else{
1034 vp = argv[i];
1035 }
1036 if (!JS_ValueToNumber(cx, vp, &_d)) {
1037 printf(
1038 "JS_ValueToNumber failed in MFTimeConstr.\n");
1039 return JS_FALSE;
1040 }
1041 if(SM_method()==2){
1042 anyv->mftime.p[i] = _d;
1043 anyv->mftime.n = i+1;
1044 }else{
1045 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
1046 printf( "JS_DefineElement failed for arg %u in MFTimeConstr.\n", i);
1047 return JS_FALSE;
1048 }
1049 }
1050 }
1051 *rval = OBJECT_TO_JSVAL(obj);
1052 return JS_TRUE;
1053}
1054
1055JSBool
1056#if JS_VERSION < 185
1057MFTimeAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1058#else
1059MFTimeAssign(JSContext *cx, uintN argc, jsval *vp) {
1060 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1061 jsval *argv = JS_ARGV(cx,vp);
1062 jsval rval;
1063#endif
1064 SET_MF_ECMA_HAS_CHANGED
1065
1066#if JS_VERSION < 185
1067 return _standardMFAssign (cx, obj, argc, argv, rval, &MFTimeClass,FIELDTYPE_SFTime);
1068#else
1069 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFTimeClass,FIELDTYPE_SFTime)) { return JS_FALSE; }
1070 JS_SET_RVAL(cx,vp,rval);
1071 return JS_TRUE;
1072#endif
1073}
1074
1075
1076
1077JSBool
1078#if JS_VERSION < 185
1079MFVec2fAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp) {
1080#elif JS_VERSION == 185
1081MFVec2fAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){
1082#else
1083MFVec2fAddProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
1084 JSObject *obj = *hobj._;
1085 jsid id = *hiid._;
1086 jsval *vp = hvp._;
1087#endif
1088 return doMFAddProperty(cx, obj, id, vp,"MFVec2fAddProperty");
1089}
1090
1091JSBool
1092#if JS_VERSION < 185
1093MFVec2fGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
1094#elif JS_VERSION == 185
1095MFVec2fGetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){
1096#else
1097MFVec2fGetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
1098 JSObject *obj = *hobj._;
1099 jsid id = *hiid._;
1100 jsval *vp = hvp._;
1101#endif
1102 return _standardMFGetProperty(cx, obj, id, vp,
1103 "_FreeWRL_Internal = new SFVec2f()",FIELDTYPE_MFVec2f);
1104}
1105
1106JSBool
1107#if JS_VERSION < 185
1108MFVec2fSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
1109#elif JS_VERSION == 185
1110MFVec2fSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp){
1111#else
1112MFVec2fSetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSBool strict, JSMutableHandleValue hvp){
1113 JSObject *obj = *hobj._;
1114 jsid id = *hiid._;
1115 jsval *vp = hvp._;
1116#endif
1117 return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFVec2f);
1118}
1119
1120JSBool
1121#if JS_VERSION < 185
1122MFVec2fToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1123#else
1124MFVec2fToString(JSContext *cx, uintN argc, jsval *vp) {
1125 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1126 jsval *argv = JS_ARGV(cx,vp);
1127 jsval rval;
1128#endif
1129 UNUSED(argc);
1130 UNUSED(argv);
1131#if JS_VERSION < 185
1132 return doMFToString(cx, obj, "MFVec2f", rval);
1133#else
1134 if (!doMFToString(cx, obj, "MFVec2f", &rval)) { return JS_FALSE; }
1135 JS_SET_RVAL(cx,vp,rval);
1136 return JS_TRUE;
1137#endif
1138}
1139
1140JSBool
1141#if JS_VERSION < 185
1142MFVec2fConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1143#else
1144MFVec2fConstr(JSContext *cx, uintN argc, jsval *vp) {
1145 JSObject *obj = JS_NewObject(cx,&MFVec2fClass,NULL,NULL);
1146 jsval *argv = JS_ARGV(cx,vp);
1147 jsval rval = OBJECT_TO_JSVAL(obj);
1148 if (!MFVec2fConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
1149 JS_SET_RVAL(cx,vp,rval);
1150 return JS_TRUE;
1151}
1152JSBool MFVec2fConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1153#endif
1154 JSObject *_arrayObj;
1155 int isArray;
1156 JSObject *_obj;
1157 unsigned int i;
1158 union anyVrml *anyv;
1159
1160 ADD_ROOT(cx,obj)
1161 isArray = FALSE;
1162 if(argc == 1 && argv){
1163 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
1164 // tests/JohnCarlson/Arc1A.x3d
1165 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
1166 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
1167 return JS_FALSE;
1168 }
1169
1170 if(JS_IsArrayObject(cx, _arrayObj)){
1171 jsuint lengthp;
1172 jsval vp;
1173 //printf("its an array\n");
1174 isArray = TRUE;
1175 JS_GetArrayLength(cx,_arrayObj, &lengthp);
1176 argc = lengthp;
1177 }
1178 }
1179
1180 if(SM_method() == 2){
1181 AnyNative *any;
1182 int newsize;
1183 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFVec2f,NULL,NULL)) == NULL){
1184 printf( "AnyfNativeNew failed in MFVec2fConstr.\n");
1185 return JS_FALSE;
1186 }
1187 if (!JS_SetPrivateFw(cx, obj, any)) {
1188 printf( "JS_SetPrivate failed in MFVec2fConstr.\n");
1189 return JS_FALSE;
1190 }
1191 anyv = any->v;
1192 newsize = sizeof(struct SFVec2f)*upper_power_of_two(argc);
1193 if(argc > 0){
1194 anyv->mfvec2f.p = MALLOC(struct SFVec2f*,newsize);
1195 memset(anyv->mfvec2f.p,0,newsize);
1196 }
1197
1198 }else{
1199 DEFINE_LENGTH(cx,obj,argc)
1200 }
1201
1202 if (!argv) {
1203 return JS_TRUE;
1204 }
1205
1206 #ifdef JSVRMLCLASSESVERBOSE
1207 printf("MFVec2fConstr: obj = %p, %u args\n", obj, argc);
1208 #endif
1209
1210 for (i = 0; i < argc; i++) {
1211 jsval vp;
1212 if(isArray){
1213 JS_GetElement(cx, _arrayObj, i, &vp);
1214
1215 }else{
1216 vp = argv[i];
1217 }
1218 if (!JS_ValueToObject(cx, vp, &_obj)) {
1219 printf( "JS_ValueToObject failed in MFVec2fConstr.\n");
1220 return JS_FALSE;
1221 }
1222
1223 CHECK_CLASS(cx,_obj,NULL,__FUNCTION__,SFVec2fClass)
1224 if(SM_method()==2){
1225 AnyNative *any2;
1226 if((any2 = JS_GetPrivateFw(cx,_obj)) != NULL){
1227 //2018 I think as long as its 2+ contiguous floats, we can use it as a vec2f,
1228 // but in future internal types might change
1229 if(any2->type == FIELDTYPE_SFVec2f || any2->type == FIELDTYPE_SFColor || any2->type == FIELDTYPE_SFVec3f || any2->type == FIELDTYPE_SFColorRGBA){
1230 shallow_copy_field(FIELDTYPE_SFVec2f,any2->v,(union anyVrml*)&anyv->mfvec2f.p[i]);
1231 anyv->mfvec2f.n = i+1;
1232 }
1233 }
1234 // else for now we'll leave zeros
1235 }else{
1236 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
1237 printf( "JS_DefineElement failed for arg %d in MFVec2fConstr.\n", i);
1238 return JS_FALSE;
1239 }
1240 }
1241 }
1242 *rval = OBJECT_TO_JSVAL(obj);
1243 return JS_TRUE;
1244}
1245
1246JSBool
1247#if JS_VERSION < 185
1248MFVec2fAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1249 return _standardMFAssign (cx, obj, argc, argv, rval, &MFVec2fClass,FIELDTYPE_SFVec2f);
1250#else
1251MFVec2fAssign(JSContext *cx, uintN argc, jsval *vp) {
1252 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1253 jsval *argv = JS_ARGV(cx,vp);
1254 jsval rval;
1255 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFVec2fClass,FIELDTYPE_SFVec2f)) { return JS_FALSE; }
1256 JS_SET_RVAL(cx,vp,rval);
1257 return JS_TRUE;
1258#endif
1259}
1260
1261/* MFVec3f */
1262JSBool
1263#if JS_VERSION < 185
1264MFVec3fAddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
1265#elif JS_VERSION == 185
1266MFVec3fAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){
1267#else
1268MFVec3fAddProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
1269 JSObject *obj = *hobj._;
1270 jsid id = *hiid._;
1271 jsval *vp = hvp._;
1272#endif
1273 return doMFAddProperty(cx, obj, id, vp,"MFVec3fAddProperty");
1274}
1275
1276JSBool
1277#if JS_VERSION < 185
1278MFVec3fGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
1279#elif JS_VERSION == 185
1280MFVec3fGetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){
1281#else
1282MFVec3fGetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
1283 JSObject *obj = *hobj._;
1284 jsid id = *hiid._;
1285 jsval *vp = hvp._;
1286#endif
1287 return _standardMFGetProperty(cx, obj, id, vp,
1288 "_FreeWRL_Internal = new SFVec3f()",FIELDTYPE_MFVec3f);
1289}
1290
1291JSBool
1292#if JS_VERSION < 185
1293MFVec3fSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
1294#elif JS_VERSION == 185
1295MFVec3fSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp){
1296#else
1297MFVec3fSetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSBool strict, JSMutableHandleValue hvp){
1298 JSObject *obj = *hobj._;
1299 jsid id = *hiid._;
1300 jsval *vp = hvp._;
1301#endif
1302 return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFVec3f);
1303}
1304
1305JSBool
1306#if JS_VERSION < 185
1307MFVec3fToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1308#else
1309MFVec3fToString(JSContext *cx, uintN argc, jsval *vp) {
1310 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1311 jsval *argv = JS_ARGV(cx,vp);
1312 jsval rval;
1313#endif
1314 UNUSED(argc);
1315 UNUSED(argv);
1316 /* printf ("CALLED MFVec3fToString\n");*/
1317#if JS_VERSION < 185
1318 return doMFToString(cx, obj, "MFVec3f", rval);
1319#else
1320 if (!doMFToString(cx, obj, "MFVec3f", &rval)) { return JS_FALSE; }
1321 JS_SET_RVAL(cx,vp,rval);
1322 return JS_TRUE;
1323#endif
1324}
1325
1326JSBool
1327#if JS_VERSION < 185
1328MFVec3fConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1329#else
1330MFVec3fConstr(JSContext *cx, uintN argc, jsval *vp) {
1331 JSObject *obj = JS_NewObject(cx,&MFVec3fClass,NULL,NULL);
1332 jsval *argv = JS_ARGV(cx,vp);
1333 jsval rval = OBJECT_TO_JSVAL(obj);
1334 if (!MFVec3fConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
1335 JS_SET_RVAL(cx,vp,rval);
1336 return JS_TRUE;
1337}
1338JSBool MFVec3fConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1339#endif
1340 JSObject *_arrayObj;
1341 int isArray;
1342 JSObject *_obj;
1343 unsigned int i;
1344 union anyVrml *anyv;
1345
1346 ADD_ROOT(cx,obj)
1347
1348 isArray = FALSE;
1349 if(argc == 1 && argv){
1350 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
1351 // tests/JohnCarlson/Arc1A.x3d
1352 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
1353 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
1354 return JS_FALSE;
1355 }
1356
1357 if(JS_IsArrayObject(cx, _arrayObj)){
1358 jsuint lengthp;
1359 jsval vp;
1360 //printf("its an array\n");
1361 isArray = TRUE;
1362 JS_GetArrayLength(cx,_arrayObj, &lengthp);
1363 argc = lengthp;
1364 }
1365 }
1366
1367
1368
1369 if(SM_method() == 2){
1370 AnyNative *any;
1371 int newsize;
1372 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFVec3f,NULL,NULL)) == NULL){
1373 printf( "AnyfNativeNew failed in MFVec3fConstr.\n");
1374 return JS_FALSE;
1375 }
1376 if (!JS_SetPrivateFw(cx, obj, any)) {
1377 printf( "JS_SetPrivate failed in MFVec3fConstr.\n");
1378 return JS_FALSE;
1379 }
1380 anyv = any->v;
1381 newsize = sizeof(struct SFVec3f)*upper_power_of_two(argc);
1382 if(argc > 0){
1383 anyv->mfvec3f.p = MALLOC(struct SFVec3f*,newsize);
1384 memset(anyv->mfvec3f.p,0,newsize);
1385 }
1386
1387 }else{
1388 DEFINE_LENGTH(cx,obj,argc)
1389 }
1390 if (!argv) {
1391 return JS_TRUE;
1392 }
1393
1394 #ifdef JSVRMLCLASSESVERBOSE
1395 printf("MFVec3fConstr: obj = %p, %u args\n", obj, argc);
1396 #endif
1397 for (i = 0; i < argc; i++) {
1398 jsval vp;
1399 if(isArray){
1400 JS_GetElement(cx, _arrayObj, i, &vp);
1401
1402 }else{
1403 vp = argv[i];
1404 }
1405 if (!JS_ValueToObject(cx, vp, &_obj)) {
1406 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
1407 return JS_FALSE;
1408 }
1409
1410 CHECK_CLASS(cx,_obj,NULL,__FUNCTION__,SFVec3fClass)
1411
1412 if(SM_method()==2){
1413 AnyNative *any2;
1414 if((any2 = JS_GetPrivateFw(cx,_obj)) != NULL){
1415 //2018 I think as long as its 3+ contiguous floats, we can use it as a vec2f,
1416 // but in future internal types might change
1417 if(any2->type == FIELDTYPE_SFVec3f || any2->type == FIELDTYPE_SFColor || any2->type == FIELDTYPE_SFColorRGBA){
1418 shallow_copy_field(FIELDTYPE_SFVec3f,any2->v,(union anyVrml*)&anyv->mfvec3f.p[i]);
1419 anyv->mfvec3f.n = i+1;
1420 }
1421 }
1422 // else for now we'll leave zeros
1423 }else{
1424
1425 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
1426 printf( "JS_DefineElement failed for arg %d in MFVec3fConstr.\n", i);
1427 return JS_FALSE;
1428 }
1429 }
1430 }
1431 *rval = OBJECT_TO_JSVAL(obj);
1432 return JS_TRUE;
1433}
1434
1435JSBool
1436#if JS_VERSION < 185
1437MFVec3fAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1438 return _standardMFAssign (cx, obj, argc, argv, rval, &MFVec3fClass,FIELDTYPE_SFVec3f);
1439#else
1440MFVec3fAssign(JSContext *cx, uintN argc, jsval *vp) {
1441 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1442 jsval *argv = JS_ARGV(cx,vp);
1443 jsval rval;
1444 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFVec3fClass,FIELDTYPE_SFVec3f)) { return JS_FALSE; }
1445 JS_SET_RVAL(cx,vp,rval);
1446 return JS_TRUE;
1447#endif
1448}
1449
1450/* VrmlMatrix */
1451
1452static void _setmatrix (JSContext *cx, JSObject *obj, double *matrix) {
1453 jsval val;
1454 int i;
1455 for (i=0; i<16; i++) {
1456
1457 if (JS_NewNumberValue(cx, matrix[i],&val) == JS_FALSE) {
1458 printf ("problem creating id matrix\n");
1459 return;
1460 }
1461
1462 if (!JS_SetElement(cx, obj, (jsint) i, &val)) {
1463 printf( "JS_DefineElement failed for arg %u in VrmlMatrixSetTransform.\n", i);
1464 return;
1465 }
1466 }
1467}
1468
1469/* get the matrix values into a double array */
1470static void _getmatrix (JSContext *cx, JSObject *obj, double *fl) {
1471 int32 _length;
1472 jsval _length_val;
1473 jsval val;
1474 int i;
1475 double d;
1476
1477 if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &_length_val)) {
1478 printf( "JS_GetProperty failed for \"%s\" in _getmatrix.\n", MF_LENGTH_FIELD);
1479 _length = 0;
1480 } else {
1481 _length = JSVAL_TO_INT(_length_val);
1482 }
1483
1484 #ifdef JSVRMLCLASSESVERBOSE
1485 printf ("_getmatrix, length %d\n",_length);
1486 #endif
1487
1488
1489 if (_length>16) _length = 16;
1490
1491 for (i = 0; i < _length; i++) {
1492 if (!JS_GetElement(cx, obj, (jsint) i, &val)) {
1493 printf( "failed in get of copyElements index %d.\n", i);
1494 fl[i] = 0.0;
1495 } else {
1496 if (!JS_ValueToNumber(cx, val, &d)) {
1497 printf ("this is not a mumber!\n");
1498 fl[i]=0.0;
1499 } else fl[i]=d;
1500 }
1501 }
1502
1503 /* in case our matrix was short for some reason */
1504 for (i=_length; i < 16; i++) {
1505 fl[i]=0.0;
1506 }
1507}
1508
1509
1510JSBool
1511#if JS_VERSION < 185
1512VrmlMatrixToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1513#else
1514VrmlMatrixToString(JSContext *cx, uintN argc, jsval *vp) {
1515 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1516 jsval *argv = JS_ARGV(cx,vp);
1517 jsval rval;
1518#endif
1519 UNUSED(argc);
1520 UNUSED(argv);
1521
1522#if JS_VERSION < 185
1523 return doMFToString(cx, obj, "MFFloat", rval);
1524#else
1525 if (!doMFToString(cx, obj, "MFFloat", &rval)) { return JS_FALSE; }
1526 JS_SET_RVAL(cx,vp,rval);
1527 return JS_TRUE;
1528#endif
1529}
1530
1531/* get rows; used for scale and rot in getTransform */
1532void _get4f(double *ret, double *mat, int row) {
1533 if (row == 0) {ret[0]=MAT00;ret[1]=MAT01;ret[2]=MAT02;ret[3]=MAT03;}
1534 if (row == 1) {ret[0]=MAT10;ret[1]=MAT11;ret[2]=MAT12;ret[3]=MAT13;}
1535 if (row == 2) {ret[0]=MAT20;ret[1]=MAT21;ret[2]=MAT22;ret[3]=MAT23;}
1536}
1537
1538/* set rows; used for scale and rot in getTransform */
1539void _set4f(double len, double *mat, int row) {
1540 if (row == 0) {MAT00=MAT00/len;MAT01=MAT01/len;MAT02=MAT02/len;MAT03=MAT03/len;}
1541 if (row == 1) {MAT10=MAT10/len;MAT11=MAT11/len;MAT12=MAT12/len;MAT13=MAT13/len;}
1542 if (row == 2) {MAT20=MAT20/len;MAT21=MAT21/len;MAT22=MAT22/len;MAT23=MAT23/len;}
1543}
1544
1545JSBool
1546#if JS_VERSION < 185
1547VrmlMatrixgetTransform(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1548#else
1549VrmlMatrixgetTransform(JSContext *cx, uintN argc, jsval *vp) {
1550 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1551 jsval *argv = JS_ARGV(cx,vp);
1552#endif
1553 int i;
1554 JSObject *transObj = NULL;
1555 JSObject *rotObj = NULL;
1556 JSObject *scaleObj = NULL;
1557 SFRotationNative *Rptr;
1558 SFVec3fNative *Vptr;
1559
1560 Quaternion quat;
1561 double matrix[16];
1562 double qu[4];
1563 double r0[4], r1[4], r2[4];
1564 double l0,l1,l2;
1565
1566 /* some intermediate calculations */
1567 _getmatrix(cx,obj,matrix);
1568 /* get each row */
1569 _get4f(r0,matrix,0);
1570 _get4f(r1,matrix,1);
1571 _get4f(r2,matrix,2);
1572 /* get the length of each row */
1573 l0 = sqrt(r0[0]*r0[0] + r0[1]*r0[1] + r0[2]*r0[2] +r0[3]*r0[3]);
1574 l1 = sqrt(r1[0]*r1[0] + r1[1]*r1[1] + r1[2]*r1[2] +r1[3]*r1[3]);
1575 l2 = sqrt(r2[0]*r2[0] + r2[1]*r2[1] + r2[2]*r2[2] +r2[3]*r2[3]);
1576
1577 if (argc == 1) {
1578 if (!JS_ConvertArguments(cx, argc, argv, "o", &transObj)) {
1579 printf ("getTransform, invalid parameters\n");
1580 return JS_FALSE;
1581 }
1582 }
1583 if (argc == 2) {
1584 if (!JS_ConvertArguments(cx, argc, argv, "o o", &transObj, &rotObj)) {
1585 printf ("getTransform, invalid parameters\n");
1586 return JS_FALSE;
1587 }
1588 }
1589 if (argc == 3) {
1590 if (!JS_ConvertArguments(cx, argc, argv, "o o o",
1591 &transObj,&rotObj,&scaleObj)) {
1592 printf ("getTransform, invalid parameters\n");
1593 return JS_FALSE;
1594 }
1595 }
1596
1597 /* translation */
1598 if (transObj!=NULL) {
1599 CHECK_CLASS(cx,transObj,NULL,__FUNCTION__,SFVec3fClass)
1600
1601 if ((Vptr = (SFVec3fNative *)JS_GetPrivateFw(cx, transObj)) == NULL) {
1602 printf( "JS_GetPrivate failed.\n");
1603 return JS_FALSE;
1604 }
1605 (Vptr->v).c[0] = (float) matrix[12];
1606 (Vptr->v).c[1] = (float) matrix[13];
1607 (Vptr->v).c[2] = (float) matrix[14];
1608 Vptr->valueChanged++;
1609 }
1610
1611 /* rotation */
1612 if (rotObj!=NULL) {
1613
1614 CHECK_CLASS(cx,rotObj,NULL,__FUNCTION__,SFRotationClass)
1615
1616 if ((Rptr = (SFRotationNative*)JS_GetPrivateFw(cx, rotObj)) == NULL) {
1617 printf( "JS_GetPrivate failed.\n");
1618 return JS_FALSE;
1619 }
1620
1621 /* apply length to each row */
1622 _set4f(l0, matrix, 0);
1623 _set4f(l1, matrix, 1);
1624 _set4f(l2, matrix, 2);
1625
1626 /* convert the matrix to a quaternion */
1627 matrix_to_quaternion (&quat, matrix);
1628 #ifdef JSVRMLCLASSESVERBOSE
1629 printf ("quaternion %f %f %f %f\n",quat.x,quat.y,quat.z,quat.w);
1630 #endif
1631
1632 /* convert the quaternion to a VRML rotation */
1633 quaternion_to_vrmlrot(&quat, &qu[0],&qu[1],&qu[2],&qu[3]);
1634
1635 /* now copy the values over */
1636 for (i=0; i<4; i++) (Rptr->v).c[i] = (float) qu[i];
1637 Rptr->valueChanged = 1;
1638 }
1639
1640 /* scale */
1641 if (scaleObj != NULL) {
1642 CHECK_CLASS(cx,scaleObj,NULL,__FUNCTION__,SFVec3fClass)
1643
1644 if ((Vptr = (SFVec3fNative*)JS_GetPrivateFw(cx, scaleObj)) == NULL) {
1645 printf( "JS_GetPrivate failed.\n");
1646 return JS_FALSE;
1647 }
1648 (Vptr->v).c[0] = (float) l0;
1649 (Vptr->v).c[1] = (float) l1;
1650 (Vptr->v).c[2] = (float) l2;
1651 Vptr->valueChanged = 1;
1652 }
1653
1654#if JS_VERSION < 185
1655 *rval = JSVAL_VOID;
1656#else
1657 JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(NULL)); //JSVAL_VOID);
1658#endif
1659 return JS_TRUE;
1660}
1661
1662
1663/* Sets the VrmlMatrix to the passed values. Any of the rightmost parameters may be omitted.
1664 The method has 0 to 5 parameters. For example, specifying 0 parameters results in an
1665 identity matrix while specifying 1 parameter results in a translation and specifying 2
1666 parameters results in a translation and a rotation. Any unspecified parameter is set to
1667 its default as specified for the Transform node. */
1668
1669JSBool
1670#if JS_VERSION < 185
1671VrmlMatrixsetTransform(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1672#else
1673VrmlMatrixsetTransform(JSContext *cx, uintN argc, jsval *vp) {
1674 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1675 jsval *argv = JS_ARGV(cx,vp);
1676#endif
1677 JSObject *transObj = NULL;
1678 JSObject *rotObj = NULL;
1679 JSObject *scaleObj = NULL;
1680 JSObject *scaleOObj = NULL;
1681 JSObject *centerObj = NULL;
1682
1683 double matrix[16];
1684
1685 int error = FALSE;
1686
1687#undef TESTING
1688#ifdef TESTING
1689 GLDOUBLE xxmat[16];
1690 FW_GL_MATRIX_MODE(GL_MODELVIEW);
1691 FW_GL_PUSH_MATRIX();
1692 FW_GL_LOAD_IDENTITY();
1693#endif
1694
1695
1696 /* set the identity for this matrix. We work on this matrix, then assign it to the variable */
1697 loadIdentityMatrix(matrix);
1698
1699 /* first, is this a VrmlMatrix object? The chances of this failing are slim to none... */
1700 if (!JS_InstanceOf(cx, obj, &VrmlMatrixClass, NULL)) {
1701 error = TRUE;
1702 } else {
1703 if (argc == 1) {
1704 error = !JS_ConvertArguments(cx, argc, argv, "o", &transObj);
1705 }
1706 if (argc == 2) {
1707 error = !JS_ConvertArguments(cx, argc, argv, "o o", &transObj,
1708 &rotObj);
1709 }
1710 if (argc == 3) {
1711 error = !JS_ConvertArguments(cx, argc, argv, "o o o",
1712 &transObj,&rotObj,&scaleObj);
1713 }
1714 if (argc == 4) {
1715 error = !JS_ConvertArguments(cx, argc, argv, "o o o o",
1716 &transObj,&rotObj,&scaleObj,&scaleOObj);
1717 }
1718 if (argc == 5) {
1719 error = !JS_ConvertArguments(cx, argc, argv, "o o o o o",
1720 &transObj,&rotObj,&scaleObj,&scaleOObj,&centerObj);
1721 }
1722 if (argc > 5) { error = TRUE; }
1723 }
1724
1725 if (error) {
1726 ConsoleMessage ("setTransform: error in parameters");
1727 return JS_FALSE;
1728 }
1729
1730 /* verify that we have the correct objects here */
1731 if (transObj != NULL)
1732 error = !JS_InstanceOf(cx, transObj, &SFVec3fClass, NULL);
1733 if (!error && (rotObj != NULL))
1734 error = !JS_InstanceOf(cx, rotObj, &SFRotationClass, NULL);
1735 if (!error && (scaleObj != NULL))
1736 error = !JS_InstanceOf(cx, scaleObj, &SFVec3fClass, NULL);
1737 if (!error && (scaleOObj != NULL))
1738 error = !JS_InstanceOf(cx, scaleOObj, &SFRotationClass, NULL);
1739 if (!error && centerObj != NULL)
1740 error = !JS_InstanceOf(cx, centerObj, &SFVec3fClass, NULL);
1741
1742 if (error) {
1743 ConsoleMessage ("setTransform: at least one parameter incorrect type");
1744 return JS_FALSE;
1745 }
1746
1747 /* apply Transform, if requested */
1748 if (transObj) {
1749 SFVec3fNative * Vptr;
1750 Vptr = (SFVec3fNative *)JS_GetPrivateFw(cx, transObj);
1751 error = (Vptr == NULL);
1752
1753 if (!error) {
1754 matrix[12]=Vptr->v.c[0];
1755 matrix[13]=Vptr->v.c[1];
1756 matrix[14]=Vptr->v.c[2];
1757 }
1758 }
1759
1760 if (!error && (rotObj != NULL)) {
1761 SFRotationNative * Rptr;
1762 Rptr = (SFRotationNative *)JS_GetPrivateFw(cx, rotObj);
1763 error = (Rptr == NULL);
1764
1765 if (!error) {
1766 Quaternion quat;
1767 vrmlrot_to_quaternion(&quat, Rptr->v.c[0], Rptr->v.c[1], Rptr->v.c[2], Rptr->v.c[3]);
1768 /* printf ("from rotation %f %f %f %f\n",Rptr->v.c[0], Rptr->v.c[1], Rptr->v.c[2], Rptr->v.c[3]);
1769 printf ("quaternion is %f %f %f %f\n",quat.x,quat.y,quat.x, quat.w); */
1770 quaternion_to_matrix (matrix, &quat);
1771 }
1772 }
1773
1774 if (!error && (scaleObj != NULL)) {
1775 SFVec3fNative * Vptr;
1776 Vptr = (SFVec3fNative *)JS_GetPrivateFw(cx, scaleObj);
1777 error = (Vptr == NULL);
1778
1779 if (!error) {
1780 struct point_XYZ myScale;
1781
1782 COPY_SFVEC3F_TO_POINT_XYZ (myScale,Vptr->v.c);
1783 scale_to_matrix(matrix, &myScale);
1784 }
1785
1786 }
1787
1788 /* place the new values into the vrmlMatrix array */
1789 _setmatrix (cx, obj, matrix);
1790
1791#ifdef TESTING
1792 printf ("calculated Matrix: \n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n",
1793 matrix[0], matrix[4], matrix[ 8], matrix[12],
1794 matrix[1], matrix[5], matrix[ 9], matrix[13],
1795 matrix[2], matrix[6], matrix[10], matrix[14],
1796 matrix[3], matrix[7], matrix[11], matrix[15]);
1797 glGetDoublev(GL_MODELVIEW,xxmat);
1798 printf ("modelview Matrix: \n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n",
1799 xxmat[0], xxmat[4], xxmat[ 8], xxmat[12],
1800 xxmat[1], xxmat[5], xxmat[ 9], xxmat[13],
1801 xxmat[2], xxmat[6], xxmat[10], xxmat[14],
1802 xxmat[3], xxmat[7], xxmat[11], xxmat[15]);
1803 FW_GL_POP_MATRIX();
1804#endif
1805
1806#if JS_VERSION >= 185
1807/* JS 185+ -requires- rval to be set on true return; assume we will return the 'this' object */
1808 JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(NULL)); //JSVAL_VOID);
1809#endif
1810 return JS_TRUE;
1811}
1812
1813
1814JSBool
1815#if JS_VERSION < 185
1816VrmlMatrixinverse(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1817#else
1818VrmlMatrixinverse(JSContext *cx, uintN argc, jsval *vp) {
1819 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1820 jsval *argv = JS_ARGV(cx,vp);
1821#endif
1822 double src[16];
1823 double dest[16];
1824 JSObject *retObj;
1825 UNUSED (argv);
1826
1827 if (argc != 0) {
1828 printf ("VrmlMatrix, expect 0 parameters\n");
1829 return JS_FALSE;
1830 }
1831 _getmatrix (cx, obj,src);
1832 matinverseFULL (dest,src);
1833
1834 retObj = JS_ConstructObjectFw(cx,&VrmlMatrixClass,NULL, NULL);
1835
1836 _setmatrix(cx,retObj,dest);
1837#if JS_VERSION < 185
1838 *rval = OBJECT_TO_JSVAL(retObj);
1839#else
1840 JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(retObj));
1841#endif
1842 return JS_TRUE;
1843}
1844
1845
1846JSBool
1847#if JS_VERSION < 185
1848VrmlMatrixtranspose(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1849#else
1850VrmlMatrixtranspose(JSContext *cx, uintN argc, jsval *vp) {
1851 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1852 jsval *argv = JS_ARGV(cx,vp);
1853#endif
1854 double src[16];
1855 double dest[16];
1856 JSObject *retObj;
1857 UNUSED (argv);
1858
1859 if (argc != 0) {
1860 printf ("VrmlMatrix, expect 0 parameters\n");
1861 return JS_FALSE;
1862 }
1863 _getmatrix (cx, obj,src);
1864 mattranspose (dest,src);
1865
1866 retObj = JS_ConstructObjectFw(cx,&VrmlMatrixClass,NULL, NULL);
1867
1868 _setmatrix(cx,retObj,dest);
1869#if JS_VERSION < 185
1870 *rval = OBJECT_TO_JSVAL(retObj);
1871#else
1872 JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(retObj));
1873#endif
1874 return JS_TRUE;
1875}
1876
1877
1878
1879JSBool
1880#if JS_VERSION < 185
1881VrmlMatrixmultLeft(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1882#else
1883VrmlMatrixmultLeft(JSContext *cx, uintN argc, jsval *vp) {
1884 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1885 jsval *argv = JS_ARGV(cx,vp);
1886#endif
1887 JSObject *transObj = NULL;
1888 JSObject *retObj = NULL;
1889
1890 double matrix1[16];
1891 double matrix2[16];
1892 int error = FALSE;
1893
1894 if (argc == 1) {
1895 error = !JS_ConvertArguments(cx, argc, argv, "o", &transObj);
1896 } else error = TRUE;
1897
1898 if (!error) if (!JS_InstanceOf(cx, transObj, &VrmlMatrixClass, NULL)) { error = TRUE;}
1899
1900 if (error) {
1901 ConsoleMessage ("VrmlMatrixMultLeft, error in params");
1902 return JS_FALSE;
1903 }
1904
1905 /* fill in the 2 matricies, multiply them, then return it */
1906 _getmatrix(cx,obj,matrix1);
1907 _getmatrix(cx,transObj,matrix2);
1908 matmultiplyFULL(matrix1,matrix1,matrix2);
1909
1910 retObj = JS_ConstructObjectFw(cx,&VrmlMatrixClass,NULL, NULL);
1911
1912 /*
1913 printf ("multLeft calculated Matrix: \n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n",
1914 matrix1[0], matrix1[4], matrix1[ 8], matrix1[12],
1915 matrix1[1], matrix1[5], matrix1[ 9], matrix1[13],
1916 matrix1[2], matrix1[6], matrix1[10], matrix1[14],
1917 matrix1[3], matrix1[7], matrix1[11], matrix1[15]);
1918 */
1919 _setmatrix(cx,retObj,matrix1);
1920#if JS_VERSION < 185
1921 *rval = OBJECT_TO_JSVAL(retObj);
1922#else
1923 JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(retObj));
1924#endif
1925
1926 return JS_TRUE;
1927}
1928
1929JSBool
1930#if JS_VERSION < 185
1931VrmlMatrixmultRight(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1932#else
1933VrmlMatrixmultRight(JSContext *cx, uintN argc, jsval *vp) {
1934 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1935 jsval *argv = JS_ARGV(cx,vp);
1936#endif
1937 JSObject *transObj = NULL;
1938 JSObject *retObj = NULL;
1939
1940 double matrix1[16];
1941 double matrix2[16];
1942 int error = FALSE;
1943
1944 if (argc == 1) {
1945 error = !JS_ConvertArguments(cx, argc, argv, "o", &transObj);
1946 } else error = TRUE;
1947
1948 if (!error) if (!JS_InstanceOf(cx, transObj, &VrmlMatrixClass, NULL)) { error = TRUE;}
1949
1950 if (error) {
1951 ConsoleMessage ("VrmlMatrixMultRight, error in params");
1952 return JS_FALSE;
1953 }
1954
1955 /* fill in the 2 matricies, multiply them, then return it */
1956 _getmatrix(cx,obj,matrix1);
1957 _getmatrix(cx,transObj,matrix2);
1958 matmultiplyFULL(matrix1,matrix2,matrix1);
1959
1960 retObj = JS_ConstructObjectFw(cx,&VrmlMatrixClass,NULL, NULL);
1961
1962 /*
1963 printf ("multRight calculated Matrix: \n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n\t%5.2f %5.2f %5.2f %5.2f\n",
1964 matrix1[0], matrix1[4], matrix1[ 8], matrix1[12],
1965 matrix1[1], matrix1[5], matrix1[ 9], matrix1[13],
1966 matrix1[2], matrix1[6], matrix1[10], matrix1[14],
1967 matrix1[3], matrix1[7], matrix1[11], matrix1[15]);
1968 */
1969 _setmatrix(cx,retObj,matrix1);
1970#if JS_VERSION < 185
1971 *rval = OBJECT_TO_JSVAL(retObj);
1972#else
1973 JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(retObj));
1974#endif
1975
1976 return JS_TRUE;
1977}
1978
1979
1980JSBool
1981#if JS_VERSION < 185
1982VrmlMatrixmultVecMatrix(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
1983#else
1984VrmlMatrixmultVecMatrix(JSContext *cx, uintN argc, jsval *vp) {
1985 JSObject *obj = JS_THIS_OBJECT(cx,vp);
1986 jsval *argv = JS_ARGV(cx,vp);
1987#endif
1988 JSObject *transObj = NULL;
1989 JSObject *retObj = NULL;
1990 SFVec3fNative *Vptr;
1991
1992 double matrix1[16];
1993 int error = FALSE;
1994 struct point_XYZ inp, outp;
1995 outp.x = outp.y = outp.z = 0.0;
1996
1997 if (argc == 1) {
1998 error = !JS_ConvertArguments(cx, argc, argv, "o", &transObj);
1999 } else error = TRUE;
2000
2001 if (!error) if (!JS_InstanceOf(cx, transObj, &SFVec3fClass, NULL)) { error = TRUE;}
2002
2003 if ((Vptr = (SFVec3fNative *)JS_GetPrivateFw(cx, transObj)) == NULL) {
2004 error = TRUE;
2005 }
2006
2007 if (error) {
2008 ConsoleMessage ("VrmlMatrixMultVec, error in params");
2009 return JS_FALSE;
2010 }
2011
2012 COPY_SFVEC3F_TO_POINT_XYZ(inp,Vptr->v.c);
2013
2014 /* fill in the 2 matricies, multiply them, then return it */
2015 _getmatrix(cx,obj,matrix1);
2016
2017 /* is this the one we have to transpose? */
2018 /* mattranspose (matrix1, matrix1); */
2019
2020 matrotate2v(matrix1, inp, outp);
2021
2022 retObj = JS_ConstructObjectFw(cx,&SFVec3fClass,NULL, NULL);
2023 if ((Vptr = (SFVec3fNative *)JS_GetPrivateFw(cx, retObj)) == NULL) {
2024 printf ("error in new VrmlMatrix\n");
2025 return JS_FALSE;
2026 }
2027
2028 COPY_POINT_XYZ_TO_SFVEC3F(Vptr->v.c,outp);
2029#if JS_VERSION < 185
2030 *rval = OBJECT_TO_JSVAL(retObj);
2031#else
2032 JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(retObj));
2033#endif
2034
2035 return JS_TRUE;
2036}
2037
2038
2039JSBool
2040#if JS_VERSION < 185
2041VrmlMatrixmultMatrixVec(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2042#else
2043VrmlMatrixmultMatrixVec(JSContext *cx, uintN argc, jsval *vp) {
2044 JSObject *obj = JS_THIS_OBJECT(cx,vp);
2045 jsval *argv = JS_ARGV(cx,vp);
2046#endif
2047 JSObject *transObj = NULL;
2048 JSObject *retObj = NULL;
2049 SFVec3fNative *Vptr;
2050
2051 double matrix1[16];
2052 int error = FALSE;
2053 struct point_XYZ inp, outp;
2054 outp.x = outp.y = outp.z = 0.0;
2055
2056 if (argc == 1) {
2057 error = !JS_ConvertArguments(cx, argc, argv, "o", &transObj);
2058 } else error = TRUE;
2059
2060 if (!error) if (!JS_InstanceOf(cx, transObj, &SFVec3fClass, NULL)) { error = TRUE;}
2061
2062 if ((Vptr = (SFVec3fNative *)JS_GetPrivateFw(cx, transObj)) == NULL) {
2063 error = TRUE;
2064 }
2065
2066 if (error) {
2067 ConsoleMessage ("VrmlMatrixMultVec, error in params");
2068 return JS_FALSE;
2069 }
2070
2071 COPY_SFVEC3F_TO_POINT_XYZ(inp,Vptr->v.c);
2072
2073 /* fill in the 2 matricies, multiply them, then return it */
2074 _getmatrix(cx,obj,matrix1);
2075
2076 /* is this the one we have to transpose? */
2077 mattranspose (matrix1, matrix1);
2078
2079 matrotate2v(matrix1, inp, outp);
2080
2081 retObj = JS_ConstructObjectFw(cx,&SFVec3fClass,NULL, NULL);
2082 if ((Vptr = (SFVec3fNative *)JS_GetPrivateFw(cx, retObj)) == NULL) {
2083 printf ("error in new VrmlMatrix\n");
2084 return JS_FALSE;
2085 }
2086
2087 COPY_POINT_XYZ_TO_SFVEC3F(Vptr->v.c,outp);
2088#if JS_VERSION < 185
2089 *rval = OBJECT_TO_JSVAL(retObj);
2090#else
2091 JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(retObj));
2092#endif
2093
2094 return JS_TRUE;
2095}
2096
2097
2098JSBool
2099#if JS_VERSION < 185
2100VrmlMatrixAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2101 return _standardMFAssign (cx, obj, argc, argv, rval, &VrmlMatrixClass,FIELDTYPE_FreeWRLPTR/*does not matter*/);
2102#else
2103VrmlMatrixAssign(JSContext *cx, uintN argc, jsval *vp) {
2104 JSObject *obj = JS_THIS_OBJECT(cx,vp);
2105 jsval *argv = JS_ARGV(cx,vp);
2106 jsval rval;
2107 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &VrmlMatrixClass,FIELDTYPE_FreeWRLPTR/*does not matter*/)) { return JS_FALSE; }
2108 JS_SET_RVAL(cx,vp,rval);
2109 return JS_TRUE;
2110#endif
2111}
2112
2113JSBool
2114#if JS_VERSION < 185
2115VrmlMatrixConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2116#else
2117VrmlMatrixConstr(JSContext *cx, uintN argc, jsval *vp) {
2118 JSObject *obj = JS_NewObject(cx,&VrmlMatrixClass,NULL,NULL);
2119 jsval *argv = JS_ARGV(cx,vp);
2120 jsval rval = OBJECT_TO_JSVAL(obj);
2121 if (!VrmlMatrixConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
2122 JS_SET_RVAL(cx,vp,rval);
2123 return JS_TRUE;
2124}
2125JSBool VrmlMatrixConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2126#endif
2127 JSObject *_arrayObj;
2128 int isArray;
2129 jsdouble _d;
2130 unsigned int i;
2131
2132 ADD_ROOT(cx,obj)
2133
2134 isArray = FALSE;
2135 if(argc == 1 && argv){
2136 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
2137 // tests/JohnCarlson/Arc1A.x3d
2138 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
2139 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
2140 return JS_FALSE;
2141 }
2142
2143 if(JS_IsArrayObject(cx, _arrayObj)){
2144 jsuint lengthp;
2145 jsval vp;
2146 //printf("its an array\n");
2147 isArray = TRUE;
2148 JS_GetArrayLength(cx,_arrayObj, &lengthp);
2149 argc = lengthp;
2150 }
2151 }
2152
2153 if ((argc != 16) && (argc != 0)) {
2154 printf ("VrmlMatrixConstr - require either 16 or no values\n");
2155 return JS_FALSE;
2156 }
2157
2158 DEFINE_LENGTH(cx,obj,16)
2159
2160 if (argc == 16) {
2161 for (i = 0; i < 16; i++) {
2162 jsval vp;
2163 if(isArray){
2164 JS_GetElement(cx, _arrayObj, i, &vp);
2165
2166 }else{
2167 vp = argv[i];
2168 }
2169 if (!JS_ValueToNumber(cx, vp, &_d)) {
2170 printf(
2171 "JS_ValueToNumber failed in VrmlMatrixConstr.\n");
2172 return JS_FALSE;
2173 }
2174
2175 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
2176 printf( "JS_DefineElement failed for arg %u in VrmlMatrixConstr.\n", i);
2177 return JS_FALSE;
2178 }
2179 }
2180 } else {
2181 /* make the identity matrix */
2182 double matrix[16];
2183 loadIdentityMatrix(matrix);
2184 _setmatrix (cx, obj, matrix);
2185 }
2186 *rval = OBJECT_TO_JSVAL(obj);
2187 return JS_TRUE;
2188}
2189
2190JSBool
2191#if JS_VERSION < 185
2192VrmlMatrixAddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
2193#elif JS_VERSION == 185
2194VrmlMatrixAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){
2195#else
2196VrmlMatrixAddProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
2197 JSObject *obj = *hobj._;
2198 jsid id = *hiid._;
2199 jsval *vp = hvp._;
2200#endif
2201 return doMFAddProperty(cx, obj, id, vp,"VrmlMatrixAddProperty");
2202}
2203
2204JSBool
2205#if JS_VERSION < 185
2206VrmlMatrixGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp){
2207#elif JS_VERSION == 185
2208VrmlMatrixGetProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp){
2209#else
2210VrmlMatrixGetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
2211 JSObject *obj = *hobj._;
2212 jsid iid = *hiid._;
2213 jsval *vp = hvp._;
2214#endif
2215 int32 _length, _index;
2216 jsval _length_val;
2217
2218#if JS_VERSION >= 185
2219 jsval id;
2220 if (!JS_IdToValue(cx,iid,&id)) {
2221 printf("JS_IdToValue failed in VrmlMatrixGetproperty.\n");
2222 return JS_FALSE;
2223 }
2224#endif
2225
2226 if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &_length_val)) {
2227 printf( "JS_GetProperty failed for \"%s\" in VrmlMatrixGetProperty.\n", MF_LENGTH_FIELD);
2228 return JS_FALSE;
2229 }
2230 _length = JSVAL_TO_INT(_length_val);
2231
2232/* -- note, code in here is not compliant to xulrunner-2
2233 if (JSVAL_IS_STRING(id)==TRUE) {
2234 printf(" is a common string :%s:\n",
2235 JS_GetStringBytes(JS_ValueToString(cx, id)));
2236 }
2237 if (JSVAL_IS_OBJECT(id)==TRUE) {
2238 printf (" parameter is an object\n");
2239 }
2240 if (JSVAL_IS_PRIMITIVE(id)==TRUE) {
2241 printf (" parameter is a primitive\n");
2242 }
2243 if (JSVAL_IS_NULL(id)) { printf (" - its a NULL\n");}
2244 if (JSVAL_IS_INT(id)) { printf (" - its a INT %d\n",JSVAL_TO_INT(id));}
2245*/
2246
2247
2248
2249
2250 if (JSVAL_IS_INT(id)) {
2251 _index = JSVAL_TO_INT(id);
2252
2253 if (_index >= _length) {
2254 JS_NewNumberValue(cx,0.0,vp);
2255 if (!JS_DefineElement(cx, obj, (jsint) _index, *vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
2256 printf( "JS_DefineElement failed in VrmlMatrixGetProperty.\n");
2257 return JS_FALSE;
2258 }
2259 } else {
2260 if (!JS_LookupElement(cx, obj, _index, vp)) {
2261 printf(
2262 "JS_LookupElement failed in VrmlMatrixGetProperty.\n");
2263 return JS_FALSE;
2264 }
2265 if (JSVAL_IS_NULL(*vp)) {
2266 printf( "VrmlMatrixGetProperty: obj = %p, jsval = %d does not exist!\n",
2267 obj, (int) _index);
2268 return JS_FALSE;
2269 }
2270 }
2271 } else if (JSVAL_IS_OBJECT(id)) {
2272 }
2273
2274 return JS_TRUE;
2275}
2276
2277JSBool
2278#if JS_VERSION < 185
2279VrmlMatrixSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
2280#elif JS_VERSION == 185
2281VrmlMatrixSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp){
2282#else
2283VrmlMatrixSetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSBool strict, JSMutableHandleValue hvp){
2284 JSObject *obj = *hobj._;
2285 jsid id = *hiid._;
2286 jsval *vp = hvp._;
2287#endif
2288 return doMFSetProperty(cx, obj, id, vp,1000); /* do not have a FIELDTYPE for this */
2289}
2290
2291/* MFRotation */
2292JSBool
2293#if JS_VERSION < 185
2294MFRotationAddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
2295#elif JS_VERSION == 185
2296MFRotationAddProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){
2297#else
2298MFRotationAddProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
2299 JSObject *obj = *hobj._;
2300 jsid id = *hiid._;
2301 jsval *vp = hvp._;
2302#endif
2303 return doMFAddProperty(cx, obj, id, vp,"MFRotationAddProperty");
2304}
2305
2306JSBool
2307#if JS_VERSION < 185
2308MFRotationGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
2309#elif JS_VERSION == 185
2310MFRotationGetProperty(JSContext *cx, JSObject *obj, jsid id, jsval *vp){
2311#else
2312MFRotationGetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
2313 JSObject *obj = *hobj._;
2314 jsid id = *hiid._;
2315 jsval *vp = hvp._;
2316#endif
2317 return _standardMFGetProperty(cx, obj, id, vp,
2318 "_FreeWRL_Internal = new SFRotation()",FIELDTYPE_MFRotation);
2319}
2320
2321JSBool
2322#if JS_VERSION < 185
2323MFRotationSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
2324#elif JS_VERSION == 185
2325MFRotationSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp){
2326#else
2327MFRotationSetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSBool strict, JSMutableHandleValue hvp){
2328 JSObject *obj = *hobj._;
2329 jsid id = *hiid._;
2330 jsval *vp = hvp._;
2331#endif
2332 return doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFRotation);
2333}
2334
2335JSBool
2336#if JS_VERSION < 185
2337MFRotationToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2338#else
2339MFRotationToString(JSContext *cx, uintN argc, jsval *vp) {
2340 JSObject *obj = JS_THIS_OBJECT(cx,vp);
2341 jsval *argv = JS_ARGV(cx,vp);
2342 jsval rval;
2343#endif
2344 UNUSED(argc);
2345 UNUSED(argv);
2346#if JS_VERSION < 185
2347 return doMFToString(cx, obj, "MFRotation", rval);
2348#else
2349 if (!doMFToString(cx, obj, "MFRotation", &rval)) { return JS_FALSE; }
2350 JS_SET_RVAL(cx,vp,rval);
2351 return JS_TRUE;
2352#endif
2353}
2354
2355JSBool
2356#if JS_VERSION < 185
2357MFRotationConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2358#else
2359MFRotationConstr(JSContext *cx, uintN argc, jsval *vp) {
2360 JSObject *obj = JS_NewObject(cx,&MFRotationClass,NULL,NULL);
2361 jsval *argv = JS_ARGV(cx,vp);
2362 jsval rval = OBJECT_TO_JSVAL(obj);
2363 if (!MFRotationConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
2364 JS_SET_RVAL(cx,vp,rval);
2365 return JS_TRUE;
2366}
2367JSBool MFRotationConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2368#endif
2369 JSObject *_arrayObj;
2370 int isArray;
2371 JSObject *_obj;
2372 unsigned int i;
2373 union anyVrml *anyv;
2374
2375 ADD_ROOT(cx,obj)
2376
2377 isArray = FALSE;
2378 if(argc == 1 && argv){
2379 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
2380 // tests/JohnCarlson/Arc1A.x3d
2381 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
2382 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
2383 return JS_FALSE;
2384 }
2385
2386 if(JS_IsArrayObject(cx, _arrayObj)){
2387 jsuint lengthp;
2388 jsval vp;
2389 //printf("its an array\n");
2390 isArray = TRUE;
2391 JS_GetArrayLength(cx,_arrayObj, &lengthp);
2392 argc = lengthp;
2393 }
2394 }
2395
2396 if(SM_method() == 2){
2397 AnyNative *any;
2398 int newsize;
2399 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFRotation,NULL,NULL)) == NULL){
2400 printf( "AnyfNativeNew failed in MFRotationConstr.\n");
2401 return JS_FALSE;
2402 }
2403 if (!JS_SetPrivateFw(cx, obj, any)) {
2404 printf( "JS_SetPrivate failed in MFRotationConstr.\n");
2405 return JS_FALSE;
2406 }
2407 anyv = any->v;
2408 newsize = sizeof(struct SFRotation)*upper_power_of_two(argc);
2409 if(argc > 0){
2410 anyv->mfrotation.p = MALLOC(struct SFRotation*,newsize);
2411 memset(anyv->mfrotation.p,0,newsize);
2412 }
2413
2414 }else{
2415 DEFINE_LENGTH(cx,obj,argc)
2416 }
2417
2418 if (!argv) {
2419 return JS_TRUE;
2420 }
2421
2422 #ifdef JSVRMLCLASSESVERBOSE
2423 printf("MFRotationConstr: obj = %p, %u args\n", obj, argc);
2424 #endif
2425 for (i = 0; i < argc; i++) {
2426 jsval vp;
2427 if(isArray){
2428 JS_GetElement(cx, _arrayObj, i, &vp);
2429
2430 }else{
2431 vp = argv[i];
2432 }
2433 if (!JS_ValueToObject(cx, vp, &_obj)) {
2434 printf(
2435 "JS_ValueToObject failed in MFRotationConstr.\n");
2436 return JS_FALSE;
2437 }
2438
2439 CHECK_CLASS(cx,_obj,NULL,__FUNCTION__,SFRotationClass)
2440 if(SM_method()==2){
2441 AnyNative *any2;
2442 if((any2 = JS_GetPrivateFw(cx,_obj)) != NULL){
2443 if(any2->type == FIELDTYPE_SFRotation ){
2444 shallow_copy_field(FIELDTYPE_SFRotation,any2->v,(union anyVrml*)&anyv->mfrotation.p[i]);
2445 anyv->mfrotation.n = i+1;
2446 }
2447 }
2448 // else for now we'll leave zeros
2449 }else{
2450 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
2451 printf( "JS_DefineElement failed for arg %d in MFRotationConstr.\n", i);
2452 return JS_FALSE;
2453 }
2454 }
2455 }
2456 *rval = OBJECT_TO_JSVAL(obj);
2457 return JS_TRUE;
2458}
2459
2460JSBool
2461#if JS_VERSION < 185
2462MFRotationAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2463 return _standardMFAssign (cx, obj, argc, argv, rval, &MFRotationClass,FIELDTYPE_SFRotation);
2464#else
2465MFRotationAssign(JSContext *cx, uintN argc, jsval *vp) {
2466 JSObject *obj = JS_THIS_OBJECT(cx,vp);
2467 jsval *argv = JS_ARGV(cx,vp);
2468 jsval rval;
2469
2470 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFRotationClass,FIELDTYPE_SFRotation)) { return JS_FALSE; }
2471 JS_SET_RVAL(cx,vp,rval);
2472 return JS_TRUE;
2473#endif
2474}
2475
2476/* MFStrings */
2477JSBool
2478#if JS_VERSION < 185
2479MFStringAddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
2480#elif JS_VERSION == 185
2481MFStringAddProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp) {
2482 jsval id;
2483 if (!JS_IdToValue(cx,iid,&id)) {
2484 printf("JS_IdToValue failed in MFStringAddProperty\n");
2485 return JS_FALSE;
2486 }
2487#else
2488MFStringAddProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
2489 JSObject *obj = *hobj._;
2490 jsid iid = *hiid._;
2491 jsval *vp = hvp._;
2492 jsval id;
2493 if (!JS_IdToValue(cx,iid,&id)) {
2494 printf("JS_IdToValue failed in MFStringAddProperty\n");
2495 return JS_FALSE;
2496 }
2497#endif
2498
2499 #ifdef JSVRMLCLASSESVERBOSE
2500 printf("MFStringAddProperty: vp = %p\n", obj);
2501 if (JSVAL_IS_STRING(*vp)==TRUE) {
2502 printf(" is a common string :%s:\n",
2503#if JS_VERSION < 185
2504 JS_GetStringBytes(JS_ValueToString(cx, *vp)));
2505#else
2506 JS_EncodeString(cx,JS_ValueToString(cx, *vp)));
2507#endif
2508 }
2509 if (JSVAL_IS_OBJECT(*vp)==TRUE) {
2510 printf (" parameter is an object\n");
2511 }
2512 if (JSVAL_IS_PRIMITIVE(*vp)==TRUE) {
2513 printf (" parameter is a primitive\n");
2514 }
2515 if (JSVAL_IS_NULL(*vp)) { printf (" - its a NULL\n");}
2516 if (JSVAL_IS_INT(*vp)) { printf (" - its a INT %d\n",JSVAL_TO_INT(*vp));}
2517
2518 printf("MFStringAddProperty: id = %p\n", obj);
2519 if (JSVAL_IS_STRING(id)==TRUE) {
2520 printf(" is a common string :%s:\n",
2521#if JS_VERSION < 185
2522 JS_GetStringBytes(JS_ValueToString(cx, id)));
2523#else
2524 JS_EncodeString(cx,JS_ValueToString(cx, id)));
2525#endif
2526 }
2527 if (JSVAL_IS_OBJECT(id)==TRUE) {
2528 printf (" parameter is an object\n");
2529 }
2530 if (JSVAL_IS_PRIMITIVE(id)==TRUE) {
2531 printf (" parameter is a primitive\n");
2532 }
2533 if (JSVAL_IS_NULL(id)) { printf (" - its a NULL\n");}
2534 if (JSVAL_IS_INT(id)) { printf (" - its a INT %d\n",JSVAL_TO_INT(id));}
2535
2536 #endif
2537
2538
2539 /* unquote parts of vp string if necessary */
2540 if (JSVAL_IS_STRING(*vp)) {
2541 if (!doMFStringUnquote(cx, vp)) {
2542 printf(
2543 "doMFStringUnquote failed in MFStringAddProperty.\n");
2544 return JS_FALSE;
2545 }
2546 }
2547#if JS_VERSION < 185
2548 return doMFAddProperty(cx, obj, id, vp,"MFStringAddProperty");
2549#else
2550 return doMFAddProperty(cx, obj, iid, vp,"MFStringAddProperty");
2551#endif
2552}
2553
2554
2555JSBool
2556#if JS_VERSION < 185
2557MFStringGetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp){
2558#elif JS_VERSION == 185
2559MFStringGetProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp){
2560#else
2561MFStringGetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
2562 JSObject *obj = *hobj._;
2563 jsid iid = *hiid._;
2564 jsval *vp = hvp._;
2565#endif
2566
2567 JSString *_str;
2568 int32 _length, _index;
2569 jsval _length_val;
2570#if JS_VERSION >= 185
2571 jsval id;
2572 if (!JS_IdToValue(cx,iid,&id)) {
2573 printf("JS_IdToValue failed in MFStringGetProperty\n");
2574 return JS_FALSE;
2575 }
2576#endif
2577 if(SM_method()==2){
2578 return _standardMFGetProperty(cx, obj, iid, vp,
2579 "_FreeWRL_Internal = new SFString()",FIELDTYPE_MFString);
2580
2581 }
2582
2583 #ifdef JSVRMLCLASSESVERBOSE
2584 printf("MFStringGetProperty: obj = %p\n", obj);
2585 #endif
2586
2587 if (!JS_GetProperty(cx, obj, MF_LENGTH_FIELD, &_length_val)) {
2588 printf( "JS_GetProperty failed for \"%s\" in MFStringGetProperty.\n", MF_LENGTH_FIELD);
2589 return JS_FALSE;
2590 }
2591 _length = JSVAL_TO_INT(_length_val);
2592
2593 if (JSVAL_IS_INT(id)) {
2594 _index = JSVAL_TO_INT(id);
2595
2596 if (_index >= _length) {
2597 _str = JS_NewStringCopyZ(cx, "");
2598 *vp = STRING_TO_JSVAL(_str);
2599 if (!JS_DefineElement(cx, obj, (jsint) _index, *vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
2600 printf( "JS_DefineElement failed in MFStringGetProperty.\n");
2601 return JS_FALSE;
2602 }
2603 } else {
2604 if (!JS_LookupElement(cx, obj, _index, vp)) {
2605 printf( "JS_LookupElement failed in MFStringGetProperty.\n");
2606 return JS_FALSE;
2607 }
2608 if (JSVAL_IS_NULL(*vp)) {
2609 /* jut make up new strings, as above */
2610 /* printf ("MFStringGetProperty, element %d is JSVAL_VOID, making up string for it\n",_index); */
2611 _str = JS_NewStringCopyZ(cx, "NULL");
2612 *vp = STRING_TO_JSVAL(_str);
2613 if (!JS_DefineElement(cx, obj, (jsint) _index, *vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
2614 printf( "JS_DefineElement failed in MFStringGetProperty.\n");
2615 return JS_FALSE;
2616 }
2617 }
2618 }
2619 }
2620
2621 return JS_TRUE;
2622}
2623
2624JSBool
2625#if JS_VERSION < 185
2626MFStringSetProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp){
2627#elif JS_VERSION == 185
2628MFStringSetProperty(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp){
2629#else
2630MFStringSetProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSBool strict, JSMutableHandleValue hvp){
2631 JSObject *obj = *hobj._;
2632 jsid id = *hiid._;
2633 jsval *vp = hvp._;
2634#endif
2635 JSBool rv;
2636
2637 #ifdef JSVRMLCLASSESVERBOSE
2638 printf("MFStringSetProperty: obj = %p id %d jsval %u\n", obj, id, (unsigned int)*vp);
2639
2640printf ("MFStringSetProperty, setting vp of type...\n");
2641 if (JSVAL_IS_OBJECT(*vp)) { printf (" - MFStringSetProperty, vp is a OBJECT\n");}
2642 if (JSVAL_IS_PRIMITIVE(*vp)) { printf (" - MFStringSetProperty, vp is a PRIMITIVE\n");}
2643 if (JSVAL_IS_NULL(*vp)) { printf (" - MFStringSetProperty, vp is a NULL\n");}
2644 if (JSVAL_IS_STRING(*vp)) { printf (" - MFStringSetProperty, vp is a STRING\n");}
2645 if (JSVAL_IS_INT(*vp)) { printf (" - MFStringSetProperty, vp is a INT %d\n",JSVAL_TO_INT(*vp));}
2646
2647 #endif
2648
2649
2650 /* unquote parts of vp string if necessary */
2651 if (JSVAL_IS_STRING(*vp)) {
2652 if (!doMFStringUnquote(cx, vp)) {
2653 printf(
2654 "doMFStringUnquote failed in MFStringSetProperty.\n");
2655 return JS_FALSE;
2656 }
2657 }
2658 rv = doMFSetProperty(cx, obj, id, vp,FIELDTYPE_MFString);
2659 #ifdef JSVRMLCLASSESVERBOSE
2660 printf ("returning from MFStringSetProperty\n");
2661 #endif
2662
2663 return rv;
2664
2665}
2666
2667JSBool
2668#if JS_VERSION < 185
2669MFStringToString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2670#else
2671MFStringToString(JSContext *cx, uintN argc, jsval *vp) {
2672 JSObject *obj = JS_THIS_OBJECT(cx,vp);
2673 jsval *argv = JS_ARGV(cx,vp);
2674 jsval rval;
2675#endif
2676 UNUSED(argc);
2677 UNUSED(argv);
2678 #ifdef JSVRMLCLASSESVERBOSE
2679 printf("MFStringToString: obj = %p, %u args\n", obj, argc);
2680 #endif
2681
2682
2683#if JS_VERSION < 185
2684 return doMFToString(cx, obj, "MFString", rval);
2685#else
2686 if (!doMFToString(cx, obj, "MFString", &rval)) { return JS_FALSE; }
2687 JS_SET_RVAL(cx,vp,rval);
2688 return JS_TRUE;
2689#endif
2690}
2691
2692
2693JSBool
2694#if JS_VERSION < 185
2695MFStringConstr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2696#else
2697MFStringConstr(JSContext *cx, uintN argc, jsval *vp) {
2698 JSObject *obj = JS_NewObject(cx,&MFStringClass,NULL,NULL);
2699 jsval *argv = JS_ARGV(cx,vp);
2700 jsval rval = OBJECT_TO_JSVAL(obj);
2701 if (!MFStringConstrInternals(cx,obj,argc,argv,&rval)) { return JS_FALSE; }
2702 JS_SET_RVAL(cx,vp,rval);
2703 return JS_TRUE;
2704}
2705JSBool MFStringConstrInternals(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2706#endif
2707 JSObject *_arrayObj;
2708 int isArray;
2709
2710 unsigned int i;
2711 union anyVrml *anyv;
2712
2713 #ifdef JSVRMLCLASSESVERBOSE
2714 JSString *_str;
2715 printf("MFStringConstr: cx %p, obj %p args %d rval %p parent %p... ", cx, obj, argc, rval, JS_GetParent(cx, obj));
2716 #endif
2717
2718 ADD_ROOT(cx,obj)
2719
2720 isArray = FALSE;
2721 if(argc == 1 && argv){
2722 //could it be new MFxxx( [A,B] ) javscript array, as used by Carlson aka Carlson Array
2723 // tests/JohnCarlson/Arc1A.x3d
2724 if (!JS_ValueToObject(cx, argv[0], &_arrayObj)) {
2725 printf( "JS_ValueToObject failed in MFVec3fConstr.\n");
2726 return JS_FALSE;
2727 }
2728
2729 if(JS_IsArrayObject(cx, _arrayObj)){
2730 jsuint lengthp;
2731 jsval vp;
2732 //printf("its an array\n");
2733 isArray = TRUE;
2734 JS_GetArrayLength(cx,_arrayObj, &lengthp);
2735 argc = lengthp;
2736 }
2737 }
2738
2739 if(SM_method() == 2){
2740 AnyNative *any;
2741 int newsize;
2742 if((any = (AnyNative*)AnyNativeNew(FIELDTYPE_MFString,NULL,NULL)) == NULL){
2743 printf( "AnyfNativeNew failed in MFStringConstr.\n");
2744 return JS_FALSE;
2745 }
2746 if (!JS_SetPrivateFw(cx, obj, any)) {
2747 printf( "JS_SetPrivate failed in MFStringConstr.\n");
2748 return JS_FALSE;
2749 }
2750 anyv = any->v;
2751 newsize = sizeof(struct Uni_String*)*upper_power_of_two(argc);
2752 if(argc > 0){
2753 anyv->mfstring.p = MALLOC(struct Uni_String**,newsize);
2754 memset(anyv->mfstring.p,0,newsize);
2755 }
2756
2757 }else{
2758 DEFINE_LENGTH(cx,obj,argc)
2759 DEFINE_MF_ECMA_HAS_CHANGED
2760 }
2761
2762 if (!argv) {
2763 return JS_TRUE;
2764 }
2765
2766 for (i = 0; i < argc; i++) {
2767 jsval vp;
2768 if(isArray){
2769 JS_GetElement(cx, _arrayObj, i, &vp);
2770
2771 }else{
2772 vp = argv[i];
2773 }
2774 #ifdef JSVRMLCLASSESVERBOSE
2775 printf ("argv %d is a ...",i);
2776
2777 if (JSVAL_IS_STRING(argv[i])==TRUE) {
2778 printf (" Common String, is");
2779 _str = JS_ValueToString(cx, argv[i]);
2780#if JS_VERSION < 185
2781 printf (" %s",JS_GetStringBytes(_str));
2782#else
2783 printf (" %s",JS_EncodeString(cx,_str));
2784#endif
2785 printf ("..");
2786
2787 }
2788 if (JSVAL_IS_OBJECT(argv[i])==TRUE) {
2789 printf (" is an object");
2790 }
2791 if (JSVAL_IS_PRIMITIVE(argv[i])==TRUE) {
2792 printf (" is a primitive");
2793 }
2794
2795 if ((_str = JS_ValueToString(cx, argv[i])) == NULL) {
2796 printf( "JS_ValueToString failed in MFStringConstr.");
2797 return JS_FALSE;
2798 }
2799 printf ("\n");
2800 #endif
2801
2802 if(SM_method()==2){
2803 char *cstring = NULL;
2804 if (JSVAL_IS_STRING(vp)==TRUE) {
2805 // https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/JSAPI_reference/JS_EncodeString
2806 // cstring: we own it
2807 JSString *_str;
2808 _str = JS_ValueToString(cx, vp);
2809#if JS_VERSION < 185
2810 cstring = JS_GetStringBytes(_str);
2811#else
2812 cstring = JS_EncodeString(cx,_str); //if utf16: lossy - will drop first byte, garbage
2813 //JS_free(cx,_str); bombs if I do this
2814#endif
2815 }else{
2816 //could try and convert object or ecma primitive to string via toString()
2817 }
2818 if(cstring){
2819 //newASCIIString does an extra malloc
2820 struct Uni_String *us;
2821 us = MALLOC(struct Uni_String*,sizeof(struct Uni_String));
2822 us->strptr = cstring;
2823 us->len = strlen(cstring);
2824 us->touched = 0;
2825 anyv->mfstring.p[i] = us;
2826 anyv->mfstring.n = i+1;
2827 }
2828 // else for now we'll leave zeros
2829 }else{
2830 if (!JS_DefineElement(cx, obj, (jsint) i, vp, JS_GET_PROPERTY_STUB, JS_SET_PROPERTY_CHECK, JSPROP_ENUMERATE)) {
2831 printf( "JS_DefineElement failed for arg %d in MFStringConstr.\n", i);
2832 return JS_FALSE;
2833 }
2834 }
2835 }
2836 *rval = OBJECT_TO_JSVAL(obj);
2837
2838 #ifdef JSVRMLCLASSESVERBOSE
2839 printf ("finished MFStringConstr\n");
2840 #endif
2841
2842 return JS_TRUE;
2843}
2844
2845JSBool
2846#if JS_VERSION < 185
2847MFStringAssign(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
2848#else
2849MFStringAssign(JSContext *cx, uintN argc, jsval *vp) {
2850 JSObject *obj = JS_THIS_OBJECT(cx,vp);
2851 jsval *argv = JS_ARGV(cx,vp);
2852 jsval rval;
2853#endif
2854
2855 #ifdef JSVRMLCLASSESVERBOSE
2856 printf("MFStringAssign: obj = %p args %d... ", obj, argc);
2857 #endif
2858 if(SM_method() != 2){
2859 SET_MF_ECMA_HAS_CHANGED
2860 }
2861
2862#if JS_VERSION < 185
2863 return _standardMFAssign (cx, obj, argc, argv, rval, &MFStringClass,FIELDTYPE_SFString);
2864#else
2865 if (!_standardMFAssign (cx, obj, argc, argv, &rval, &MFStringClass,FIELDTYPE_SFString)) { return JS_FALSE; }
2866 JS_SET_RVAL(cx,vp,OBJECT_TO_JSVAL(obj));
2867 return JS_TRUE;
2868#endif
2869}
2870
2871/* testing.. */
2872#if JS_VERSION < 185
2873JSBool MFStringDeleteProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp) {
2874#elif JS_VERSION == 185
2875MFStringDeleteProperty(JSContext *cx, JSObject *obj, jsid iid, jsval *vp){
2876#else
2877MFStringDeleteProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid, JSMutableHandleValue hvp){
2878 JSObject *obj = *hobj._;
2879 jsid iid = *hiid._;
2880 jsval *vp = hvp._;
2881#endif
2882 #ifdef JSVRMLCLASSESVERBOSE
2883 printf ("MFStringDeleteProperty\n");
2884 #endif
2885 return JS_TRUE;
2886}
2887JSBool
2888#if JS_VERSION < 186
2889MFStringEnumerateProperty(JSContext *cx, JSObject *obj) {
2890#else //186 aka 17
2891MFStringEnumerateProperty(JSContext *cx, JSHandleObject hobj) {
2892 JSObject *obj = *hobj._;
2893#endif
2894 #ifdef JSVRMLCLASSESVERBOSE
2895 printf ("MFStringEnumerateProperty\n");
2896 #endif
2897 return JS_TRUE;
2898}
2899
2900#if JS_VERSION < 185
2901JSBool MFStringResolveProperty(JSContext *cx, JSObject *obj, jsval id) {
2902#elif JS_VERSION == 185
2903JSBool MFStringResolveProperty(JSContext *cx, JSObject *obj, jsid id) {
2904#else
2905JSBool MFStringResolveProperty(JSContext *cx, JSHandleObject hobj, JSHandleId hiid){
2906 JSObject *obj = *hobj._;
2907 jsid id = *hiid._;
2908#endif
2909 #ifdef JSVRMLCLASSESVERBOSE
2910 printf ("MFStringResolveProperty\n");
2911 #endif
2912 return JS_TRUE;
2913}
2914#if JS_VERSION < 186
2915JSBool MFStringConvertProperty(JSContext *cx, JSObject *obj, JSType type, jsval *vp) {
2916#else
2917JSBool MFStringConvertProperty(JSContext *cx, JSHandleObject hobj, JSType type, JSMutableHandleValue hvp) {
2918 JSObject *obj = *hobj._;
2919 jsval *vp = hvp._;
2920#endif
2921
2922 #ifdef JSVRMLCLASSESVERBOSE
2923 printf ("MFStringConvertProperty\n");
2924 #endif
2925 return JS_TRUE;
2926}
2927
2928#endif /* !(defined(JAVASCRIPT_STUB) || defined(JAVASCRIPT_DUK) */
2929#endif