source: trunk/zoo-kernel/service_internal.c @ 57

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

Adding contains and getIoTypeFromElement functions in service.h. Remove memory leaks from the Service Configuration Parser, add the support for multiple supported formats as before. Small modification of the ZOO-Kernel Java Support, adding the capability to access the modified main_conf HashMap? from the Kernel to let lenv message map pass when an error occurs and it is handled in the Service code. Adding same capability for the ZOO-Kernel Python Support. Use strcasecmp in service.h rather than strlen+strncasecmp. Ensure that only OWS compliant informations are available for Contact.Phone and Contact.Adress. Remove memory leak in createExceptionReportNode. Correction of the addDefaultValues function to add the default format using the informations from DataInputs? if present, this should correct the behavior of the ZOO-Kernel when choosing the extension value which should now point to the corresponding zcfg value if present. Don't set the NULL value for inputs not provided in the DataInputs?, still set NULL as default value for outputs. Avoid segfault in freeElements when some zcfg values was not set correctly. Link against the client libjvm.so file rather than the server one.

File size: 47.9 KB
Line 
1/**
2 * Author : Gérald FENOY
3 *
4 * Copyright (c) 2009-2010 GeoLabs SARL
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 */
24
25#include "service_internal.h"
26
27void *addLangAttr(xmlNodePtr n,maps *m){
28  map *tmpLmap=getMapFromMaps(m,"main","language");
29  if(tmpLmap!=NULL)
30    xmlNewProp(n,BAD_CAST "xml:lang",BAD_CAST tmpLmap->value);
31  else
32    xmlNewProp(n,BAD_CAST "xml:lang",BAD_CAST "en-US");
33}
34
35/* Converts a hex character to its integer value */
36char from_hex(char ch) {
37  return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10;
38}
39
40/* Converts an integer value to its hex character*/
41char to_hex(char code) {
42  static char hex[] = "0123456789abcdef";
43  return hex[code & 15];
44}
45
46void* unhandleStatus(maps *conf){
47  int shmid,i;
48  key_t key;
49  void *shm;
50  struct shmid_ds shmids;
51  char *s,*s1;
52  map *tmpMap=getMapFromMaps(conf,"lenv","sid");
53  if(tmpMap!=NULL){
54    key=atoi(tmpMap->value);
55    if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
56#ifdef DEBUG
57      fprintf(stderr,"shmget failed to update value\n");
58#endif
59    }else{
60      if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
61#ifdef DEBUG
62        fprintf(stderr,"shmat failed to update value\n");
63#endif
64      }else{
65        shmdt(shm);
66        shmctl(shmid,IPC_RMID,&shmids);
67      }
68    }
69  }
70}
71
72#ifdef USE_JS
73
74JSBool
75JSUpdateStatus(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
76{
77  JS_MaybeGC(cx);
78  char *sid;
79  int istatus=0;
80  char *status=NULL;
81  maps *conf;
82  int i=0;
83  if(argc>2){
84#ifdef JS_DEBUG
85    fprintf(stderr,"Number of arguments used to call the function : %i",argc);
86#endif
87    return JS_FALSE;
88  }
89  conf=mapsFromJSObject(cx,argv[0]);
90  if(JS_ValueToInt32(cx,argv[1],&istatus)==JS_TRUE){
91    char tmpStatus[4];
92    sprintf(tmpStatus,"%i",istatus);
93    tmpStatus[3]=0;
94    status=strdup(tmpStatus);
95  }
96  if(getMapFromMaps(conf,"lenv","status")!=NULL){
97    if(status!=NULL)
98      setMapInMaps(conf,"lenv","status",status);
99    else
100      setMapInMaps(conf,"lenv","status","15");
101    updateStatus(conf);
102  }
103  freeMaps(&conf);
104  free(conf);
105  JS_MaybeGC(cx);
106  return JS_TRUE;
107}
108
109#endif
110
111void* updateStatus(maps *conf){
112  int shmid,i;
113  key_t key;
114  char *shm,*s,*s1;
115  map *tmpMap=NULL;
116  tmpMap=getMapFromMaps(conf,"lenv","sid");
117  if(tmpMap!=NULL){
118    key=atoi(tmpMap->value);
119    if ((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
120#ifdef DEBUG
121      fprintf(stderr,"shmget failed to update value\n");
122#endif
123    }else{
124      if ((shm = (char*) shmat(shmid, NULL, 0)) == (char *) -1) {
125#ifdef DEBUG
126        fprintf(stderr,"shmat failed to update value\n");
127#endif
128      }
129      else{
130        tmpMap=getMapFromMaps(conf,"lenv","status");
131        s1=shm;
132        for(s=tmpMap->value;*s!=NULL;s++)
133          *s1++=*s;
134        shmdt((void *)shm);
135      }
136    }
137  }
138}
139
140char* getStatus(int pid){
141  int shmid,i;
142  key_t key;
143  void *shm;
144  char *s;
145  key=pid;
146  if ((shmid = shmget(key, SHMSZ, 0666)) < 0) {
147#ifdef DEBUG
148    fprintf(stderr,"shmget failed in getStatus\n");
149#endif
150  }else{
151    if ((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
152#ifdef DEBUG
153      fprintf(stderr,"shmat failed in getStatus\n");
154#endif
155    }else{
156      return (char*)shm;
157    }
158  }
159  return "-1";
160}
161
162
163/* Returns a url-encoded version of str */
164/* IMPORTANT: be sure to free() the returned string after use */
165char *url_encode(char *str) {
166  char *pstr = str, *buf = (char*) malloc(strlen(str) * 3 + 1), *pbuf = buf;
167  while (*pstr) {
168    if (isalnum(*pstr) || *pstr == '-' || *pstr == '_' || *pstr == '.' || *pstr == '~') 
169      *pbuf++ = *pstr;
170    else if (*pstr == ' ') 
171      *pbuf++ = '+';
172    else 
173      *pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15);
174    pstr++;
175  }
176  *pbuf = '\0';
177  return buf;
178}
179
180/* Returns a url-decoded version of str */
181/* IMPORTANT: be sure to free() the returned string after use */
182char *url_decode(char *str) {
183  char *pstr = str, *buf = (char*) malloc(strlen(str) + 1), *pbuf = buf;
184  while (*pstr) {
185    if (*pstr == '%') {
186      if (pstr[1] && pstr[2]) {
187        *pbuf++ = from_hex(pstr[1]) << 4 | from_hex(pstr[2]);
188        pstr += 2;
189      }
190    } else if (*pstr == '+') { 
191      *pbuf++ = ' ';
192    } else {
193      *pbuf++ = *pstr;
194    }
195    pstr++;
196  }
197  *pbuf = '\0';
198  return buf;
199}
200
201char *zCapitalize1(char *tmp){
202        char *res=strdup(tmp);
203        if(res[0]>=97 && res[0]<=122)
204                res[0]-=32;
205        return res;
206}
207
208char *zCapitalize(char *tmp){
209  int i=0;
210  char *res=strdup(tmp);
211  for(i=0;i<strlen(res);i++)
212    if(res[i]>=97 && res[i]<=122)
213      res[i]-=32;
214  return res;
215}
216
217
218int zooXmlSearchForNs(char* name){
219  int i;
220  int res=-1;
221  for(i=0;i<nbNs;i++)
222    if(strncasecmp(name,nsName[i],strlen(nsName[i]))==0){
223      res=i;
224      break;
225    }
226  return res;
227}
228
229int zooXmlAddNs(xmlNodePtr nr,char* url,char* name){
230#ifdef DEBUG
231  fprintf(stderr,"zooXmlAddNs %d \n",nbNs);
232#endif
233  int currId=-1;
234  if(nbNs==0){
235    nbNs++;
236    currId=0;
237    nsName[currId]=strdup(name);
238    usedNs[currId]=xmlNewNs(nr,BAD_CAST url,BAD_CAST name);
239  }else{
240    currId=zooXmlSearchForNs(name);
241    if(currId<0){
242      nbNs++;
243      currId=nbNs-1;
244      nsName[currId]=strdup(name);
245      usedNs[currId]=xmlNewNs(nr,BAD_CAST url,BAD_CAST name);
246    }
247  }
248  return currId;
249}
250
251void zooXmlCleanupNs(){
252  int j;
253#ifdef DEBUG
254  fprintf(stderr,"zooXmlCleanup %d\n",nbNs);
255#endif
256  for(j=nbNs-1;j>=0;j--){
257#ifdef DEBUG
258    fprintf(stderr,"zooXmlCleanup %d\n",j);
259#endif
260    if(j==0)
261      xmlFreeNs(usedNs[j]);
262    free(nsName[j]);
263    nbNs--;
264  }
265  nbNs=0;
266}
267
268xmlNodePtr printGetCapabilitiesHeader(xmlDocPtr doc,char* service,maps* m){
269
270  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
271  xmlNodePtr n,nc,nc1,nc2,nc3,nc4,nc5,nc6,pseudor;
272  xmlChar *xmlbuff;
273  int buffersize;
274  /**
275   * Create the document and its temporary root.
276   */
277  int wpsId=zooXmlAddNs(NULL,"http://www.opengis.net/wps/1.0.0","wps");
278  ns=usedNs[wpsId];
279  maps* toto1=getMaps(m,"main");
280
281  n = xmlNewNode(ns, BAD_CAST "Capabilities");
282  int owsId=zooXmlAddNs(n,"http://www.opengis.net/ows/1.1","ows");
283  ns_ows=usedNs[owsId];
284  xmlNewNs(n,BAD_CAST "http://www.opengis.net/wps/1.0.0",BAD_CAST "wps");
285  int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
286  ns_xsi=usedNs[xsiId];
287  int xlinkId=zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
288  ns_xlink=usedNs[xlinkId];
289  xmlNewNsProp(n,ns_xsi,BAD_CAST "schemaLocation",BAD_CAST "http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsGetCapabilities_response.xsd"); 
290  xmlNewProp(n,BAD_CAST "service",BAD_CAST "WPS");
291  addLangAttr(n,m);
292 
293  if(toto1!=NULL){
294    map* tmp=getMap(toto1->content,"version");
295    if(tmp!=NULL){
296      xmlNewProp(n,BAD_CAST "version",BAD_CAST tmp->value);
297    }
298    else
299      xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.0.0");
300  }
301  else
302    xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.0.0");
303
304  char tmp[256];
305 
306  nc = xmlNewNode(ns_ows, BAD_CAST "ServiceIdentification");
307  maps* tmp4=getMaps(m,"identification");
308  if(tmp4!=NULL){
309    map* tmp2=tmp4->content;
310    while(tmp2!=NULL){
311      if(strcasecmp(tmp2->name,"abstract")==0 ||
312         strcasecmp(tmp2->name,"title")==0 ||
313         strcasecmp(tmp2->name,"accessConstraints")==0 ||
314         strcasecmp(tmp2->name,"fess")==0){
315        tmp2->name[0]=toupper(tmp2->name[0]);
316        nc1 = xmlNewNode(ns_ows, BAD_CAST tmp2->name);
317        xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
318        xmlAddChild(nc,nc1);
319      }
320      else
321        if(strcmp(tmp2->name,"keywords")==0){
322          nc1 = xmlNewNode(ns_ows, BAD_CAST "Keywords");
323          char *toto=tmp2->value;
324          char buff[256];
325          int i=0;
326          int j=0;
327          while(toto[i]){
328            if(toto[i]!=',' && toto[i]!=0){
329              buff[j]=toto[i];
330              buff[j+1]=0;
331              j++;
332            }
333            else{
334              nc2 = xmlNewNode(ns_ows, BAD_CAST "Keyword");
335              xmlAddChild(nc2,xmlNewText(BAD_CAST buff));             
336              xmlAddChild(nc1,nc2);
337              j=0;
338            }
339            i++;
340          }
341          if(strlen(buff)>0){
342            nc2 = xmlNewNode(ns_ows, BAD_CAST "Keyword");
343            xmlAddChild(nc2,xmlNewText(BAD_CAST buff));       
344            xmlAddChild(nc1,nc2);
345          }
346          xmlAddChild(nc,nc1);
347          nc2 = xmlNewNode(ns_ows, BAD_CAST "ServiceType");
348          xmlAddChild(nc2,xmlNewText(BAD_CAST "WPS"));
349          xmlAddChild(nc,nc2);
350          nc2 = xmlNewNode(ns_ows, BAD_CAST "ServiceTypeVersion");
351          xmlAddChild(nc2,xmlNewText(BAD_CAST "1.0.0"));
352          xmlAddChild(nc,nc2);   
353        }
354      tmp2=tmp2->next;
355    }
356  }
357  else{
358    fprintf(stderr,"TMP4 NOT FOUND !!");
359    return NULL;
360  }
361  xmlAddChild(n,nc);
362
363  nc = xmlNewNode(ns_ows, BAD_CAST "ServiceProvider");
364  nc3 = xmlNewNode(ns_ows, BAD_CAST "ServiceContact");
365  nc4 = xmlNewNode(ns_ows, BAD_CAST "ContactInfo");
366  nc5 = xmlNewNode(ns_ows, BAD_CAST "Phone");
367  nc6 = xmlNewNode(ns_ows, BAD_CAST "Address");
368  tmp4=getMaps(m,"provider");
369  if(tmp4!=NULL){
370    map* tmp2=tmp4->content;
371    char *tmpAddress[6];
372    tmpAddress[0]="addressDeliveryPoint";
373    tmpAddress[1]="addressCity";
374    tmpAddress[2]="addressAdministrativeArea";
375    tmpAddress[3]="addressPostalCode";
376    tmpAddress[4]="addressCountry";
377    tmpAddress[5]="addressElectronicMailAddress";
378    char *tmpPhone[2];
379    tmpPhone[0]="phoneVoice";
380    tmpPhone[1]="phoneFacsimile";
381    while(tmp2!=NULL){
382      if(strcmp(tmp2->name,"keywords")!=0 &&
383         strcmp(tmp2->name,"serverAddress")!=0 &&
384         strcmp(tmp2->name,"lang")!=0){
385        tmp2->name[0]=toupper(tmp2->name[0]);
386        if(strcmp(tmp2->name,"ProviderName")==0){
387          nc1 = xmlNewNode(ns_ows, BAD_CAST tmp2->name);
388          xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
389          xmlAddChild(nc,nc1);
390        }
391        else{
392          if(strcmp(tmp2->name,"ProviderSite")==0){
393            nc1 = xmlNewNode(ns_ows, BAD_CAST tmp2->name);
394            xmlNewNsProp(nc1,ns_xlink,BAD_CAST "href",BAD_CAST tmp2->value);
395            xmlAddChild(nc,nc1);
396          } 
397          else 
398            if(strcmp(tmp2->name,"IndividualName")==0 || 
399               strcmp(tmp2->name,"PositionName")==0){
400              nc1 = xmlNewNode(ns_ows, BAD_CAST tmp2->name);
401              xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
402              xmlAddChild(nc3,nc1);
403            } 
404            else 
405              if(strncmp(tmp2->name,"Phone",5)==0){
406                int j;
407                for(j=0;j<2;j++)
408                  if(strlen(tmp2->name)==strlen(tmpPhone[j]) && strncasecmp(tmp2->name,tmpPhone[j],strlen(tmp2->name))==0){
409                    char *toto=NULL;
410                    char *toto1=tmp2->name;
411                    toto=strstr(toto1,"Phone");
412                    nc1 = xmlNewNode(ns_ows, BAD_CAST toto1+5);
413                    xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
414                    xmlAddChild(nc5,nc1);
415                  }
416              }
417              else 
418                if(strncmp(tmp2->name,"Address",7)==0){
419                  int j;
420                  for(j=0;j<6;j++)
421                    if(strlen(tmp2->name)==strlen(tmpAddress[j]) && strncasecmp(tmp2->name,tmpAddress[j],strlen(tmp2->name))==0){
422                      char *toto=NULL;
423                      char *toto1=tmp2->name;
424                      toto=strstr(toto1,"Address");
425                      nc1 = xmlNewNode(ns_ows, BAD_CAST toto1+7);
426                      xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
427                      xmlAddChild(nc6,nc1);
428                    }
429                }
430        }
431      }
432      else
433        if(strcmp(tmp2->name,"keywords")==0){
434          nc1 = xmlNewNode(ns_ows, BAD_CAST "Keywords");
435          char *toto=tmp2->value;
436          char buff[256];
437          int i=0;
438          int j=0;
439          while(toto[i]){
440            if(toto[i]!=',' && toto[i]!=0){
441              buff[j]=toto[i];
442              buff[j+1]=0;
443              j++;
444            }
445            else{
446              nc2 = xmlNewNode(ns_ows, BAD_CAST "Keyword");
447              xmlAddChild(nc2,xmlNewText(BAD_CAST buff));             
448              xmlAddChild(nc1,nc2);
449              j=0;
450            }
451            i++;
452          }
453          if(strlen(buff)>0){
454            nc2 = xmlNewNode(ns_ows, BAD_CAST "Keyword");
455            xmlAddChild(nc2,xmlNewText(BAD_CAST buff));       
456            xmlAddChild(nc1,nc2);
457          }
458          xmlAddChild(nc,nc1);
459        }
460      tmp2=tmp2->next;
461    }
462  }
463  else{
464    fprintf(stderr,"TMP4 NOT FOUND !!");
465  }
466  xmlAddChild(nc4,nc5);
467  xmlAddChild(nc4,nc6);
468  xmlAddChild(nc3,nc4);
469  xmlAddChild(nc,nc3);
470  xmlAddChild(n,nc);
471
472
473  nc = xmlNewNode(ns_ows, BAD_CAST "OperationsMetadata");
474  char *tmp2[3];
475  tmp2[0]=strdup("GetCapabilities");
476  tmp2[1]=strdup("DescribeProcess");
477  tmp2[2]=strdup("Execute");
478  int j=0;
479
480  if(toto1!=NULL){
481    map* tmp=getMap(toto1->content,"serverAddress");
482    if(tmp!=NULL){
483      SERVICE_URL = strdup(tmp->value);
484    }
485    else
486      SERVICE_URL = strdup("not_found");
487  }
488  else
489    SERVICE_URL = strdup("not_found");
490
491  for(j=0;j<3;j++){
492    nc1 = xmlNewNode(ns_ows, BAD_CAST "Operation");
493    xmlNewProp(nc1,BAD_CAST "name",BAD_CAST tmp2[j]);
494    nc2 = xmlNewNode(ns_ows, BAD_CAST "DCP");
495    nc3 = xmlNewNode(ns_ows, BAD_CAST "HTTP");
496    nc4 = xmlNewNode(ns_ows, BAD_CAST "Get");
497    sprintf(tmp,"%s/%s",SERVICE_URL,service);
498    xmlNewNsProp(nc4,ns_xlink,BAD_CAST "href",BAD_CAST tmp);
499    xmlAddChild(nc3,nc4);
500    if(j>0){
501      nc4 = xmlNewNode(ns_ows, BAD_CAST "Post");
502      xmlNewNsProp(nc4,ns_xlink,BAD_CAST "href",BAD_CAST tmp);
503      xmlAddChild(nc3,nc4);
504    }
505    xmlAddChild(nc2,nc3);
506    xmlAddChild(nc1,nc2);   
507    xmlAddChild(nc,nc1);   
508  }
509  for(j=2;j>=0;j--)
510    free(tmp2[j]);
511  xmlAddChild(n,nc);
512
513  nc = xmlNewNode(ns, BAD_CAST "ProcessOfferings");
514  xmlAddChild(n,nc);
515
516  nc1 = xmlNewNode(ns, BAD_CAST "Languages");
517  nc2 = xmlNewNode(ns, BAD_CAST "Default");
518  nc3 = xmlNewNode(ns, BAD_CAST "Supported");
519 
520  toto1=getMaps(m,"main");
521  if(toto1!=NULL){
522    map* tmp1=getMap(toto1->content,"lang");
523    char *toto=tmp1->value;
524    char buff[256];
525    int i=0;
526    int j=0;
527    int dcount=0;
528    while(toto[i]){
529      if(toto[i]!=',' && toto[i]!=0){
530        buff[j]=toto[i];
531        buff[j+1]=0;
532        j++;
533      }
534      else{
535        nc4 = xmlNewNode(ns_ows, BAD_CAST "Language");
536        xmlAddChild(nc4,xmlNewText(BAD_CAST buff));
537        if(dcount==0){
538          xmlAddChild(nc2,nc4);
539          xmlAddChild(nc1,nc2);
540          dcount++;
541        }
542        nc4 = xmlNewNode(ns_ows, BAD_CAST "Language");
543        xmlAddChild(nc4,xmlNewText(BAD_CAST buff));
544        xmlAddChild(nc3,nc4);
545        j=0;
546        buff[j]=0;
547      }
548      i++;
549    }
550    if(strlen(buff)>0){
551      nc4 = xmlNewNode(ns_ows, BAD_CAST "Language");
552      xmlAddChild(nc4,xmlNewText(BAD_CAST buff));             
553      xmlAddChild(nc3,nc4);
554    }
555  }
556  xmlAddChild(nc1,nc3);
557  xmlAddChild(n,nc1);
558 
559  xmlDocSetRootElement(doc, n);
560  //xmlFreeNs(ns);
561  free(SERVICE_URL);
562  return nc;
563}
564
565void printGetCapabilitiesForProcess(maps* m,xmlNodePtr nc,service* serv){
566  xmlNsPtr ns,ns_ows,ns_xlink;
567  xmlNodePtr nr,n,nc1,nc2,nc3,nc4,nc5,nc6,pseudor;
568  /**
569   * Initialize or get existing namspaces
570   */
571  int wpsId=zooXmlAddNs(NULL,"http://www.opengis.net/wps/1.0.0","wps");
572  ns=usedNs[wpsId];
573  int owsId=zooXmlAddNs(NULL,"http://www.opengis.net/ows/1.1","ows");
574  ns_ows=usedNs[owsId];
575  int xlinkId=zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
576  ns_xlink=usedNs[xlinkId];
577
578  int cursor=0;
579  map* tmp1;
580  if(serv->content!=NULL){
581    nc1 = xmlNewNode(ns, BAD_CAST "Process");
582    tmp1=getMap(serv->content,"processVersion");
583    if(tmp1!=NULL)
584      xmlNewNsProp(nc1,ns,BAD_CAST "processVersion",BAD_CAST tmp1->value);
585    printDescription(nc1,ns_ows,serv->name,serv->content);
586    tmp1=serv->metadata;
587    while(tmp1!=NULL){
588      nc2 = xmlNewNode(ns_ows, BAD_CAST "Metadata");
589      xmlNewNsProp(nc2,ns_xlink,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
590      xmlAddChild(nc1,nc2);
591      tmp1=tmp1->next;
592    }
593    xmlAddChild(nc,nc1);
594  }
595}
596
597xmlNodePtr printDescribeProcessHeader(xmlDocPtr doc,char* service,maps* m){
598
599  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
600  xmlNodePtr n,nr;
601  xmlChar *xmlbuff;
602  int buffersize;
603
604  int wpsId=zooXmlAddNs(NULL,"http://schemas.opengis.net/wps/1.0.0","wps");
605  ns=usedNs[wpsId];
606  n = xmlNewNode(ns, BAD_CAST "ProcessDescriptions");
607  int owsId=zooXmlAddNs(n,"http://www.opengis.net/ows/1.1","ows");
608  ns_ows=usedNs[owsId];
609  xmlNewNs(n,BAD_CAST "http://www.opengis.net/wps/1.0.0",BAD_CAST "wps");
610  zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
611  int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
612  ns_xsi=usedNs[xsiId];
613 
614  xmlNewNsProp(n,ns_xsi,BAD_CAST "schemaLocation",BAD_CAST "http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsDescribeProcess_response.xsd");
615  xmlNewProp(n,BAD_CAST "service",BAD_CAST "WPS");
616  xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.0.0");
617  addLangAttr(n,m);
618
619  xmlDocSetRootElement(doc, n);
620
621  return n;
622}
623
624void printDescribeProcessForProcess(maps* m,xmlNodePtr nc,service* serv,int sc){
625  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
626  xmlNodePtr nr,n,nc1,nc2,nc3,nc4,nc5,nc6,pseudor;
627
628  char tmp[256];
629  n=nc;
630 
631  int wpsId=zooXmlAddNs(NULL,"http://schemas.opengis.net/wps/1.0.0","wps");
632  ns=usedNs[wpsId];
633  int owsId=zooXmlAddNs(NULL,"http://www.opengis.net/ows/1.1","ows");
634  ns_ows=usedNs[owsId];
635  int xlinkId=zooXmlAddNs(NULL,"http://www.w3.org/1999/xlink","xlink");
636  ns_xlink=usedNs[xlinkId];
637
638  nc = xmlNewNode(NULL, BAD_CAST "ProcessDescription");
639  char *tmp4[3];
640  tmp4[0]="processVersion";
641  tmp4[1]="storeSupported";
642  tmp4[2]="statusSupported";
643  int j=0;
644  map* tmp1=NULL;
645  for(j=0;j<3;j++){
646    tmp1=getMap(serv->content,tmp4[j]);
647    if(tmp1!=NULL){
648      if(j==0)
649        xmlNewNsProp(nc,ns,BAD_CAST "processVersion",BAD_CAST tmp1->value);     
650      else
651        xmlNewProp(nc,BAD_CAST tmp4[j],BAD_CAST tmp1->value);     
652    }
653    else{
654      if(j>0)
655        xmlNewProp(nc,BAD_CAST tmp4[j],BAD_CAST "false");     
656    }
657  }
658 
659  printDescription(nc,ns_ows,serv->name,serv->content);
660
661  tmp1=serv->metadata;
662  while(tmp1!=NULL){
663    nc1 = xmlNewNode(ns_ows, BAD_CAST "Metadata");
664    xmlNewNsProp(nc1,ns_xlink,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
665    xmlAddChild(nc,nc1);
666    tmp1=tmp1->next;
667  }
668
669  tmp1=getMap(serv->content,"Profile");
670  if(tmp1!=NULL){
671    nc1 = xmlNewNode(ns, BAD_CAST "Profile");
672    xmlAddChild(nc1,xmlNewText(BAD_CAST tmp1->value));
673    xmlAddChild(nc,nc1);
674  }
675
676  nc1 = xmlNewNode(NULL, BAD_CAST "DataInputs");
677 
678  elements* e=serv->inputs;
679  while(e!=NULL){
680    nc2 = xmlNewNode(NULL, BAD_CAST "Input");
681    tmp1=getMap(e->content,"minOccurs");
682    if(tmp1){
683      xmlNewProp(nc2,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
684    }
685    tmp1=getMap(e->content,"maxOccurs");
686    if(tmp1){
687      xmlNewProp(nc2,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
688    }
689
690    printDescription(nc2,ns_ows,e->name,e->content);
691
692
693    nc3 = xmlNewNode(NULL, BAD_CAST e->format);
694    iotype* _tmp=e->defaults;
695    int datatype=0;
696    if(_tmp!=NULL){
697      int isAnyValue=1;
698      if(strcmp(e->format,"LiteralData")!=0){
699        nc4 = xmlNewNode(NULL, BAD_CAST "Default");
700        nc5 = xmlNewNode(NULL, BAD_CAST "Format");
701      }
702      else{
703        nc4 = xmlNewNode(NULL, BAD_CAST "UOMs");
704        nc5 = xmlNewNode(NULL, BAD_CAST "Default");
705        datatype=1;
706      }
707      tmp1=_tmp->content;
708      int default1=0;
709      xmlNodePtr nc7;
710      while(tmp1!=NULL){
711#ifdef DEBUG
712        printf("DATATYPE DEFAULT ? %s\n",tmp1->name);
713#endif
714        if(strncasecmp(tmp1->name,"DataType",8)==0){
715          nc6 = xmlNewNode(ns_ows, BAD_CAST "DataType");
716          xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
717          char tmp[1024];
718          sprintf(tmp,"http://www.w3.org/TR/xmlschema-2/#%s",tmp1->value);
719          xmlNewNsProp(nc6,ns_ows,BAD_CAST "reference",BAD_CAST tmp);
720          xmlAddChild(nc3,nc6);
721          tmp1=tmp1->next;
722          continue;
723        }
724        if(strcasecmp(tmp1->name,"asReference")!=0 && 
725           strcasecmp(tmp1->name,"DataType")!=0 && 
726           strncasecmp(tmp1->name,"AllowedValues",13)!=0 &&
727           strcasecmp(tmp1->name,"value")!=0 &&
728           strcasecmp(tmp1->name,"extension")!=0){
729          if(datatype==0){
730            char *tmp2=zCapitalize1(tmp1->name);
731            nc6 = xmlNewNode(NULL, BAD_CAST tmp2);
732            free(tmp2);
733          }
734          else{
735            char *tmp2=zCapitalize(tmp1->name);
736            nc6 = xmlNewNode(ns_ows, BAD_CAST tmp2);
737            free(tmp2);
738          }
739          xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
740          xmlAddChild(nc5,nc6);
741        }
742        else{
743          if(strcmp(tmp1->name,"value")==0){
744            nc7 = xmlNewNode(NULL, BAD_CAST "DefaultValue");
745            xmlAddChild(nc7,xmlNewText(BAD_CAST tmp1->value));
746            default1=1;
747          }
748          if(strncasecmp(tmp1->name,"AllowedValues",13)==0){
749            nc6 = xmlNewNode(ns_ows, BAD_CAST "AllowedValues");
750            char *token,*saveptr1;
751            token=strtok_r(tmp1->value,",",&saveptr1);
752            while(token!=NULL){
753                nc7 = xmlNewNode(ns_ows, BAD_CAST "Value");
754                char *tmps=strdup(token);
755                tmps[strlen(tmps)]=0;
756                xmlAddChild(nc7,xmlNewText(BAD_CAST tmps));
757                fprintf(stderr,"strgin : %s\n",tmps);
758                xmlAddChild(nc6,nc7);
759                token=strtok_r(NULL,",",&saveptr1);
760            }
761            xmlAddChild(nc3,nc6);
762            isAnyValue=-1;
763          }
764        }
765        tmp1=tmp1->next;
766      }
767      xmlAddChild(nc4,nc5);
768      xmlAddChild(nc3,nc4);
769      if(datatype==1 && isAnyValue==1){
770        xmlAddChild(nc3,xmlNewNode(ns_ows, BAD_CAST "AnyValue"));
771        if(default1>0)
772          xmlAddChild(nc3,nc7);
773      }
774      if(datatype==1 && default1>0)
775        xmlAddChild(nc3,nc7);
776    }
777    xmlAddChild(nc2,nc3);
778   
779    _tmp=e->supported;
780    while(_tmp!=NULL){
781      if(datatype==0){
782        nc4 = xmlNewNode(NULL, BAD_CAST "Supported");
783        nc5 = xmlNewNode(NULL, BAD_CAST "Format");
784      }
785      else{
786        nc5 = xmlNewNode(NULL, BAD_CAST "Supported");
787      }
788      tmp1=_tmp->content;
789      while(tmp1!=NULL){
790        /*if(strcmp(e->format,"LiteralData")==0)
791          xmlAddChild(nc5,nc6);*/
792        if(datatype==0){
793          char *tmp2=zCapitalize1(tmp1->name);
794          nc6 = xmlNewNode(NULL, BAD_CAST tmp2);
795          free(tmp2);
796        }
797        else{
798          char *tmp2=zCapitalize(tmp1->name);     
799          nc6 = xmlNewNode(ns_ows, BAD_CAST tmp2);
800          free(tmp2);
801        }
802        xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
803        xmlAddChild(nc5,nc6);
804        tmp1=tmp1->next;
805      }
806      if(datatype==0){
807        xmlAddChild(nc4,nc5);
808        xmlAddChild(nc3,nc4);
809      }else{
810        xmlAddChild(nc4,nc5);
811        //xmlAddChild(nc3,xmlNewNode(ns_ows, BAD_CAST "AnyValue"));
812      }
813      _tmp=_tmp->next;
814      if(strcmp(e->format,"LiteralData")!=0){
815        xmlAddChild(nc2,nc3);
816      }
817      xmlAddChild(nc1,nc2);
818    }
819   
820   
821    e=e->next;
822  }
823  xmlAddChild(nc,nc1);
824
825  nc1 = xmlNewNode(NULL, BAD_CAST "ProcessOutputs");
826 
827  e=serv->outputs;
828  while(e!=NULL){
829    nc2 = xmlNewNode(NULL, BAD_CAST "Output");
830    tmp1=getMap(e->content,"minOccurs");
831    if(tmp1){
832      xmlNewProp(nc2,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
833    }
834    tmp1=getMap(e->content,"maxOccurs");
835    if(tmp1){
836      xmlNewProp(nc2,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
837    }
838
839    printDescription(nc2,ns_ows,e->name,e->content);
840
841    if(strncasecmp(e->format,"LITERALDATA",strlen(e->format))==0)
842      nc3 = xmlNewNode(NULL, BAD_CAST "LiteralOutput");
843    else
844      if(strncasecmp(e->format,"COMPLEXDATA",strlen(e->format))==0)
845        nc3 = xmlNewNode(NULL, BAD_CAST "ComplexOutput");
846      else
847        nc3 = xmlNewNode(NULL, BAD_CAST e->format);
848    iotype* _tmp=e->defaults;
849    int datatype=0;
850    if(_tmp!=NULL){
851     if(strcmp(e->format,"LiteralOutput")==0 ||
852        strcmp(e->format,"LiteralData")==0){
853        datatype=1;
854        nc4 = xmlNewNode(NULL, BAD_CAST "UOMs");
855        nc5 = xmlNewNode(NULL, BAD_CAST "Default");
856     }
857      else{
858        nc4 = xmlNewNode(NULL, BAD_CAST "Default");
859        nc5 = xmlNewNode(NULL, BAD_CAST "Format");
860      }
861      tmp1=_tmp->content;
862      while(tmp1!=NULL){
863#ifdef DEBUG
864        printf("DATATYPE DEFAULT ? %s\n",tmp1->name);
865#endif
866        if(strncasecmp(tmp1->name,"DataType",8)==0){
867          nc6 = xmlNewNode(ns_ows, BAD_CAST "DataType");
868          xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
869          char tmp[1024];
870          sprintf(tmp,"http://www.w3.org/TR/xmlschema-2/#%s",tmp1->value);
871          xmlNewNsProp(nc6,ns_ows,BAD_CAST "reference",BAD_CAST tmp);
872          xmlAddChild(nc3,nc6);
873          tmp1=tmp1->next;
874          datatype=1;
875          continue;
876        }
877        if(strcmp(tmp1->name,"asReference")!=0 &&
878           strncasecmp(tmp1->name,"DataType",8)!=0 &&
879           strcasecmp(tmp1->name,"extension")!=0){
880          if(datatype==0){
881            char *tmp2=zCapitalize1(tmp1->name);
882            nc6 = xmlNewNode(NULL, BAD_CAST tmp2);
883            free(tmp2);
884          }
885          else{
886            char *tmp2=zCapitalize(tmp1->name);
887            nc6 = xmlNewNode(ns_ows, BAD_CAST tmp2);
888            free(tmp2);
889          }
890          xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
891          xmlAddChild(nc5,nc6);
892        }
893        tmp1=tmp1->next;
894      }
895      xmlAddChild(nc4,nc5);
896      xmlAddChild(nc3,nc4);         
897    }
898    _tmp=e->supported;
899    while(_tmp!=NULL){
900    if(datatype==0){
901      nc4 = xmlNewNode(NULL, BAD_CAST "Supported");
902      nc5 = xmlNewNode(NULL, BAD_CAST "Format");
903      }
904      else
905      nc5 = xmlNewNode(NULL, BAD_CAST "Supported");
906      tmp1=_tmp->content;
907      while(tmp1!=NULL){
908#ifdef DEBUG
909        printf("DATATYPE SUPPORTED ? %s\n",tmp1->name);
910#endif
911        if(strcmp(tmp1->name,"asReference")!=0 && 
912           strcmp(tmp1->name,"DataType")!=0 &&
913           strcasecmp(tmp1->name,"extension")!=0){
914          if(datatype==0){
915            char *tmp2=zCapitalize1(tmp1->name);
916            nc6 = xmlNewNode(NULL, BAD_CAST tmp2);
917            free(tmp2);
918          }
919          else{
920            char *tmp2=zCapitalize(tmp1->name);
921            nc6 = xmlNewNode(ns_ows, BAD_CAST tmp2);
922            free(tmp2);
923          }
924          xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
925          xmlAddChild(nc5,nc6);
926        }
927        tmp1=tmp1->next;
928      }
929      _tmp=_tmp->next;
930      if(datatype==0){
931         xmlAddChild(nc4,nc5);
932         xmlAddChild(nc3,nc4);
933      }else
934      xmlAddChild(nc4,nc5);
935    }
936    xmlAddChild(nc2,nc3);
937
938    xmlAddChild(nc3,nc4);
939     
940   
941    xmlAddChild(nc2,nc3);
942   
943    xmlAddChild(nc1,nc2);
944   
945    e=e->next;
946  }
947  xmlAddChild(nc,nc1);
948
949  xmlAddChild(n,nc);
950
951}
952
953void printProcessResponse(maps* m,map* request, int pid,service* serv,char* service,int status,maps* inputs,maps* outputs){
954  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
955  xmlNodePtr nr,n,nc,nc1,nc2,nc3,pseudor;
956  xmlDocPtr doc;
957  xmlChar *xmlbuff;
958  int buffersize;
959  time_t time1; 
960  time(&time1);
961  /**
962   * Create the document and its temporary root.
963   */
964  doc = xmlNewDoc(BAD_CAST "1.0");
965  int wpsId=zooXmlAddNs(NULL,"http://www.opengis.net/wps/1.0.0","wps");
966  ns=usedNs[wpsId];
967 
968  n = xmlNewNode(ns, BAD_CAST "ExecuteResponse");
969  int owsId=zooXmlAddNs(n,"http://www.opengis.net/ows/1.1","ows");
970  ns_ows=usedNs[owsId];
971  int xlinkId=zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
972  ns_xlink=usedNs[xlinkId];
973  int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
974  ns_xsi=usedNs[xsiId];
975  xmlNewNs(n,BAD_CAST "http://www.opengis.net/wps/1.0.0",BAD_CAST "wps");
976
977  xmlNewNsProp(n,ns_xsi,BAD_CAST "schemaLocation",BAD_CAST "http://www.opengis.net/wps/1.0.0 http://schemas.opengis.net/wps/1.0.0/wpsExecute_response.xsd");
978 
979  xmlNewProp(n,BAD_CAST "service",BAD_CAST "WPS");
980  xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.0.0");
981  addLangAttr(n,m);
982
983  char tmp[256];
984  char url[1024];
985  memset(tmp,0,256);
986  memset(url,0,256);
987  maps* tmp_maps=getMaps(m,"main");
988  if(tmp_maps!=NULL){
989    map* tmpm1=getMap(tmp_maps->content,"serverAddress");
990    /**
991     * Check if the ZOO Service GetStatus is available in the local directory.
992     * If yes, then it uses a reference to an URL which the client can access
993     * to get information on the status of a running Service (using the
994     * percentCompleted attribute).
995     * Else fallback to the initial method using the xml file to write in ...
996     */
997    char ntmp[1024];
998#ifndef WIN32
999    getcwd(ntmp,1024);
1000#else
1001    _getcwd(ntmp,1024);
1002#endif
1003    struct stat myFileInfo;
1004    int statRes;
1005    char file_path[1024];
1006    sprintf(file_path,"%s/GetStatus.zcfg",ntmp);
1007    statRes=stat(file_path,&myFileInfo);
1008    if(statRes==0){
1009      char currentSid[128];
1010      map* tmpm=getMap(tmp_maps->content,"rewriteUrl");
1011      map *tmp_lenv=NULL;
1012      tmp_lenv=getMapFromMaps(m,"lenv","sid");
1013      if(tmp_lenv==NULL)
1014        sprintf(currentSid,"%i",pid);
1015      else
1016        sprintf(currentSid,"%s",tmp_lenv->value);
1017      if(tmpm==NULL || strcasecmp(tmpm->value,"false")==0){
1018        sprintf(url,"%s/?request=Execute&service=WPS&version=1.0.0&Identifier=GetStatus&DataInputs=sid=%s&RawDataOutput=Result",tmpm1->value,currentSid);
1019      }else{
1020        if(strlen(tmpm->value)>0)
1021          if(strcasecmp(tmpm->value,"true")!=0)
1022            sprintf(url,"%s/%s/GetStatus/%s",tmpm1->value,tmpm->value,currentSid);
1023          else
1024            sprintf(url,"%s/GetStatus/%s",tmpm1->value,currentSid);
1025        else
1026          sprintf(url,"%s/?request=Execute&service=WPS&version=1.0.0&Identifier=GetStatus&DataInputs=sid=%s&RawDataOutput=Result",tmpm1->value,currentSid);
1027      }
1028    }else{
1029      map* tmpm2=getMap(tmp_maps->content,"tmpUrl");
1030      if(tmpm1!=NULL && tmpm2!=NULL){
1031        sprintf(url,"%s/%s/%s_%i.xml",tmpm1->value,tmpm2->value,service,pid);
1032      }
1033    }
1034    if(tmpm1!=NULL)
1035      sprintf(tmp,"%s/",tmpm1->value);
1036  }
1037
1038  xmlNewProp(n,BAD_CAST "serviceInstance",BAD_CAST tmp);
1039  if(status!=SERVICE_SUCCEEDED && status!=SERVICE_FAILED){
1040    xmlNewProp(n,BAD_CAST "statusLocation",BAD_CAST url);
1041  }
1042
1043  nc = xmlNewNode(ns, BAD_CAST "Process");
1044  map* tmp2=getMap(serv->content,"processVersion");
1045
1046  if(tmp2!=NULL)
1047    xmlNewNsProp(nc,ns,BAD_CAST "processVersion",BAD_CAST tmp2->value);
1048 
1049  printDescription(nc,ns_ows,serv->name,serv->content);
1050  fflush(stderr);
1051
1052  xmlAddChild(n,nc);
1053
1054  nc = xmlNewNode(ns, BAD_CAST "Status");
1055  const struct tm *tm;
1056  size_t len;
1057  time_t now;
1058  char *tmp1;
1059  map *tmpStatus;
1060 
1061  now = time ( NULL );
1062  tm = localtime ( &now );
1063
1064  tmp1 = (char*)malloc((TIME_SIZE+1)*sizeof(char));
1065
1066  len = strftime ( tmp1, TIME_SIZE, "%Y-%m-%dT%I:%M:%SZ", tm );
1067
1068  xmlNewProp(nc,BAD_CAST "creationTime",BAD_CAST tmp1);
1069
1070  char sMsg[2048];
1071  switch(status){
1072  case SERVICE_SUCCEEDED:
1073    nc1 = xmlNewNode(ns, BAD_CAST "ProcessSucceeded");
1074    sprintf(sMsg,_("Service \"%s\" run successfully."),serv->name);
1075    nc3=xmlNewText(BAD_CAST sMsg);
1076    xmlAddChild(nc1,nc3);
1077    break;
1078  case SERVICE_STARTED:
1079    nc1 = xmlNewNode(ns, BAD_CAST "ProcessStarted");
1080    tmpStatus=getMapFromMaps(m,"lenv","status");
1081    xmlNewProp(nc1,BAD_CAST "percentCompleted",BAD_CAST tmpStatus->value);
1082    sprintf(sMsg,_("ZOO Service \"%s\" is currently running. Please, reload this document to get the up-to-date status of the Service."),serv->name);
1083    nc3=xmlNewText(BAD_CAST sMsg);
1084    xmlAddChild(nc1,nc3);
1085    break;
1086  case SERVICE_ACCEPTED:
1087    nc1 = xmlNewNode(ns, BAD_CAST "ProcessAccepted");
1088    sprintf(sMsg,_("Service \"%s\" was accepted by the ZOO Kernel and it run as a background task. Please consult the statusLocation attribtue providen in this document to get the up-to-date document."),serv->name);
1089    nc3=xmlNewText(BAD_CAST sMsg);
1090    xmlAddChild(nc1,nc3);
1091    break;
1092  case SERVICE_FAILED:
1093    nc1 = xmlNewNode(ns, BAD_CAST "ProcessFailed");
1094    map *errorMap;
1095    map *te;
1096    te=getMapFromMaps(m,"lenv","code");
1097    if(te!=NULL)
1098      errorMap=createMap("code",te->value);
1099    else
1100      errorMap=createMap("code","NoApplicableCode");
1101    te=getMapFromMaps(m,"lenv","message");
1102    if(te!=NULL)
1103      addToMap(errorMap,"text",_ss(te->value));
1104    else
1105      addToMap(errorMap,"text",_("No more information available"));
1106    nc3=createExceptionReportNode(m,errorMap,0);
1107    xmlAddChild(nc1,nc3);
1108    break;
1109  default :
1110    printf(_("error code not know : %i\n"),status);
1111    //exit(1);
1112    break;
1113  }
1114  xmlAddChild(nc,nc1);
1115  xmlAddChild(n,nc);
1116  free(tmp1);
1117
1118#ifdef DEBUG
1119  fprintf(stderr,"printProcessResponse 1 161\n");
1120#endif
1121
1122  map* lineage=getMap(request,"lineage");
1123  if(lineage!=NULL){
1124    nc = xmlNewNode(ns, BAD_CAST "DataInputs");
1125    int i;
1126    maps* mcursor=inputs;
1127    elements* scursor=serv->inputs;
1128    while(mcursor!=NULL /*&& scursor!=NULL*/){
1129      printIOType(doc,nc,ns,ns_ows,scursor,mcursor,"Input");
1130      mcursor=mcursor->next;
1131      //scursor=scursor->next;
1132    }
1133    xmlAddChild(n,nc);
1134   
1135#ifdef DEBUG
1136    fprintf(stderr,"printProcessResponse 1 177\n");
1137#endif
1138
1139    nc = xmlNewNode(ns, BAD_CAST "OutputDefinitions");
1140    mcursor=outputs;
1141    scursor=serv->outputs;
1142    while(mcursor!=NULL /*&& scursor!=NULL*/){
1143      printOutputDefinitions1(doc,nc,ns,ns_ows,scursor,mcursor,"Output");
1144      mcursor=mcursor->next;
1145      //scursor=scursor->next;
1146    }
1147    xmlAddChild(n,nc);
1148  }
1149#ifdef DEBUG
1150  fprintf(stderr,"printProcessResponse 1 190\n");
1151#endif
1152
1153  /**
1154   * Display the process output only when requested !
1155   */
1156  if(status==SERVICE_SUCCEEDED){
1157    nc = xmlNewNode(ns, BAD_CAST "ProcessOutputs");
1158    maps* mcursor=outputs;
1159    elements* scursor=serv->outputs;
1160    while(mcursor!=NULL && scursor!=NULL){
1161      printIOType(doc,nc,ns,ns_ows,scursor,mcursor,"Output");
1162      mcursor=mcursor->next;
1163      scursor=scursor->next;
1164    }
1165    xmlAddChild(n,nc);
1166  }
1167#ifdef DEBUG
1168  fprintf(stderr,"printProcessResponse 1 202\n");
1169#endif
1170  xmlDocSetRootElement(doc, n);
1171  printDocument(m,doc,pid);
1172
1173  xmlCleanupParser();
1174  zooXmlCleanupNs();
1175}
1176
1177
1178void printDocument(maps* m, xmlDocPtr doc,int pid){
1179  rewind(stdout);
1180  char *encoding=getEncoding(m);
1181  if(pid==getpid()){
1182    printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
1183  }
1184  fflush(stdout);
1185  xmlChar *xmlbuff;
1186  int buffersize;
1187  /*
1188   * Dump the document to a buffer and print it on stdout
1189   * for demonstration purposes.
1190   */
1191  xmlDocDumpFormatMemoryEnc(doc, &xmlbuff, &buffersize, encoding, 1);
1192  printf((char *) xmlbuff);
1193  //fflush(stdout);
1194  /*
1195   * Free associated memory.
1196   */
1197  xmlFree(xmlbuff);
1198  xmlFreeDoc(doc);
1199  xmlCleanupParser();
1200  zooXmlCleanupNs();
1201}
1202
1203void printOutputDefinitions1(xmlDocPtr doc,xmlNodePtr nc,xmlNsPtr ns_wps,xmlNsPtr ns_ows,elements* e,maps* m,char* type){
1204  xmlNodePtr nc1;
1205  nc1=xmlNewNode(ns_wps, BAD_CAST type);
1206  map *tmp=NULL; 
1207  if(e!=NULL && e->defaults!=NULL)
1208    tmp=e->defaults->content;
1209  else{
1210    /*
1211    dumpElements(e);
1212    */
1213    return;
1214  }
1215  while(tmp!=NULL){
1216    if(strncasecmp(tmp->name,"MIMETYPE",strlen(tmp->name))==0
1217       || strncasecmp(tmp->name,"ENCODING",strlen(tmp->name))==0
1218       || strncasecmp(tmp->name,"SCHEMA",strlen(tmp->name))==0
1219       || strncasecmp(tmp->name,"UOM",strlen(tmp->name))==0)
1220    xmlNewProp(nc1,BAD_CAST tmp->name,BAD_CAST tmp->value);
1221    tmp=tmp->next;
1222  }
1223  tmp=getMap(e->defaults->content,"asReference");
1224  if(tmp==NULL)
1225    xmlNewProp(nc1,BAD_CAST "asReference",BAD_CAST "false");
1226
1227  tmp=e->content;
1228
1229  printDescription(nc1,ns_ows,m->name,e->content);
1230
1231  xmlAddChild(nc,nc1);
1232
1233}
1234
1235void printOutputDefinitions(xmlDocPtr doc,xmlNodePtr nc,xmlNsPtr ns_wps,xmlNsPtr ns_ows,elements* e,map* m,char* type){
1236  xmlNodePtr nc1,nc2,nc3;
1237  nc1=xmlNewNode(ns_wps, BAD_CAST type);
1238  map *tmp=NULL; 
1239  if(e!=NULL && e->defaults!=NULL)
1240    tmp=e->defaults->content;
1241  else{
1242    /*
1243    dumpElements(e);
1244    */
1245    return;
1246  }
1247  while(tmp!=NULL){
1248    xmlNewProp(nc1,BAD_CAST tmp->name,BAD_CAST tmp->value);
1249    tmp=tmp->next;
1250  }
1251  tmp=getMap(e->defaults->content,"asReference");
1252  if(tmp==NULL)
1253    xmlNewProp(nc1,BAD_CAST "asReference",BAD_CAST "false");
1254
1255  tmp=e->content;
1256
1257  printDescription(nc1,ns_ows,m->name,e->content);
1258
1259  xmlAddChild(nc,nc1);
1260
1261}
1262
1263void printIOType(xmlDocPtr doc,xmlNodePtr nc,xmlNsPtr ns_wps,xmlNsPtr ns_ows,elements* e,maps* m,char* type){
1264  xmlNodePtr nc1,nc2,nc3;
1265  nc1=xmlNewNode(ns_wps, BAD_CAST type);
1266  map *tmp=e->content;
1267#ifdef DEBUG
1268  dumpMap(tmp);
1269  dumpElements(e);
1270#endif
1271  nc2=xmlNewNode(ns_ows, BAD_CAST "Identifier");
1272  nc3=xmlNewText(BAD_CAST e->name);
1273  xmlAddChild(nc2,nc3);
1274  xmlAddChild(nc1,nc2);
1275  xmlAddChild(nc,nc1);
1276  // Extract Title required to be first element in the ZCFG file !
1277  nc2=xmlNewNode(ns_ows, BAD_CAST tmp->name);
1278  nc3=xmlNewText(BAD_CAST _ss(tmp->value));
1279  xmlAddChild(nc2,nc3); 
1280  xmlAddChild(nc1,nc2);
1281  // Extract Abstract required to be second element in the ZCFG file !
1282  // For GRASS it can be empty ...
1283  if(tmp->next!=NULL){
1284    tmp=tmp->next;
1285    nc2=xmlNewNode(ns_ows, BAD_CAST tmp->name);
1286    nc3=xmlNewText(BAD_CAST _ss(tmp->value));
1287    xmlAddChild(nc2,nc3); 
1288    xmlAddChild(nc1,nc2);
1289    xmlAddChild(nc,nc1);
1290    tmp=tmp->next;
1291  }
1292
1293  /**
1294   * IO type Reference or full Data ?
1295   */
1296#ifdef DEBUG
1297  fprintf(stderr,"FORMAT %s %s\n",e->format,e->format);
1298#endif
1299  map *tmpMap=getMap(m->content,"Reference");
1300  if(tmpMap==NULL){
1301    nc2=xmlNewNode(ns_wps, BAD_CAST "Data");
1302    if(strncasecmp(e->format,"LITERALOUTPUT",strlen(e->format))==0)
1303      nc3=xmlNewNode(ns_wps, BAD_CAST "LiteralData");
1304    else
1305      if(strncasecmp(e->format,"COMPLEXOUTPUT",strlen(e->format))==0)
1306        nc3=xmlNewNode(ns_wps, BAD_CAST "ComplexData");
1307      else
1308        nc3=xmlNewNode(ns_wps, BAD_CAST e->format);
1309    tmp=m->content;
1310    while(tmp!=NULL){
1311      if(strncasecmp(tmp->name,"value",strlen(tmp->name))!=0 &&
1312         strncasecmp(tmp->name,"extension",strlen(tmp->name))!=0 &&
1313         strncasecmp(tmp->name,"asReference",strlen(tmp->name))!=0 &&
1314         strncasecmp(tmp->name,"status",strlen(tmp->name))!=0 &&
1315         strncasecmp(tmp->name,"storeExecuteResponse",strlen(tmp->name))!=0 &&
1316         strncasecmp(tmp->name,"extension",strlen(tmp->name))!=0)
1317        xmlNewProp(nc3,BAD_CAST tmp->name,BAD_CAST tmp->value);
1318      tmp=tmp->next;
1319      xmlAddChild(nc2,nc3);
1320    }
1321    tmp=getMap(e->defaults->content,"mimeType");
1322    map* tmp1=getMap(m->content,"encoding");
1323    map* tmp2=getMap(m->content,"mimeType");
1324    map* toto=getMap(m->content,"value");
1325    if((tmp1!=NULL && strncmp(tmp1->value,"base64",6)==0)
1326       || (tmp2!=NULL && (strncmp(tmp2->value,"image/",6)==0
1327                          || strncmp(tmp2->value,"application/",6)==0)) ){
1328      map* rs=getMap(m->content,"size");
1329      if(rs==NULL){
1330        char tmp1[1024];
1331        sprintf(tmp1,"%d",strlen(toto->value));
1332        rs=createMap("z",tmp1);
1333      }
1334      xmlAddChild(nc3,xmlNewText(BAD_CAST base64((const unsigned char*)toto->value,atoi(rs->value))));
1335    }
1336    else if(tmp!=NULL){
1337      if(strncmp(tmp->value,"text/js",4)==0 ||
1338         strncmp(tmp->value,"application/js",14)==0)
1339        xmlAddChild(nc3,xmlNewCDataBlock(doc,BAD_CAST toto->value,strlen(toto->value)));
1340      else
1341        xmlAddChild(nc3,xmlNewText(BAD_CAST toto->value));
1342      xmlAddChild(nc2,nc3);
1343    }
1344    else
1345      xmlAddChild(nc3,xmlNewText(BAD_CAST toto->value));
1346  }
1347  else{
1348    nc3=nc2=xmlNewNode(ns_wps, BAD_CAST "Reference");
1349    xmlNewProp(nc3,BAD_CAST "href",BAD_CAST tmpMap->value);
1350    tmp=m->content;
1351    while(tmp!=NULL){
1352      if(strncasecmp(tmp->name,"value",strlen(tmp->name))!=0 &&
1353         strncasecmp(tmp->name,"reference",strlen(tmp->name))!=0 &&
1354         strncasecmp(tmp->name,"extension",strlen(tmp->name))!=0 &&
1355         strncasecmp(tmp->name,"abstract",strlen(tmp->name))!=0 &&
1356         strncasecmp(tmp->name,"status",strlen(tmp->name))!=0 &&
1357         strncasecmp(tmp->name,"storeExecuteResponse",strlen(tmp->name))!=0 &&
1358         strncasecmp(tmp->name,"asReference",strlen(tmp->name))!=0)
1359        xmlNewProp(nc3,BAD_CAST tmp->name,BAD_CAST tmp->value);
1360      tmp=tmp->next;
1361      xmlAddChild(nc2,nc3);
1362    }
1363  }
1364
1365  xmlAddChild(nc1,nc2);
1366  xmlAddChild(nc,nc1);
1367
1368}
1369
1370void printDescription(xmlNodePtr root,xmlNsPtr ns_ows,char* identifier,map* amap){
1371  xmlNodePtr nc2 = xmlNewNode(ns_ows, BAD_CAST "Identifier");
1372  xmlAddChild(nc2,xmlNewText(BAD_CAST identifier));
1373  xmlAddChild(root,nc2);
1374  map* tmp=amap;
1375  char *tmp2[2];
1376  tmp2[0]="Title";
1377  tmp2[1]="Abstract";
1378  int j=0;
1379  for(j=0;j<2;j++){
1380    map* tmp1=getMap(tmp,tmp2[j]);
1381    if(tmp1!=NULL){
1382      nc2 = xmlNewNode(ns_ows, BAD_CAST tmp2[j]);
1383      xmlAddChild(nc2,xmlNewText(BAD_CAST _ss(tmp1->value)));
1384      xmlAddChild(root,nc2);
1385    }
1386  }
1387}
1388
1389char* getEncoding(maps* m){
1390  if(m!=NULL){
1391    map* tmp=getMap(m->content,"encoding");
1392    if(tmp!=NULL){
1393      return tmp->value;
1394    }
1395    else
1396      return "UTF-8";
1397  }
1398  else
1399    return "UTF-8"; 
1400}
1401
1402char* getVersion(maps* m){
1403  if(m!=NULL){
1404    map* tmp=getMap(m->content,"version");
1405    if(tmp!=NULL){
1406      return tmp->value;
1407    }
1408    else
1409      return "1.0.0";
1410  }
1411  else
1412    return "1.0.0";
1413}
1414
1415void printExceptionReportResponse(maps* m,map* s){
1416  int buffersize;
1417  xmlDocPtr doc;
1418  xmlChar *xmlbuff;
1419  xmlNodePtr n;
1420
1421  doc = xmlNewDoc(BAD_CAST "1.0");
1422  maps* tmpMap=getMaps(m,"main");
1423  char *encoding=getEncoding(tmpMap);
1424  if(m!=NULL){
1425    map *tmpSid=getMapFromMaps(m,"lenv","sid");
1426    if(tmpSid!=NULL){
1427      if( getpid()==atoi(tmpSid->value) )
1428        printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
1429    }
1430    else
1431      printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
1432  }else
1433    printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
1434  n=createExceptionReportNode(m,s,1);
1435  xmlDocSetRootElement(doc, n);
1436  xmlDocDumpFormatMemoryEnc(doc, &xmlbuff, &buffersize, encoding, 1);
1437  printf("%s",xmlbuff);
1438  fflush(stdout);
1439  xmlFreeDoc(doc);
1440  xmlFree(xmlbuff);
1441  xmlCleanupParser();
1442  zooXmlCleanupNs();
1443}
1444
1445xmlNodePtr createExceptionReportNode(maps* m,map* s,int use_ns){
1446 
1447  int buffersize;
1448  xmlChar *xmlbuff;
1449  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
1450  xmlNodePtr n,nc,nc1,nc2;
1451
1452  maps* tmpMap=getMaps(m,"main");
1453
1454  int nsid=zooXmlAddNs(NULL,BAD_CAST "http://www.opengis.net/ows/1.1",BAD_CAST "ows");
1455  ns=usedNs[nsid];
1456  n = xmlNewNode(ns, BAD_CAST "ExceptionReport");
1457
1458  if(use_ns==1){
1459    ns_ows=xmlNewNs(n,BAD_CAST "http://www.opengis.net/ows/1.1",BAD_CAST "ows");
1460    int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
1461    ns_xsi=usedNs[xsiId];
1462    int xlinkId=zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
1463    ns_xlink=usedNs[xlinkId];
1464    xmlNewNsProp(n,ns_xsi,BAD_CAST "schemaLocation",BAD_CAST "http://www.opengis.net/ows/1.1 http://schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd");
1465  }
1466  addLangAttr(n,m);
1467  xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.1.0");
1468 
1469  nc = xmlNewNode(ns, BAD_CAST "Exception");
1470
1471  map* tmp=getMap(s,"code");
1472  if(tmp!=NULL)
1473    xmlNewProp(nc,BAD_CAST "exceptionCode",BAD_CAST tmp->value);
1474  else
1475    xmlNewProp(nc,BAD_CAST "exceptionCode",BAD_CAST "NoApplicableCode");
1476
1477  tmp=getMap(s,"text");
1478  nc1 = xmlNewNode(ns, BAD_CAST "ExceptionText");
1479  nc2=NULL;
1480  if(tmp!=NULL){
1481    xmlNodeSetContent(nc1, BAD_CAST tmp->value);
1482  }
1483  else{
1484    xmlNodeSetContent(nc1, BAD_CAST _("No debug message available"));
1485  }
1486  xmlAddChild(nc,nc1);
1487  xmlAddChild(n,nc);
1488  return n;
1489}
1490
1491
1492void outputResponse(service* s,maps* request_inputs,maps* request_outputs,
1493                    map* request_inputs1,int cpid,maps* m,int res){
1494#ifdef DEBUG
1495  dumpMaps(request_inputs);
1496  dumpMaps(request_outputs);
1497  fprintf(stderr,"printProcessResponse\n");
1498#endif
1499  map* toto=getMap(request_inputs1,"RawDataOutput");
1500  int asRaw=0;
1501  if(toto!=NULL)
1502    asRaw=1;
1503 
1504  if(asRaw==0){
1505#ifdef DEBUG
1506    fprintf(stderr,"REQUEST_OUTPUTS FINAL\n");
1507    dumpMaps(request_outputs);
1508#endif
1509    toto=getMap(request_outputs->content,"asReference");
1510    if(toto!=NULL && strcasecmp(toto->value,"true")==0){
1511      toto=getMap(request_outputs->content,"extension");
1512      map *tmp1=getMapFromMaps(m,"main","tmpPath");
1513      char *file_name;
1514      bool hasExt=true;
1515      if(toto==NULL){
1516        // We can fallback to a default list of supported formats using
1517        // mimeType information if present here. Maybe we can add more formats
1518        // here.
1519        // If mimeType was not found, we then set txt as the default extension.
1520        map* mtype=getMap(request_outputs->content,"mimeType");
1521        if(mtype!=NULL){
1522          if(strcasecmp(mtype->value,"text/xml")==0)
1523            toto=createMap("extension","xml");
1524          else
1525            toto=createMap("extension","txt");
1526        }
1527        if(toto==NULL)
1528          toto=createMap("extension","txt");
1529        hasExt=false;
1530      }
1531      file_name=(char*)malloc((strlen(tmp1->value)+strlen(s->name)+strlen(toto->value)+13)*sizeof(char));
1532      sprintf(file_name,"%s/%s_%i.%s",tmp1->value,s->name,cpid+100000,toto->value);
1533      FILE *ofile=fopen(file_name,"w");
1534      if(ofile==NULL)
1535        fprintf(stderr,"Unable to create file on disk implying segfault ! \n");
1536      map *tmp2=getMapFromMaps(m,"main","tmpUrl");
1537      map *tmp3=getMapFromMaps(m,"main","serverAddress");
1538      char *file_url;
1539      file_url=(char*)malloc((strlen(tmp3->value)+strlen(tmp2->value)+strlen(s->name)+strlen(toto->value)+13)*sizeof(char));
1540      sprintf(file_url,"%s/%s/%s_%i.%s",tmp3->value,tmp2->value,s->name,cpid+100000,toto->value);
1541      addToMap(request_outputs->content,"Reference",file_url);
1542      if(hasExt!=true){
1543        freeMap(&toto);
1544        free(toto);
1545      }
1546      toto=getMap(request_outputs->content,"value");
1547      if(toto!=NULL && toto->value!=NULL)
1548        fwrite(toto->value,1,(strlen(toto->value)+1)*sizeof(char),ofile);
1549      fclose(ofile);
1550      free(file_name);
1551      free(file_url);
1552    }
1553    map *r_inputs=getMap(s->content,"serviceProvider");
1554#ifdef DEBUG
1555    fprintf(stderr,"SERVICE : %s\n",r_inputs->value);
1556    dumpMaps(m);
1557#endif
1558    printProcessResponse(m,request_inputs1,cpid,
1559                         s,r_inputs->value,res,
1560                         request_inputs,
1561                         request_outputs);
1562  }
1563  else
1564    if(res!=SERVICE_FAILED){
1565      /**
1566       * We get the first output only !!
1567       */
1568      toto=getMap(request_outputs->content,"value");
1569      if(toto==NULL){
1570        map * errormap = createMap("text",_("Unable to fetch any result"));
1571        addToMap(errormap,"code", "InternalError");
1572        printExceptionReportResponse(m,errormap);
1573        freeMap(&errormap);
1574        free(errormap);
1575      }
1576      char mime[1024];
1577      map* mi=getMap(request_outputs->content,"mimeType");
1578#ifdef DEBUG
1579      fprintf(stderr,"SERVICE OUTPUTS\n");
1580      dumpMaps(request_outputs);
1581      fprintf(stderr,"SERVICE OUTPUTS\n");
1582#endif
1583      map* en=getMap(request_outputs->content,"encoding");
1584      if(mi!=NULL && en!=NULL)
1585        sprintf(mime,
1586                "Content-Type: %s; charset=%s\r\nStatus: 200 OK\r\n\r\n",
1587                mi->value,en->value);
1588      else
1589        if(mi!=NULL)
1590          sprintf(mime,
1591                  "Content-Type: %s; charset=UTF-8\r\nStatus: 200 OK\r\n\r\n",
1592                  mi->value);
1593        else
1594          sprintf(mime,"Content-Type: text/plain; charset=utf-8\r\nStatus: 200 OK\r\n\r\n");
1595      printf("%s",mime);
1596      if(mi!=NULL && strncmp(mi->value,"image",5)==0){
1597        map* rs=getMapFromMaps(request_outputs,request_outputs->name,"size");
1598        fwrite(toto->value,atoi(rs->value),1,stdout);
1599      }
1600      else
1601        printf("%s",toto->value);
1602#ifdef DEBUG
1603      dumpMap(toto);
1604#endif
1605    }else{
1606      char tmp[1024];
1607      map * errormap;
1608      map *lenv;
1609      lenv=getMapFromMaps(m,"lenv","message");
1610      if(lenv!=NULL)
1611        sprintf(tmp,_("Unable to run the Service. The message returned back by the Service was the following : %s"),lenv->value);
1612      else
1613        sprintf(tmp,_("Unable to run the Service. No more information was returned back by the Service."));
1614      errormap = createMap("text",tmp);     
1615      addToMap(errormap,"code", "InternalError");
1616      printExceptionReportResponse(m,errormap);
1617      freeMap(&errormap);
1618      free(errormap);
1619    }
1620}
1621
1622char *base64(const unsigned char *input, int length)
1623{
1624  BIO *bmem, *b64;
1625  BUF_MEM *bptr;
1626
1627  b64 = BIO_new(BIO_f_base64());
1628  bmem = BIO_new(BIO_s_mem());
1629  b64 = BIO_push(b64, bmem);
1630  BIO_write(b64, input, length);
1631  BIO_flush(b64);
1632  BIO_get_mem_ptr(b64, &bptr);
1633
1634  char *buff = (char *)malloc(bptr->length);
1635  memcpy(buff, bptr->data, bptr->length-1);
1636  buff[bptr->length-1] = 0;
1637
1638  BIO_free_all(b64);
1639
1640  return buff;
1641}
1642
1643char* addDefaultValues(maps** out,elements* in,maps* m,char* type){
1644  elements* tmpInputs=in;
1645  maps* out1=*out;
1646  while(tmpInputs!=NULL){
1647    maps *tmpMaps=getMaps(out1,tmpInputs->name);
1648    /*fprintf(stderr,"IN LOOP\n");
1649    dumpElements(tmpInputs);
1650    dumpMaps(tmpMaps);
1651    fprintf(stderr,"/ IN LOOP\n");*/
1652    if(tmpMaps==NULL){
1653      map* tmpMap1=getMap(tmpInputs->content,"minOccurs");
1654      if(strncmp(type,"inputs",6)==0)
1655        if(tmpMap1!=NULL && atoi(tmpMap1->value)>=1){
1656          return tmpInputs->name;
1657        }
1658      maps* tmpMaps2=(maps*)malloc(MAPS_SIZE);
1659      tmpMaps2->name=strdup(tmpInputs->name);
1660      tmpMaps2->content=NULL;
1661      tmpMaps2->next=NULL;
1662      iotype* tmpIoType=tmpInputs->defaults;
1663      while(tmpIoType!=NULL){
1664        addMapToMap(&tmpMaps2->content,tmpIoType->content);
1665        tmpIoType=tmpIoType->next;
1666      }
1667      if(strncmp(type,"outputs",7)==0){
1668        map *tmpMap=getMap(tmpMaps2->content,"value");
1669        if(tmpMap==NULL)
1670          addToMap(tmpMaps2->content,"value","NULL");
1671      }
1672      if(out1==NULL){
1673        *out=dupMaps(&tmpMaps2);
1674      }
1675      else
1676        addMapsToMaps(&out1,tmpMaps2);
1677      freeMaps(&tmpMaps2);
1678      free(tmpMaps2);
1679      tmpMaps2=NULL;
1680    }
1681    else{
1682      iotype* tmpIoType=getIoTypeFromElement(tmpInputs,tmpInputs->name,
1683                                             tmpMaps->content);
1684      if(tmpIoType!=NULL){
1685        map* tmpContent=tmpIoType->content;
1686        map* cval=NULL;
1687
1688        while(tmpContent!=NULL){
1689          if((cval=getMap(tmpMaps->content,tmpContent->name))==NULL){
1690#ifdef DEBUG
1691            fprintf(stderr,"addDefaultValues %s => %s\n",tmpContent->name,tmpContent->value);
1692#endif
1693              if(tmpMaps->content==NULL)
1694                tmpMaps->content=createMap(tmpContent->name,tmpContent->value);
1695              else
1696                addToMap(tmpMaps->content,tmpContent->name,tmpContent->value);
1697          }
1698          tmpContent=tmpContent->next;
1699        }
1700      }
1701    }
1702    tmpInputs=tmpInputs->next;
1703  }
1704  return "";
1705}
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