source: trunk/zoo-project/zoo-kernel/zoo_service_loader.c @ 454

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

Dumping final file fix. Add missing functions definition.

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc
File size: 66.8 KB
RevLine 
[1]1/**
2 * Author : Gérald FENOY
3 *
[392]4 *  Copyright 2008-2013 GeoLabs SARL. All rights reserved.
[1]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#define length(x) (sizeof(x) / sizeof(x[0]))
26
27extern "C" int yylex();
28extern "C" int crlex();
[9]29
[376]30#include "cgic.h"
31
[1]32extern "C" {
33#include <libxml/tree.h>
34#include <libxml/xmlmemory.h>
35#include <libxml/parser.h>
36#include <libxml/xpath.h>
37#include <libxml/xpathInternals.h>
38}
39
40#include "ulinet.h"
41
[34]42#include <libintl.h>
43#include <locale.h>
[1]44#include <string.h>
45
46#include "service.h"
[34]47
[1]48#include "service_internal.h"
[33]49
50#ifdef USE_PYTHON
[1]51#include "service_internal_python.h"
[33]52#endif
[1]53
54#ifdef USE_JAVA
55#include "service_internal_java.h"
56#endif
57
58#ifdef USE_PHP
59#include "service_internal_php.h"
60#endif
61
62#ifdef USE_JS
63#include "service_internal_js.h"
64#endif
65
[453]66#ifdef USE_RUBY
67#include "service_internal_ruby.h"
68#endif
69
[25]70#ifdef USE_PERL
71#include "service_internal_perl.h"
72#endif
[1]73
74#include <dirent.h>
75#include <signal.h>
76#include <unistd.h>
77#ifndef WIN32
78#include <dlfcn.h>
79#include <libgen.h>
80#else
81#include <windows.h>
82#include <direct.h>
[364]83#include <sys/types.h>
84#include <sys/stat.h>
85#include <unistd.h>
86#define pid_t int;
[1]87#endif
88#include <fcntl.h>
89#include <time.h>
90#include <stdarg.h>
91
[364]92#ifdef WIN32
93extern "C" {
[370]94  __declspec(dllexport) char *strcasestr(char const *a, char const *b)
95#ifndef USE_MS
96 { 
[453]97  char *x=_zStrdup(a); 
98  char *y=_zStrdup(b); 
[370]99 
100  x=_strlwr(x); 
101  y=_strlwr(y); 
102  char *pos = strstr(x, y); 
103  char *ret = pos == NULL ? NULL : (char *)(a + (pos-x)); 
104  free(x); 
105  free(y); 
106  return ret; 
107 };
108#else
109  ;
110#endif
[364]111}
112#endif
113
[34]114#define _(String) dgettext ("zoo-kernel",String)
[376]115#define __(String) dgettext ("zoo-service",String)
[34]116
117
[109]118void translateChar(char* str,char toReplace,char toReplaceBy){
[34]119  int i=0,len=strlen(str);
120  for(i=0;i<len;i++){
121    if(str[i]==toReplace)
122      str[i]=toReplaceBy;
123  }
124}
125
[360]126/**
127 * Create (or append to) an array valued maps
128 * value = "["",""]"
129 */
130int appendMapsToMaps(maps* m,maps* mo,maps* mi,elements* elem){
[362]131  maps* tmpMaps=getMaps(mo,mi->name);
132  map* tmap=getMapType(tmpMaps->content);
133  elements* el=getElements(elem,mi->name);
134  int hasEl=1;
135  if(el==NULL)
136    hasEl=-1;
[360]137  if(tmap==NULL){
[362]138    if(hasEl>0)
139      tmap=getMapType(el->defaults->content);     
[360]140  }
141
[362]142  map* testMap=NULL;
143  if(hasEl>0){
144    testMap=getMap(el->content,"maxOccurs");
145  }else{
146    testMap=createMap("maxOccurs","unbounded");
147  }
148
[360]149  if(testMap!=NULL){
150    if(strncasecmp(testMap->value,"unbounded",9)!=0 && atoi(testMap->value)>1){
151      if(addMapsArrayToMaps(&mo,mi,tmap->name)<0){
152        char emsg[1024];
153        sprintf(emsg,_("You set maximum occurences for <%s> as %i but you tried to use it more than the limit you set. Please correct your ZCFG file or your request."),mi->name,atoi(testMap->value));
154        errorException(m,emsg,"InternalError");
155        return -1;
156      }
157    }else{
158      if(strncasecmp(testMap->value,"unbounded",9)==0){
[362]159        if(hasEl<0){
160          freeMap(&testMap);
161          free(testMap);
162        }
[360]163        if(addMapsArrayToMaps(&mo,mi,tmap->name)<0){
164          char emsg[1024];
165          map* tmpMap=getMap(mi->content,"length");
166          sprintf(emsg,_("ZOO-Kernel was unable to load your data for %s position %s."),mi->name,tmpMap->value);
167          errorException(m,emsg,"InternalError");
168          return -1;
169        }
170      }
171      else{
172        char emsg[1024];
173        sprintf(emsg,_("You set maximum occurences for <%s> to one but you tried to use it more than once. Please correct your ZCFG file or your request."),mi->name);
174        errorException(m,emsg,"InternalError");
175        return -1;
176      }
177    }
178  }
179  return 0;
180}
181
[114]182xmlXPathObjectPtr extractFromDoc(xmlDocPtr doc,const char* search){
[1]183  xmlXPathContextPtr xpathCtx;
184  xmlXPathObjectPtr xpathObj;
185  xpathCtx = xmlXPathNewContext(doc);
186  xpathObj = xmlXPathEvalExpression(BAD_CAST search,xpathCtx);
[9]187  xmlXPathFreeContext(xpathCtx);
188  return xpathObj;
[1]189}
190
[105]191void donothing(int sig){
192  fprintf(stderr,"Signal %d after the ZOO-Kernel returned result !\n",sig);
193  exit(0);
194}
195
[9]196void sig_handler(int sig){
197  char tmp[100];
[114]198  const char *ssig;
[9]199  switch(sig){
200  case SIGSEGV:
201    ssig="SIGSEGV";
202    break;
203  case SIGTERM:
204    ssig="SIGTERM";
205    break;
206  case SIGINT:
207    ssig="SIGINT";
208    break;
209  case SIGILL:
210    ssig="SIGILL";
211    break;
212  case SIGFPE:
213    ssig="SIGFPE";
214    break;
215  case SIGABRT:
216    ssig="SIGABRT";
217    break;
218  default:
219    ssig="UNKNOWN";
220    break;
221  }
[34]222  sprintf(tmp,_("ZOO Kernel failed to process your request receiving signal %d = %s"),sig,ssig);
[9]223  errorException(NULL, tmp, "InternalError");
[10]224#ifdef DEBUG
[1]225  fprintf(stderr,"Not this time!\n");
[10]226#endif
[9]227  exit(0);
[1]228}
229
[109]230void loadServiceAndRun(maps **myMap,service* s1,map* request_inputs,maps **inputs,maps** ioutputs,int* eres){
[34]231  char tmps1[1024];
232  char ntmp[1024];
233  maps *m=*myMap;
234  maps *request_output_real_format=*ioutputs;
235  maps *request_input_real_format=*inputs;
236  /**
237   * Extract serviceType to know what kind of service should be loaded
238   */
239  map* r_inputs=NULL;
240#ifndef WIN32
[114]241  char* pntmp=getcwd(ntmp,1024);
[34]242#else
243  _getcwd(ntmp,1024);
244#endif
245  r_inputs=getMap(s1->content,"serviceType");
246#ifdef DEBUG
247  fprintf(stderr,"LOAD A %s SERVICE PROVIDER \n",r_inputs->value);
248  fflush(stderr);
249#endif
[364]250  if(strlen(r_inputs->value)==1 && strncasecmp(r_inputs->value,"C",1)==0){
[34]251    r_inputs=getMap(request_inputs,"metapath");
252    if(r_inputs!=NULL)
253      sprintf(tmps1,"%s/%s",ntmp,r_inputs->value);
254    else
255      sprintf(tmps1,"%s/",ntmp);
[453]256    char *altPath=zStrdup(tmps1);
[34]257    r_inputs=getMap(s1->content,"ServiceProvider");
258    sprintf(tmps1,"%s/%s",altPath,r_inputs->value);
259    free(altPath);
260#ifdef DEBUG
261    fprintf(stderr,"Trying to load %s\n",tmps1);
262#endif
263#ifdef WIN32
264    HINSTANCE so = LoadLibraryEx(tmps1,NULL,LOAD_WITH_ALTERED_SEARCH_PATH);
265#else
266    void* so = dlopen(tmps1, RTLD_LAZY);
267#endif
268#ifdef DEBUG
[57]269#ifdef WIN32
[34]270    DWORD errstr;
271    errstr = GetLastError();
272    fprintf(stderr,"%s loaded (%d) \n",tmps1,errstr);
273#else
274    char *errstr;
275    errstr = dlerror();
276#endif
277#endif
278    if( so != NULL ) {
279#ifdef DEBUG
280      fprintf(stderr,"Library loaded %s \n",errstr);
281      fprintf(stderr,"Service Shared Object = %s\n",r_inputs->value);
282#endif
283      r_inputs=getMap(s1->content,"serviceType");
284#ifdef DEBUG
285      dumpMap(r_inputs);
286      fprintf(stderr,"%s\n",r_inputs->value);
287      fflush(stderr);
288#endif
289      if(strncasecmp(r_inputs->value,"C-FORTRAN",9)==0){
290        r_inputs=getMap(request_inputs,"Identifier");
291        char fname[1024];
292        sprintf(fname,"%s_",r_inputs->value);
293#ifdef DEBUG
294        fprintf(stderr,"Try to load function %s\n",fname);
295#endif
296#ifdef WIN32
297        typedef int (CALLBACK* execute_t)(char***,char***,char***);
298        execute_t execute=(execute_t)GetProcAddress(so,fname);
299#else
300        typedef int (*execute_t)(char***,char***,char***);
301        execute_t execute=(execute_t)dlsym(so,fname);
302#endif
303#ifdef DEBUG
304#ifdef WIN32
305        errstr = GetLastError();
306#else
307        errstr = dlerror();
308#endif
309        fprintf(stderr,"Function loaded %s\n",errstr);
310#endif 
311
312        char main_conf[10][30][1024];
313        char inputs[10][30][1024];
314        char outputs[10][30][1024];
315        for(int i=0;i<10;i++){
316          for(int j=0;j<30;j++){
317            memset(main_conf[i][j],0,1024);
318            memset(inputs[i][j],0,1024);
319            memset(outputs[i][j],0,1024);
320          }
321        }
322        mapsToCharXXX(m,(char***)main_conf);
323        mapsToCharXXX(request_input_real_format,(char***)inputs);
324        mapsToCharXXX(request_output_real_format,(char***)outputs);
325        *eres=execute((char***)&main_conf[0],(char***)&inputs[0],(char***)&outputs[0]);
326#ifdef DEBUG
327        fprintf(stderr,"Function run successfully \n");
328#endif
329        charxxxToMaps((char***)&outputs[0],&request_output_real_format);
330      }else{
331#ifdef DEBUG
332#ifdef WIN32
333        errstr = GetLastError();
334        fprintf(stderr,"Function %s failed to load because of %d\n",r_inputs->value,errstr);
335#endif
336#endif
337        r_inputs=getMap(request_inputs,"Identifier");
338#ifdef DEBUG
339        fprintf(stderr,"Try to load function %s\n",r_inputs->value);
340#endif
341        typedef int (*execute_t)(maps**,maps**,maps**);
342#ifdef WIN32
343        execute_t execute=(execute_t)GetProcAddress(so,r_inputs->value); 
344#else
345        execute_t execute=(execute_t)dlsym(so,r_inputs->value);
346#endif
347
348#ifdef DEBUG
349#ifdef WIN32
350        errstr = GetLastError();
351#else
352        errstr = dlerror();
353#endif
354        fprintf(stderr,"Function loaded %s\n",errstr);
355#endif 
356
357#ifdef DEBUG
358        fprintf(stderr,"Now run the function \n");
359        fflush(stderr);
360#endif
361        *eres=execute(&m,&request_input_real_format,&request_output_real_format);
362#ifdef DEBUG
363        fprintf(stderr,"Function loaded and returned %d\n",eres);
364        fflush(stderr);
365#endif
366      }
[216]367#ifdef WIN32
368      *ioutputs=dupMaps(&request_output_real_format);
369      FreeLibrary(so);
370#else
[34]371      dlclose(so);
[216]372#endif
[34]373    } else {
374      /**
375       * Unable to load the specified shared library
376       */
377      char tmps[1024];
378#ifdef WIN32
379      DWORD errstr = GetLastError();
380#else
381      char* errstr = dlerror();
382#endif
[392]383      sprintf(tmps,_("C Library can't be loaded %s"),errstr);
[34]384      map* tmps1=createMap("text",tmps);
385      printExceptionReportResponse(m,tmps1);
386      *eres=-1;
387    }
388  }
389  else
390#ifdef USE_PYTHON
391    if(strncasecmp(r_inputs->value,"PYTHON",6)==0){
392      *eres=zoo_python_support(&m,request_inputs,s1,&request_input_real_format,&request_output_real_format);
393    }
394    else
395#endif
396       
397#ifdef USE_JAVA
398      if(strncasecmp(r_inputs->value,"JAVA",4)==0){
399        *eres=zoo_java_support(&m,request_inputs,s1,&request_input_real_format,&request_output_real_format);
400      }
401      else
402#endif
403
404#ifdef USE_PHP
405        if(strncasecmp(r_inputs->value,"PHP",3)==0){
406          *eres=zoo_php_support(&m,request_inputs,s1,&request_input_real_format,&request_output_real_format);
407        }
408        else
409#endif
410           
411           
412#ifdef USE_PERL
413          if(strncasecmp(r_inputs->value,"PERL",4)==0){
414            *eres=zoo_perl_support(&m,request_inputs,s1,&request_input_real_format,&request_output_real_format);
415          }
416          else
417#endif
418
419#ifdef USE_JS
420            if(strncasecmp(r_inputs->value,"JS",2)==0){
421              *eres=zoo_js_support(&m,request_inputs,s1,&request_input_real_format,&request_output_real_format);
422            }
423            else
424#endif
[453]425
426#ifdef USE_RUBY
427          if(strncasecmp(r_inputs->value,"Ruby",4)==0){
428            *eres=zoo_ruby_support(&m,request_inputs,s1,&request_input_real_format,&request_output_real_format);
429          }
430          else
431#endif
432
[34]433              {
434                char tmpv[1024];
435                sprintf(tmpv,_("Programming Language (%s) set in ZCFG file is not currently supported by ZOO Kernel.\n"),r_inputs->value);
436                map* tmps=createMap("text",tmpv);
437                printExceptionReportResponse(m,tmps);
438                *eres=-1;
439              }
[57]440  *myMap=m;
[34]441  *ioutputs=request_output_real_format;
442}
443
[384]444
[216]445#ifdef WIN32
446/**
447 * createProcess function: create a new process after setting some env variables
448 */
449void createProcess(maps* m,map* request_inputs,service* s1,char* opts,int cpid, maps* inputs,maps* outputs){
450  STARTUPINFO si;
451  PROCESS_INFORMATION pi;
452  ZeroMemory( &si, sizeof(si) );
453  si.cb = sizeof(si);
454  ZeroMemory( &pi, sizeof(pi) );
455  char *tmp=(char *)malloc((1024+cgiContentLength)*sizeof(char));
456  char *tmpq=(char *)malloc((1024+cgiContentLength)*sizeof(char));
457  map *req=getMap(request_inputs,"request");
458  map *id=getMap(request_inputs,"identifier");
459  map *di=getMap(request_inputs,"DataInputs");
460
461  char *dataInputsKVP=getMapsAsKVP(inputs,cgiContentLength,0);
462  char *dataOutputsKVP=getMapsAsKVP(outputs,cgiContentLength,1);
[384]463#ifdef DEBUG
[216]464  fprintf(stderr,"DATAINPUTSKVP %s\n",dataInputsKVP);
465  fprintf(stderr,"DATAOUTPUTSKVP %s\n",dataOutputsKVP);
[384]466#endif
[216]467  map *sid=getMapFromMaps(m,"lenv","sid");
468  map* r_inputs=getMapFromMaps(m,"main","tmpPath");
[384]469  map* r_inputs1=getMap(request_inputs,"metapath");
470  int hasIn=-1;
471  if(r_inputs1==NULL){
472    r_inputs1=createMap("metapath","");
473    hasIn=1;
474  }
[452]475  map* r_inputs2=getMap(request_inputs,"ResponseDocument");
[216]476  if(r_inputs2==NULL)
[452]477    r_inputs2=getMap(request_inputs,"RawDataOutput");
[216]478  map *tmpPath=getMapFromMaps(m,"lenv","cwd");
479
480  if(r_inputs2!=NULL){
[452]481    sprintf(tmp,"\"metapath=%s&request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s&%s=%s&cgiSid=%s\"",r_inputs1->value,req->value,id->value,dataInputsKVP,r_inputs2->name,dataOutputsKVP,sid->value);
[384]482    sprintf(tmpq,"metapath=%s&request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s&%s=%s",r_inputs1->value,req->value,id->value,dataInputsKVP,r_inputs2->name,dataOutputsKVP);
[452]483    }
[216]484  else{
[384]485    sprintf(tmp,"\"metapath=%s&request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s&cgiSid=%s\"",r_inputs1->value,req->value,id->value,dataInputsKVP,sid->value);
486    sprintf(tmpq,"metapath=%s&request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s",r_inputs1->value,req->value,id->value,dataInputsKVP,sid->value);
[216]487  }
[384]488 
489  if(hasIn>0){
490    freeMap(&r_inputs1);
491    free(r_inputs1);
492  }
[453]493  char *tmp1=zStrdup(tmp);
[216]494  sprintf(tmp,"zoo_loader.cgi %s \"%s\"",tmp1,sid->value);
[384]495 
[216]496  free(dataInputsKVP);
497  free(dataOutputsKVP);
[384]498#ifdef DEBUG
[216]499  fprintf(stderr,"REQUEST IS : %s \n",tmp);
[384]500#endif
[216]501  SetEnvironmentVariable("CGISID",TEXT(sid->value));
502  SetEnvironmentVariable("QUERY_STRING",TEXT(tmpq));
503  char clen[1000];
504  sprintf(clen,"%d",strlen(tmpq));
505  SetEnvironmentVariable("CONTENT_LENGTH",TEXT(clen));
506
507  if( !CreateProcess( NULL,             // No module name (use command line)
508                      TEXT(tmp),        // Command line
509                      NULL,             // Process handle not inheritable
510                      NULL,             // Thread handle not inheritable
511                      FALSE,            // Set handle inheritance to FALSE
512                      CREATE_NO_WINDOW, // Apache won't wait until the end
513                      NULL,             // Use parent's environment block
514                      NULL,             // Use parent's starting directory
515                      &si,              // Pointer to STARTUPINFO struct
516                      &pi )             // Pointer to PROCESS_INFORMATION struct
517      ) 
518    { 
[384]519      //printf("CreateProcess failed (%d).\n",GetLastError() );
520#ifdef DEBUG
[216]521      fprintf( stderr, "CreateProcess failed (%d).\n", GetLastError() );
[384]522#endif
[216]523      return ;
524    }else{
[384]525    //printf("CreateProcess successfull (%d).\n",GetLastError() );
526#ifdef DEBUG
[216]527    fprintf( stderr, "CreateProcess successfull (%d).\n\n\n\n", GetLastError() );
[384]528#endif
[216]529  }
530  CloseHandle( pi.hProcess );
531  CloseHandle( pi.hThread );
[384]532  //printf("CreateProcess finished !\n");
533#ifdef DEBUG
[216]534  fprintf(stderr,"CreateProcess finished !\n");
[384]535#endif
[216]536}
537#endif
538
[1]539int runRequest(map* request_inputs)
540{
541
[53]542#ifndef USE_GDB
[9]543  (void) signal(SIGSEGV,sig_handler);
544  (void) signal(SIGTERM,sig_handler);
545  (void) signal(SIGINT,sig_handler);
546  (void) signal(SIGILL,sig_handler);
547  (void) signal(SIGFPE,sig_handler);
548  (void) signal(SIGABRT,sig_handler);
[53]549#endif
[9]550
[114]551  map* r_inputs=NULL;
[1]552  maps* m=NULL;
553
554  char* REQUEST=NULL;
555  /**
556   * Parsing service specfic configuration file
557   */
[381]558  m=(maps*)malloc(MAPS_SIZE);
[9]559  if(m == NULL){
[34]560    return errorException(m, _("Unable to allocate memory."), "InternalError");
[9]561  }
[1]562  char ntmp[1024];
563#ifndef WIN32
[114]564  char *pntmp=getcwd(ntmp,1024);
[1]565#else
566  _getcwd(ntmp,1024);
567#endif
[282]568  r_inputs=getMapOrFill(request_inputs,"metapath","");
569
[381]570
[9]571  char conf_file[10240];
572  snprintf(conf_file,10240,"%s/%s/main.cfg",ntmp,r_inputs->value);
[385]573  if(conf_read(conf_file,m)==2){
574    errorException(NULL, _("Unable to load the main.cfg file."),"InternalError");
575    free(m);
576    return 1;
577  }
[9]578#ifdef DEBUG
579  fprintf(stderr, "***** BEGIN MAPS\n"); 
580  dumpMaps(m);
581  fprintf(stderr, "***** END MAPS\n");
582#endif
583
[376]584  map *getPath=getMapFromMaps(m,"main","gettextPath");
585  if(getPath!=NULL){
586    bindtextdomain ("zoo-kernel",getPath->value);
587    bindtextdomain ("zoo-services",getPath->value);   
588  }else{
589    bindtextdomain ("zoo-kernel","/usr/share/locale/");
590    bindtextdomain ("zoo-services","/usr/share/locale/");
591  }
[364]592
[381]593
[364]594  /**
595   * Manage our own error log file (usefull to separate standard apache debug
596   * messages from the ZOO-Kernel ones but also for IIS users to avoid wrong
597   * headers messages returned by the CGI due to wrong redirection of stderr)
598   */
599  FILE * fstde=NULL;
600  map* fstdem=getMapFromMaps(m,"main","logPath");
601  if(fstdem!=NULL)
602        fstde = freopen(fstdem->value, "a+", stderr) ;
603
[376]604  r_inputs=getMap(request_inputs,"language");
605  if(r_inputs==NULL)
606    r_inputs=getMapFromMaps(m,"main","language");
607  if(r_inputs!=NULL){
[453]608    char *tmp=zStrdup(r_inputs->value);
[376]609    setMapInMaps(m,"main","language",tmp);
[34]610    translateChar(tmp,'-','_');
611    setlocale (LC_ALL, tmp);
[444]612#ifndef WIN32
613    setenv("LC_ALL",tmp,1);
614#else
[376]615    char tmp1[12];
616    sprintf(tmp1,"LC_ALL=%s",tmp);
617    putenv(tmp1);
618#endif
[34]619    free(tmp);
620  }
621  else{
622    setlocale (LC_ALL, "en_US");
[444]623#ifndef WIN32
624    setenv("LC_ALL","en_US",1);
625#else
[376]626    char tmp1[12];
627    sprintf(tmp1,"LC_ALL=en_US");
628    putenv(tmp1);
629#endif
[34]630    setMapInMaps(m,"main","language","en-US");
631  }
632  setlocale (LC_NUMERIC, "en_US");
633  bind_textdomain_codeset("zoo-kernel","UTF-8");
634  textdomain("zoo-kernel");
635  bind_textdomain_codeset("zoo-services","UTF-8");
636  textdomain("zoo-services");
637
[280]638  map* lsoap=getMap(request_inputs,"soap");
639  if(lsoap!=NULL && strcasecmp(lsoap->value,"true")==0)
640    setMapInMaps(m,"main","isSoap","true");
641  else
642    setMapInMaps(m,"main","isSoap","false");
[34]643
[445]644  if(strlen(cgiServerName)>0){
645    char tmpUrl[1024];
646    sprintf(tmpUrl,"http://%s%s",cgiServerName,cgiScriptName);
647#ifdef DEBUG
648    fprintf(stderr,"*** %s ***\n",tmpUrl);
649#endif
650    setMapInMaps(m,"main","serverAddress",tmpUrl);
651  }
[381]652
[1]653  /**
654   * Check for minimum inputs
655   */
656  r_inputs=getMap(request_inputs,"Request");
[9]657  if(request_inputs==NULL || r_inputs==NULL){ 
[34]658    errorException(m, _("Parameter <request> was not specified"),"MissingParameterValue");
[9]659    freeMaps(&m);
660    free(m);
[1]661    return 1;
662  }
[9]663  else{
[453]664    REQUEST=zStrdup(r_inputs->value);
[9]665    if(strncasecmp(r_inputs->value,"GetCapabilities",15)!=0
666       && strncasecmp(r_inputs->value,"DescribeProcess",15)!=0
667       && strncasecmp(r_inputs->value,"Execute",7)!=0){ 
[34]668      errorException(m, _("Unenderstood <request> value. Please check that it was set to GetCapabilities, DescribeProcess or Execute."), "InvalidParameterValue");
[9]669      freeMaps(&m);
670      free(m);
671      free(REQUEST);
672      return 1;
673    }
674  }
[1]675  r_inputs=NULL;
676  r_inputs=getMap(request_inputs,"Service");
[9]677  if(r_inputs==NULLMAP){
[34]678    errorException(m, _("Parameter <service> was not specified"),"MissingParameterValue");
[9]679    freeMaps(&m);
680    free(m);
681    free(REQUEST);
[1]682    return 1;
683  }
[9]684  if(strncasecmp(REQUEST,"GetCapabilities",15)!=0){
[1]685    r_inputs=getMap(request_inputs,"Version");
686    if(r_inputs==NULL){ 
[34]687      errorException(m, _("Parameter <version> was not specified"),"MissingParameterValue");
[9]688      freeMaps(&m);
689      free(m);
690      free(REQUEST);
[1]691      return 1;
692    }
693  }
694
[9]695  r_inputs=getMap(request_inputs,"serviceprovider");
696  if(r_inputs==NULL){
697    addToMap(request_inputs,"serviceprovider","");
[1]698  }
699
700  maps* request_output_real_format=NULL;
701  map* tmpm=getMapFromMaps(m,"main","serverAddress");
702  if(tmpm!=NULL)
[453]703    SERVICE_URL=zStrdup(tmpm->value);
[1]704  else
[453]705    SERVICE_URL=zStrdup(DEFAULT_SERVICE_URL);
[1]706
707  service* s1;
708  int scount=0;
709#ifdef DEBUG
710  dumpMap(r_inputs);
711#endif
712  char conf_dir[1024];
713  int t;
714  char tmps1[1024];
715
[9]716  r_inputs=NULL;
717  r_inputs=getMap(request_inputs,"metapath");
718  if(r_inputs!=NULL)
719    snprintf(conf_dir,1024,"%s/%s",ntmp,r_inputs->value);
720  else
721    snprintf(conf_dir,1024,"%s",ntmp);
722
723  if(strncasecmp(REQUEST,"GetCapabilities",15)==0){
[1]724    struct dirent *dp;
725#ifdef DEBUG
726    dumpMap(r_inputs);
727#endif
[9]728    DIR *dirp = opendir(conf_dir);
[1]729    if(dirp==NULL){
[34]730      return errorException(m, _("The specified path doesn't exist."),"InvalidParameterValue");
[1]731    }
732    xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0");
733    r_inputs=NULL;
734    r_inputs=getMap(request_inputs,"ServiceProvider");
[9]735    xmlNodePtr n;
736    if(r_inputs!=NULL)
737      n = printGetCapabilitiesHeader(doc,r_inputs->value,m);
738    else
739      n = printGetCapabilitiesHeader(doc,"",m);
[1]740    /**
[214]741     * Here we need to close stdout to ensure that not supported chars
742     * has been found in the zcfg and then printed on stdout
[1]743     */
744    int saved_stdout = dup(fileno(stdout));
745    dup2(fileno(stderr),fileno(stdout));
746    while ((dp = readdir(dirp)) != NULL)
747      if(strstr(dp->d_name,".zcfg")!=0){
[9]748        memset(tmps1,0,1024);
749        snprintf(tmps1,1024,"%s/%s",conf_dir,dp->d_name);
[381]750        s1=(service*)malloc(SERVICE_SIZE);
[9]751        if(s1 == NULL){ 
[34]752          return errorException(m, _("Unable to allocate memory."),"InternalError");
[9]753        }
[1]754#ifdef DEBUG
755        fprintf(stderr,"#################\n%s\n#################\n",tmps1);
756#endif
757        t=getServiceFromFile(tmps1,&s1);
758#ifdef DEBUG
759        dumpService(s1);
760        fflush(stdout);
761        fflush(stderr);
762#endif
763        printGetCapabilitiesForProcess(m,n,s1);
[9]764        freeService(&s1);
765        free(s1);
[1]766        scount++;
767      }
768    (void)closedir(dirp);
769    fflush(stdout);
770    dup2(saved_stdout,fileno(stdout));
[9]771    printDocument(m,doc,getpid());
772    freeMaps(&m);
773    free(m);
774    free(REQUEST);
775    free(SERVICE_URL);
[1]776    fflush(stdout);
777    return 0;
778  }
779  else{
780    r_inputs=getMap(request_inputs,"Identifier");
781    if(r_inputs==NULL 
782       || strlen(r_inputs->name)==0 || strlen(r_inputs->value)==0){ 
[34]783      errorException(m, _("Mandatory <identifier> was not specified"),"MissingParameterValue");
[9]784      freeMaps(&m);
785      free(m);
786      free(REQUEST);
787      free(SERVICE_URL);
788      return 0;
[1]789    }
790
791    struct dirent *dp;
792    DIR *dirp = opendir(conf_dir);
793    if(dirp==NULL){
[34]794      errorException(m, _("The specified path path doesn't exist."),"InvalidParameterValue");
[9]795      freeMaps(&m);
796      free(m);
797      free(REQUEST);
798      free(SERVICE_URL);
799      return 0;
[1]800    }
[9]801    if(strncasecmp(REQUEST,"DescribeProcess",15)==0){
[1]802      /**
803       * Loop over Identifier list
804       */
805      xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0");
806      r_inputs=NULL;
807      r_inputs=getMap(request_inputs,"ServiceProvider");
[9]808
[1]809      xmlNodePtr n;
810      if(r_inputs!=NULL)
811        n = printDescribeProcessHeader(doc,r_inputs->value,m);
[9]812      else
813        n = printDescribeProcessHeader(doc,"",m);
[1]814
815      r_inputs=getMap(request_inputs,"Identifier");
816      char *tmps=strtok(r_inputs->value,",");
817     
818      char buff[256];
819      char buff1[1024];
820      int saved_stdout = dup(fileno(stdout));
821      dup2(fileno(stderr),fileno(stdout));
822      while(tmps){
823        memset(buff,0,256);
[9]824        snprintf(buff,256,"%s.zcfg",tmps);
[1]825        memset(buff1,0,1024);
826#ifdef DEBUG
[379]827        printf("\n#######%s\n########\n",buff1);
[1]828#endif
829        while ((dp = readdir(dirp)) != NULL)
[260]830          if((strcasecmp("all.zcfg",buff)==0 && strstr(dp->d_name,".zcfg")>0)
831             || strcasecmp(dp->d_name,buff)==0){
[1]832            memset(buff1,0,1024);
[9]833            snprintf(buff1,1024,"%s/%s",conf_dir,dp->d_name);
[381]834            s1=(service*)malloc(SERVICE_SIZE);
[9]835            if(s1 == NULL){
[379]836              dup2(saved_stdout,fileno(stdout));
[34]837              return errorException(m, _("Unable to allocate memory."),"InternalError");
[9]838            }
[1]839#ifdef DEBUG
[379]840            printf("#################\n%s\n#################\n",buff1);
[1]841#endif
842            t=getServiceFromFile(buff1,&s1);
[9]843#ifdef DEBUG
844            dumpService(s1);
845#endif
846            printDescribeProcessForProcess(m,n,s1,1);
847            freeService(&s1);
848            free(s1);
[1]849            scount++;
850          }
851        rewinddir(dirp);
852        tmps=strtok(NULL,",");
853      }
[9]854      closedir(dirp);
[1]855      fflush(stdout);
856      dup2(saved_stdout,fileno(stdout));
[9]857      printDocument(m,doc,getpid());
858      freeMaps(&m);
859      free(m);
860      free(REQUEST);
861      free(SERVICE_URL);
[1]862      fflush(stdout);
863      return 0;
864    }
865    else
[9]866      if(strncasecmp(REQUEST,"Execute",strlen(REQUEST))!=0){
[34]867        errorException(m, _("Unenderstood <request> value. Please check that it was set to GetCapabilities, DescribeProcess or Execute."), "InvalidParameterValue");
[1]868#ifdef DEBUG
869        fprintf(stderr,"No request found %s",REQUEST);
870#endif 
[9]871        closedir(dirp);
[385]872        freeMaps(&m);
873        free(m);
874        free(REQUEST);
875        free(SERVICE_URL);
876        fflush(stdout);
[1]877        return 0;
878      }
[9]879    closedir(dirp);
[1]880  }
881 
882  s1=NULL;
[381]883  s1=(service*)malloc(SERVICE_SIZE);
[9]884  if(s1 == NULL){
[32]885    freeMaps(&m);
886    free(m);
887    free(REQUEST);
888    free(SERVICE_URL);
[34]889    return errorException(m, _("Unable to allocate memory."),"InternalError");
[9]890  }
[1]891  r_inputs=getMap(request_inputs,"MetaPath");
[9]892  if(r_inputs!=NULL)
893    snprintf(tmps1,1024,"%s/%s",ntmp,r_inputs->value);
894  else
895    snprintf(tmps1,1024,"%s/",ntmp);
[1]896  r_inputs=getMap(request_inputs,"Identifier");
[453]897  char *ttmp=zStrdup(tmps1);
[9]898  snprintf(tmps1,1024,"%s/%s.zcfg",ttmp,r_inputs->value);
899  free(ttmp);
[1]900#ifdef DEBUG
901  fprintf(stderr,"Trying to load %s\n", tmps1);
902#endif
903  int saved_stdout = dup(fileno(stdout));
[331]904  dup2(fileno(stderr),fileno(stdout));
[1]905  t=getServiceFromFile(tmps1,&s1);
906  fflush(stdout);
907  dup2(saved_stdout,fileno(stdout));
[32]908  if(t<0){
[216]909    char *tmpMsg=(char*)malloc(2048+strlen(r_inputs->value));
910   
[34]911    sprintf(tmpMsg,_("The value for <indetifier> seems to be wrong (%s). Please, ensure that the process exist using the GetCapabilities request."),r_inputs->value);
[32]912    errorException(m, tmpMsg, "InvalidParameterValue");
[216]913    free(tmpMsg);
[32]914    free(s1);
915    freeMaps(&m);
916    free(m);
917    free(REQUEST);
918    free(SERVICE_URL);
919    return 0;
[1]920  }
[258]921  close(saved_stdout);
[1]922
923#ifdef DEBUG
924  dumpService(s1);
925#endif
926  int j;
927 
[381]928
[1]929  /**
[344]930   * Create the input and output maps data structure
[1]931   */
932  int i=0;
933  HINTERNET hInternet;
934  HINTERNET res;
935  hInternet=InternetOpen(
936#ifndef WIN32
937                         (LPCTSTR)
938#endif
939                         "ZooWPSClient\0",
940                         INTERNET_OPEN_TYPE_PRECONFIG,
941                         NULL,NULL, 0);
942
943#ifndef WIN32
944  if(!CHECK_INET_HANDLE(hInternet))
945    fprintf(stderr,"WARNING : hInternet handle failed to initialize");
946#endif
947  maps* request_input_real_format=NULL;
948  maps* tmpmaps = request_input_real_format;
949  map* postRequest=NULL;
950  postRequest=getMap(request_inputs,"xrequest");
951  if(postRequest==NULLMAP){
952    /**
953     * Parsing outputs provided as KVP
954     */
955    r_inputs=NULL;
956#ifdef DEBUG
957    fprintf(stderr,"OUTPUT Parsing ... \n");
958#endif
959    r_inputs=getMap(request_inputs,"ResponseDocument"); 
[9]960    if(r_inputs==NULL) r_inputs=getMap(request_inputs,"RawDataOutput");
961   
[32]962#ifdef DEBUG
[1]963    fprintf(stderr,"OUTPUT Parsing ... \n");
[32]964#endif
[9]965    if(r_inputs!=NULL){
[32]966#ifdef DEBUG
[1]967      fprintf(stderr,"OUTPUT Parsing start now ... \n");
[32]968#endif
[1]969      char cursor_output[10240];
[453]970      char *cotmp=zStrdup(r_inputs->value);
[9]971      snprintf(cursor_output,10240,"%s",cotmp);
972      free(cotmp);
[1]973      j=0;
974       
975      /**
976       * Put each Output into the outputs_as_text array
977       */
978      char * pToken;
979      maps* tmp_output=NULL;
980#ifdef DEBUG
981      fprintf(stderr,"OUTPUT [%s]\n",cursor_output);
982#endif
983      pToken=strtok(cursor_output,";");
[381]984      char** outputs_as_text=(char**)malloc(128*sizeof(char*));
[9]985      if(outputs_as_text == NULL) {
[34]986        return errorException(m, _("Unable to allocate memory"), "InternalError");
[9]987      }
[1]988      i=0;
989      while(pToken!=NULL){
990#ifdef DEBUG
991        fprintf(stderr,"***%s***\n",pToken);
992        fflush(stderr);
993        fprintf(stderr,"***%s***\n",pToken);
994#endif
[381]995        outputs_as_text[i]=(char*)malloc((strlen(pToken)+1)*sizeof(char));
[9]996        if(outputs_as_text[i] == NULL) {
[34]997          return errorException(m, _("Unable to allocate memory"), "InternalError");
[9]998        }
999        snprintf(outputs_as_text[i],strlen(pToken)+1,"%s",pToken);
[1]1000        pToken = strtok(NULL,";");
1001        i++;
1002      }
1003      for(j=0;j<i;j++){
[453]1004        char *tmp=zStrdup(outputs_as_text[j]);
[9]1005        free(outputs_as_text[j]);
[1]1006        char *tmpc;
1007        tmpc=strtok(tmp,"@");
1008        int k=0;
1009        while(tmpc!=NULL){
1010          if(k==0){
1011            if(tmp_output==NULL){
[381]1012              tmp_output=(maps*)malloc(MAPS_SIZE);
[9]1013              if(tmp_output == NULL){
[34]1014                return errorException(m, _("Unable to allocate memory."), "InternalError");
[9]1015              }
[453]1016              tmp_output->name=zStrdup(tmpc);
[1]1017              tmp_output->content=NULL;
1018              tmp_output->next=NULL;
1019            }
1020          }
1021          else{
1022            char *tmpv=strstr(tmpc,"=");
1023            char tmpn[256];
1024            memset(tmpn,0,256);
1025            strncpy(tmpn,tmpc,(strlen(tmpc)-strlen(tmpv))*sizeof(char));
1026            tmpn[strlen(tmpc)-strlen(tmpv)]=0;
1027#ifdef DEBUG
1028            fprintf(stderr,"OUTPUT DEF [%s]=[%s]\n",tmpn,tmpv+1);
1029#endif
1030            if(tmp_output->content==NULL){
1031              tmp_output->content=createMap(tmpn,tmpv+1);
1032              tmp_output->content->next=NULL;
1033            }
1034            else
1035              addToMap(tmp_output->content,tmpn,tmpv+1);
1036          }
1037          k++;
1038#ifdef DEBUG
1039          fprintf(stderr,"***%s***\n",tmpc);
1040#endif
1041          tmpc=strtok(NULL,"@");
1042        }
1043        if(request_output_real_format==NULL)
[9]1044          request_output_real_format=dupMaps(&tmp_output);
[1]1045        else
1046          addMapsToMaps(&request_output_real_format,tmp_output);
[9]1047        freeMaps(&tmp_output);
1048        free(tmp_output);
1049        tmp_output=NULL;
[1]1050#ifdef DEBUG
1051        dumpMaps(tmp_output);
1052        fflush(stderr);
1053#endif
[9]1054        free(tmp);
[1]1055      }
[9]1056      free(outputs_as_text);
[1]1057    }
1058
1059
1060    /**
1061     * Parsing inputs provided as KVP
1062     */
1063    r_inputs=getMap(request_inputs,"DataInputs");
1064#ifdef DEBUG
1065    fprintf(stderr,"DATA INPUTS [%s]\n",r_inputs->value);
1066#endif
1067    char cursor_input[40960];
[9]1068    if(r_inputs!=NULL)
1069      snprintf(cursor_input,40960,"%s",r_inputs->value);
1070    else{
[34]1071      errorException(m, _("Parameter <DataInputs> was not specified"),"MissingParameterValue");
[9]1072      freeMaps(&m);
1073      free(m);
1074      free(REQUEST);
1075      free(SERVICE_URL);
[57]1076      InternetCloseHandle(hInternet);
1077      freeService(&s1);
1078      free(s1);
[9]1079      return 0;
1080    }
[1]1081    j=0;
1082 
1083    /**
1084     * Put each DataInputs into the inputs_as_text array
1085     */
[453]1086    char *tmp1=zStrdup(cursor_input);
[1]1087    char * pToken;
1088    pToken=strtok(cursor_input,";");
[328]1089    if(pToken!=NULL && strncasecmp(pToken,tmp1,strlen(tmp1))==0){
1090      char* tmp2=url_decode(tmp1);
1091      snprintf(cursor_input,(strlen(tmp2)+1)*sizeof(char),"%s",tmp2);
1092      free(tmp2);
1093      pToken=strtok(cursor_input,";");
1094    }
1095    free(tmp1);
1096
[381]1097    char** inputs_as_text=(char**)malloc(100*sizeof(char*));
[9]1098    if(inputs_as_text == NULL){
[34]1099      return errorException(m, _("Unable to allocate memory."), "InternalError");
[9]1100    }
[1]1101    i=0;
1102    while(pToken!=NULL){
1103#ifdef DEBUG
1104      fprintf(stderr,"***%s***\n",pToken);
1105#endif
1106      fflush(stderr);
1107#ifdef DEBUG
1108      fprintf(stderr,"***%s***\n",pToken);
1109#endif
[381]1110      inputs_as_text[i]=(char*)malloc((strlen(pToken)+1)*sizeof(char));
[9]1111      snprintf(inputs_as_text[i],strlen(pToken)+1,"%s",pToken);
1112      if(inputs_as_text[i] == NULL){
[34]1113        return errorException(m, _("Unable to allocate memory."), "InternalError");
[9]1114      }
[1]1115      pToken = strtok(NULL,";");
1116      i++;
1117    }
1118
1119    for(j=0;j<i;j++){
[453]1120      char *tmp=zStrdup(inputs_as_text[j]);
[9]1121      free(inputs_as_text[j]);
[1]1122      char *tmpc;
1123      tmpc=strtok(tmp,"@");
1124      while(tmpc!=NULL){
1125#ifdef DEBUG
1126        fprintf(stderr,"***\n***%s***\n",tmpc);
1127#endif
1128        char *tmpv=strstr(tmpc,"=");
1129        char tmpn[256];
1130        memset(tmpn,0,256);
[216]1131        if(tmpv!=NULL){
1132          strncpy(tmpn,tmpc,(strlen(tmpc)-strlen(tmpv))*sizeof(char));
1133          tmpn[strlen(tmpc)-strlen(tmpv)]=0;
1134        }
1135        else{
1136          strncpy(tmpn,tmpc,strlen(tmpc)*sizeof(char));
1137          tmpn[strlen(tmpc)]=0;
1138        }
[1]1139#ifdef DEBUG
1140        fprintf(stderr,"***\n*** %s = %s ***\n",tmpn,tmpv+1);
1141#endif
1142        if(tmpmaps==NULL){
[381]1143          tmpmaps=(maps*)malloc(MAPS_SIZE);
[9]1144          if(tmpmaps == NULL){
[34]1145            return errorException(m, _("Unable to allocate memory."), "InternalError");
[9]1146          }
[453]1147          tmpmaps->name=zStrdup(tmpn);
[344]1148          if(tmpv!=NULL){
1149            char *tmpvf=url_decode(tmpv+1);
1150            tmpmaps->content=createMap("value",tmpvf);
1151            free(tmpvf);
1152          }
[216]1153          else
1154            tmpmaps->content=createMap("value","Reference");
[1]1155          tmpmaps->next=NULL;
1156        }
1157        tmpc=strtok(NULL,"@");
1158        while(tmpc!=NULL){
1159#ifdef DEBUG
1160          fprintf(stderr,"*** KVP NON URL-ENCODED \n***%s***\n",tmpc);
1161#endif
1162          char *tmpv1=strstr(tmpc,"=");
1163#ifdef DEBUG
1164          fprintf(stderr,"*** VALUE NON URL-ENCODED \n***%s***\n",tmpv1+1);
1165#endif
1166          char tmpn1[1024];
1167          memset(tmpn1,0,1024);
[216]1168          if(tmpv1!=NULL){
1169            strncpy(tmpn1,tmpc,strlen(tmpc)-strlen(tmpv1));
1170            tmpn1[strlen(tmpc)-strlen(tmpv1)]=0;
1171            addToMap(tmpmaps->content,tmpn1,tmpv1+1);
1172          }
1173          else{
1174            strncpy(tmpn1,tmpc,strlen(tmpc));
1175            tmpn1[strlen(tmpc)]=0;
1176            map* lmap=getLastMap(tmpmaps->content);
[381]1177            char *tmpValue=(char*)malloc((strlen(tmpv)+strlen(tmpc)+1)*sizeof(char));
[365]1178            sprintf(tmpValue,"%s@%s",tmpv+1,tmpc);
[216]1179            free(lmap->value);
[453]1180            lmap->value=zStrdup(tmpValue);
[216]1181            free(tmpValue);
1182            tmpc=strtok(NULL,"@");
1183            continue;
1184          }
[1]1185#ifdef DEBUG
1186          fprintf(stderr,"*** NAME NON URL-ENCODED \n***%s***\n",tmpn1);
1187          fprintf(stderr,"*** VALUE NON URL-ENCODED \n***%s***\n",tmpv1+1);
1188#endif
1189          if(strcmp(tmpn1,"xlink:href")!=0)
1190            addToMap(tmpmaps->content,tmpn1,tmpv1+1);
[216]1191          else
1192            if(tmpv1!=NULL){
[328]1193              char *tmpx2=url_decode(tmpv1+1);
1194              if(strncasecmp(tmpx2,"http://",7)!=0 &&
[453]1195                 strncasecmp(tmpx2,"ftp://",6)!=0 &&
1196                 strncasecmp(tmpx2,"https://",8)!=0){
[216]1197                char emsg[1024];
1198                sprintf(emsg,_("Unable to find a valid protocol to download the remote file %s"),tmpv1+1);
1199                errorException(m,emsg,"InternalError");
1200                freeMaps(&m);
1201                free(m);
1202                free(REQUEST);
1203                free(SERVICE_URL);
1204                InternetCloseHandle(hInternet);
1205                freeService(&s1);
1206                free(s1);
1207                return 0;
1208              }
[1]1209#ifdef DEBUG
[216]1210              fprintf(stderr,"REQUIRE TO DOWNLOAD A FILE FROM A SERVER : url(%s)\n",tmpv1+1);
[1]1211#endif
[328]1212              addToMap(tmpmaps->content,tmpn1,tmpx2);
[280]1213             
[1]1214#ifndef WIN32
[216]1215              if(CHECK_INET_HANDLE(hInternet))
[1]1216#endif
[216]1217                {
[368]1218                  if(loadRemoteFile(m,tmpmaps->content,hInternet,tmpx2)<0){
1219                    freeMaps(&m);
1220                    free(m);
1221                    free(REQUEST);
1222                    free(SERVICE_URL);
1223                    InternetCloseHandle(hInternet);
1224                    freeService(&s1);
1225                    free(s1);
1226                    return 0;
1227                  }
[58]1228                }
[328]1229              free(tmpx2);
[216]1230              addToMap(tmpmaps->content,"Reference",tmpv1+1);
1231            }
[1]1232          tmpc=strtok(NULL,"@");
1233        }
1234#ifdef DEBUG
1235        dumpMaps(tmpmaps);
1236        fflush(stderr);
1237#endif
[9]1238        if(request_input_real_format==NULL)
1239          request_input_real_format=dupMaps(&tmpmaps);
[360]1240        else{
1241          maps* testPresence=getMaps(request_input_real_format,tmpmaps->name);
1242          if(testPresence!=NULL){
1243            elements* elem=getElements(s1->inputs,tmpmaps->name);
1244            if(elem!=NULL){
1245              if(appendMapsToMaps(m,request_input_real_format,tmpmaps,elem)<0){
1246                freeMaps(&m);
1247                free(m);
1248                free(REQUEST);
1249                free(SERVICE_URL);
1250                InternetCloseHandle(hInternet);
1251                freeService(&s1);
1252                free(s1);
1253                return 0;
1254              }
1255            }
1256          }
1257          else
1258            addMapsToMaps(&request_input_real_format,tmpmaps);
1259        }
[9]1260        freeMaps(&tmpmaps);
1261        free(tmpmaps);
1262        tmpmaps=NULL;
1263        free(tmp);
[1]1264      }
1265    }
[9]1266    free(inputs_as_text);
1267  }
[1]1268  else {
[9]1269    /**
1270     * Parse XML request
1271     */ 
[1]1272    xmlInitParser();
1273#ifdef DEBUG
1274    fflush(stderr);
1275    fprintf(stderr,"BEFORE %s\n",postRequest->value);
1276    fflush(stderr);
1277#endif
1278    xmlDocPtr doc =
[5]1279      xmlParseMemory(postRequest->value,cgiContentLength);
[1]1280#ifdef DEBUG
1281    fprintf(stderr,"AFTER\n");
1282    fflush(stderr);
1283#endif
1284    /**
1285     * Parse every Input in DataInputs node.
1286     */
[9]1287    xmlXPathObjectPtr tmpsptr=extractFromDoc(doc,"/*/*/*[local-name()='Input']");
1288    xmlNodeSet* tmps=tmpsptr->nodesetval;
[1]1289#ifdef DEBUG
1290    fprintf(stderr,"*****%d*****\n",tmps->nodeNr);
1291#endif
1292    for(int k=0;k<tmps->nodeNr;k++){
1293      maps *tmpmaps=NULL;
1294      xmlNodePtr cur=tmps->nodeTab[k];
1295      if(tmps->nodeTab[k]->type == XML_ELEMENT_NODE) {
1296        /**
1297         * A specific Input node.
1298         */
1299#ifdef DEBUG
1300        fprintf(stderr, "= element 0 node \"%s\"\n", cur->name);
1301#endif
[9]1302        xmlNodePtr cur2=cur->children;
[32]1303        while(cur2!=NULL){
1304          while(cur2!=NULL && cur2->type!=XML_ELEMENT_NODE)
[9]1305            cur2=cur2->next;
[32]1306          if(cur2==NULL)
1307            break;
[9]1308          /**
1309           * Indentifier
1310           */
1311          if(xmlStrncasecmp(cur2->name,BAD_CAST "Identifier",xmlStrlen(cur2->name))==0){
1312            xmlChar *val= xmlNodeListGetString(doc,cur2->xmlChildrenNode,1);
1313            if(tmpmaps==NULL){
[381]1314              tmpmaps=(maps*)malloc(MAPS_SIZE);
[9]1315              if(tmpmaps == NULL){
[34]1316                return errorException(m, _("Unable to allocate memory."), "InternalError");
[1]1317              }
[453]1318              tmpmaps->name=zStrdup((char*)val);
[9]1319              tmpmaps->content=NULL;
1320              tmpmaps->next=NULL;
[1]1321            }
[9]1322            xmlFree(val);
1323          }
1324          /**
1325           * Title, Asbtract
1326           */
1327          if(xmlStrncasecmp(cur2->name,BAD_CAST "Title",xmlStrlen(cur2->name))==0 ||
1328             xmlStrncasecmp(cur2->name,BAD_CAST "Abstract",xmlStrlen(cur2->name))==0){
1329            xmlChar *val=
1330              xmlNodeListGetString(doc,cur2->xmlChildrenNode,1);
1331            if(tmpmaps==NULL){
[381]1332              tmpmaps=(maps*)malloc(MAPS_SIZE);
[9]1333              if(tmpmaps == NULL){
[34]1334                return errorException(m, _("Unable to allocate memory."), "InternalError");
[1]1335              }
[453]1336              tmpmaps->name=zStrdup("missingIndetifier");
[9]1337              tmpmaps->content=createMap((char*)cur2->name,(char*)val);
1338              tmpmaps->next=NULL;
1339            }
1340            else{
1341              if(tmpmaps->content!=NULL)
1342                addToMap(tmpmaps->content,
1343                         (char*)cur2->name,(char*)val);
1344              else
1345                tmpmaps->content=
1346                  createMap((char*)cur2->name,(char*)val);
1347            }
[1]1348#ifdef DEBUG
[9]1349            dumpMaps(tmpmaps);
[1]1350#endif
[9]1351            xmlFree(val);
1352          }
1353          /**
1354           * InputDataFormChoice (Reference or Data ?)
1355           */
1356          if(xmlStrcasecmp(cur2->name,BAD_CAST "Reference")==0){
[1]1357            /**
[9]1358             * Get every attribute from a Reference node
1359             * mimeType, encoding, schema, href, method
1360             * Header and Body gesture should be added here
[1]1361             */
1362#ifdef DEBUG
[9]1363            fprintf(stderr,"REFERENCE\n");
[1]1364#endif
[283]1365            const char *refs[5]={"mimeType","encoding","schema","method","href"};
[9]1366            for(int l=0;l<5;l++){
[1]1367#ifdef DEBUG
[9]1368              fprintf(stderr,"*** %s ***",refs[l]);
[1]1369#endif
[9]1370              xmlChar *val=xmlGetProp(cur2,BAD_CAST refs[l]);
1371              if(val!=NULL && xmlStrlen(val)>0){
1372                if(tmpmaps->content!=NULL)
1373                  addToMap(tmpmaps->content,refs[l],(char*)val);
1374                else
1375                  tmpmaps->content=createMap(refs[l],(char*)val);
1376                map* ltmp=getMap(tmpmaps->content,"method");
1377                if(l==4){
[440]1378                  if(!(ltmp!=NULL && strncmp(ltmp->value,"POST",4)==0)
[9]1379                     && CHECK_INET_HANDLE(hInternet)){
[379]1380                    if(loadRemoteFile(m,tmpmaps->content,hInternet,(char*)val)!=0){
[368]1381                      freeMaps(&m);
1382                      free(m);
1383                      free(REQUEST);
1384                      free(SERVICE_URL);
1385                      InternetCloseHandle(hInternet);
1386                      freeService(&s1);
1387                      free(s1);
1388                      return 0;
1389                    }
[1]1390                  }
1391                }
[9]1392              }
[1]1393#ifdef DEBUG
[9]1394              fprintf(stderr,"%s\n",val);
[1]1395#endif
[9]1396              xmlFree(val);
1397            }
[1]1398#ifdef POST_DEBUG
[9]1399            fprintf(stderr,"Parse Header and Body from Reference \n");
[1]1400#endif
[9]1401            xmlNodePtr cur3=cur2->children;
[441]1402            HINTERNET hInternetP;
1403            hInternetP=InternetOpen(
1404#ifndef WIN32
1405                                   (LPCTSTR)
1406#endif
1407                                   "ZooWPSClient\0",
1408                                   INTERNET_OPEN_TYPE_PRECONFIG,
1409                                   NULL,NULL, 0);
1410            hInternetP.header=NULL;
[9]1411            while(cur3){
[216]1412              while(cur3!=NULL && cur3->type!=XML_ELEMENT_NODE)
1413                cur2=cur3->next;
[9]1414              if(xmlStrcasecmp(cur3->name,BAD_CAST "Header")==0 ){
[114]1415                const char *ha[2];
[9]1416                ha[0]="key";
1417                ha[1]="value";
1418                int hai;
1419                char *has;
1420                char *key;
1421                for(hai=0;hai<2;hai++){
1422                  xmlChar *val=xmlGetProp(cur3,BAD_CAST ha[hai]);
[1]1423#ifdef POST_DEBUG
[9]1424                  fprintf(stderr,"%s = %s\n",ha[hai],(char*)val);
[1]1425#endif
[9]1426                  if(hai==0){
[381]1427                    key=(char*)malloc((1+strlen((char*)val))*sizeof(char));
[9]1428                    snprintf(key,1+strlen((char*)val),"%s",(char*)val);
1429                  }else{
[381]1430                    has=(char*)malloc((3+strlen((char*)val)+strlen(key))*sizeof(char));
[9]1431                    if(has == NULL){
[34]1432                      return errorException(m, _("Unable to allocate memory."), "InternalError");
[9]1433                    }
1434                    snprintf(has,(3+strlen((char*)val)+strlen(key)),"%s: %s",key,(char*)val);
[1]1435#ifdef POST_DEBUG
[9]1436                    fprintf(stderr,"%s\n",has);
[1]1437#endif
1438                  }
1439                }
[441]1440                hInternetP.header=curl_slist_append(hInternetP.header, has);
1441                if(has!=NULL)
1442                  free(has);
[9]1443              }
1444              else{
[1]1445#ifdef POST_DEBUG
[9]1446                fprintf(stderr,"Try to fetch the body part of the request ...\n");
[1]1447#endif
[9]1448                if(xmlStrcasecmp(cur3->name,BAD_CAST "Body")==0 ){
[1]1449#ifdef POST_DEBUG
[9]1450                  fprintf(stderr,"Body part found !!!\n",(char*)cur3->content);
[1]1451#endif
[9]1452                  char *tmp=new char[cgiContentLength];
1453                  memset(tmp,0,cgiContentLength);
1454                  xmlNodePtr cur4=cur3->children;
1455                  while(cur4!=NULL){
[127]1456                    while(cur4->type!=XML_ELEMENT_NODE)
1457                      cur4=cur4->next;
[9]1458                    xmlDocPtr bdoc = xmlNewDoc(BAD_CAST "1.0");
1459                    bdoc->encoding = xmlCharStrdup ("UTF-8");
1460                    xmlDocSetRootElement(bdoc,cur4);
1461                    xmlChar* btmps;
1462                    int bsize;
1463                    xmlDocDumpMemory(bdoc,&btmps,&bsize);
[1]1464#ifdef POST_DEBUG
[9]1465                    fprintf(stderr,"Body part found !!! %s %s\n",tmp,(char*)btmps);
[1]1466#endif
[9]1467                    if(btmps!=NULL)
1468                      sprintf(tmp,"%s",(char*)btmps);
1469                    xmlFreeDoc(bdoc);
1470                    cur4=cur4->next;
1471                  }
1472                  map *btmp=getMap(tmpmaps->content,"href");
1473                  if(btmp!=NULL){
1474#ifdef POST_DEBUG
1475                    fprintf(stderr,"%s %s\n",btmp->value,tmp);
[441]1476                    curl_easy_setopt(hInternetP.handle, CURLOPT_VERBOSE, 1);
[9]1477#endif
[441]1478                    res=InternetOpenUrl(hInternetP,btmp->value,tmp,strlen(tmp),
[9]1479                                        INTERNET_FLAG_NO_CACHE_WRITE,0);
[381]1480                    char* tmpContent = (char*)malloc((res.nDataLen+1)*sizeof(char));
[9]1481                    if(tmpContent == NULL){
[34]1482                      return errorException(m, _("Unable to allocate memory."), "InternalError");
[1]1483                    }
[9]1484                    size_t dwRead;
1485                    InternetReadFile(res, (LPVOID)tmpContent,
1486                                     res.nDataLen, &dwRead);
1487                    tmpContent[res.nDataLen]=0;
[441]1488                    if(hInternetP.header!=NULL)
1489                      curl_slist_free_all(hInternetP.header);
[9]1490                    addToMap(tmpmaps->content,"value",tmpContent);
1491#ifdef POST_DEBUG
1492                    fprintf(stderr,"DL CONTENT : (%s)\n",tmpContent);
1493#endif
1494                  }
1495                }
1496                else
1497                  if(xmlStrcasecmp(cur3->name,BAD_CAST "BodyReference")==0 ){
1498                    xmlChar *val=xmlGetProp(cur3,BAD_CAST "href");
1499                    HINTERNET bInternet,res1;
1500                    bInternet=InternetOpen(
1501#ifndef WIN32
1502                                           (LPCTSTR)
1503#endif
1504                                           "ZooWPSClient\0",
1505                                           INTERNET_OPEN_TYPE_PRECONFIG,
1506                                           NULL,NULL, 0);
1507                    if(!CHECK_INET_HANDLE(bInternet))
1508                      fprintf(stderr,"WARNING : hInternet handle failed to initialize");
1509#ifdef POST_DEBUG
1510                    curl_easy_setopt(bInternet.handle, CURLOPT_VERBOSE, 1);
1511#endif
1512                    res1=InternetOpenUrl(bInternet,(char*)val,NULL,0,
1513                                         INTERNET_FLAG_NO_CACHE_WRITE,0);
1514                    char* tmp=
[381]1515                      (char*)malloc((res1.nDataLen+1)*sizeof(char));
[9]1516                    if(tmp == NULL){
[34]1517                      return errorException(m, _("Unable to allocate memory."), "InternalError");
[9]1518                    }
1519                    size_t bRead;
1520                    InternetReadFile(res1, (LPVOID)tmp,
1521                                     res1.nDataLen, &bRead);
1522                    tmp[res1.nDataLen]=0;
1523                    InternetCloseHandle(bInternet);
[1]1524                    map *btmp=getMap(tmpmaps->content,"href");
1525                    if(btmp!=NULL){
1526#ifdef POST_DEBUG
1527                      fprintf(stderr,"%s %s\n",btmp->value,tmp);
[441]1528                      curl_easy_setopt(hInternetP.handle, CURLOPT_VERBOSE, 1);
[1]1529#endif
[441]1530                      res=InternetOpenUrl(hInternetP,btmp->value,tmp,
[9]1531                                          strlen(tmp),
[1]1532                                          INTERNET_FLAG_NO_CACHE_WRITE,0);
[381]1533                      char* tmpContent = (char*)malloc((res.nDataLen+1)*sizeof(char));
[9]1534                      if(tmpContent == NULL){
[34]1535                        return errorException(m, _("Unable to allocate memory."), "InternalError");
[9]1536                      }
[1]1537                      size_t dwRead;
1538                      InternetReadFile(res, (LPVOID)tmpContent,
1539                                       res.nDataLen, &dwRead);
1540                      tmpContent[res.nDataLen]=0;
[441]1541                      if(hInternetP.header!=NULL)
1542                        curl_slist_free_all(hInternetP.header);
[1]1543                      addToMap(tmpmaps->content,"value",tmpContent);
1544#ifdef POST_DEBUG
1545                      fprintf(stderr,"DL CONTENT : (%s)\n",tmpContent);
1546#endif
1547                    }
1548                  }
1549              }
[9]1550              cur3=cur3->next;
1551            }
[441]1552            InternetCloseHandle(hInternetP);
[1]1553#ifdef POST_DEBUG
[9]1554            fprintf(stderr,"Header and Body was parsed from Reference \n");
[1]1555#endif
1556#ifdef DEBUG
[9]1557            dumpMap(tmpmaps->content);
1558            fprintf(stderr, "= element 2 node \"%s\" = (%s)\n", 
1559                    cur2->name,cur2->content);
[1]1560#endif
[9]1561          }
1562          else if(xmlStrcasecmp(cur2->name,BAD_CAST "Data")==0){
[1]1563#ifdef DEBUG
[9]1564            fprintf(stderr,"DATA\n");
[1]1565#endif
[9]1566            xmlNodePtr cur4=cur2->children;
[32]1567            while(cur4!=NULL){
1568              while(cur4!=NULL &&cur4->type!=XML_ELEMENT_NODE)
[9]1569                cur4=cur4->next;
[32]1570              if(cur4==NULL)
1571                break;
[9]1572              if(xmlStrcasecmp(cur4->name, BAD_CAST "LiteralData")==0){
1573                /**
1574                 * Get every attribute from a LiteralData node
1575                 * dataType , uom
1576                 */
[114]1577                char *list[2];
[453]1578                list[0]=zStrdup("dataType");
1579                list[1]=zStrdup("uom");
[9]1580                for(int l=0;l<2;l++){
[1]1581#ifdef DEBUG
[114]1582                  fprintf(stderr,"*** LiteralData %s ***",list[l]);
[1]1583#endif
[114]1584                  xmlChar *val=xmlGetProp(cur4,BAD_CAST list[l]);
[9]1585                  if(val!=NULL && strlen((char*)val)>0){
1586                    if(tmpmaps->content!=NULL)
[114]1587                      addToMap(tmpmaps->content,list[l],(char*)val);
[9]1588                    else
[114]1589                      tmpmaps->content=createMap(list[l],(char*)val);
[1]1590#ifdef DEBUG
[280]1591                    fprintf(stderr,"%s\n",val);
[1]1592#endif
[280]1593                  }
[9]1594                  xmlFree(val);
[280]1595                  free(list[l]);                 
[1]1596                }
[9]1597              }
1598              else if(xmlStrcasecmp(cur4->name, BAD_CAST "ComplexData")==0){
1599                /**
1600                 * Get every attribute from a Reference node
1601                 * mimeType, encoding, schema
1602                 */
[282]1603                const char *coms[3]={"mimeType","encoding","schema"};
[9]1604                for(int l=0;l<3;l++){
[1]1605#ifdef DEBUG
[280]1606                  fprintf(stderr,"*** ComplexData %s ***\n",coms[l]);
[1]1607#endif
[9]1608                  xmlChar *val=xmlGetProp(cur4,BAD_CAST coms[l]);
1609                  if(val!=NULL && strlen((char*)val)>0){
1610                    if(tmpmaps->content!=NULL)
1611                      addToMap(tmpmaps->content,coms[l],(char*)val);
1612                    else
1613                      tmpmaps->content=createMap(coms[l],(char*)val);
[1]1614#ifdef DEBUG
[280]1615                    fprintf(stderr,"%s\n",val);
[1]1616#endif
[280]1617                  }
[9]1618                  xmlFree(val);
[1]1619                }
1620              }
[280]1621
[94]1622              map* test=getMap(tmpmaps->content,"encoding");
[280]1623              if(test==NULL){
1624                if(tmpmaps->content!=NULL)
1625                  addToMap(tmpmaps->content,"encoding","utf-8");
1626                else
1627                  tmpmaps->content=createMap("encoding","utf-8");
1628                test=getMap(tmpmaps->content,"encoding");
1629              }
1630
1631              if(strcasecmp(test->value,"base64")!=0){
[94]1632                xmlChar* mv=xmlNodeListGetString(doc,cur4->xmlChildrenNode,1);
[280]1633                map* ltmp=getMap(tmpmaps->content,"mimeType");
1634                if(mv==NULL || 
1635                   (xmlStrcasecmp(cur4->name, BAD_CAST "ComplexData")==0 &&
1636                    (ltmp==NULL || strncasecmp(ltmp->value,"text/xml",8)==0) )){
[94]1637                  xmlDocPtr doc1=xmlNewDoc(BAD_CAST "1.0");
1638                  int buffersize;
[280]1639                  xmlNodePtr cur5=cur4->children;
1640                  while(cur5!=NULL &&cur5->type!=XML_ELEMENT_NODE)
1641                    cur5=cur5->next;
1642                  xmlDocSetRootElement(doc1,cur5);
[94]1643                  xmlDocDumpFormatMemoryEnc(doc1, &mv, &buffersize, "utf-8", 1);
1644                  char size[1024];
1645                  sprintf(size,"%d",buffersize);
1646                  addToMap(tmpmaps->content,"size",size);
1647                }
1648                addToMap(tmpmaps->content,"value",(char*)mv);
1649                xmlFree(mv);
1650              }else{
[95]1651                xmlChar* tmp=xmlNodeListGetRawString(doc,cur4->xmlChildrenNode,0);
[94]1652                addToMap(tmpmaps->content,"value",(char*)tmp);
1653                map* tmpv=getMap(tmpmaps->content,"value");
1654                char *res=NULL;
1655                char *curs=tmpv->value;
1656                for(int i=0;i<=strlen(tmpv->value)/64;i++) {
1657                  if(res==NULL)
1658                    res=(char*)malloc(67*sizeof(char));
1659                  else
1660                    res=(char*)realloc(res,(((i+1)*65)+i)*sizeof(char));
1661                  int csize=i*65;
1662                  strncpy(res + csize,curs,64);
1663                  if(i==xmlStrlen(tmp)/64)
1664                    strcat(res,"\n\0");
1665                  else{
1666                    strncpy(res + (((i+1)*64)+i),"\n\0",2);
1667                    curs+=64;
1668                  }
1669                }
1670                free(tmpv->value);
[453]1671                tmpv->value=zStrdup(res);
[94]1672                free(res);
1673                xmlFree(tmp);
[69]1674              }
[9]1675              cur4=cur4->next;
[1]1676            }
[9]1677          }
[1]1678#ifdef DEBUG
[9]1679          fprintf(stderr,"cur2 next \n");
1680          fflush(stderr);
[1]1681#endif
[9]1682          cur2=cur2->next;
1683        }
[1]1684#ifdef DEBUG
[9]1685        fprintf(stderr,"ADD MAPS TO REQUEST MAPS !\n");
1686        fflush(stderr);
[1]1687#endif
[360]1688
1689        {
1690          maps* testPresence=getMaps(request_input_real_format,tmpmaps->name);
1691          if(testPresence!=NULL){
1692            elements* elem=getElements(s1->inputs,tmpmaps->name);
1693            if(elem!=NULL){
1694              if(appendMapsToMaps(m,request_input_real_format,tmpmaps,elem)<0){
1695                freeMaps(&m);
1696                free(m);
1697                free(REQUEST);
1698                free(SERVICE_URL);
1699                InternetCloseHandle(hInternet);
1700                freeService(&s1);
1701                free(s1);
1702                return 0;
1703              }
1704            }
1705          }
1706          else
1707            addMapsToMaps(&request_input_real_format,tmpmaps);
1708        }
[418]1709
[1]1710#ifdef DEBUG
[9]1711        fprintf(stderr,"******TMPMAPS*****\n");
[1]1712        dumpMaps(tmpmaps);
[9]1713        fprintf(stderr,"******REQUESTMAPS*****\n");
1714        dumpMaps(request_input_real_format);
[1]1715#endif
[32]1716        freeMaps(&tmpmaps);
1717        free(tmpmaps);
1718        tmpmaps=NULL;         
[1]1719      }
[25]1720#ifdef DEBUG
1721      dumpMaps(tmpmaps); 
1722#endif
[1]1723    }
1724#ifdef DEBUG
[9]1725    fprintf(stderr,"Search for response document node\n");
1726#endif
1727    xmlXPathFreeObject(tmpsptr);
[105]1728   
[9]1729    tmpsptr=extractFromDoc(doc,"/*/*/*[local-name()='ResponseDocument']");
[105]1730    bool asRaw=false;
[9]1731    tmps=tmpsptr->nodesetval;
[105]1732    if(tmps->nodeNr==0){
1733      tmpsptr=extractFromDoc(doc,"/*/*/*[local-name()='RawDataOutput']");
1734      tmps=tmpsptr->nodesetval;
1735      asRaw=true;
1736    }
[9]1737#ifdef DEBUG
[1]1738    fprintf(stderr,"*****%d*****\n",tmps->nodeNr);
1739#endif
1740    for(int k=0;k<tmps->nodeNr;k++){
[105]1741      if(asRaw==true)
1742        addToMap(request_inputs,"RawDataOutput","");
1743      else
1744        addToMap(request_inputs,"ResponseDocument","");
[1]1745      maps *tmpmaps=NULL;
1746      xmlNodePtr cur=tmps->nodeTab[k];
1747      if(cur->type == XML_ELEMENT_NODE) {
1748        /**
1749         * A specific responseDocument node.
1750         */
1751        if(tmpmaps==NULL){
[381]1752          tmpmaps=(maps*)malloc(MAPS_SIZE);
[9]1753          if(tmpmaps == NULL){
[34]1754            return errorException(m, _("Unable to allocate memory."), "InternalError");
[9]1755          }
[453]1756          tmpmaps->name=zStrdup("unknownIdentifier");
[381]1757          tmpmaps->content=NULL;
[1]1758          tmpmaps->next=NULL;
1759        }
1760        /**
[384]1761         * Get every attribute: storeExecuteResponse, lineage, status
[1]1762         */
[283]1763        const char *ress[3]={"storeExecuteResponse","lineage","status"};
[1]1764        xmlChar *val;
1765        for(int l=0;l<3;l++){
1766#ifdef DEBUG
1767          fprintf(stderr,"*** %s ***\t",ress[l]);
1768#endif
1769          val=xmlGetProp(cur,BAD_CAST ress[l]);
1770          if(val!=NULL && strlen((char*)val)>0){
1771            if(tmpmaps->content!=NULL)
1772              addToMap(tmpmaps->content,ress[l],(char*)val);
1773            else
1774              tmpmaps->content=createMap(ress[l],(char*)val);
1775            addToMap(request_inputs,ress[l],(char*)val);
1776          }
1777#ifdef DEBUG
1778          fprintf(stderr,"%s\n",val);
1779#endif
1780          xmlFree(val);
1781        }
1782        xmlNodePtr cur1=cur->children;
[381]1783        while(cur1!=NULL && cur1->type != XML_ELEMENT_NODE)
1784          cur1=cur1->next;
[418]1785        int cur1cnt=0;
[1]1786        while(cur1){
[280]1787          /**
1788           * Indentifier
1789           */
1790          if(xmlStrncasecmp(cur1->name,BAD_CAST "Identifier",xmlStrlen(cur1->name))==0){
1791            xmlChar *val=
1792              xmlNodeListGetString(doc,cur1->xmlChildrenNode,1);
1793            if(tmpmaps==NULL){
[381]1794              tmpmaps=(maps*)malloc(MAPS_SIZE);
[280]1795              if(tmpmaps == NULL){
1796                return errorException(m, _("Unable to allocate memory."), "InternalError");
1797              }
[453]1798              tmpmaps->name=zStrdup((char*)val);
[280]1799              tmpmaps->content=NULL;
1800              tmpmaps->next=NULL;
1801            }
[384]1802            else{
1803              //free(tmpmaps->name);
[453]1804              tmpmaps->name=zStrdup((char*)val);
[384]1805            }
[418]1806            if(asRaw==true)
1807              addToMap(request_inputs,"RawDataOutput",(char*)val);
1808            else{
1809              if(cur1cnt==0)
1810                addToMap(request_inputs,"ResponseDocument",(char*)val);
1811              else{
1812                map* tt=getMap(request_inputs,"ResponseDocument");
[453]1813                char* tmp=zStrdup(tt->value);
[418]1814                free(tt->value);
1815                tt->value=(char*)malloc((strlen(tmp)+strlen((char*)val)+1)*sizeof(char));
1816                sprintf(tt->value,"%s;%s",tmp,(char*)val);
1817                free(tmp);
1818              }
1819            }
1820            cur1cnt+=1;
[280]1821            xmlFree(val);
1822          }
1823          /**
1824           * Title, Asbtract
1825           */
1826          else if(xmlStrncasecmp(cur1->name,BAD_CAST "Title",xmlStrlen(cur1->name))==0 ||
1827                  xmlStrncasecmp(cur1->name,BAD_CAST "Abstract",xmlStrlen(cur1->name))==0){
1828            xmlChar *val=
1829              xmlNodeListGetString(doc,cur1->xmlChildrenNode,1);
1830            if(tmpmaps==NULL){
[381]1831              tmpmaps=(maps*)malloc(MAPS_SIZE);
[280]1832              if(tmpmaps == NULL){
1833                return errorException(m, _("Unable to allocate memory."), "InternalError");
1834              }
[453]1835              tmpmaps->name=zStrdup("missingIndetifier");
[280]1836              tmpmaps->content=createMap((char*)cur1->name,(char*)val);
1837              tmpmaps->next=NULL;
1838            }
1839            else{
1840              if(tmpmaps->content!=NULL)
[384]1841                addToMap(tmpmaps->content,(char*)cur1->name,(char*)val);
[280]1842              else
[384]1843                tmpmaps->content=createMap((char*)cur1->name,(char*)val);
[280]1844            }
1845            xmlFree(val);
1846          }
1847          else if(xmlStrncasecmp(cur1->name,BAD_CAST "Output",xmlStrlen(cur1->name))==0){
[1]1848            /**
1849             * Get every attribute from a Output node
1850             * mimeType, encoding, schema, uom, asReference
1851             */
[283]1852            const char *outs[5]={"mimeType","encoding","schema","uom","asReference"};
[1]1853            for(int l=0;l<5;l++){
1854#ifdef DEBUG
1855              fprintf(stderr,"*** %s ***\t",outs[l]);
1856#endif
1857              val=xmlGetProp(cur1,BAD_CAST outs[l]);
1858              if(val!=NULL && strlen((char*)val)>0){
1859                if(tmpmaps->content!=NULL)
1860                  addToMap(tmpmaps->content,outs[l],(char*)val);
1861                else
1862                  tmpmaps->content=createMap(outs[l],(char*)val);
1863              }
1864#ifdef DEBUG
1865              fprintf(stderr,"%s\n",val);
1866#endif
1867              xmlFree(val);
1868            }
1869            xmlNodePtr cur2=cur1->children;
[384]1870            while(cur2!=NULL && cur2->type != XML_ELEMENT_NODE)
1871              cur2=cur2->next;
[1]1872            while(cur2){
1873              /**
1874               * Indentifier
1875               */
[9]1876              if(xmlStrncasecmp(cur2->name,BAD_CAST "Identifier",xmlStrlen(cur2->name))==0){
[1]1877                xmlChar *val=
1878                  xmlNodeListGetString(doc,cur2->xmlChildrenNode,1);
1879                if(tmpmaps==NULL){
[381]1880                  tmpmaps=(maps*)malloc(MAPS_SIZE);
[9]1881                  if(tmpmaps == NULL){
[34]1882                    return errorException(m, _("Unable to allocate memory."), "InternalError");
[9]1883                  }
[453]1884                  tmpmaps->name=zStrdup((char*)val);
[1]1885                  tmpmaps->content=NULL;
1886                  tmpmaps->next=NULL;
1887                }
[380]1888                else{
1889                  if(tmpmaps->name!=NULL)
1890                    free(tmpmaps->name);
[453]1891                  tmpmaps->name=zStrdup((char*)val);;
[380]1892                }
[1]1893                xmlFree(val);
1894              }
1895              /**
1896               * Title, Asbtract
1897               */
[274]1898              else if(xmlStrncasecmp(cur2->name,BAD_CAST "Title",xmlStrlen(cur2->name))==0 ||
[331]1899                      xmlStrncasecmp(cur2->name,BAD_CAST "Abstract",xmlStrlen(cur2->name))==0){
[1]1900                xmlChar *val=
1901                  xmlNodeListGetString(doc,cur2->xmlChildrenNode,1);
1902                if(tmpmaps==NULL){
[381]1903                  tmpmaps=(maps*)malloc(MAPS_SIZE);
[9]1904                  if(tmpmaps == NULL){
[34]1905                    return errorException(m, _("Unable to allocate memory."), "InternalError");
[9]1906                  }
[453]1907                  tmpmaps->name=zStrdup("missingIndetifier");
[1]1908                  tmpmaps->content=createMap((char*)cur2->name,(char*)val);
1909                  tmpmaps->next=NULL;
1910                }
1911                else{
1912                  if(tmpmaps->content!=NULL)
1913                    addToMap(tmpmaps->content,
1914                             (char*)cur2->name,(char*)val);
1915                  else
1916                    tmpmaps->content=
1917                      createMap((char*)cur2->name,(char*)val);
1918                }
1919                xmlFree(val);
1920              }
1921              cur2=cur2->next;
[380]1922              while(cur2!=NULL && cur2->type != XML_ELEMENT_NODE)
1923                cur2=cur2->next;
[1]1924            }
1925          }
1926          cur1=cur1->next;
[380]1927          while(cur1!=NULL && cur1->type != XML_ELEMENT_NODE)
1928            cur1=cur1->next;
[1]1929        }
1930      }
[418]1931      if(request_output_real_format==NULL)
1932        request_output_real_format=dupMaps(&tmpmaps);
1933      else
1934        addMapsToMaps(&request_output_real_format,tmpmaps);
[380]1935      if(tmpmaps!=NULL){
1936        freeMaps(&tmpmaps);
1937        free(tmpmaps);
1938        tmpmaps=NULL;
1939      }
[1]1940    }
[9]1941    xmlXPathFreeObject(tmpsptr);
[1]1942    xmlCleanupParser();
1943  }
[105]1944 
[392]1945
1946  //  if(CHECK_INET_HANDLE(hInternet))
[9]1947  InternetCloseHandle(hInternet);
[1]1948
1949#ifdef DEBUG
[375]1950  fprintf(stderr,"\n%d\n",__LINE__);
1951  fflush(stderr);
[1]1952  dumpMaps(request_input_real_format);
1953  dumpMaps(request_output_real_format);
[9]1954  dumpMap(request_inputs);
[375]1955  fprintf(stderr,"\n%d\n",__LINE__);
1956  fflush(stderr);
[1]1957#endif
1958
1959  /**
1960   * Ensure that each requested arguments are present in the request
1961   * DataInputs and ResponseDocument / RawDataOutput
[92]1962   */
[63]1963  char *dfv=addDefaultValues(&request_input_real_format,s1->inputs,m,0);
[280]1964  char *dfv1=addDefaultValues(&request_output_real_format,s1->outputs,m,1);
1965  if(strcmp(dfv1,"")!=0 || strcmp(dfv,"")!=0){
[9]1966    char tmps[1024];
[280]1967    if(strcmp(dfv,"")!=0){
1968      snprintf(tmps,1024,_("The <%s> argument was not specified in DataInputs but defined as requested in ZOO ServicesProvider configuration file, please correct your query or the ZOO Configuration file."),dfv);
1969    }
1970    else if(strcmp(dfv1,"")!=0){
1971      snprintf(tmps,1024,_("The <%s> argument was specified as Output identifier but not defined in the ZOO Configuration File. Please, correct your query or the ZOO Configuration File."),dfv1);
1972    }
[9]1973    map* tmpe=createMap("text",tmps);
1974    addToMap(tmpe,"code","MissingParameterValue");
1975    printExceptionReportResponse(m,tmpe);
[63]1976    freeService(&s1);
1977    free(s1);
[9]1978    freeMap(&tmpe);
1979    free(tmpe);
1980    freeMaps(&m);
1981    free(m);
1982    free(REQUEST);
[63]1983    free(SERVICE_URL);
[9]1984    freeMaps(&request_input_real_format);
1985    free(request_input_real_format);
1986    freeMaps(&request_output_real_format);
1987    free(request_output_real_format);
1988    freeMaps(&tmpmaps);
1989    free(tmpmaps);
1990    return 1;
1991  }
[331]1992  maps* tmpReqI=request_input_real_format;
1993  while(tmpReqI!=NULL){
1994    char name[1024];
1995    if(getMap(tmpReqI->content,"isFile")!=NULL){
1996      if (cgiFormFileName(tmpReqI->name, name, sizeof(name)) == cgiFormSuccess) {
1997        int BufferLen=1024;
1998        cgiFilePtr file;
1999        int targetFile;
2000        mode_t mode;
2001        char storageNameOnServer[2048];
2002        char fileNameOnServer[64];
2003        char contentType[1024];
[364]2004        char buffer[1024];
[331]2005        char *tmpStr=NULL;
2006        int size;
2007        int got,t;
2008        map *path=getMapFromMaps(m,"main","tmpPath");
2009        cgiFormFileSize(tmpReqI->name, &size);
2010        cgiFormFileContentType(tmpReqI->name, contentType, sizeof(contentType));
2011        if (cgiFormFileOpen(tmpReqI->name, &file) == cgiFormSuccess) {
2012          t=-1;
2013          while(1){
2014            tmpStr=strstr(name+t+1,"\\");
2015            if(NULL==tmpStr)
2016              tmpStr=strstr(name+t+1,"/");
2017            if(NULL!=tmpStr)
2018              t=(int)(tmpStr-name);
2019            else
2020              break;
2021          }
2022          strcpy(fileNameOnServer,name+t+1);
2023         
2024          sprintf(storageNameOnServer,"%s/%s",path->value,fileNameOnServer);
[375]2025#ifdef DEBUG
[331]2026          fprintf(stderr,"Name on server %s\n",storageNameOnServer);
2027          fprintf(stderr,"fileNameOnServer: %s\n",fileNameOnServer);
[375]2028#endif
[331]2029          mode=S_IRWXU|S_IRGRP|S_IROTH;
[364]2030          targetFile = open (storageNameOnServer,O_RDWR|O_CREAT|O_TRUNC,S_IRWXU|S_IRGRP|S_IROTH);
[331]2031          if(targetFile<0){
[375]2032#ifdef DEBUG
[331]2033            fprintf(stderr,"could not create the new file,%s\n",fileNameOnServer);         
[375]2034#endif
[331]2035          }else{
2036            while (cgiFormFileRead(file, buffer, BufferLen, &got) ==cgiFormSuccess){
2037              if(got>0)
2038                write(targetFile,buffer,got);
2039            }
2040          }
2041          addToMap(tmpReqI->content,"lref",storageNameOnServer);
2042          cgiFormFileClose(file);
2043          close(targetFile);
[375]2044#ifdef DEBUG
[331]2045          fprintf(stderr,"File \"%s\" has been uploaded",fileNameOnServer);
[375]2046#endif
[331]2047        }
2048      }
2049    }
2050    tmpReqI=tmpReqI->next;
2051  }
2052
[88]2053  ensureDecodedBase64(&request_input_real_format);
2054
[9]2055#ifdef DEBUG
2056  fprintf(stderr,"REQUEST_INPUTS\n");
2057  dumpMaps(request_input_real_format);
2058  fprintf(stderr,"REQUEST_OUTPUTS\n");
2059  dumpMaps(request_output_real_format);
2060#endif
[1]2061
2062  maps* curs=getMaps(m,"env");
2063  if(curs!=NULL){
2064    map* mapcs=curs->content;
2065    while(mapcs!=NULLMAP){
2066#ifndef WIN32
2067      setenv(mapcs->name,mapcs->value,1);
2068#else
2069#ifdef DEBUG
2070      fprintf(stderr,"[ZOO: setenv (%s=%s)]\n",mapcs->name,mapcs->value);
2071#endif
2072      if(mapcs->value[strlen(mapcs->value)-2]=='\r'){
2073#ifdef DEBUG
2074        fprintf(stderr,"[ZOO: Env var finish with \r]\n");
2075#endif
2076        mapcs->value[strlen(mapcs->value)-1]=0;
2077      }
2078#ifdef DEBUG
2079      fflush(stderr);
[364]2080      fprintf(stderr,"setting variable... %s\n",(
[1]2081#endif
2082              SetEnvironmentVariable(mapcs->name,mapcs->value)
2083#ifdef DEBUG
[364]2084              ==0)? "OK" : "FAILED");
[1]2085#else
2086      ;
2087#endif
[392]2088      char* toto=(char*)malloc((strlen(mapcs->name)+strlen(mapcs->value)+2)*sizeof(char));
[364]2089      sprintf(toto,"%s=%s",mapcs->name,mapcs->value);
[392]2090      putenv(toto);
[1]2091#ifdef DEBUG
2092      fflush(stderr);
2093#endif
2094#endif
2095#ifdef DEBUG
2096      fprintf(stderr,"[ZOO: setenv (%s=%s)]\n",mapcs->name,mapcs->value);
2097      fflush(stderr);
2098#endif
2099      mapcs=mapcs->next;
2100    }
2101  }
2102 
2103#ifdef DEBUG
2104  dumpMap(request_inputs);
2105#endif
2106
2107  /**
2108   * Need to check if we need to fork to load a status enabled
2109   */
2110  r_inputs=NULL;
[72]2111  map* store=getMap(request_inputs,"storeExecuteResponse");
2112  map* status=getMap(request_inputs,"status");
2113  /**
2114   * 05-007r7 WPS 1.0.0 page 57 :
2115   * 'If status="true" and storeExecuteResponse is "false" then the service
2116   * shall raise an exception.'
2117   */
2118  if(status!=NULL && strcmp(status->value,"true")==0 && 
2119     store!=NULL && strcmp(store->value,"false")==0){
2120    errorException(m, _("Status cannot be set to true with storeExecuteResponse to false. Please, modify your request parameters."), "InvalidParameterValue");
2121    freeService(&s1);
2122    free(s1);
2123    freeMaps(&m);
2124    free(m);
2125   
2126    freeMaps(&request_input_real_format);
2127    free(request_input_real_format);
2128   
2129    freeMaps(&request_output_real_format);
2130    free(request_output_real_format);
2131   
2132    free(REQUEST);
2133    free(SERVICE_URL);
2134    return 1;
2135  }
[1]2136  r_inputs=getMap(request_inputs,"storeExecuteResponse");
2137  int eres=SERVICE_STARTED;
2138  int cpid=getpid();
[94]2139
[453]2140  /**
2141   * Initialize the specific [lenv] section which contains runtime variables:
2142   *
2143   *  - usid : it is an unique identification number
2144   *  - sid : it is the process idenfitication number (OS)
2145   *  - status : value between 0 and 100 to express the  completude of
2146   * the operations of the running service
2147   *  - message : is a string where you can store error messages, in case
2148   * service is failing, or o provide details on the ongoing operation.
2149   *  - cwd : is the current working directory
2150   *  - soap : is a boolean value, true if the request was contained in a SOAP
2151   * Envelop
2152   *  - sessid : string storing the session identifier (only when cookie is
2153   * used)
2154   *  - cgiSid : only defined on Window platforms (for being able to identify
2155   * the created process)
2156   *
2157   */
[32]2158  maps *_tmpMaps=(maps*)malloc(MAPS_SIZE);
[453]2159  _tmpMaps->name=zStrdup("lenv");
[32]2160  char tmpBuff[100];
[453]2161  sprintf(tmpBuff,"%i",(cpid+(int)time(NULL)));
2162  _tmpMaps->content=createMap("usid",tmpBuff);
2163  _tmpMaps->next=NULL;
[32]2164  sprintf(tmpBuff,"%i",cpid);
[453]2165  addToMap(_tmpMaps->content,"sid",tmpBuff);
[32]2166  addToMap(_tmpMaps->content,"status","0");
[453]2167  addToMap(_tmpMaps->content,"message",_("No message provided"));
[216]2168  addToMap(_tmpMaps->content,"cwd",ntmp);
[280]2169  map* ltmp=getMap(request_inputs,"soap");
2170  if(ltmp!=NULL)
2171    addToMap(_tmpMaps->content,"soap",ltmp->value);
2172  else
2173    addToMap(_tmpMaps->content,"soap","false");
[92]2174  if(cgiCookie!=NULL && strlen(cgiCookie)>0){
[390]2175    int hasValidCookie=-1;
[453]2176    char *tcook=zStrdup(cgiCookie);
[433]2177    char *tmp=NULL;
2178    int hasVal=-1;
2179    map* testing=getMapFromMaps(m,"main","cookiePrefix");
2180    if(testing==NULL){
[453]2181      tmp=zStrdup("ID=");
[433]2182    }else{
2183      tmp=(char*)malloc((strlen(testing->value)+2)*sizeof(char));
2184      sprintf(tmp,"%s=",testing->value);
2185      hasVal=1;
2186    }
[391]2187    if(strstr(cgiCookie,";")!=NULL){
[342]2188      char *token,*saveptr;
2189      token=strtok_r(cgiCookie,";",&saveptr);
2190      while(token!=NULL){
[433]2191        if(strcasestr(token,tmp)!=NULL){
[342]2192          if(tcook!=NULL)
2193            free(tcook);
[453]2194          tcook=zStrdup(token);
[390]2195          hasValidCookie=1;
[342]2196        }
2197        token=strtok_r(NULL,";",&saveptr);
2198      }
[391]2199    }else{
[433]2200      if(strstr(cgiCookie,"=")!=NULL && strcasestr(cgiCookie,tmp)!=NULL){
[453]2201        tcook=zStrdup(cgiCookie);
[391]2202        hasValidCookie=1;
2203      }
[433]2204      if(tmp!=NULL){
2205        free(tmp);
2206      }
[342]2207    }
[390]2208    if(hasValidCookie>0){
2209      addToMap(_tmpMaps->content,"sessid",strstr(tcook,"=")+1);
2210      char session_file_path[1024];
2211      map *tmpPath=getMapFromMaps(m,"main","sessPath");
2212      if(tmpPath==NULL)
2213        tmpPath=getMapFromMaps(m,"main","tmpPath");
2214      char *tmp1=strtok(tcook,";");
2215      if(tmp1!=NULL)
2216        sprintf(session_file_path,"%s/sess_%s.cfg",tmpPath->value,strstr(tmp1,"=")+1);
2217      else
2218        sprintf(session_file_path,"%s/sess_%s.cfg",tmpPath->value,strstr(cgiCookie,"=")+1);
2219      free(tcook);
2220      maps *tmpSess=(maps*)malloc(MAPS_SIZE);
2221      struct stat file_status;
2222      int istat = stat(session_file_path, &file_status);
2223      if(istat==0 && file_status.st_size>0){
2224        conf_read(session_file_path,tmpSess);
2225        addMapsToMaps(&m,tmpSess);
2226        freeMaps(&tmpSess);
2227        free(tmpSess);
2228      }
[92]2229    }
2230  }
[32]2231  addMapsToMaps(&m,_tmpMaps);
2232  freeMaps(&_tmpMaps);
2233  free(_tmpMaps);
2234
[1]2235#ifdef DEBUG
2236  dumpMap(request_inputs);
2237#endif
[216]2238#ifdef WIN32
2239  char *cgiSidL=NULL;
2240  if(getenv("CGISID")!=NULL)
[331]2241    addToMap(request_inputs,"cgiSid",getenv("CGISID"));
[216]2242  map* test1=getMap(request_inputs,"cgiSid");
2243  if(test1!=NULL){
2244    cgiSid=test1->value;
2245    addToMap(request_inputs,"storeExecuteResponse","true");
2246    addToMap(request_inputs,"status","true");
[384]2247    setMapInMaps(m,"lenv","sid",test1->value);
[216]2248    status=getMap(request_inputs,"status");
[384]2249    printf("cgiSid %s\n",cgiSid);
[216]2250  }
2251#endif
[384]2252  int hrstd=-1;
2253  char *fbkp,*fbkp1;
2254  FILE *f0,*f1;
[72]2255  if(status!=NULL)
2256    if(strcasecmp(status->value,"false")==0)
[364]2257      status=NULLMAP;
[72]2258  if(status==NULLMAP){
[34]2259    loadServiceAndRun(&m,s1,request_inputs,&request_input_real_format,&request_output_real_format,&eres);
2260  }
[1]2261  else{
[364]2262    int   pid;
[1]2263#ifdef DEBUG
2264    fprintf(stderr,"\nPID : %d\n",cpid);
2265#endif
[9]2266
[1]2267#ifndef WIN32
[9]2268    pid = fork ();
[1]2269#else
[216]2270    if(cgiSid==NULL){
2271      createProcess(m,request_inputs,s1,NULL,cpid,request_input_real_format,request_output_real_format);
2272      pid = cpid;
2273    }else{
2274      pid=0;
2275      cpid=atoi(cgiSid);
[384]2276      printf("cgiSid %s\n",cgiSid);
[216]2277    }
[384]2278    //printf("pid cpid %d %d\n",pid,cpid);
2279    //fflush(stderr);
[1]2280#endif
2281    if (pid > 0) {
2282      /**
2283       * dady :
2284       * set status to SERVICE_ACCEPTED
2285       */
2286#ifdef DEBUG
2287      fprintf(stderr,"father pid continue (origin %d) %d ...\n",cpid,getpid());
2288#endif
2289      eres=SERVICE_ACCEPTED;
2290    }else if (pid == 0) {
2291      /**
2292       * son : have to close the stdout, stdin and stderr to let the parent
2293       * process answer to http client.
2294       */
2295      r_inputs=getMapFromMaps(m,"main","tmpPath");
[9]2296      map* r_inputs1=getMap(s1->content,"ServiceProvider");
[384]2297      fbkp=(char*)malloc((strlen(r_inputs->value)+strlen(r_inputs1->value)+1024)*sizeof(char));
[9]2298      sprintf(fbkp,"%s/%s_%d.xml",r_inputs->value,r_inputs1->value,cpid);
[384]2299      char* flog=(char*)malloc((strlen(r_inputs->value)+strlen(r_inputs1->value)+1024)*sizeof(char));
[9]2300      sprintf(flog,"%s/%s_%d_error.log",r_inputs->value,r_inputs1->value,cpid);
[1]2301#ifdef DEBUG
2302      fprintf(stderr,"RUN IN BACKGROUND MODE \n");
2303      fprintf(stderr,"son pid continue (origin %d) %d ...\n",cpid,getpid());
[9]2304      fprintf(stderr,"\nFILE TO STORE DATA %s\n",r_inputs->value);
[1]2305#endif
[216]2306      freopen(flog,"w+",stderr);
[384]2307      f0=freopen(fbkp , "w+", stdout);
[1]2308      fclose(stdin);
[9]2309      free(flog);
[1]2310      /**
2311       * set status to SERVICE_STARTED and flush stdout to ensure full
2312       * content was outputed (the file used to store the ResponseDocument).
2313       * The rewind stdout to restart writing from the bgining of the file,
2314       * this way the data will be updated at the end of the process run.
2315       */
[9]2316      printProcessResponse(m,request_inputs,cpid,
[216]2317                           s1,r_inputs1->value,SERVICE_STARTED,
2318                           request_input_real_format,
2319                           request_output_real_format);
2320#ifndef WIN32
[1]2321      fflush(stdout);
2322      rewind(stdout);
[384]2323#else
[216]2324#endif
[384]2325      fbkp1=(char*)malloc((strlen(r_inputs->value)+strlen(r_inputs1->value)+1024)*sizeof(char));
2326      sprintf(fbkp1,"%s/%s_final_%d.xml",r_inputs->value,r_inputs1->value,cpid);
2327      f1=freopen(fbkp1 , "w+", stdout);
[34]2328      loadServiceAndRun(&m,s1,request_inputs,&request_input_real_format,&request_output_real_format,&eres);
[1]2329    } else {
2330      /**
2331       * error server don't accept the process need to output a valid
2332       * error response here !!!
2333       */
[34]2334      eres=-1;
2335      errorException(m, _("Unable to run the child process properly"), "InternalError");
[1]2336    }
2337  }
2338
2339#ifdef DEBUG
2340  dumpMaps(request_output_real_format);
2341#endif
[9]2342  if(eres!=-1)
2343    outputResponse(s1,request_input_real_format,
2344                   request_output_real_format,request_inputs,
2345                   cpid,m,eres);
[216]2346  fflush(stdout);
[105]2347  /**
2348   * Ensure that if error occurs when freeing memory, no signal will return
2349   * an ExceptionReport document as the result was already returned to the
2350   * client.
2351   */
2352#ifndef USE_GDB
2353  (void) signal(SIGSEGV,donothing);
2354  (void) signal(SIGTERM,donothing);
2355  (void) signal(SIGINT,donothing);
2356  (void) signal(SIGILL,donothing);
2357  (void) signal(SIGFPE,donothing);
2358  (void) signal(SIGABRT,donothing);
2359#endif
[1]2360
[32]2361  if(((int)getpid())!=cpid){
2362    fclose(stdout);
2363    fclose(stderr);
2364    unhandleStatus(m);
[384]2365    /**
2366     * Dump back the final file fbkp1 to fbkp
2367     */
2368    fclose(f0);
2369    fclose(f1);
2370    FILE* f2=fopen(fbkp1,"rb");
2371    FILE* f3=fopen(fbkp,"wb+");
2372    free(fbkp);
2373    fseek(f2,0,SEEK_END);
2374    long flen=ftell(f2);
2375    fseek(f2,0,SEEK_SET);
2376    char *tmps1=(char*)malloc((flen+1)*sizeof(char));
2377    fread(tmps1,flen,1,f2);
[454]2378    fwrite(tmps1,1,flen+1,f3);
[384]2379    fclose(f2);
2380    fclose(f3);
[393]2381    unlink(fbkp1);
2382    free(fbkp1);
[32]2383  }
2384
[9]2385  freeService(&s1);
2386  free(s1);
[59]2387  freeMaps(&m);
[9]2388  free(m);
2389 
2390  freeMaps(&request_input_real_format);
2391  free(request_input_real_format);
[25]2392 
[59]2393  freeMaps(&request_output_real_format);
2394  free(request_output_real_format);
[9]2395 
2396  free(REQUEST);
2397  free(SERVICE_URL);
[1]2398#ifdef DEBUG
2399  fprintf(stderr,"Processed response \n");
2400  fflush(stdout);
2401  fflush(stderr);
2402#endif
2403
2404  return 0;
2405}
[364]2406
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