/** * Update the ongoing status of a running service from the Ruby environment * (ZOO-API) * * @param argc the number of parameters * @param argv the parameter values given from the Ruby environment * @param obj the Ruby object on which we run the method * @return a new Ruby string containing the translated value * @see _updateStatus */ VALUE RubyUpdateStatus(int argc, VALUE *argv, VALUE obj) { maps* conf; VALUE confdict=argv[0]; int istatus=argv[1]; char* status; if (istatus < 0 || istatus > 100){ fprintf(stderr,"Status must be a percentage."); return Qnil; }else{ char tmpStatus[4]; snprintf(tmpStatus, 4, "%i", istatus); status = zStrdup(tmpStatus); } /* now update the map */ { VALUE lenv = rb_hash_aref(confdict,rb_str_new2("lenv")); if(TYPE(lenv)!=T_NIL){ VALUE valobj=rb_str_new2(status); rb_hash_aset(lenv,rb_str_new2("status"),valobj); } } conf = mapsFromRubyHash(confdict); if (getMapFromMaps(conf,"lenv","status") != NULL){ fprintf(stderr,"STATUS RETURNED : %s\n",status); if(status!=NULL){ setMapInMaps(conf,"lenv","status",status); free(status); } else setMapInMaps(conf,"lenv","status","15"); _updateStatus(conf); } freeMaps(&conf); free(conf); return Qnil; }
/** * Print the Ruby Stack Trace in an ows:ExceptionReport XML Document * * @param m the conf maps containing the main.cfg settings * @see printExceptionReportResponse */ void ruby_trace_error(maps* m){ #if RUBY_VERSION_MINOR == 8 VALUE lasterr = rb_gv_get("$!"); #else VALUE lasterr = rb_errinfo(); VALUE ruby_errinfo = lasterr; #endif VALUE message = rb_obj_as_string(lasterr); VALUE lklass = rb_class_path(CLASS_OF(lasterr)); #if RUBY_VERSION_MINOR == 8 char *trace=(char*)malloc((strlen(RSTRING(lklass)->ptr)+strlen(RSTRING(message)->ptr)+3)*sizeof(char)); sprintf(trace,"%s: %s",RSTRING_PTR(lklass),RSTRING_PTR(message)); #else char *trace=(char*)malloc((strlen(RSTRING_PTR(lklass))+strlen(RSTRING_PTR(message))+3)*sizeof(char)); sprintf(trace,"%s: %s",RSTRING_PTR(lklass),RSTRING_PTR(message)); #endif if(!NIL_P(ruby_errinfo)) { VALUE ary = rb_funcall(ruby_errinfo, rb_intern("backtrace"), 0); int c; for (c=0; c<RARRAY_LEN(ary); c++) { int len=strlen(trace); char *tmp0=zStrdup(trace); #if RUBY_VERSION_MINOR == 8 trace=(char *) realloc(trace,(len+strlen(RSTRING(RARRAY(ary)->ptr[c])->ptr)+2)*sizeof(char)); sprintf(trace,"%s\n%s",tmp0,RSTRING(RARRAY(ary)->ptr[c])->ptr); #else trace=(char *) realloc(trace,(len+strlen(RSTRING_PTR(RARRAY_PTR(ary)[c]))+2)*sizeof(char)); sprintf(trace,"%s\n%s",tmp0,RSTRING_PTR(RARRAY_PTR(ary)[c])); #endif free(tmp0); } } map* err=createMap("text",trace); addToMap(err,"code","NoApplicableCode"); printExceptionReportResponse(m,err); }
/** * The function used as ZOORequest from the JavaScript environment (ZOO-API) * * @param cx the JavaScript context * @param argc the number of parameters * @param argv1 the parameter values * @return true * @see setHeader */ JSBool JSRequest(JSContext *cx, uintN argc, jsval *argv1) { jsval *argv = JS_ARGV(cx,argv1); HINTERNET hInternet; JSObject *header; char *url; char *method; char* tmpValue; size_t dwRead; JS_MaybeGC(cx); hInternet=InternetOpen("ZooWPSClient\0", INTERNET_OPEN_TYPE_PRECONFIG, NULL,NULL, 0); if(!CHECK_INET_HANDLE(hInternet)) return JS_FALSE; if(argc>=2){ method=JSValToChar(cx,&argv[0]); url=JSValToChar(cx,&argv[1]); } else{ method=zStrdup("GET"); url=JSValToChar(cx,argv); } hInternet.waitingRequests[hInternet.nb]=strdup(url); if(argc==4){ char *body; body=JSValToChar(cx,&argv[2]); header=JSVAL_TO_OBJECT(argv[3]); #ifdef ULINET_DEBUG fprintf(stderr,"URL (%s) \nBODY (%s)\n",url,body); #endif if(JS_IsArrayObject(cx,header)) setHeader(&hInternet,cx,header); #ifdef ULINET_DEBUG fprintf(stderr,"BODY (%s)\n",body); #endif InternetOpenUrl(&hInternet,hInternet.waitingRequests[hInternet.nb],body,strlen(body), INTERNET_FLAG_NO_CACHE_WRITE,0); processDownloads(&hInternet); free(body); }else{ if(argc==3){ if(strncasecmp(method,"GET",3)==0){ header=JSVAL_TO_OBJECT(argv[2]); if(JS_IsArrayObject(cx,header)){ setHeader(&hInternet,cx,header); } InternetOpenUrl(&hInternet,hInternet.waitingRequests[hInternet.nb],NULL,0, INTERNET_FLAG_NO_CACHE_WRITE,0); processDownloads(&hInternet); }else{ char *body=JSValToChar(cx,&argv[2]); InternetOpenUrl(&hInternet,hInternet.waitingRequests[hInternet.nb],body,strlen(body), INTERNET_FLAG_NO_CACHE_WRITE,0); processDownloads(&hInternet); free(body); } }else{ InternetOpenUrl(&hInternet,hInternet.waitingRequests[hInternet.nb],NULL,0, INTERNET_FLAG_NO_CACHE_WRITE,0); processDownloads(&hInternet); } } tmpValue=(char*)malloc((hInternet.ihandle[0].nDataLen+1)*sizeof(char)); InternetReadFile(hInternet.ihandle[0],(LPVOID)tmpValue,hInternet.ihandle[0].nDataLen,&dwRead); #ifdef ULINET_DEBUG fprintf(stderr,"content downloaded (%d) (%s) \n",dwRead,tmpValue); #endif if(dwRead==0){ JS_SET_RVAL(cx, argv1,STRING_TO_JSVAL(JS_NewStringCopyN(cx,"Unable to access the file.",strlen("Unable to access the file.")))); return JS_TRUE; } #ifdef ULINET_DEBUG fprintf(stderr,"content downloaded (%d) (%s) \n",dwRead,tmpValue); #endif JS_SET_RVAL(cx, argv1,STRING_TO_JSVAL(JS_NewStringCopyN(cx,tmpValue,strlen(tmpValue)))); free(url); if(argc>=2) free(method); InternetCloseHandle(&hInternet); JS_MaybeGC(cx); return JS_TRUE; }
/** * Convert a JavaScript Object to a maps * * @param cx the JavaScript context * @param t the JavaScript Object to convert * @return a new maps containing the JavaScript Object */ maps* mapsFromJSObject(JSContext *cx,jsval t){ maps *res=NULL; maps *tres=NULL; jsint oi=0; JSObject* tt=JSVAL_TO_OBJECT(t); if(JS_IsArrayObject(cx,tt)){ #ifdef JS_DEBUG fprintf(stderr,"Is finally an array !\n"); #endif } else{ #ifdef JS_DEBUG fprintf(stderr,"Is not an array !\n"); #endif JSIdArray *idp=JS_Enumerate(cx,tt); if(idp!=NULL) { int index; jsdouble argNum; #ifdef JS_DEBUG fprintf(stderr,"Properties length : %d \n",idp->length); #endif for (index=0,argNum=idp->length;index<argNum;index++) { jsval id = idp->vector[index]; jsval vp; JS_IdToValue(cx,id,&vp); char *tmp; JSString *jsmsg; size_t len1; jsmsg = JS_ValueToString(cx,vp); len1 = JS_GetStringLength(jsmsg); tmp=JS_EncodeString(cx,jsmsg); tres=createMaps(tmp); jsval nvp=JSVAL_NULL; if((JS_GetProperty(cx, tt, tmp, &nvp)==JS_FALSE)){ #ifdef JS_DEBUG fprintf(stderr,"Enumerate id : %d => %s => No more value\n",oi,tmp); #endif } free(tmp); JSObject *nvp1=JSVAL_TO_OBJECT(JSVAL_NULL); JS_ValueToObject(cx,nvp,&nvp1); jsval nvp1j=OBJECT_TO_JSVAL(nvp1); if(JSVAL_IS_OBJECT(nvp1j)){ tres->content=mapFromJSObject(cx,nvp1j); } jsval nvp0=JSVAL_NULL; JSObject *nvp01=JSVAL_TO_OBJECT(JSVAL_NULL); if((JS_GetProperty(cx, nvp1, "child", &nvp0)==JS_FALSE)){ #ifdef JS_DEBUG fprintf(stderr,"Enumerate id : %d => %s => No more value\n",oi,tmp); #endif } JS_ValueToObject(cx,nvp0,&nvp01); jsval nvp01j=OBJECT_TO_JSVAL(nvp01); if(!JSVAL_IS_NULL(nvp01j)){ tres->child=mapsFromJSObject(cx,nvp01j); } if(res==NULL) res=dupMaps(&tres); else addMapsToMaps(&res,tres); freeMaps(&tres); free(tres); tres=NULL; } JS_DestroyIdArray(cx,idp); } } jsuint len; JSBool hasLen=JS_GetArrayLength(cx, tt, &len); #ifdef JS_DEBUG if(hasLen==JS_FALSE){ fprintf(stderr,"outputs array is empty\n"); } fprintf(stderr,"outputs array length : %d\n",len); #endif for(oi=0;hasLen && oi < len;oi++){ #ifdef JS_DEBUG fprintf(stderr,"outputs array length : %d step %d \n",len,oi); #endif jsval tmp1; JSBool hasElement=JS_GetElement(cx,tt,oi,&tmp1); JSObject *otmp1=JSVAL_TO_OBJECT(tmp1); JSIdArray *idp=JS_Enumerate(cx,otmp1); if(idp!=NULL) { int index; jsdouble argNum; #ifdef JS_DEBUG fprintf(stderr,"Properties length : %d \n",idp->length); #endif tres=(maps*)malloc(MAPS_SIZE); tres->name=NULL; tres->content=NULL; tres->next=NULL; for (index=0,argNum=idp->length;index<argNum;index++) { jsval id = idp->vector[index]; jsval vp; JS_IdToValue(cx,id,&vp); char *tmp; JSString *jsmsg; size_t len1; jsmsg = JS_ValueToString(cx,vp); len1 = JS_GetStringLength(jsmsg); tmp=JS_EncodeString(cx,jsmsg); #ifdef JS_DEBUG fprintf(stderr,"Enumerate id : %d => %s\n",oi,tmp); #endif jsval nvp=JSVAL_NULL; if((JS_GetProperty(cx, JSVAL_TO_OBJECT(tmp1), tmp, &nvp)==JS_FALSE)){ #ifdef JS_DEBUG fprintf(stderr,"Enumerate id : %d => %s => No more value\n",oi,tmp); #endif } free(tmp); if(JSVAL_IS_OBJECT(nvp)){ #ifdef JS_DEBUG fprintf(stderr,"JSVAL NVP IS OBJECT\n"); #endif } JSObject *nvp1=JSVAL_TO_OBJECT(JSVAL_NULL); JS_ValueToObject(cx,nvp,&nvp1); jsval nvp1j=OBJECT_TO_JSVAL(nvp1); if(JSVAL_IS_OBJECT(nvp1j)){ JSString *jsmsg1; char *tmp1, *tmp2; JSObject *nvp2=JSVAL_TO_OBJECT(JSVAL_NULL); jsmsg1 = JS_ValueToString(cx,nvp1j); len1 = JS_GetStringLength(jsmsg1); tmp1=JS_EncodeString(cx,jsmsg1); tmp2=JS_EncodeString(cx,jsmsg); #ifdef JS_DEBUG fprintf(stderr,"JSVAL NVP1J IS OBJECT %s = %s\n",JS_EncodeString(cx,jsmsg),tmp1); #endif if(strcasecmp(tmp1,"[object Object]")==0){ tres->name=zStrdup(tmp2); tres->content=mapFromJSObject(cx,nvp1j); } else if(strcasecmp(tmp2,"name")==0){ tres->name=zStrdup(tmp1); } else{ if(tres->content==NULL) tres->content=createMap(tmp2,tmp1); else addToMap(tres->content,tmp2,tmp1); } free(tmp1); free(tmp2); } #ifdef JS_DEBUG else fprintf(stderr,"JSVAL NVP1J IS NOT OBJECT !!\n"); #endif } #ifdef JS_DEBUG dumpMaps(tres); #endif if(res==NULL) res=dupMaps(&tres); else addMapsToMaps(&res,tres); freeMaps(&tres); free(tres); tres=NULL; JS_DestroyIdArray(cx,idp); } } #ifdef JS_DEBUG dumpMaps(res); #endif return res; }
int getServiceFromYAML(maps* conf, char* file,service** service,char *name){ FILE *fh = fopen("test.yml", "r"); if(current_content!=NULL){ freeMap(¤t_content); free(current_content); current_content=NULL; } #ifdef DEBUG_SERVICE_CONF fprintf(stderr,"(STARTING)FREE current_element\n"); #endif if(current_element!=NULL){ freeElements(¤t_element); free(current_element); current_element=NULL; } my_service=NULL; my_service=*service; my_service->name=strdup(name); my_service->content=NULL; my_service->metadata=NULL; my_service->inputs=NULL; my_service->outputs=NULL; fh = fopen(file,"r"); if (fh==NULL){ fprintf(stderr,"error : file not found\n") ; return -1; } yaml_parser_t parser; yaml_token_t token; /* new variable */ /* Initialize parser */ if(!yaml_parser_initialize(&parser)) fputs("Failed to initialize parser!\n", stderr); if(fh == NULL) fputs("Failed to open file!\n", stderr); /* Set input file */ yaml_parser_set_input_file(&parser, fh); /* BEGIN new code */ int level=0; int plevel=level; int ilevel=-1; int blevel=-1; int ttype=0; int wait_metadata=-1; char *cur_key; do { yaml_parser_scan(&parser, &token); switch(token.type) { /* Stream start/end */ case YAML_STREAM_START_TOKEN: #ifdef DEBUG_YAML puts("STREAM START"); #endif break; case YAML_STREAM_END_TOKEN: #ifdef DEBUG_YAML puts("STREAM END"); #endif break; /* Token types (read before actual token) */ case YAML_KEY_TOKEN: #ifdef DEBUG_YAML printf("(Key token) "); #endif ttype=0; break; case YAML_VALUE_TOKEN: #ifdef DEBUG_YAML printf("(Value token) "); #endif ttype=1; break; /* Block delimeters */ case YAML_BLOCK_SEQUENCE_START_TOKEN: #ifdef DEBUG_YAML puts("<b>Start Block (Sequence)</b>"); #endif break; case YAML_BLOCK_ENTRY_TOKEN: #ifdef DEBUG_YAML puts("<b>Start Block (Entry)</b>"); #endif break; case YAML_BLOCK_END_TOKEN: blevel--; if(ilevel>=0) ilevel--; #ifdef DEBUG_YAML printf("<b>End block</b> (%d,%d,%d,%d)\n", blevel,level,ilevel,ttype); #endif break; /* Data */ case YAML_BLOCK_MAPPING_START_TOKEN: #ifdef DEBUG_YAML puts("[Block mapping]"); #endif blevel++; break; case YAML_SCALAR_TOKEN: if(ttype==0){ cur_key=zStrdup((char *)token.data.scalar.value); } if(ttype==1){ if(current_content==NULL){ current_content=createMap(cur_key,(char *)token.data.scalar.value); }else{ addToMap(current_content,cur_key,(char *)token.data.scalar.value); } free(cur_key); cur_key=NULL; } if(ttype==0 && blevel==0 && level==0 && strcasecmp((char *)token.data.scalar.value,"MetaData")==0 && blevel==0){ addMapToMap(&my_service->content,current_content); #ifdef DEBUG_YAML fprintf(stderr,"MSG: %s %d \n",__FILE__,__LINE__); #endif freeMap(¤t_content); free(current_content); current_content=NULL; wait_metadata=1; } if(ttype==0 && blevel>0 && level>0 && strcasecmp((char *)token.data.scalar.value,"MetaData")==0){ if(current_element->content==NULL && current_content!=NULL) addMapToMap(¤t_element->content,current_content); #ifdef DEBUG_YAML dumpMap(current_content); fprintf(stderr,"MSG: %s %d \n",__FILE__,__LINE__); #endif freeMap(¤t_content); free(current_content); current_content=NULL; wait_metadata=1; } if(ttype==0 && strcasecmp((char *)token.data.scalar.value,"inputs")==0 && blevel==0){ if(wait_metadata>0){ addMapToMap(&my_service->metadata,current_content); wait_metadata=-1; }else{ if(current_content!=NULL && my_service->content==NULL) addMapToMap(&my_service->content,current_content); } #ifdef DEBUG_YAML dumpMap(current_content); fprintf(stderr,"MSG: %s %d \n",__FILE__,__LINE__); #endif freeMap(¤t_content); free(current_content); current_content=NULL; wait_metadata=false; level++; } if(ttype==0 && strcasecmp((char *)token.data.scalar.value,"outputs")==0 && blevel==1){ level++; #ifdef DEBUG_YAML dumpMap(current_content); printf("\n***\n%d (%d,%d,%d,%d)\n+++\n", current_element->defaults==NULL,blevel,level,ilevel,ttype); #endif if(current_element->defaults==NULL && current_content!=NULL && ilevel<0){ current_element->defaults=(iotype*)malloc(IOTYPE_SIZE); current_element->defaults->content=NULL; current_element->defaults->next=NULL; addMapToMap(¤t_element->defaults->content,current_content); #ifdef DEBUG_YAML dumpElements(current_element); dumpMap(current_content); fprintf(stderr,"MSG: %s %d \n",__FILE__,__LINE__); #endif freeMap(¤t_content); free(current_content); current_content=NULL; }else{ if(current_content!=NULL && ilevel<=0){ addMapToIoType(¤t_element->supported,current_content); #ifdef DEBUG_YAML dumpElements(current_element); dumpMap(current_content); fprintf(stderr,"MSG: %s %d \n",__FILE__,__LINE__); #endif freeMap(¤t_content); free(current_content); current_content=NULL; } } } if(level==1 && strcasecmp((char *)token.data.scalar.value,"default")==0){ ilevel=0; } if(level==1 && strcasecmp((char *)token.data.scalar.value,"supported")==0){ #ifdef DEBUG_YAML dumpMap(current_content); printf("\n***\n%d (%d,%d,%d,%d)\n+++\n", current_element->defaults==NULL,blevel,level,ilevel,ttype); #endif if(current_element->defaults==NULL && current_content!=NULL && ilevel<0){ current_element->defaults=(iotype*)malloc(IOTYPE_SIZE); current_element->defaults->content=NULL; current_element->defaults->next=NULL; addMapToMap(¤t_element->defaults->content,current_content); #ifdef DEBUG_YAML dumpElements(current_element); dumpMap(current_content); fprintf(stderr,"MSG: %s %d \n",__FILE__,__LINE__); #endif freeMap(¤t_content); free(current_content); current_content=NULL; }else{ if(current_content!=NULL && ilevel<=0){ if(current_element->supported==NULL){ current_element->supported=(iotype*)malloc(IOTYPE_SIZE); current_element->supported->content=NULL; current_element->supported->next=NULL; } addMapToMap(¤t_element->supported->content,current_content); #ifdef DEBUG_YAML dumpElements(current_element); fprintf(stderr,"MSG: %s %d \n",__FILE__,__LINE__); #endif freeMap(¤t_content); free(current_content); current_content=NULL; } } ilevel=1; } if(strncasecmp((char *)token.data.scalar.value,"ComplexData",11)==0 || strncasecmp((char *)token.data.scalar.value,"LiteralData",10)==0 || strncasecmp((char *)token.data.scalar.value,"ComplexOutput",13)==0 || strncasecmp((char *)token.data.scalar.value,"LiteralOutput",12)==0 || strncasecmp((char *)token.data.scalar.value,"BoundingBoxOutput",13)==0 || strncasecmp((char *)token.data.scalar.value,"BoundingBoxData",12)==0){ current_element->format=zStrdup((char *)token.data.scalar.value); free(cur_key); cur_key=NULL; if(wait_metadata>0 && current_content!=NULL){ addMapToMap(¤t_element->metadata,current_content); wait_metadata=-1; }else{ if(current_content!=NULL){ addMapToMap(¤t_element->content,current_content); } } #ifdef DEBUG_YAML dumpMap(current_content); fprintf(stderr,"MSG: %s %d \n",__FILE__,__LINE__); #endif freeMap(¤t_content); free(current_content); current_content=NULL; #ifdef DEBUG_YAML dumpElements(current_element); #endif } if(blevel==1 && level==1){ if(current_element!=NULL && current_content!=NULL){ if(current_element->defaults==NULL){ current_element->defaults=(iotype*)malloc(IOTYPE_SIZE); current_element->defaults->content=NULL; current_element->defaults->next=NULL; addMapToMap(¤t_element->defaults->content,current_content); }else{ if(current_element->supported==NULL){ current_element->supported=(iotype*)malloc(IOTYPE_SIZE); current_element->supported->content=NULL; current_element->supported->next=NULL; addMapToMap(¤t_element->supported->content,current_content); }else addMapToIoType(¤t_element->supported,current_content); } } if(current_element!=NULL){ if(my_service->inputs==NULL) my_service->inputs=dupElements(current_element); else addToElements(&my_service->inputs,current_element); freeElements(¤t_element); free(current_element); } plevel=level; current_element=(elements*)malloc(ELEMENTS_SIZE); current_element->name=zStrdup((char *)token.data.scalar.value); current_element->content=NULL; current_element->metadata=NULL; current_element->format=NULL; current_element->defaults=NULL; current_element->supported=NULL; current_element->next=NULL; } if(blevel==1 && level==2){ if(current_element!=NULL && current_content!=NULL){ if(current_element->defaults==NULL){ current_element->defaults=(iotype*)malloc(IOTYPE_SIZE); current_element->defaults->content=NULL; current_element->defaults->next=NULL; addMapToMap(¤t_element->defaults->content,current_content); }else{ if(current_element->supported==NULL){ current_element->supported=(iotype*)malloc(IOTYPE_SIZE); current_element->supported->content=NULL; current_element->supported->next=NULL; addMapToMap(¤t_element->supported->content,current_content); }else addMapToIoType(¤t_element->supported,current_content); } } if(current_element!=NULL){ if(plevel==level){ if(my_service->outputs==NULL) my_service->outputs=dupElements(current_element); else addToElements(&my_service->outputs,current_element); }else{ if(my_service->inputs==NULL) my_service->inputs=dupElements(current_element); else addToElements(&my_service->inputs,current_element); } freeElements(¤t_element); free(current_element); } plevel=level; current_element=(elements*)malloc(ELEMENTS_SIZE); current_element->name=zStrdup((char *)token.data.scalar.value); current_element->content=NULL; current_element->metadata=NULL; current_element->format=NULL; current_element->defaults=NULL; current_element->supported=NULL; current_element->next=NULL; } #ifdef DEBUG_YAML printf("scalar %s (%d,%d,%d,%d,%d)\n", token.data.scalar.value,blevel,level,plevel,ilevel,ttype); #endif break; /* Others */ default: if(token.type==0){ char tmp[1024]; sprintf(tmp,"Wrong charater found in %s: \\t",name); setMapInMaps(conf,"lenv","message",tmp); return -1; } #ifdef DEBUG_YAML printf("Got token of type %d\n", token.type); #endif break; } if(token.type != YAML_STREAM_END_TOKEN ) yaml_token_delete(&token); } while(token.type != YAML_STREAM_END_TOKEN); yaml_token_delete(&token); #ifdef DEBUG_YAML fprintf(stderr,"MSG: %s %d \n",__FILE__,__LINE__); #endif if(current_element!=NULL && current_content!=NULL){ if(current_element->defaults==NULL){ current_element->defaults=(iotype*)malloc(IOTYPE_SIZE); current_element->defaults->content=NULL; current_element->defaults->next=NULL; addMapToMap(¤t_element->defaults->content,current_content); }else{ if(current_element->supported==NULL){ current_element->supported=(iotype*)malloc(IOTYPE_SIZE); current_element->supported->content=NULL; current_element->supported->next=NULL; addMapToMap(¤t_element->supported->content,current_content); }else addMapToIoType(¤t_element->supported,current_content); } #ifdef DEBUG_YAML dumpMap(current_content); fprintf(stderr,"MSG: %s %d \n",__FILE__,__LINE__); #endif freeMap(¤t_content); free(current_content); current_content=NULL; } if(current_element!=NULL){ if(my_service->outputs==NULL) my_service->outputs=dupElements(current_element); else addToElements(&my_service->outputs,current_element); freeElements(¤t_element); free(current_element); current_element=NULL; } /* END new code */ /* Cleanup */ yaml_parser_delete(&parser); fclose(fh); #ifdef DEBUG_YAML dumpService(my_service); #endif *service=my_service; return 1; }
/** * Read the downloaded file for a specific input * * @param m the maps containing the settings of the main.cfg file * @param in the input * @param index the input index * @param hInternet the internet connection * @param error the error map pointer * @return 0 in case of success, -1 in case of failure */ int readCurrentInput(maps** m,maps** in,int* index,HINTERNET* hInternet,map** error){ map* tmp1; char sindex[5]; maps* content=*in; map* length=getMap(content->content,"length"); int shouldClean=-1; if(length==NULL){ length=createMap("length","1"); shouldClean=1; } for(int i=0;i<atoi(length->value);i++){ char* fcontent; char *mimeType=NULL; int fsize=0; char cname[15]; char vname[11]; char vname1[11]; char sname[9]; char mname[15]; char icname[14]; char xname[16]; char oname[12]; if(*index>0) sprintf(vname1,"value_%d",*index); else sprintf(vname1,"value"); if(i>0){ tmp1=getMap(content->content,cname); sprintf(cname,"cache_file_%d",i); sprintf(vname,"value_%d",i); sprintf(sname,"size_%d",i); sprintf(mname,"mimeType_%d",i); sprintf(icname,"isCached_%d",i); sprintf(xname,"Reference_%d",i); sprintf(oname,"Order_%d",i); }else{ sprintf(cname,"cache_file"); sprintf(vname,"value"); sprintf(sname,"size"); sprintf(mname,"mimeType"); sprintf(icname,"isCached"); sprintf(xname,"Reference"); sprintf(oname,"Order"); } map* tmap=getMap(content->content,oname); sprintf(sindex,"%d",*index+1); if((tmp1=getMap(content->content,xname))!=NULL && tmap!=NULL && strcasecmp(tmap->value,sindex)==0){ if(getMap(content->content,icname)==NULL){ fcontent=(char*)malloc((hInternet->ihandle[*index].nDataLen+1)*sizeof(char)); if(fcontent == NULL){ errorException(*m, _("Unable to allocate memory"), "InternalError",NULL); return -1; } size_t dwRead; InternetReadFile(hInternet->ihandle[*index], (LPVOID)fcontent, hInternet->ihandle[*index].nDataLen, &dwRead); fcontent[hInternet->ihandle[*index].nDataLen]=0; fsize=hInternet->ihandle[*index].nDataLen; if(hInternet->ihandle[*index].mimeType==NULL) mimeType=zStrdup("none"); else mimeType=zStrdup(hInternet->ihandle[*index].mimeType); map* tmpMap=getMapOrFill(&(*in)->content,vname,""); free(tmpMap->value); tmpMap->value=(char*)malloc((fsize+1)*sizeof(char)); if(tmpMap->value==NULL){ return errorException(*m, _("Unable to allocate memory"), "InternalError",NULL); } memcpy(tmpMap->value,fcontent,(fsize+1)*sizeof(char)); if(hInternet->ihandle[*index].code!=200){ const char *error_rep_str=_("Unable to download the file for the input <%s>, response code was : %d."); char *error_msg=(char*)malloc((strlen(error_rep_str)+strlen(content->name)+4)*sizeof(char)); sprintf(error_msg,error_rep_str,content->name,hInternet->ihandle[*index].code); if(*error==NULL){ *error=createMap("text",error_msg); addToMap(*error,"locator",content->name); addToMap(*error,"code","InvalidParameterValue"); }else{ int nb=1; map* tmpMap=getMap(*error,"length"); if(tmpMap!=NULL) nb=atoi(tmpMap->value); setMapArray(*error,"text",nb,error_msg); setMapArray(*error,"locator",nb,content->name); setMapArray(*error,"code",nb,"InvalidParameterValue"); } return -1; } char ltmp1[256]; sprintf(ltmp1,"%d",fsize); map* tmp=getMapFromMaps(*m,"main","cacheDir"); if(tmp!=NULL){ char* md5str=getMd5(tmp1->value); char* fname=(char*)malloc(sizeof(char)*(strlen(tmp->value)+strlen(md5str)+6)); sprintf(fname,"%s/%s.zca",tmp->value,md5str); addToMap((*in)->content,cname,fname); free(fname); } addToMap((*in)->content,sname,ltmp1); addToMap((*in)->content,mname,mimeType); addToCache(*m,tmp1->value,fcontent,mimeType,fsize, NULL, 0); free(fcontent); free(mimeType); *index++; } } } if(shouldClean>0){ freeMap(&length); free(length); } return 0; }