source: trunk/zoo-project/zoo-kernel/service_internal_js.c @ 471

Last change on this file since 471 was 471, checked in by djay, 10 years ago

Remove leaks from DescribeProcess? and JavaScript? support. Fix wrong ulinet update on previous commit. Use the new updateStatus/setOutputValue functions as described in #88 from longProcess. Add default value for QREncode service in ZCFG. Fix name of profile service in the ZCFG file.

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc
File size: 22.3 KB
Line 
1/**
2 * Author : Gérald FENOY
3 *
4 * Copyright (c) 2009-2012 GeoLabs SARL
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24
25#include "service_internal.h"
26
27#ifndef JSCLASS_GLOBAL_FLAGS
28#define JSCLSAS_GLOBAL_FLAGS 0
29#endif
30
31static char dbg[1024];
32
33JSBool
34JSAlert(JSContext *cx, uintN argc, jsval *argv1)
35{
36  jsval *argv = JS_ARGV(cx,argv1);
37  int i=0;
38  JS_MaybeGC(cx);
39  for(i=0;i<argc;i++){
40    JSString* jsmsg = JS_ValueToString(cx,argv[i]);
41    char *tmp=JS_EncodeString(cx,jsmsg);
42    fprintf(stderr,"[ZOO-API:JS] %s\n",tmp);
43    free(tmp);
44  }
45  JS_MaybeGC(cx);
46 
47  return JS_TRUE;
48}
49
50JSBool
51JSLoadScripts(JSContext *cx, uintN argc, jsval *argv1)
52{
53  //map* request = JS_GetContextPrivate(cx);
54  //map* tmpm1=getMap(request,"metapath");
55  JS_MaybeGC(cx);
56
57  char ntmp[1024];
58  getcwd(ntmp,1024);
59
60  jsval *argv = JS_ARGV(cx,argv1);
61  int i=0;
62  JS_MaybeGC(cx);
63  for(i=0;i<argc;i++){
64    JSString* jsmsg = JS_ValueToString(cx,argv[i]);
65    char *filename = JSValToChar(cx,&argv[i]);
66    char *api0=(char*)malloc((strlen(ntmp)+strlen(filename)+2)*sizeof(char));
67    sprintf(api0,"%s/%s",ntmp,filename);
68#ifdef JS_DEBUG
69    fprintf(stderr,"Trying to load %s\n",api0);
70    fflush(stderr);
71#endif
72    JSObject *api_script1=loadZooApiFile(cx,JS_GetGlobalObject(cx),api0);
73    free(api0);
74  }
75  JS_MaybeGC(cx);
76  JS_SET_RVAL(cx, argv1, JSVAL_VOID);
77 
78  return JS_TRUE;
79}
80
81
82int zoo_js_support(maps** main_conf,map* request,service* s,
83                   maps **inputs,maps **outputs)
84{
85  maps* main=*main_conf;
86  maps* _inputs=*inputs;
87  maps* _outputs=*outputs;
88
89  /* The class of the global object. */
90  JSClass global_class= {
91    "global", JSCLASS_GLOBAL_FLAGS,
92    JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
93    JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
94    JSCLASS_NO_OPTIONAL_MEMBERS
95  };
96
97  /* JS variables. */
98  JSRuntime *rt;
99  JSContext *cx;
100  JSObject  *global;
101
102  /* Create a JS runtime. */
103  rt = JS_NewRuntime(8L * 1024L * 1024L);
104  if (rt == NULL)
105    return 1;
106 
107  /* Create a context. */
108  cx = JS_NewContext(rt,8192);
109  if (cx == NULL){
110    return 1;
111  }
112  JS_SetOptions(cx, JSOPTION_VAROBJFIX | JSOPTION_JIT | JSOPTION_METHODJIT);
113  JS_SetVersion(cx, JSVERSION_LATEST);
114  JS_SetErrorReporter(cx, reportError);
115
116  /* Create the global object. */
117  global = JS_NewCompartmentAndGlobalObject(cx, &global_class, NULL);
118
119  /* Populate the global object with the standard globals,
120     like Object and Array. */
121  if (!JS_InitStandardClasses(cx, global)){
122    return 1;
123  }
124
125  /* Define specific function and global variable to share with JS runtime
126   */
127  jsval tmp=INT_TO_JSVAL(3);
128  if (!JS_SetProperty(cx, global, "SERVICE_SUCCEEDED", &tmp))
129    return 1;
130  tmp=INT_TO_JSVAL(4);
131  if (!JS_SetProperty(cx, global, "SERVICE_FAILED", &tmp))
132    return 1;
133  if (!JS_DefineFunction(cx, global, "ZOORequest", JSRequest, 4, 0))
134    return 1;
135  if (!JS_DefineFunction(cx, global, "ZOOTranslate", JSTranslate, 4, 0))
136    return 1;
137  if (!JS_DefineFunction(cx, global, "ZOOUpdateStatus", JSUpdateStatus, 2, 0))
138    return 1;
139  if (!JS_DefineFunction(cx, global, "alert", JSAlert, 2, 0))
140    return 1; 
141  if (!JS_DefineFunction(cx, global, "importScripts", JSLoadScripts, 1, 0))
142    return 1;
143
144  /**
145   * Add private context object
146   */
147  void* cxPrivate = request;
148  JS_SetContextPrivate(cx,cxPrivate);
149   
150  map* tmpm1=getMap(request,"metapath");
151  char ntmp[1024];
152  getcwd(ntmp,1024);
153
154  /**
155   * Load the first part of the ZOO-API
156   */
157  char *api0=(char*)malloc(strlen(tmpm1->value)+strlen(ntmp)+17);
158  sprintf(api0,"%s/%s/ZOO-proj4js.js",ntmp,tmpm1->value);
159#ifdef JS_DEBUG
160  fprintf(stderr,"Trying to load %s\n",api0);
161#endif
162  JSObject *api_script1=loadZooApiFile(cx,global,api0);
163  free(api0);
164  fflush(stderr);
165
166  char *api1=(char*)malloc(strlen(tmpm1->value)+strlen(ntmp)+13);
167  sprintf(api1,"%s/%s/ZOO-api.js",ntmp,tmpm1->value);
168#ifdef JS_DEBUG
169  fprintf(stderr,"Trying to load %s\n",api1);
170#endif
171  JSObject *api_script2=loadZooApiFile(cx,global,api1);
172  free(api1);
173  fflush(stderr);
174
175  /* Your application code here. This may include JSAPI calls
176     to create your own custom JS objects and run scripts. */
177  maps* out=*outputs;
178  int res=SERVICE_FAILED;
179  maps* mc=*main_conf;
180  map* tmpm2=getMap(s->content,"serviceProvider");
181
182  char *filename=(char*)malloc(strlen(tmpm1->value)+strlen(tmpm2->value)+strlen(ntmp)+3);
183  sprintf(filename,"%s/%s/%s",ntmp,tmpm1->value,tmpm2->value);
184  filename[strlen(tmpm1->value)+strlen(tmpm2->value)+strlen(ntmp)+2]=0;
185#ifdef JS_DEBUG
186  fprintf(stderr,"FILENAME %s\n",filename);
187#endif
188  struct stat file_status;
189  stat(filename, &file_status);
190  //char *source=(char*)malloc(file_status.st_size);
191  uint16 lineno;
192  jsval rval;
193  JSBool ok ;
194  JSObject *script = JS_CompileFile(cx, global, filename);
195  if(script!=NULL){
196    (void)JS_ExecuteScript(cx, global, script, &rval);
197  }
198  else{
199    char tmp1[1024];
200    sprintf(tmp1,"Unable to load JavaScript file %s",filename);
201    free(filename);
202    map* err=createMap("text",tmp1);
203    addToMap(err,"code","NoApplicableCode");
204    printExceptionReportResponse(mc,err);
205    freeMap(&err);
206    free(err);
207    JS_MaybeGC(cx);
208    JS_DestroyContext(cx);
209    JS_DestroyRuntime(rt);
210    JS_ShutDown();
211    return -1;
212  }
213 
214
215  /* Call a function in obj's scope. */
216  jsval argv[3];
217  JSObject *jsargv1=JSObject_FromMaps(cx,*main_conf);
218  argv[0] = OBJECT_TO_JSVAL(jsargv1);
219  JSObject *jsargv2=JSObject_FromMaps(cx,*inputs);
220  argv[1] = OBJECT_TO_JSVAL(jsargv2);
221  JSObject *jsargv3=JSObject_FromMaps(cx,*outputs);
222  argv[2] = OBJECT_TO_JSVAL(jsargv3);
223  jsval rval1=JSVAL_NULL;
224#ifdef JS_DEBUG
225  fprintf(stderr, "object %p\n", (void *) argv[2]);
226#endif
227
228  ok = JS_CallFunctionName(cx, global, s->name, 3, argv, &rval1);
229
230#ifdef JS_DEBUG
231  fprintf(stderr, "object %p\n", (void *) argv[2]);
232#endif
233
234  JSObject *d;
235  if (ok==JS_TRUE && JSVAL_IS_OBJECT(rval1)==JS_TRUE) {
236#ifdef JS_DEBUG
237    fprintf(stderr,"Function run sucessfully !\n");
238#endif
239    /* Should get a number back from the service function call. */
240    ok = JS_ValueToObject(cx, rval1, &d);
241  }else{
242    /* Unable to run JS function */
243    char tmp1[1024];
244    if(strlen(dbg)==0)
245      sprintf(dbg,"No result was found after the function call");
246    sprintf(tmp1,"Unable to run %s from the JavaScript file %s : \n %s",s->name,filename,dbg);
247#ifdef JS_DEBUG
248    fprintf(stderr,"%s",tmp1);
249#endif
250    map* err=createMap("text",tmp1);
251    addToMap(err,"code","NoApplicableCode");
252    printExceptionReportResponse(*main_conf,err);
253    freeMap(&err);
254    free(err);
255    free(filename);
256    JS_MaybeGC(cx);
257    JS_DestroyContext(cx);
258    JS_DestroyRuntime(rt);
259    JS_ShutDown();
260    // Should return -1 here but the unallocation won't work from zoo_service_loader.c line 1847
261    return -1;
262  }
263
264  jsval t=OBJECT_TO_JSVAL(d);
265  if(JS_IsArrayObject(cx,d)){
266#ifdef JS_DEBUG
267    fprintf(stderr,"An array was returned !\n");
268#endif
269    jsuint       len;
270    if((JS_GetArrayLength(cx, d, &len)==JS_FALSE)){
271#ifdef JS_DEBUG
272      fprintf(stderr,"outputs array is empty\n");
273#endif
274    }
275    jsval tmp1;
276    JSBool hasResult=JS_GetElement(cx,d,0,&tmp1);
277    res=JSVAL_TO_INT(tmp1);
278#ifdef JS_DEBUG
279    fprintf(stderr," * %d * \n",res);
280#endif
281    if(res==SERVICE_SUCCEEDED){
282      jsval tmp2;
283      JSBool hasElement=JS_GetElement(cx,d,1,&tmp2);
284      if(hasElement==JS_TRUE){
285        freeMaps(outputs);
286        free(*outputs);
287        *outputs=mapsFromJSObject(cx,tmp2);
288      }
289    }else{
290      jsval tmp3;
291      JSBool hasConf=JS_GetElement(cx,d,1,&tmp3);
292      if(hasConf==JS_TRUE){
293        freeMaps(main_conf);
294        free(*main_conf);
295        *main_conf=mapsFromJSObject(cx,tmp3);
296      }
297    }
298
299  }
300  else{
301#ifdef JS_DEBUG
302    fprintf(stderr,"The service didn't return an array !\n");
303#endif
304    /**
305     * Extract result
306     */
307    jsval tmp1;
308    JSBool hasResult=JS_GetProperty(cx,d,"result",&tmp1);
309    res=JSVAL_TO_INT(tmp1);
310
311#ifdef JS_DEBUG
312    fprintf(stderr," * %d * \n",res);
313#endif
314    /**
315     * Extract outputs when available.
316     */
317    jsval tmp2;
318    JSBool hasElement=JS_GetProperty(cx,d,"outputs",&tmp2);
319    if(!JSVAL_IS_VOID(tmp2) && hasElement==JS_TRUE){
320      freeMaps(outputs);
321      free(*outputs);   
322      *outputs=mapsFromJSObject(cx,tmp2);
323    }
324    JS_MaybeGC(cx);
325#ifdef JS_DEBUG
326    if(JSVAL_IS_VOID(tmp2))
327      fprintf(stderr,"No outputs property returned\n");
328    else{
329      if(JS_IsArrayObject(cx,JSVAL_TO_OBJECT(tmp2)))
330        fprintf(stderr,"outputs is an array as expected\n");
331      else
332        fprintf(stderr,"outputs is not an array as expected\n");
333    }
334    JS_MaybeGC(cx);
335#endif
336
337    /**
338     * Extract conf when available.
339     */
340    jsval tmp3;
341    JSBool hasConf=JS_GetProperty(cx,d,"conf",&tmp3);
342    if(!JSVAL_IS_VOID(tmp3) && hasConf==JS_TRUE){
343      freeMaps(main_conf);
344      free(*main_conf);
345      *main_conf=mapsFromJSObject(cx,tmp3);
346    }
347    JS_MaybeGC(cx);
348
349#ifdef JS_DEBUG
350    dumpMaps(*outputs);
351#endif
352  }
353  /* Cleanup. */
354  JS_MaybeGC(cx);
355  JS_DestroyContext(cx);
356  JS_DestroyRuntime(rt);
357  JS_ShutDown();
358  free(filename);
359#ifdef JS_DEBUG
360  fprintf(stderr,"Returned value %d\n",res);
361#endif
362  return res;
363}
364
365JSObject * loadZooApiFile(JSContext *cx,JSObject  *global, char* filename){
366  struct stat api_status;
367  int s=stat(filename, &api_status);
368  if(s==0){
369    jsval rval;
370    JSBool ok ;
371    JSObject *script = JS_CompileFile(cx, JS_GetGlobalObject(cx), filename);
372    if(script!=NULL){
373      (void)JS_ExecuteScript(cx, JS_GetGlobalObject(cx), script, &rval);
374#ifdef JS_DEBUG
375      fprintf(stderr,"**************\n%s correctly loaded\n**************\n",filename);
376#endif
377      return script;
378    }
379#ifdef JS_DEBUG
380    else
381      fprintf(stderr,"\n**************\nUnable to run %s\n**************\n",filename);
382#endif
383  }
384#ifdef JS_DEBUG
385  else
386    fprintf(stderr,"\n**************\nUnable to load %s\n**************\n",filename);
387#endif
388  return NULL;
389}
390
391JSObject* JSObject_FromMaps(JSContext *cx,maps* t){
392
393  JSObject* res=JS_NewObject(cx, NULL, NULL, NULL);
394  //JSObject *res = JS_NewArrayObject(cx, 0, NULL);
395  if(res==NULL)
396    fprintf(stderr,"Array Object is NULL!\n");
397  maps* tmp=t;
398  while(tmp!=NULL){
399    jsuint len;
400    JSObject* res1=JS_NewObject(cx, NULL, NULL, NULL);
401    JSObject *pval=JSObject_FromMap(cx,tmp->content);
402    jsval pvalj=OBJECT_TO_JSVAL(pval);
403    JS_SetProperty(cx, res, tmp->name, &pvalj);
404#ifdef JS_DEBUG
405    fprintf(stderr,"Length of the Array %d, element : %s added \n",len,tmp->name);
406#endif
407    tmp=tmp->next;
408  } 
409  return res;
410}
411
412JSObject* JSObject_FromMap(JSContext *cx,map* t){
413  JSObject* res=JS_NewObject(cx, NULL, NULL, NULL);
414  jsval resf =  OBJECT_TO_JSVAL(res);
415  map* tmpm=t;
416  map* isArray=getMap(t,"isArray");
417  map* isBinary=getMap(t,"size");
418  map* tmap=getMapType(t);
419#ifdef JS_DEBUG
420  if(tmap==NULL)
421    fprintf(stderr,"tmap is null !\n");
422  else
423    fprintf(stderr,"tmap is not null ! (%s = %s)\n",tmap->name,tmap->value);
424#endif
425  while(tmpm!=NULL){
426    jsval jsstr;
427    if((isArray==NULL && isBinary!=NULL && strncasecmp(tmpm->name,"value",5)==0))
428      jsstr = STRING_TO_JSVAL(JS_NewStringCopyN(cx,tmpm->value,atoi(isBinary->value)));
429    else
430      jsstr = STRING_TO_JSVAL(JS_NewStringCopyN(cx,tmpm->value,strlen(tmpm->value)));
431    JS_SetProperty(cx, res, tmpm->name,&jsstr);
432#ifdef JS_DEBUG
433    fprintf(stderr,"[JS] %s => %s\n",tmpm->name,tmpm->value);
434#endif
435    tmpm=tmpm->next;
436  }
437  if(isArray!=NULL){
438    map* len=getMap(t,"length");
439    int cnt=atoi(len->value);
440    JSObject* values=JS_NewArrayObject( cx, cnt, NULL );
441    JSObject* mvalues=JS_NewArrayObject( cx, cnt, NULL );
442    map *tmpm1,*tmpm2;
443    int i=0;
444    for(i=0;i<cnt;i++){
445      tmpm1=getMapArray(t,"value",i);
446      tmpm2=getMapArray(t,tmap->name,i);
447      if(tmpm1!=NULL){
448        jsval jsstr = STRING_TO_JSVAL(JS_NewStringCopyN(cx,tmpm1->value,strlen(tmpm1->value)));
449        JS_SetElement( cx, values, i, &jsstr );
450      }
451      if(tmpm2!=NULL){
452        jsval jsstr = STRING_TO_JSVAL(JS_NewStringCopyN(cx,tmpm2->value,strlen(tmpm2->value)));
453        JS_SetElement( cx, mvalues, i, &jsstr );
454      }
455    }
456    jsval jvalues=OBJECT_TO_JSVAL(values);
457    jsval jmvalues=OBJECT_TO_JSVAL(mvalues);
458    JS_SetProperty(cx, res,"value",&jvalues);
459    JS_SetProperty(cx, res,tmap->name,&jmvalues);
460  }
461  return res;
462}
463
464maps* mapsFromJSObject(JSContext *cx,jsval t){
465  maps *res=NULL;
466  maps *tres=NULL;
467  jsint oi=0;
468  JSObject* tt=JSVAL_TO_OBJECT(t);
469  if(JS_IsArrayObject(cx,tt)){
470#ifdef JS_DEBUG
471    fprintf(stderr,"Is finally an array !\n");
472#endif
473  }
474  else{
475#ifdef JS_DEBUG
476    fprintf(stderr,"Is not an array !\n");
477#endif
478    JSIdArray *idp=JS_Enumerate(cx,tt);
479    if(idp!=NULL) {
480      int index;
481      jsdouble argNum;
482#ifdef JS_DEBUG
483      fprintf(stderr,"Properties length :  %d \n",idp->length);
484#endif
485     
486      for (index=0,argNum=idp->length;index<argNum;index++) { 
487        jsval id = idp->vector[index];
488        jsval vp;
489        JSString* str; 
490        JS_IdToValue(cx,id,&vp);
491        char *c, *tmp;
492        JSString *jsmsg;
493        size_t len1;
494        jsmsg = JS_ValueToString(cx,vp);
495        len1 = JS_GetStringLength(jsmsg);
496       
497        tmp=JS_EncodeString(cx,jsmsg);
498        tres=(maps*)malloc(MAPS_SIZE);
499        tres->name=zStrdup(tmp);
500        tres->content=NULL;
501        tres->next=NULL;
502
503        jsval nvp=JSVAL_NULL;
504        if((JS_GetProperty(cx, tt, tmp, &nvp)==JS_FALSE)){
505#ifdef JS_DEBUG
506          fprintf(stderr,"Enumerate id : %d => %s => No more value\n",oi,tmp);
507#endif
508        }
509        free(tmp);
510        JSObject *nvp1=JSVAL_TO_OBJECT(JSVAL_NULL);
511        JS_ValueToObject(cx,nvp,&nvp1);
512        jsval nvp1j=OBJECT_TO_JSVAL(nvp1);
513        if(JSVAL_IS_OBJECT(nvp1j)){
514          tres->content=mapFromJSObject(cx,nvp1j);
515        }
516
517        if(res==NULL)
518          res=dupMaps(&tres);
519        else
520          addMapsToMaps(&res,tres);
521        freeMaps(&tres);
522        free(tres);
523        tres=NULL;
524               
525      }
526      JS_DestroyIdArray(cx,idp);
527    }
528  }
529
530  jsuint len;
531  JSBool hasLen=JS_GetArrayLength(cx, tt, &len);
532#ifdef JS_DEBUG
533  if(hasLen==JS_FALSE){
534    fprintf(stderr,"outputs array is empty\n");
535  }
536  fprintf(stderr,"outputs array length : %d\n",len);
537#endif
538  for(oi=0;oi < len;oi++){
539#ifdef JS_DEBUG
540    fprintf(stderr,"outputs array length : %d step %d \n",len,oi);
541#endif
542    jsval tmp1;
543    JSBool hasElement=JS_GetElement(cx,tt,oi,&tmp1);
544    JSObject *otmp1=JSVAL_TO_OBJECT(tmp1);
545    JSIdArray *idp=JS_Enumerate(cx,otmp1);
546    if(idp!=NULL) {
547      int index;
548      jsdouble argNum;
549#ifdef JS_DEBUG
550      fprintf(stderr,"Properties length :  %d \n",idp->length);
551#endif
552      tres=(maps*)malloc(MAPS_SIZE);
553      tres->name=NULL;
554      tres->content=NULL;
555      tres->next=NULL;
556
557      for (index=0,argNum=idp->length;index<argNum;index++) { 
558        jsval id = idp->vector[index];
559        jsval vp;
560        JSString* str; 
561        JS_IdToValue(cx,id,&vp);
562        char *c, *tmp;
563        JSString *jsmsg;
564        size_t len1;
565        jsmsg = JS_ValueToString(cx,vp);
566        len1 = JS_GetStringLength(jsmsg);
567        tmp=JS_EncodeString(cx,jsmsg);
568#ifdef JS_DEBUG
569        fprintf(stderr,"Enumerate id : %d => %s\n",oi,tmp);
570#endif
571        jsval nvp=JSVAL_NULL;
572        if((JS_GetProperty(cx, JSVAL_TO_OBJECT(tmp1), tmp, &nvp)==JS_FALSE)){
573#ifdef JS_DEBUG
574          fprintf(stderr,"Enumerate id : %d => %s => No more value\n",oi,tmp);
575#endif
576        }
577        free(tmp);
578        if(JSVAL_IS_OBJECT(nvp)){
579#ifdef JS_DEBUG
580          fprintf(stderr,"JSVAL NVP IS OBJECT\n");
581#endif
582        }
583
584        JSObject *nvp1=JSVAL_TO_OBJECT(JSVAL_NULL);
585        JS_ValueToObject(cx,nvp,&nvp1);
586        jsval nvp1j=OBJECT_TO_JSVAL(nvp1);
587        if(JSVAL_IS_OBJECT(nvp1j)){
588          JSString *jsmsg1;
589          char *tmp1, *tmp2;
590          JSObject *nvp2=JSVAL_TO_OBJECT(JSVAL_NULL);
591          jsmsg1 = JS_ValueToString(cx,nvp1j);
592          len1 = JS_GetStringLength(jsmsg1);
593          tmp1=JS_EncodeString(cx,jsmsg1);
594          tmp2=JS_EncodeString(cx,jsmsg);
595#ifdef JS_DEBUG
596          fprintf(stderr,"JSVAL NVP1J IS OBJECT %s = %s\n",JS_EncodeString(cx,jsmsg),tmp1);
597#endif
598          if(strcasecmp(tmp1,"[object Object]")==0){
599            tres->name=zStrdup(tmp2);
600            tres->content=mapFromJSObject(cx,nvp1j);
601          }
602          else
603            if(strcasecmp(tmp2,"name")==0){
604              tres->name=zStrdup(tmp1);
605            }
606            else{
607              if(tres->content==NULL)
608                tres->content=createMap(tmp2,tmp1);
609              else
610                addToMap(tres->content,tmp2,tmp1);
611            }
612          free(tmp1);
613          free(tmp2);
614        }
615#ifdef JS_DEBUG
616        else
617          fprintf(stderr,"JSVAL NVP1J IS NOT OBJECT !!\n");
618#endif
619      }
620#ifdef JS_DEBUG
621      dumpMaps(tres);
622#endif
623      if(res==NULL)
624        res=dupMaps(&tres);
625      else
626        addMapsToMaps(&res,tres);
627      freeMaps(&tres);
628      free(tres);
629      tres=NULL;
630      JS_DestroyIdArray(cx,idp);
631    }
632  }
633#ifdef JS_DEBUG
634  dumpMaps(res);
635#endif
636  return res;
637}
638
639map* mapFromJSObject(JSContext *cx,jsval t){
640  map *res=NULL;
641  JSIdArray *idp=JS_Enumerate(cx,JSVAL_TO_OBJECT(t));
642#ifdef JS_DEBUG
643  fprintf(stderr,"Properties %p\n",(void*)t);
644#endif
645  if(idp!=NULL) {
646    int index;
647    jsdouble argNum;
648#ifdef JS_DEBUG
649    fprintf(stderr,"Properties length :  %d \n",idp->length);
650#endif
651    for (index=0,argNum=idp->length;index<argNum;index++) { 
652      jsval id = idp->vector[index];
653      jsval vp;
654      JSString* str; 
655      JS_IdToValue(cx,id,&vp);
656      char *c, *tmp, *tmp1;
657      JSString *jsmsg,*jsmsg1;
658      size_t len,len1;
659      jsmsg = JS_ValueToString(cx,vp);
660      len = JS_GetStringLength(jsmsg);
661      jsval nvp;
662      tmp=JS_EncodeString(cx,jsmsg);
663      JS_GetProperty(cx, JSVAL_TO_OBJECT(t), tmp, &nvp);
664      jsmsg1 = JS_ValueToString(cx,nvp);
665      len1 = JS_GetStringLength(jsmsg1);
666      tmp1=JS_EncodeString(cx,jsmsg1);
667#ifdef JS_DEBUG
668      fprintf(stderr,"Enumerate id : %d [ %s => %s ]\n",index,tmp,tmp1);
669#endif
670      if(res!=NULL){
671#ifdef JS_DEBUG
672        fprintf(stderr,"%s - %s\n",tmp,tmp1);
673#endif
674        addToMap(res,tmp,tmp1);
675      }
676      else{
677        res=createMap(tmp,tmp1);
678        res->next=NULL;
679      }
680      free(tmp);
681      free(tmp1);
682#ifdef JS_DEBUG
683      dumpMap(res);
684#endif
685    }
686    JS_DestroyIdArray(cx,idp);
687  }
688#ifdef JS_DEBUG
689  dumpMap(res);
690#endif
691  return res;
692}
693
694/* The error reporter callback. */
695void reportError(JSContext *cx, const char *message, JSErrorReport *report)
696{
697  sprintf(dbg,"%s:%u:%s\n",
698          report->filename ? report->filename : "<no filename>",
699          (unsigned int) report->lineno,
700          message);
701#ifdef JS_DEBUG
702  fprintf(stderr,"%s",dbg);
703#endif
704  fflush(stderr);
705}
706
707char* JSValToChar(JSContext* context, jsval* arg) {
708  char *c;
709  char *tmp;
710  JSString *jsmsg;
711  size_t len;
712  int i;
713  if(!JSVAL_IS_STRING(*arg)) {
714    return NULL;
715  }
716  jsmsg = JS_ValueToString(context,*arg);
717  len = JS_GetStringLength(jsmsg);
718  tmp = JS_EncodeString(context,jsmsg);
719  c = (char*)malloc((len+1)*sizeof(char));
720  c[len] = '\0';
721#ifdef ULINET_DEBUG
722  fprintf(stderr,"%d \n",len);
723#endif
724  for(i = 0;i < len;i++) {
725    c[i] = tmp[i];
726    c[i+1] = 0;
727  }
728#ifdef ULINET_DEBUG
729  fprintf(stderr,"%s \n",c);
730#endif
731  return c;
732}
733
734HINTERNET setHeader(HINTERNET handle,JSContext *cx,JSObject *header){
735  jsuint length=0;
736  jsint i=0;
737  char *tmp1;
738#ifdef ULINET_DEBUG
739  fprintf(stderr,"setHeader\n");
740#endif
741  if(JS_IsArrayObject(cx,header)){
742#ifdef ULINET_DEBUG
743    fprintf(stderr,"header is an array\n");
744#endif
745    JS_GetArrayLength(cx,header,&length);
746#ifdef ULINET_DEBUG
747    fprintf(stderr,"header is an array of %d elements\n",length);
748#endif
749    handle.header=NULL;
750    for(i=0;i<length;i++){
751      jsval tmp;
752      JS_GetElement(cx,header,i,&tmp);
753      tmp1=JSValToChar(cx,&tmp);
754#ifdef ULINET_DEBUG
755      curl_easy_setopt(handle.handle,CURLOPT_VERBOSE,1);
756      fprintf(stderr,"Element of array n° %d, value : %s\n",i,tmp1);
757#endif
758      handle.header=curl_slist_append(handle.header, tmp1);
759      free(tmp1);
760    }
761  }
762  else{
763    fprintf(stderr,"not an array !!!!!!!\n");
764  }
765  return handle;
766}
767
768JSBool
769JSTranslate(JSContext *cx, uintN argc, jsval *argv1)
770{
771  jsval *argv = JS_ARGV(cx,argv1);
772  char *str=JSValToChar(cx,&argv[0]);
773  char *tmpValue=_ss(str);
774  JS_SET_RVAL(cx, argv1,STRING_TO_JSVAL(JS_NewStringCopyN(cx,tmpValue,strlen(tmpValue)))); 
775  JS_MaybeGC(cx);
776  return JS_TRUE;
777}
778
779JSBool
780JSRequest(JSContext *cx, uintN argc, jsval *argv1)
781{
782  jsval *argv = JS_ARGV(cx,argv1);
783  HINTERNET hInternet;
784  HINTERNET res;
785  HINTERNET res1;
786  JSObject *header;
787  char *url;
788  char *method;
789  char* tmpValue;
790  size_t dwRead;
791  int i=0;
792  JS_MaybeGC(cx);
793  hInternet=InternetOpen("ZooWPSClient\0",
794                         INTERNET_OPEN_TYPE_PRECONFIG,
795                         NULL,NULL, 0);
796  if(!CHECK_INET_HANDLE(hInternet))
797    return JS_FALSE;
798  if(argc>=2){
799    method=JSValToChar(cx,&argv[0]);
800    url=JSValToChar(cx,&argv[1]);
801  }
802  else{
803    method=zStrdup("GET");
804    url=JSValToChar(cx,argv);
805  }
806  if(argc==4){
807    char *body;
808    body=JSValToChar(cx,&argv[2]);
809    header=JSVAL_TO_OBJECT(argv[3]);
810#ifdef ULINET_DEBUG
811    fprintf(stderr,"URL (%s) \nBODY (%s)\n",url,body);
812#endif
813    if(JS_IsArrayObject(cx,header))
814      res1=setHeader(hInternet,cx,header);
815#ifdef ULINET_DEBUG
816    fprintf(stderr,"BODY (%s)\n",body);
817#endif
818    res=InternetOpenUrl(res1,url,body,strlen(body),
819                        INTERNET_FLAG_NO_CACHE_WRITE,0);   
820    free(body);
821  }else{
822    if(argc==3){
823      char *body=JSValToChar(cx,&argv[2]);
824      res=InternetOpenUrl(hInternet,url,body,strlen(body),
825                          INTERNET_FLAG_NO_CACHE_WRITE,0);
826      free(body);
827    }
828    res=InternetOpenUrl(hInternet,url,NULL,0,
829                        INTERNET_FLAG_NO_CACHE_WRITE,0);
830  }
831  tmpValue=(char*)malloc((res.nDataLen+1)*sizeof(char));
832  InternetReadFile(res,(LPVOID)tmpValue,res.nDataLen,&dwRead);
833#ifdef ULINET_DEBUG
834  fprintf(stderr,"content downloaded (%d) (%s) \n",dwRead,tmpValue);
835#endif
836  if(dwRead==0){
837    JS_SET_RVAL(cx, argv1,STRING_TO_JSVAL(JS_NewStringCopyN(cx,"Unable to access the file.",strlen("Unable to access the file."))));
838    return JS_TRUE;
839  }
840
841#ifdef ULINET_DEBUG
842  fprintf(stderr,"content downloaded (%d) (%s) \n",dwRead,tmpValue);
843#endif
844  JS_SET_RVAL(cx, argv1,STRING_TO_JSVAL(JS_NewStringCopyN(cx,tmpValue,strlen(tmpValue))));
845  free(url);
846  if(argc>=2)
847    free(method);
848  if(argc==4 && res.header!=NULL){
849    curl_slist_free_all(res.header);
850  }
851  InternetCloseHandle(hInternet);
852  JS_MaybeGC(cx);
853  return JS_TRUE;
854}
Note: See TracBrowser for help on using the repository browser.

Search

ZOO Sponsors

http://www.zoo-project.org/trac/chrome/site/img/geolabs-logo.pnghttp://www.zoo-project.org/trac/chrome/site/img/neogeo-logo.png http://www.zoo-project.org/trac/chrome/site/img/apptech-logo.png http://www.zoo-project.org/trac/chrome/site/img/3liz-logo.png http://www.zoo-project.org/trac/chrome/site/img/gateway-logo.png

Become a sponsor !

Knowledge partners

http://www.zoo-project.org/trac/chrome/site/img/ocu-logo.png http://www.zoo-project.org/trac/chrome/site/img/gucas-logo.png http://www.zoo-project.org/trac/chrome/site/img/polimi-logo.png http://www.zoo-project.org/trac/chrome/site/img/fem-logo.png http://www.zoo-project.org/trac/chrome/site/img/supsi-logo.png http://www.zoo-project.org/trac/chrome/site/img/cumtb-logo.png

Become a knowledge partner

Related links

http://zoo-project.org/img/ogclogo.png http://zoo-project.org/img/osgeologo.png