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

Last change on this file since 63 was 63, checked in by djay, 13 years ago

Remove memory leaks. Add support for minOccurs and maxOccurs informations in the inputs maps to close ticket #12.

File size: 48.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(strcasecmp(tmp2->name,tmpPhone[j])==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(strcasecmp(tmp2->name,tmpAddress[j])==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    freeMap(&errorMap);
1108    free(errorMap);
1109    xmlAddChild(nc1,nc3);
1110    break;
1111  default :
1112    printf(_("error code not know : %i\n"),status);
1113    //exit(1);
1114    break;
1115  }
1116  xmlAddChild(nc,nc1);
1117  xmlAddChild(n,nc);
1118  free(tmp1);
1119
1120#ifdef DEBUG
1121  fprintf(stderr,"printProcessResponse 1 161\n");
1122#endif
1123
1124  map* lineage=getMap(request,"lineage");
1125  if(lineage!=NULL){
1126    nc = xmlNewNode(ns, BAD_CAST "DataInputs");
1127    int i;
1128    maps* mcursor=inputs;
1129    elements* scursor=serv->inputs;
1130    while(mcursor!=NULL /*&& scursor!=NULL*/){
1131      printIOType(doc,nc,ns,ns_ows,scursor,mcursor,"Input");
1132      mcursor=mcursor->next;
1133      //scursor=scursor->next;
1134    }
1135    xmlAddChild(n,nc);
1136   
1137#ifdef DEBUG
1138    fprintf(stderr,"printProcessResponse 1 177\n");
1139#endif
1140
1141    nc = xmlNewNode(ns, BAD_CAST "OutputDefinitions");
1142    mcursor=outputs;
1143    scursor=serv->outputs;
1144    while(mcursor!=NULL /*&& scursor!=NULL*/){
1145      printOutputDefinitions1(doc,nc,ns,ns_ows,scursor,mcursor,"Output");
1146      mcursor=mcursor->next;
1147      //scursor=scursor->next;
1148    }
1149    xmlAddChild(n,nc);
1150  }
1151#ifdef DEBUG
1152  fprintf(stderr,"printProcessResponse 1 190\n");
1153#endif
1154
1155  /**
1156   * Display the process output only when requested !
1157   */
1158  if(status==SERVICE_SUCCEEDED){
1159    nc = xmlNewNode(ns, BAD_CAST "ProcessOutputs");
1160    maps* mcursor=outputs;
1161    elements* scursor=serv->outputs;
1162    while(mcursor!=NULL){
1163      printIOType(doc,nc,ns,ns_ows,scursor,mcursor,"Output");
1164      mcursor=mcursor->next;
1165    }
1166    xmlAddChild(n,nc);
1167  }
1168#ifdef DEBUG
1169  fprintf(stderr,"printProcessResponse 1 202\n");
1170#endif
1171  xmlDocSetRootElement(doc, n);
1172  printDocument(m,doc,pid);
1173
1174  xmlCleanupParser();
1175  zooXmlCleanupNs();
1176}
1177
1178
1179void printDocument(maps* m, xmlDocPtr doc,int pid){
1180  rewind(stdout);
1181  char *encoding=getEncoding(m);
1182  if(pid==getpid()){
1183    printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
1184  }
1185  fflush(stdout);
1186  xmlChar *xmlbuff;
1187  int buffersize;
1188  /*
1189   * Dump the document to a buffer and print it on stdout
1190   * for demonstration purposes.
1191   */
1192  xmlDocDumpFormatMemoryEnc(doc, &xmlbuff, &buffersize, encoding, 1);
1193  printf((char *) xmlbuff);
1194  //fflush(stdout);
1195  /*
1196   * Free associated memory.
1197   */
1198  xmlFree(xmlbuff);
1199  xmlFreeDoc(doc);
1200  xmlCleanupParser();
1201  zooXmlCleanupNs();
1202}
1203
1204void printOutputDefinitions1(xmlDocPtr doc,xmlNodePtr nc,xmlNsPtr ns_wps,xmlNsPtr ns_ows,elements* e,maps* m,char* type){
1205  xmlNodePtr nc1;
1206  nc1=xmlNewNode(ns_wps, BAD_CAST type);
1207  map *tmp=NULL; 
1208  if(e!=NULL && e->defaults!=NULL)
1209    tmp=e->defaults->content;
1210  else{
1211    /*
1212    dumpElements(e);
1213    */
1214    return;
1215  }
1216  while(tmp!=NULL){
1217    if(strncasecmp(tmp->name,"MIMETYPE",strlen(tmp->name))==0
1218       || strncasecmp(tmp->name,"ENCODING",strlen(tmp->name))==0
1219       || strncasecmp(tmp->name,"SCHEMA",strlen(tmp->name))==0
1220       || strncasecmp(tmp->name,"UOM",strlen(tmp->name))==0)
1221    xmlNewProp(nc1,BAD_CAST tmp->name,BAD_CAST tmp->value);
1222    tmp=tmp->next;
1223  }
1224  tmp=getMap(e->defaults->content,"asReference");
1225  if(tmp==NULL)
1226    xmlNewProp(nc1,BAD_CAST "asReference",BAD_CAST "false");
1227
1228  tmp=e->content;
1229
1230  printDescription(nc1,ns_ows,m->name,e->content);
1231
1232  xmlAddChild(nc,nc1);
1233
1234}
1235
1236void printOutputDefinitions(xmlDocPtr doc,xmlNodePtr nc,xmlNsPtr ns_wps,xmlNsPtr ns_ows,elements* e,map* m,char* type){
1237  xmlNodePtr nc1,nc2,nc3;
1238  nc1=xmlNewNode(ns_wps, BAD_CAST type);
1239  map *tmp=NULL; 
1240  if(e!=NULL && e->defaults!=NULL)
1241    tmp=e->defaults->content;
1242  else{
1243    /*
1244    dumpElements(e);
1245    */
1246    return;
1247  }
1248  while(tmp!=NULL){
1249    xmlNewProp(nc1,BAD_CAST tmp->name,BAD_CAST tmp->value);
1250    tmp=tmp->next;
1251  }
1252  tmp=getMap(e->defaults->content,"asReference");
1253  if(tmp==NULL)
1254    xmlNewProp(nc1,BAD_CAST "asReference",BAD_CAST "false");
1255
1256  tmp=e->content;
1257
1258  printDescription(nc1,ns_ows,m->name,e->content);
1259
1260  xmlAddChild(nc,nc1);
1261
1262}
1263
1264void printIOType(xmlDocPtr doc,xmlNodePtr nc,xmlNsPtr ns_wps,xmlNsPtr ns_ows,elements* e,maps* m,char* type){
1265  xmlNodePtr nc1,nc2,nc3;
1266  nc1=xmlNewNode(ns_wps, BAD_CAST type);
1267  map *tmp=e->content;
1268#ifdef DEBUG
1269  dumpMap(tmp);
1270  dumpElements(e);
1271#endif
1272  nc2=xmlNewNode(ns_ows, BAD_CAST "Identifier");
1273  nc3=xmlNewText(BAD_CAST e->name);
1274  xmlAddChild(nc2,nc3);
1275  xmlAddChild(nc1,nc2);
1276  xmlAddChild(nc,nc1);
1277  // Extract Title required to be first element in the ZCFG file !
1278  nc2=xmlNewNode(ns_ows, BAD_CAST tmp->name);
1279  nc3=xmlNewText(BAD_CAST _ss(tmp->value));
1280  xmlAddChild(nc2,nc3); 
1281  xmlAddChild(nc1,nc2);
1282  // Extract Abstract required to be second element in the ZCFG file !
1283  // For GRASS it can be empty ...
1284  if(tmp->next!=NULL){
1285    tmp=tmp->next;
1286    nc2=xmlNewNode(ns_ows, BAD_CAST tmp->name);
1287    nc3=xmlNewText(BAD_CAST _ss(tmp->value));
1288    xmlAddChild(nc2,nc3); 
1289    xmlAddChild(nc1,nc2);
1290    xmlAddChild(nc,nc1);
1291    tmp=tmp->next;
1292  }
1293
1294  /**
1295   * IO type Reference or full Data ?
1296   */
1297#ifdef DEBUG
1298  fprintf(stderr,"FORMAT %s %s\n",e->format,e->format);
1299#endif
1300  map *tmpMap=getMap(m->content,"Reference");
1301  if(tmpMap==NULL){
1302    nc2=xmlNewNode(ns_wps, BAD_CAST "Data");
1303    if(strncasecmp(e->format,"LITERALOUTPUT",strlen(e->format))==0)
1304      nc3=xmlNewNode(ns_wps, BAD_CAST "LiteralData");
1305    else
1306      if(strncasecmp(e->format,"COMPLEXOUTPUT",strlen(e->format))==0)
1307        nc3=xmlNewNode(ns_wps, BAD_CAST "ComplexData");
1308      else
1309        nc3=xmlNewNode(ns_wps, BAD_CAST e->format);
1310    tmp=m->content;
1311    while(tmp!=NULL){
1312      if(strncasecmp(tmp->name,"value",strlen(tmp->name))!=0 &&
1313         strncasecmp(tmp->name,"extension",strlen(tmp->name))!=0 &&
1314         strncasecmp(tmp->name,"asReference",strlen(tmp->name))!=0 &&
1315         strncasecmp(tmp->name,"status",strlen(tmp->name))!=0 &&
1316         strncasecmp(tmp->name,"storeExecuteResponse",strlen(tmp->name))!=0 &&
1317         strncasecmp(tmp->name,"extension",strlen(tmp->name))!=0)
1318        xmlNewProp(nc3,BAD_CAST tmp->name,BAD_CAST tmp->value);
1319      tmp=tmp->next;
1320      xmlAddChild(nc2,nc3);
1321    }
1322    tmp=getMap(e->defaults->content,"mimeType");
1323    map* tmp1=getMap(m->content,"encoding");
1324    map* tmp2=getMap(m->content,"mimeType");
1325    map* toto=getMap(m->content,"value");
1326    if((tmp1!=NULL && strncmp(tmp1->value,"base64",6)==0)
1327       || (tmp2!=NULL && (strncmp(tmp2->value,"image/",6)==0
1328                          || strncmp(tmp2->value,"application/",6)==0)) ){
1329      map* rs=getMap(m->content,"size");
1330      bool isSized=true;
1331      if(rs==NULL){
1332        char tmp1[1024];
1333        sprintf(tmp1,"%d",strlen(toto->value));
1334        rs=createMap("z",tmp1);
1335        isSized=false;
1336      }
1337      xmlAddChild(nc3,xmlNewText(BAD_CAST base64((const unsigned char*)toto->value,atoi(rs->value))));
1338      if(!isSized){
1339        freeMap(&rs);
1340        free(rs);
1341      }
1342    }
1343    else if(tmp!=NULL){
1344      if(strncmp(tmp->value,"text/js",4)==0 ||
1345         strncmp(tmp->value,"application/js",14)==0)
1346        xmlAddChild(nc3,xmlNewCDataBlock(doc,BAD_CAST toto->value,strlen(toto->value)));
1347      else
1348        xmlAddChild(nc3,xmlNewText(BAD_CAST toto->value));
1349      xmlAddChild(nc2,nc3);
1350    }
1351    else
1352      xmlAddChild(nc3,xmlNewText(BAD_CAST toto->value));
1353  }
1354  else{
1355    nc3=nc2=xmlNewNode(ns_wps, BAD_CAST "Reference");
1356    xmlNewProp(nc3,BAD_CAST "href",BAD_CAST tmpMap->value);
1357    tmp=m->content;
1358    while(tmp!=NULL){
1359      if(strncasecmp(tmp->name,"value",strlen(tmp->name))!=0 &&
1360         strncasecmp(tmp->name,"reference",strlen(tmp->name))!=0 &&
1361         strncasecmp(tmp->name,"extension",strlen(tmp->name))!=0 &&
1362         strncasecmp(tmp->name,"abstract",strlen(tmp->name))!=0 &&
1363         strncasecmp(tmp->name,"status",strlen(tmp->name))!=0 &&
1364         strncasecmp(tmp->name,"storeExecuteResponse",strlen(tmp->name))!=0 &&
1365         strncasecmp(tmp->name,"asReference",strlen(tmp->name))!=0)
1366        xmlNewProp(nc3,BAD_CAST tmp->name,BAD_CAST tmp->value);
1367      tmp=tmp->next;
1368      xmlAddChild(nc2,nc3);
1369    }
1370  }
1371
1372  xmlAddChild(nc1,nc2);
1373  xmlAddChild(nc,nc1);
1374
1375}
1376
1377void printDescription(xmlNodePtr root,xmlNsPtr ns_ows,char* identifier,map* amap){
1378  xmlNodePtr nc2 = xmlNewNode(ns_ows, BAD_CAST "Identifier");
1379  xmlAddChild(nc2,xmlNewText(BAD_CAST identifier));
1380  xmlAddChild(root,nc2);
1381  map* tmp=amap;
1382  char *tmp2[2];
1383  tmp2[0]="Title";
1384  tmp2[1]="Abstract";
1385  int j=0;
1386  for(j=0;j<2;j++){
1387    map* tmp1=getMap(tmp,tmp2[j]);
1388    if(tmp1!=NULL){
1389      nc2 = xmlNewNode(ns_ows, BAD_CAST tmp2[j]);
1390      xmlAddChild(nc2,xmlNewText(BAD_CAST _ss(tmp1->value)));
1391      xmlAddChild(root,nc2);
1392    }
1393  }
1394}
1395
1396char* getEncoding(maps* m){
1397  if(m!=NULL){
1398    map* tmp=getMap(m->content,"encoding");
1399    if(tmp!=NULL){
1400      return tmp->value;
1401    }
1402    else
1403      return "UTF-8";
1404  }
1405  else
1406    return "UTF-8"; 
1407}
1408
1409char* getVersion(maps* m){
1410  if(m!=NULL){
1411    map* tmp=getMap(m->content,"version");
1412    if(tmp!=NULL){
1413      return tmp->value;
1414    }
1415    else
1416      return "1.0.0";
1417  }
1418  else
1419    return "1.0.0";
1420}
1421
1422void printExceptionReportResponse(maps* m,map* s){
1423  int buffersize;
1424  xmlDocPtr doc;
1425  xmlChar *xmlbuff;
1426  xmlNodePtr n;
1427
1428  doc = xmlNewDoc(BAD_CAST "1.0");
1429  maps* tmpMap=getMaps(m,"main");
1430  char *encoding=getEncoding(tmpMap);
1431  if(m!=NULL){
1432    map *tmpSid=getMapFromMaps(m,"lenv","sid");
1433    if(tmpSid!=NULL){
1434      if( getpid()==atoi(tmpSid->value) )
1435        printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
1436    }
1437    else
1438      printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
1439  }else
1440    printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
1441  n=createExceptionReportNode(m,s,1);
1442  xmlDocSetRootElement(doc, n);
1443  xmlDocDumpFormatMemoryEnc(doc, &xmlbuff, &buffersize, encoding, 1);
1444  printf("%s",xmlbuff);
1445  fflush(stdout);
1446  xmlFreeDoc(doc);
1447  xmlFree(xmlbuff);
1448  xmlCleanupParser();
1449  zooXmlCleanupNs();
1450}
1451
1452xmlNodePtr createExceptionReportNode(maps* m,map* s,int use_ns){
1453 
1454  int buffersize;
1455  xmlChar *xmlbuff;
1456  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
1457  xmlNodePtr n,nc,nc1,nc2;
1458
1459  maps* tmpMap=getMaps(m,"main");
1460
1461  int nsid=zooXmlAddNs(NULL,BAD_CAST "http://www.opengis.net/ows/1.1",BAD_CAST "ows");
1462  ns=usedNs[nsid];
1463  n = xmlNewNode(ns, BAD_CAST "ExceptionReport");
1464
1465  if(use_ns==1){
1466    ns_ows=xmlNewNs(n,BAD_CAST "http://www.opengis.net/ows/1.1",BAD_CAST "ows");
1467    int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
1468    ns_xsi=usedNs[xsiId];
1469    int xlinkId=zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
1470    ns_xlink=usedNs[xlinkId];
1471    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");
1472  }
1473  addLangAttr(n,m);
1474  xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.1.0");
1475 
1476  nc = xmlNewNode(ns, BAD_CAST "Exception");
1477
1478  map* tmp=getMap(s,"code");
1479  if(tmp!=NULL)
1480    xmlNewProp(nc,BAD_CAST "exceptionCode",BAD_CAST tmp->value);
1481  else
1482    xmlNewProp(nc,BAD_CAST "exceptionCode",BAD_CAST "NoApplicableCode");
1483
1484  tmp=getMap(s,"text");
1485  nc1 = xmlNewNode(ns, BAD_CAST "ExceptionText");
1486  nc2=NULL;
1487  if(tmp!=NULL){
1488    xmlNodeSetContent(nc1, BAD_CAST tmp->value);
1489  }
1490  else{
1491    xmlNodeSetContent(nc1, BAD_CAST _("No debug message available"));
1492  }
1493  xmlAddChild(nc,nc1);
1494  xmlAddChild(n,nc);
1495  return n;
1496}
1497
1498
1499void outputResponse(service* s,maps* request_inputs,maps* request_outputs,
1500                    map* request_inputs1,int cpid,maps* m,int res){
1501#ifdef DEBUG
1502  dumpMaps(request_inputs);
1503  dumpMaps(request_outputs);
1504  fprintf(stderr,"printProcessResponse\n");
1505#endif
1506  map* toto=getMap(request_inputs1,"RawDataOutput");
1507  int asRaw=0;
1508  if(toto!=NULL)
1509    asRaw=1;
1510 
1511  if(asRaw==0){
1512#ifdef DEBUG
1513    fprintf(stderr,"REQUEST_OUTPUTS FINAL\n");
1514    dumpMaps(request_outputs);
1515#endif
1516    toto=getMap(request_outputs->content,"asReference");
1517    if(toto!=NULL && strcasecmp(toto->value,"true")==0){
1518      toto=getMap(request_outputs->content,"extension");
1519      map *tmp1=getMapFromMaps(m,"main","tmpPath");
1520      char *file_name;
1521      bool hasExt=true;
1522      if(toto==NULL){
1523        // We can fallback to a default list of supported formats using
1524        // mimeType information if present here. Maybe we can add more formats
1525        // here.
1526        // If mimeType was not found, we then set txt as the default extension.
1527        map* mtype=getMap(request_outputs->content,"mimeType");
1528        if(mtype!=NULL){
1529          if(strcasecmp(mtype->value,"text/xml")==0)
1530            toto=createMap("extension","xml");
1531          else
1532            toto=createMap("extension","txt");
1533        }
1534        else
1535          toto=createMap("extension","txt");
1536        hasExt=false;
1537      }
1538      file_name=(char*)malloc((strlen(tmp1->value)+strlen(s->name)+strlen(toto->value)+13)*sizeof(char));
1539      sprintf(file_name,"%s/%s_%i.%s",tmp1->value,s->name,cpid+100000,toto->value);
1540      FILE *ofile=fopen(file_name,"w");
1541      if(ofile==NULL)
1542        fprintf(stderr,"Unable to create file on disk implying segfault ! \n");
1543      map *tmp2=getMapFromMaps(m,"main","tmpUrl");
1544      map *tmp3=getMapFromMaps(m,"main","serverAddress");
1545      char *file_url;
1546      file_url=(char*)malloc((strlen(tmp3->value)+strlen(tmp2->value)+strlen(s->name)+strlen(toto->value)+13)*sizeof(char));
1547      sprintf(file_url,"%s/%s/%s_%i.%s",tmp3->value,tmp2->value,s->name,cpid+100000,toto->value);
1548      addToMap(request_outputs->content,"Reference",file_url);
1549      if(hasExt!=true){
1550        freeMap(&toto);
1551        free(toto);
1552      }
1553      toto=getMap(request_outputs->content,"value");
1554      if(toto!=NULL && toto->value!=NULL)
1555        fwrite(toto->value,1,(strlen(toto->value)+1)*sizeof(char),ofile);
1556      fclose(ofile);
1557      free(file_name);
1558      free(file_url);
1559    }
1560    map *r_inputs=getMap(s->content,"serviceProvider");
1561#ifdef DEBUG
1562    fprintf(stderr,"SERVICE : %s\n",r_inputs->value);
1563    dumpMaps(m);
1564#endif
1565    printProcessResponse(m,request_inputs1,cpid,
1566                         s,r_inputs->value,res,
1567                         request_inputs,
1568                         request_outputs);
1569  }
1570  else
1571    if(res!=SERVICE_FAILED){
1572      /**
1573       * We get the first output only !!
1574       */
1575      toto=getMap(request_outputs->content,"value");
1576      if(toto==NULL){
1577        map * errormap = createMap("text",_("Unable to fetch any result"));
1578        addToMap(errormap,"code", "InternalError");
1579        printExceptionReportResponse(m,errormap);
1580        freeMap(&errormap);
1581        free(errormap);
1582      }
1583      char mime[1024];
1584      map* mi=getMap(request_outputs->content,"mimeType");
1585#ifdef DEBUG
1586      fprintf(stderr,"SERVICE OUTPUTS\n");
1587      dumpMaps(request_outputs);
1588      fprintf(stderr,"SERVICE OUTPUTS\n");
1589#endif
1590      map* en=getMap(request_outputs->content,"encoding");
1591      if(mi!=NULL && en!=NULL)
1592        sprintf(mime,
1593                "Content-Type: %s; charset=%s\r\nStatus: 200 OK\r\n\r\n",
1594                mi->value,en->value);
1595      else
1596        if(mi!=NULL)
1597          sprintf(mime,
1598                  "Content-Type: %s; charset=UTF-8\r\nStatus: 200 OK\r\n\r\n",
1599                  mi->value);
1600        else
1601          sprintf(mime,"Content-Type: text/plain; charset=utf-8\r\nStatus: 200 OK\r\n\r\n");
1602      printf("%s",mime);
1603      if(mi!=NULL && strncmp(mi->value,"image",5)==0){
1604        map* rs=getMapFromMaps(request_outputs,request_outputs->name,"size");
1605        fwrite(toto->value,atoi(rs->value),1,stdout);
1606      }
1607      else
1608        printf("%s",toto->value);
1609#ifdef DEBUG
1610      dumpMap(toto);
1611#endif
1612    }else{
1613      char tmp[1024];
1614      map * errormap;
1615      map *lenv;
1616      lenv=getMapFromMaps(m,"lenv","message");
1617      if(lenv!=NULL)
1618        sprintf(tmp,_("Unable to run the Service. The message returned back by the Service was the following : %s"),lenv->value);
1619      else
1620        sprintf(tmp,_("Unable to run the Service. No more information was returned back by the Service."));
1621      errormap = createMap("text",tmp);     
1622      addToMap(errormap,"code", "InternalError");
1623      printExceptionReportResponse(m,errormap);
1624      freeMap(&errormap);
1625      free(errormap);
1626    }
1627}
1628
1629char *base64(const unsigned char *input, int length)
1630{
1631  BIO *bmem, *b64;
1632  BUF_MEM *bptr;
1633
1634  b64 = BIO_new(BIO_f_base64());
1635  bmem = BIO_new(BIO_s_mem());
1636  b64 = BIO_push(b64, bmem);
1637  BIO_write(b64, input, length);
1638  BIO_flush(b64);
1639  BIO_get_mem_ptr(b64, &bptr);
1640
1641  char *buff = (char *)malloc(bptr->length);
1642  memcpy(buff, bptr->data, bptr->length-1);
1643  buff[bptr->length-1] = 0;
1644
1645  BIO_free_all(b64);
1646
1647  return buff;
1648}
1649
1650char* addDefaultValues(maps** out,elements* in,maps* m,int type){
1651  elements* tmpInputs=in;
1652  maps* out1=*out;
1653  while(tmpInputs!=NULL){
1654    maps *tmpMaps=getMaps(out1,tmpInputs->name);
1655    if(tmpMaps==NULL){
1656      maps* tmpMaps2=(maps*)malloc(MAPS_SIZE);
1657      tmpMaps2->name=strdup(tmpInputs->name);
1658      tmpMaps2->content=NULL;
1659      tmpMaps2->next=NULL;
1660     
1661      if(type==0){
1662        map* tmpMapMinO=getMap(tmpInputs->content,"minOccurs");
1663        if(tmpMapMinO!=NULL)
1664          if(atoi(tmpMapMinO->value)>=1){
1665            freeMaps(&tmpMaps2);
1666            free(tmpMaps2);
1667            return tmpInputs->name;
1668          }
1669          else{
1670            if(tmpMaps2->content==NULL)
1671              tmpMaps2->content=createMap("minOccurs",tmpMapMinO->value);
1672            else
1673              addToMap(tmpMaps2->content,"minOccurs",tmpMapMinO->value);
1674          }
1675        map* tmpMaxO=getMap(tmpInputs->content,"maxOccurs");
1676        if(tmpMaxO!=NULL)
1677          if(tmpMaps2->content==NULL)
1678            tmpMaps2->content=createMap("maxOccurs",tmpMaxO->value);
1679          else
1680            addToMap(tmpMaps2->content,"maxOccurs",tmpMaxO->value);
1681      }
1682
1683      iotype* tmpIoType=tmpInputs->defaults;
1684      if(tmpIoType!=NULL){
1685        map* tmpm=tmpIoType->content;
1686        while(tmpm!=NULL){
1687          if(tmpMaps2->content==NULL)
1688            tmpMaps2->content=createMap(tmpm->name,tmpm->value);
1689          else
1690            addToMap(tmpMaps2->content,tmpm->name,tmpm->value);
1691          tmpm=tmpm->next;
1692        }
1693      }
1694      if(type==1){
1695        map *tmpMap=getMap(tmpMaps2->content,"value");
1696        if(tmpMap==NULL)
1697          addToMap(tmpMaps2->content,"value","NULL");
1698      }
1699      if(out1==NULL){
1700        *out=dupMaps(&tmpMaps2);
1701        out1=*out;
1702      }
1703      else
1704        addMapsToMaps(&out1,tmpMaps2);
1705      freeMap(&tmpMaps2->content);
1706      free(tmpMaps2->content);
1707      tmpMaps2->content=NULL;
1708      freeMaps(&tmpMaps2);
1709      free(tmpMaps2);
1710      tmpMaps2=NULL;
1711    }
1712    else{
1713      iotype* tmpIoType=getIoTypeFromElement(tmpInputs,tmpInputs->name,
1714                                             tmpMaps->content);
1715
1716      if(type==0) {
1717        map* tmpMap1=getMap(tmpInputs->content,"minOccurs");
1718        if(tmpMap1!=NULL){
1719          if(tmpMaps->content==NULL)
1720            tmpMaps->content=createMap("minOccurs",tmpMap1->value);
1721          else
1722            addToMap(tmpMaps->content,"minOccurs",tmpMap1->value);
1723        }
1724        map* tmpMaxO=getMap(tmpInputs->content,"maxOccurs");
1725        if(tmpMaxO!=NULL){
1726          if(tmpMaps->content==NULL)
1727            tmpMaps->content=createMap("maxOccurs",tmpMap1->value);
1728          else
1729            addToMap(tmpMaps->content,"maxOccurs",tmpMap1->value);
1730        }
1731      }
1732
1733      if(tmpIoType!=NULL){
1734        map* tmpContent=tmpIoType->content;
1735        map* cval=NULL;
1736
1737        while(tmpContent!=NULL){
1738          if((cval=getMap(tmpMaps->content,tmpContent->name))==NULL){
1739#ifdef DEBUG
1740            fprintf(stderr,"addDefaultValues %s => %s\n",tmpContent->name,tmpContent->value);
1741#endif
1742            if(tmpMaps->content==NULL)
1743              tmpMaps->content=createMap(tmpContent->name,tmpContent->value);
1744            else
1745              addToMap(tmpMaps->content,tmpContent->name,tmpContent->value);
1746          }
1747          tmpContent=tmpContent->next;
1748        }
1749      }
1750    }
1751    tmpInputs=tmpInputs->next;
1752  }
1753  return "";
1754}
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