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

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

Small fix for binary string support in dupMaps function to ensure that the binary value willbe passed to various laguages correctly. Memory cleanup.

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