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

Last change on this file since 9 was 9, checked in by djay, 14 years ago

Update of both ZOO Kernel and ZOO Services (ogr base-vect-ops ServicesProvider?).
All the ZCFG files have been corrected to remove all references to wrong metadata (Test = Demo) to avoid validation issues.
Main Memory leaks has been removed from this version.
Addition of the Simplify Service in the C ogr base-vect-ops ServicesProvider? and addition of the Python version (without Simplify).
Update of the configure.ac and Makefile.in to follow dicussions on the mailing list and ensure to use our cgic206 and not another one, path to our cgic library is now directly in the Makefile.in file.
Accept the "-" character to name inputs, to solve issue on GRASS 7 integration.
Addition of the extension keyword for ZCFG file to be able to store resulting outputs in a file name using the extension suffix.
This version after a testing period shall be considerate as 1.0.1 version of the ZOO Project.

File size: 39.6 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
27/* Converts a hex character to its integer value */
28char from_hex(char ch) {
29  return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10;
30}
31
32/* Converts an integer value to its hex character*/
33char to_hex(char code) {
34  static char hex[] = "0123456789abcdef";
35  return hex[code & 15];
36}
37
38/* Returns a url-encoded version of str */
39/* IMPORTANT: be sure to free() the returned string after use */
40char *url_encode(char *str) {
41  char *pstr = str, *buf = (char*) malloc(strlen(str) * 3 + 1), *pbuf = buf;
42  while (*pstr) {
43    if (isalnum(*pstr) || *pstr == '-' || *pstr == '_' || *pstr == '.' || *pstr == '~') 
44      *pbuf++ = *pstr;
45    else if (*pstr == ' ') 
46      *pbuf++ = '+';
47    else 
48      *pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15);
49    pstr++;
50  }
51  *pbuf = '\0';
52  return buf;
53}
54
55/* Returns a url-decoded version of str */
56/* IMPORTANT: be sure to free() the returned string after use */
57char *url_decode(char *str) {
58  char *pstr = str, *buf = (char*) malloc(strlen(str) + 1), *pbuf = buf;
59  while (*pstr) {
60    if (*pstr == '%') {
61      if (pstr[1] && pstr[2]) {
62        *pbuf++ = from_hex(pstr[1]) << 4 | from_hex(pstr[2]);
63        pstr += 2;
64      }
65    } else if (*pstr == '+') { 
66      *pbuf++ = ' ';
67    } else {
68      *pbuf++ = *pstr;
69    }
70    pstr++;
71  }
72  *pbuf = '\0';
73  return buf;
74}
75
76char *zCapitalize1(char *tmp){
77        char *res=strdup(tmp);
78        if(res[0]>=97 && res[0]<=122)
79                res[0]-=32;
80        return res;
81}
82
83char *zCapitalize(char *tmp){
84  int i=0;
85  char *res=strdup(tmp);
86  for(i=0;i<strlen(res);i++)
87    if(res[i]>=97 && res[i]<=122)
88      res[i]-=32;
89  return res;
90}
91
92
93int zooXmlSearchForNs(char* name){
94  int i;
95  int res=-1;
96  for(i=0;i<nbNs;i++)
97    if(strncasecmp(name,nsName[i],strlen(nsName[i]))==0){
98      res=i;
99      break;
100    }
101  return res;
102}
103
104int zooXmlAddNs(xmlNodePtr nr,char* url,char* name){
105#ifdef DEBUG
106  fprintf(stderr,"zooXmlAddNs %d \n",nbNs);
107#endif
108  int currId=-1;
109  if(nbNs==0){
110    nbNs++;
111    currId=0;
112    nsName[currId]=strdup(name);
113    usedNs[currId]=xmlNewNs(nr,BAD_CAST url,BAD_CAST name);
114  }else{
115    currId=zooXmlSearchForNs(name);
116    if(currId<0){
117      nbNs++;
118      currId=nbNs-1;
119      nsName[currId]=strdup(name);
120      usedNs[currId]=xmlNewNs(nr,BAD_CAST url,BAD_CAST name);
121    }
122  }
123  return currId;
124}
125
126void zooXmlCleanupNs(){
127  int j;
128#ifdef DEBUG
129  fprintf(stderr,"zooXmlCleanup %d\n",nbNs);
130#endif
131  for(j=nbNs-1;j>=0;j--){
132#ifdef DEBUG
133    fprintf(stderr,"zooXmlCleanup %d\n",j);
134#endif
135    if(j==0)
136      xmlFreeNs(usedNs[j]);
137    free(nsName[j]);
138    nbNs--;
139  }
140  nbNs=0;
141}
142
143xmlNodePtr printGetCapabilitiesHeader(xmlDocPtr doc,char* service,maps* m){
144
145  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
146  xmlNodePtr n,nc,nc1,nc2,nc3,nc4,nc5,nc6,pseudor;
147  xmlChar *xmlbuff;
148  int buffersize;
149  /**
150   * Create the document and its temporary root.
151   */
152  int wpsId=zooXmlAddNs(NULL,"http://www.opengis.net/wps/1.0.0","wps");
153  ns=usedNs[wpsId];
154  maps* toto1=getMaps(m,"main");
155
156  n = xmlNewNode(ns, BAD_CAST "Capabilities");
157  int owsId=zooXmlAddNs(n,"http://www.opengis.net/ows/1.1","ows");
158  ns_ows=usedNs[owsId];
159  xmlNewNs(n,BAD_CAST "http://www.opengis.net/wps/1.0.0",BAD_CAST "wps");
160  int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
161  ns_xsi=usedNs[xsiId];
162  int xlinkId=zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
163  ns_xlink=usedNs[xlinkId];
164  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"); 
165  xmlNewProp(n,BAD_CAST "service",BAD_CAST "WPS");
166 
167  if(toto1!=NULL){
168    map* tmp=getMap(toto1->content,"version");
169    if(tmp!=NULL){
170      xmlNewProp(n,BAD_CAST "version",BAD_CAST tmp->value);
171    }
172    else
173      xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.0.0");
174  }
175  else
176    xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.0.0");
177
178  char tmp[256];
179 
180  nc = xmlNewNode(ns_ows, BAD_CAST "ServiceIdentification");
181  maps* tmp4=getMaps(m,"identification");
182  if(tmp4!=NULL){
183    map* tmp2=tmp4->content;
184    while(tmp2!=NULL){
185      if(strncasecmp(tmp2->name,"keywords",8)!=0 &&
186         strncasecmp(tmp2->name,"serverAddress",13)!=0 &&
187         strncasecmp(tmp2->name,"lang",4)!=0 &&
188         strncasecmp(tmp2->name,"encoding",8)!=0 &&
189         strncasecmp(tmp2->name,"version",7)!=0){
190        tmp2->name[0]=toupper(tmp2->name[0]);
191        nc1 = xmlNewNode(ns_ows, BAD_CAST tmp2->name);
192        xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
193        xmlAddChild(nc,nc1);
194      }
195      else
196        if(strcmp(tmp2->name,"keywords")==0){
197          nc1 = xmlNewNode(ns_ows, BAD_CAST "Keywords");
198          char *toto=tmp2->value;
199          char buff[256];
200          int i=0;
201          int j=0;
202          while(toto[i]){
203            if(toto[i]!=',' && toto[i]!=0){
204              buff[j]=toto[i];
205              buff[j+1]=0;
206              j++;
207            }
208            else{
209              nc2 = xmlNewNode(ns_ows, BAD_CAST "Keyword");
210              xmlAddChild(nc2,xmlNewText(BAD_CAST buff));             
211              xmlAddChild(nc1,nc2);
212              j=0;
213            }
214            i++;
215          }
216          if(strlen(buff)>0){
217            nc2 = xmlNewNode(ns_ows, BAD_CAST "Keyword");
218            xmlAddChild(nc2,xmlNewText(BAD_CAST buff));       
219            xmlAddChild(nc1,nc2);
220          }
221          xmlAddChild(nc,nc1);
222          nc2 = xmlNewNode(ns_ows, BAD_CAST "ServiceType");
223          xmlAddChild(nc2,xmlNewText(BAD_CAST "WPS"));
224          xmlAddChild(nc,nc2);
225          nc2 = xmlNewNode(ns_ows, BAD_CAST "ServiceTypeVersion");
226          xmlAddChild(nc2,xmlNewText(BAD_CAST "1.0.0"));
227          xmlAddChild(nc,nc2);   
228        }
229      tmp2=tmp2->next;
230    }
231  }
232  else{
233    fprintf(stderr,"TMP4 NOT FOUND !!");
234    //dumpMaps(tmp4);
235    return NULL;
236  }
237  xmlAddChild(n,nc);
238
239  nc = xmlNewNode(ns_ows, BAD_CAST "ServiceProvider");
240  nc3 = xmlNewNode(ns_ows, BAD_CAST "ServiceContact");
241  nc4 = xmlNewNode(ns_ows, BAD_CAST "ContactInfo");
242  nc5 = xmlNewNode(ns_ows, BAD_CAST "Phone");
243  nc6 = xmlNewNode(ns_ows, BAD_CAST "Address");
244  tmp4=getMaps(m,"provider");
245  if(tmp4!=NULL){
246    map* tmp2=tmp4->content;
247    while(tmp2!=NULL){
248      if(strcmp(tmp2->name,"keywords")!=0 &&
249         strcmp(tmp2->name,"serverAddress")!=0 &&
250         strcmp(tmp2->name,"lang")!=0){
251        tmp2->name[0]=toupper(tmp2->name[0]);
252        if(strcmp(tmp2->name,"ProviderName")==0){
253          nc1 = xmlNewNode(ns_ows, BAD_CAST tmp2->name);
254          xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
255          xmlAddChild(nc,nc1);
256        }
257        else{
258          if(strcmp(tmp2->name,"ProviderSite")==0){
259            nc1 = xmlNewNode(ns_ows, BAD_CAST tmp2->name);
260            xmlNewNsProp(nc1,ns_xlink,BAD_CAST "href",BAD_CAST tmp2->value);
261            xmlAddChild(nc,nc1);
262          } 
263          else 
264            if(strcmp(tmp2->name,"IndividualName")==0 || 
265               strcmp(tmp2->name,"PositionName")==0){
266              nc1 = xmlNewNode(ns_ows, BAD_CAST tmp2->name);
267              xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
268              xmlAddChild(nc3,nc1);
269            } 
270            else 
271              if(strncmp(tmp2->name,"Phone",5)==0){
272                char *toto=NULL;
273                char *toto1=tmp2->name;
274                toto=strstr(toto1,"Phone");
275                nc1 = xmlNewNode(ns_ows, BAD_CAST toto1+5);
276                xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
277                xmlAddChild(nc5,nc1);
278              }
279              else 
280                if(strncmp(tmp2->name,"Address",7)==0){
281                  char *toto=NULL;
282                  char *toto1=tmp2->name;
283                  toto=strstr(toto1,"Address");
284                  nc1 = xmlNewNode(ns_ows, BAD_CAST toto1+7);
285                  xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
286                  xmlAddChild(nc6,nc1);
287                }
288        }
289      }
290      else
291        if(strcmp(tmp2->name,"keywords")==0){
292          nc1 = xmlNewNode(ns_ows, BAD_CAST "Keywords");
293          char *toto=tmp2->value;
294          char buff[256];
295          int i=0;
296          int j=0;
297          while(toto[i]){
298            if(toto[i]!=',' && toto[i]!=0){
299              buff[j]=toto[i];
300              buff[j+1]=0;
301              j++;
302            }
303            else{
304              nc2 = xmlNewNode(ns_ows, BAD_CAST "Keyword");
305              xmlAddChild(nc2,xmlNewText(BAD_CAST buff));             
306              xmlAddChild(nc1,nc2);
307              j=0;
308            }
309            i++;
310          }
311          if(strlen(buff)>0){
312            nc2 = xmlNewNode(ns_ows, BAD_CAST "Keyword");
313            xmlAddChild(nc2,xmlNewText(BAD_CAST buff));       
314            xmlAddChild(nc1,nc2);
315          }
316          xmlAddChild(nc,nc1);
317        }
318      tmp2=tmp2->next;
319    }
320  }
321  else{
322    fprintf(stderr,"TMP4 NOT FOUND !!");
323    //dumpMaps(tmp4);
324  }
325  xmlAddChild(nc4,nc5);
326  xmlAddChild(nc4,nc6);
327  xmlAddChild(nc3,nc4);
328  xmlAddChild(nc,nc3);
329  xmlAddChild(n,nc);
330
331
332  nc = xmlNewNode(ns_ows, BAD_CAST "OperationsMetadata");
333  char *tmp2[3];
334  tmp2[0]=strdup("GetCapabilities");
335  tmp2[1]=strdup("DescribeProcess");
336  tmp2[2]=strdup("Execute");
337  int j=0;
338
339  if(toto1!=NULL){
340    map* tmp=getMap(toto1->content,"serverAddress");
341    if(tmp!=NULL){
342      SERVICE_URL = strdup(tmp->value);
343    }
344    else
345      SERVICE_URL = strdup("not_found");
346  }
347  else
348    SERVICE_URL = strdup("not_found");
349
350  for(j=0;j<3;j++){
351    nc1 = xmlNewNode(ns_ows, BAD_CAST "Operation");
352    xmlNewProp(nc1,BAD_CAST "name",BAD_CAST tmp2[j]);
353    nc2 = xmlNewNode(ns_ows, BAD_CAST "DCP");
354    nc3 = xmlNewNode(ns_ows, BAD_CAST "HTTP");
355    nc4 = xmlNewNode(ns_ows, BAD_CAST "Get");
356    sprintf(tmp,"%s/%s",SERVICE_URL,service);
357    xmlNewNsProp(nc4,ns_xlink,BAD_CAST "href",BAD_CAST tmp);
358    xmlAddChild(nc3,nc4);
359    if(j>0){
360      nc4 = xmlNewNode(ns_ows, BAD_CAST "Post");
361      xmlNewNsProp(nc4,ns_xlink,BAD_CAST "href",BAD_CAST tmp);
362      xmlAddChild(nc3,nc4);
363    }
364    xmlAddChild(nc2,nc3);
365    xmlAddChild(nc1,nc2);   
366    xmlAddChild(nc,nc1);   
367  }
368  for(j=2;j>=0;j--)
369    free(tmp2[j]);
370  xmlAddChild(n,nc);
371
372  nc = xmlNewNode(ns, BAD_CAST "ProcessOfferings");
373  xmlAddChild(n,nc);
374
375  nc1 = xmlNewNode(ns, BAD_CAST "Languages");
376  nc2 = xmlNewNode(ns, BAD_CAST "Default");
377  nc3 = xmlNewNode(ns, BAD_CAST "Supported");
378 
379  toto1=getMaps(m,"main");
380  if(toto1!=NULL){
381    map* tmp1=getMap(toto1->content,"lang");
382    char *toto=tmp1->value;
383    char buff[256];
384    int i=0;
385    int j=0;
386    int dcount=0;
387    while(toto[i]){
388      if(toto[i]!=',' && toto[i]!=0){
389        buff[j]=toto[i];
390        buff[j+1]=0;
391        j++;
392      }
393      else{
394        nc4 = xmlNewNode(ns_ows, BAD_CAST "Language");
395        xmlAddChild(nc4,xmlNewText(BAD_CAST buff));
396        if(dcount==0){
397          xmlAddChild(nc2,nc4);
398          xmlAddChild(nc1,nc2);
399          xmlNewProp(n,BAD_CAST "xml:lang",BAD_CAST buff);
400          dcount++;
401        }
402        nc4 = xmlNewNode(ns_ows, BAD_CAST "Language");
403        xmlAddChild(nc4,xmlNewText(BAD_CAST buff));
404        xmlAddChild(nc3,nc4);
405        j=0;
406        buff[j]=0;
407      }
408      i++;
409    }
410    if(strlen(buff)>0){
411      nc4 = xmlNewNode(ns_ows, BAD_CAST "Language");
412      xmlAddChild(nc4,xmlNewText(BAD_CAST buff));             
413      xmlAddChild(nc3,nc4);
414    }
415  }
416  xmlAddChild(nc1,nc3);
417  xmlAddChild(n,nc1);
418 
419  xmlDocSetRootElement(doc, n);
420  //xmlFreeNs(ns);
421  free(SERVICE_URL);
422  return nc;
423}
424
425void printGetCapabilitiesForProcess(maps* m,xmlNodePtr nc,service* serv){
426  xmlNsPtr ns,ns_ows,ns_xlink;
427  xmlNodePtr nr,n,nc1,nc2,nc3,nc4,nc5,nc6,pseudor;
428  /**
429   * Initialize or get existing namspaces
430   */
431  int wpsId=zooXmlAddNs(NULL,"http://www.opengis.net/wps/1.0.0","wps");
432  ns=usedNs[wpsId];
433  int owsId=zooXmlAddNs(NULL,"http://www.opengis.net/ows/1.1","ows");
434  ns_ows=usedNs[owsId];
435  int xlinkId=zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
436  ns_xlink=usedNs[xlinkId];
437
438  int cursor=0;
439  map* tmp1;
440  if(serv->content!=NULL){
441    nc1 = xmlNewNode(ns, BAD_CAST "Process");
442    tmp1=getMap(serv->content,"processVersion");
443    if(tmp1!=NULL)
444      xmlNewNsProp(nc1,ns,BAD_CAST "processVersion",BAD_CAST tmp1->value);
445    printDescription(nc1,ns_ows,serv->name,serv->content);
446    tmp1=serv->metadata;
447    while(tmp1!=NULL){
448      nc2 = xmlNewNode(ns_ows, BAD_CAST "Metadata");
449      xmlNewNsProp(nc2,ns_xlink,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
450      xmlAddChild(nc1,nc2);
451      tmp1=tmp1->next;
452    }
453    xmlAddChild(nc,nc1);
454  }
455}
456
457xmlNodePtr printDescribeProcessHeader(xmlDocPtr doc,char* service,maps* m){
458
459  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
460  xmlNodePtr n,nr;
461  xmlChar *xmlbuff;
462  int buffersize;
463
464  int wpsId=zooXmlAddNs(NULL,"http://schemas.opengis.net/wps/1.0.0","wps");
465  ns=usedNs[wpsId];
466  n = xmlNewNode(ns, BAD_CAST "ProcessDescriptions");
467  int owsId=zooXmlAddNs(n,"http://www.opengis.net/ows/1.1","ows");
468  ns_ows=usedNs[owsId];
469  xmlNewNs(n,BAD_CAST "http://www.opengis.net/wps/1.0.0",BAD_CAST "wps");
470  zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
471  int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
472  ns_xsi=usedNs[xsiId];
473 
474  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");
475  xmlNewProp(n,BAD_CAST "service",BAD_CAST "WPS");
476  xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.0.0");
477  xmlNewProp(n,BAD_CAST "xml:lang",BAD_CAST "en");
478
479  xmlDocSetRootElement(doc, n);
480
481  return n;
482}
483
484void printDescribeProcessForProcess(maps* m,xmlNodePtr nc,service* serv,int sc){
485  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
486  xmlNodePtr nr,n,nc1,nc2,nc3,nc4,nc5,nc6,pseudor;
487
488  char tmp[256];
489  n=nc;
490 
491  int wpsId=zooXmlAddNs(NULL,"http://schemas.opengis.net/wps/1.0.0","wps");
492  ns=usedNs[wpsId];
493  int owsId=zooXmlAddNs(NULL,"http://www.opengis.net/ows/1.1","ows");
494  ns_ows=usedNs[owsId];
495  int xlinkId=zooXmlAddNs(NULL,"http://www.w3.org/1999/xlink","xlink");
496  ns_xlink=usedNs[xlinkId];
497
498  nc = xmlNewNode(NULL, BAD_CAST "ProcessDescription");
499  char *tmp4[3];
500  tmp4[0]="processVersion";
501  tmp4[1]="storeSupported";
502  tmp4[2]="statusSupported";
503  int j=0;
504  map* tmp1=NULL;
505  for(j=0;j<3;j++){
506    tmp1=getMap(serv->content,tmp4[j]);
507    if(tmp1!=NULL){
508      if(j==0)
509        xmlNewNsProp(nc,ns,BAD_CAST "processVersion",BAD_CAST tmp1->value);     
510      else
511        xmlNewProp(nc,BAD_CAST tmp4[j],BAD_CAST tmp1->value);     
512    }
513    else{
514      if(j>0)
515        xmlNewProp(nc,BAD_CAST tmp4[j],BAD_CAST "false");     
516    }
517  }
518 
519  printDescription(nc,ns_ows,serv->name,serv->content);
520
521  tmp1=serv->metadata;
522  while(tmp1!=NULL){
523    nc1 = xmlNewNode(ns_ows, BAD_CAST "Metadata");
524    xmlNewNsProp(nc1,ns_xlink,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
525    xmlAddChild(nc,nc1);
526    tmp1=tmp1->next;
527  }
528
529  tmp1=getMap(serv->content,"Profile");
530  if(tmp1!=NULL){
531    nc1 = xmlNewNode(ns, BAD_CAST "Profile");
532    xmlAddChild(nc1,xmlNewText(BAD_CAST tmp1->value));
533    xmlAddChild(nc,nc1);
534  }
535
536  nc1 = xmlNewNode(NULL, BAD_CAST "DataInputs");
537 
538  elements* e=serv->inputs;
539  while(e!=NULL){
540    nc2 = xmlNewNode(NULL, BAD_CAST "Input");
541    tmp1=getMap(e->content,"minOccurs");
542    if(tmp1){
543      xmlNewProp(nc2,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
544    }
545    tmp1=getMap(e->content,"maxOccurs");
546    if(tmp1){
547      xmlNewProp(nc2,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
548    }
549
550    printDescription(nc2,ns_ows,e->name,e->content);
551
552
553    nc3 = xmlNewNode(NULL, BAD_CAST e->format);
554    iotype* _tmp=e->defaults;
555    int datatype=0;
556    if(_tmp!=NULL){
557      int isAnyValue=1;
558      if(strcmp(e->format,"LiteralData")!=0){
559        nc4 = xmlNewNode(NULL, BAD_CAST "Default");
560        nc5 = xmlNewNode(NULL, BAD_CAST "Format");
561      }
562      else{
563        nc4 = xmlNewNode(NULL, BAD_CAST "UOMs");
564        nc5 = xmlNewNode(NULL, BAD_CAST "Default");
565        datatype=1;
566      }
567      tmp1=_tmp->content;
568      int default1=0;
569      xmlNodePtr nc7;
570      while(tmp1!=NULL){
571#ifdef DEBUG
572        printf("DATATYPE DEFAULT ? %s\n",tmp1->name);
573#endif
574        if(strncasecmp(tmp1->name,"DataType",8)==0){
575          nc6 = xmlNewNode(ns_ows, BAD_CAST "DataType");
576          xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
577          char tmp[1024];
578          sprintf(tmp,"http://www.w3.org/TR/xmlschema-2/#%s",tmp1->value);
579          xmlNewNsProp(nc6,ns_ows,BAD_CAST "reference",BAD_CAST tmp);
580          xmlAddChild(nc3,nc6);
581          tmp1=tmp1->next;
582          continue;
583        }
584        if(strcasecmp(tmp1->name,"asReference")!=0 && 
585           strcasecmp(tmp1->name,"DataType")!=0 && 
586           strncasecmp(tmp1->name,"AllowedValues",13)!=0 &&
587           strcasecmp(tmp1->name,"value")!=0 &&
588           strcasecmp(tmp1->name,"extension")!=0){
589          if(datatype==0){
590            char *tmp2=zCapitalize1(tmp1->name);
591            nc6 = xmlNewNode(NULL, BAD_CAST tmp2);
592            free(tmp2);
593          }
594          else{
595            char *tmp2=zCapitalize(tmp1->name);
596            nc6 = xmlNewNode(ns_ows, BAD_CAST tmp2);
597            free(tmp2);
598          }
599          xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
600          xmlAddChild(nc5,nc6);
601        }
602        else{
603          if(strcmp(tmp1->name,"value")==0){
604            nc7 = xmlNewNode(NULL, BAD_CAST "DefaultValue");
605            xmlAddChild(nc7,xmlNewText(BAD_CAST tmp1->value));
606            default1=1;
607          }
608          if(strncasecmp(tmp1->name,"AllowedValues",13)==0){
609            nc6 = xmlNewNode(ns_ows, BAD_CAST "AllowedValues");
610            char *token,*saveptr1;
611            token=strtok_r(tmp1->value,",",&saveptr1);
612            while(token!=NULL){
613                nc7 = xmlNewNode(ns_ows, BAD_CAST "Value");
614                char *tmps=strdup(token);
615                tmps[strlen(tmps)]=0;
616                xmlAddChild(nc7,xmlNewText(BAD_CAST tmps));
617                fprintf(stderr,"strgin : %s\n",tmps);
618                xmlAddChild(nc6,nc7);
619                token=strtok_r(NULL,",",&saveptr1);
620            }
621            xmlAddChild(nc3,nc6);
622            isAnyValue=-1;
623          }
624        }
625        tmp1=tmp1->next;
626      }
627      xmlAddChild(nc4,nc5);
628      xmlAddChild(nc3,nc4);
629      if(datatype==1 && isAnyValue==1){
630        xmlAddChild(nc3,xmlNewNode(ns_ows, BAD_CAST "AnyValue"));
631        if(default1>0)
632          xmlAddChild(nc3,nc7);
633      }
634      if(datatype==1 && default1>0)
635        xmlAddChild(nc3,nc7);
636    }
637    xmlAddChild(nc2,nc3);
638   
639    _tmp=e->supported;
640    while(_tmp!=NULL){
641      if(datatype==0){
642        nc4 = xmlNewNode(NULL, BAD_CAST "Supported");
643        nc5 = xmlNewNode(NULL, BAD_CAST "Format");
644      }
645      else{
646        nc5 = xmlNewNode(NULL, BAD_CAST "Supported");
647      }
648      tmp1=_tmp->content;
649      while(tmp1!=NULL){
650        /*if(strcmp(e->format,"LiteralData")==0)
651          xmlAddChild(nc5,nc6);*/
652        if(datatype==0){
653          char *tmp2=zCapitalize1(tmp1->name);
654          nc6 = xmlNewNode(NULL, BAD_CAST tmp2);
655          free(tmp2);
656        }
657        else{
658          char *tmp2=zCapitalize(tmp1->name);     
659          nc6 = xmlNewNode(ns_ows, BAD_CAST tmp2);
660          free(tmp2);
661        }
662        xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
663        xmlAddChild(nc5,nc6);
664        tmp1=tmp1->next;
665      }
666      if(datatype==0){
667        xmlAddChild(nc4,nc5);
668        xmlAddChild(nc3,nc4);
669      }else{
670        xmlAddChild(nc4,nc5);
671        //xmlAddChild(nc3,xmlNewNode(ns_ows, BAD_CAST "AnyValue"));
672      }
673      _tmp=_tmp->next;
674      if(strcmp(e->format,"LiteralData")!=0){
675        xmlAddChild(nc2,nc3);
676      }
677      xmlAddChild(nc1,nc2);
678    }
679   
680   
681    e=e->next;
682  }
683  xmlAddChild(nc,nc1);
684
685  nc1 = xmlNewNode(NULL, BAD_CAST "ProcessOutputs");
686 
687  e=serv->outputs;
688  while(e!=NULL){
689    nc2 = xmlNewNode(NULL, BAD_CAST "Output");
690    tmp1=getMap(e->content,"minOccurs");
691    if(tmp1){
692      xmlNewProp(nc2,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
693    }
694    tmp1=getMap(e->content,"maxOccurs");
695    if(tmp1){
696      xmlNewProp(nc2,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
697    }
698
699    printDescription(nc2,ns_ows,e->name,e->content);
700
701    if(strncasecmp(e->format,"LITERALDATA",strlen(e->format))==0)
702      nc3 = xmlNewNode(NULL, BAD_CAST "LiteralOutput");
703    else
704      if(strncasecmp(e->format,"COMPLEXDATA",strlen(e->format))==0)
705        nc3 = xmlNewNode(NULL, BAD_CAST "ComplexOutput");
706      else
707        nc3 = xmlNewNode(NULL, BAD_CAST e->format);
708    iotype* _tmp=e->defaults;
709    int datatype=0;
710    if(_tmp!=NULL){
711     if(strcmp(e->format,"LiteralOutput")==0 ||
712        strcmp(e->format,"LiteralData")==0){
713        datatype=1;
714        nc4 = xmlNewNode(NULL, BAD_CAST "UOMs");
715        nc5 = xmlNewNode(NULL, BAD_CAST "Default");
716     }
717      else{
718        nc4 = xmlNewNode(NULL, BAD_CAST "Default");
719        nc5 = xmlNewNode(NULL, BAD_CAST "Format");
720      }
721      tmp1=_tmp->content;
722      while(tmp1!=NULL){
723#ifdef DEBUG
724        printf("DATATYPE DEFAULT ? %s\n",tmp1->name);
725#endif
726        if(strncasecmp(tmp1->name,"DataType",8)==0){
727          nc6 = xmlNewNode(ns_ows, BAD_CAST "DataType");
728          xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
729          char tmp[1024];
730          sprintf(tmp,"http://www.w3.org/TR/xmlschema-2/#%s",tmp1->value);
731          xmlNewNsProp(nc6,ns_xlink,BAD_CAST "reference",BAD_CAST tmp);
732          xmlAddChild(nc3,nc6);
733          tmp1=tmp1->next;
734          datatype=1;
735          continue;
736        }
737        if(strcmp(tmp1->name,"asReference")!=0 &&
738           strncasecmp(tmp1->name,"DataType",8)!=0 &&
739           strcasecmp(tmp1->name,"extension")!=0){
740          if(datatype==0){
741            char *tmp2=zCapitalize1(tmp1->name);
742            nc6 = xmlNewNode(NULL, BAD_CAST tmp2);
743            free(tmp2);
744          }
745          else{
746            char *tmp2=zCapitalize(tmp1->name);
747            nc6 = xmlNewNode(ns_ows, BAD_CAST tmp2);
748            free(tmp2);
749          }
750          xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
751          xmlAddChild(nc5,nc6);
752        }
753        tmp1=tmp1->next;
754      }
755      xmlAddChild(nc4,nc5);
756      xmlAddChild(nc3,nc4);         
757    }
758    _tmp=e->supported;
759    while(_tmp!=NULL){
760    if(datatype==0){
761      nc4 = xmlNewNode(NULL, BAD_CAST "Supported");
762      nc5 = xmlNewNode(NULL, BAD_CAST "Format");
763      }
764      else
765      nc5 = xmlNewNode(NULL, BAD_CAST "Supported");
766      tmp1=_tmp->content;
767      while(tmp1!=NULL){
768#ifdef DEBUG
769        printf("DATATYPE SUPPORTED ? %s\n",tmp1->name);
770#endif
771        if(strcmp(tmp1->name,"asReference")!=0 && 
772           strcmp(tmp1->name,"DataType")!=0 &&
773           strcasecmp(tmp1->name,"extension")!=0){
774          if(datatype==0){
775            char *tmp2=zCapitalize1(tmp1->name);
776            nc6 = xmlNewNode(NULL, BAD_CAST tmp2);
777            free(tmp2);
778          }
779          else{
780            char *tmp2=zCapitalize(tmp1->name);
781            nc6 = xmlNewNode(ns_ows, BAD_CAST tmp2);
782            free(tmp2);
783          }
784          xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
785          xmlAddChild(nc5,nc6);
786        }
787        tmp1=tmp1->next;
788      }
789      _tmp=_tmp->next;
790      if(datatype==0){
791         xmlAddChild(nc4,nc5);
792         xmlAddChild(nc3,nc4);
793      }else
794      xmlAddChild(nc4,nc5);
795    }
796    xmlAddChild(nc2,nc3);
797
798    xmlAddChild(nc3,nc4);
799     
800   
801    xmlAddChild(nc2,nc3);
802   
803    xmlAddChild(nc1,nc2);
804   
805    e=e->next;
806  }
807  xmlAddChild(nc,nc1);
808
809  xmlAddChild(n,nc);
810
811}
812
813void printProcessResponse(maps* m,map* request, int pid,service* serv,char* service,int status,maps* inputs,maps* outputs){
814  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
815  xmlNodePtr nr,n,nc,nc1,nc2,nc3,pseudor;
816  xmlDocPtr doc;
817  xmlChar *xmlbuff;
818  int buffersize;
819  time_t time1; 
820  time(&time1);
821  /**
822   * Create the document and its temporary root.
823   */
824  doc = xmlNewDoc(BAD_CAST "1.0");
825  int wpsId=zooXmlAddNs(NULL,"http://www.opengis.net/wps/1.0.0","wps");
826  ns=usedNs[wpsId];
827 
828  n = xmlNewNode(ns, BAD_CAST "ExecuteResponse");
829  int owsId=zooXmlAddNs(n,"http://www.opengis.net/ows/1.1","ows");
830  ns_ows=usedNs[owsId];
831  int xlinkId=zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
832  ns_xlink=usedNs[xlinkId];
833  int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
834  ns_xsi=usedNs[xsiId];
835  xmlNewNs(n,BAD_CAST "http://www.opengis.net/wps/1.0.0",BAD_CAST "wps");
836
837  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");
838 
839  xmlNewProp(n,BAD_CAST "service",BAD_CAST "WPS");
840  xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.0.0");
841  xmlNewProp(n,BAD_CAST "xml:lang",BAD_CAST "en");
842  char tmp[256];
843  char url[256];
844  memset(tmp,0,256);
845  memset(url,0,256);
846  maps* tmp_maps=getMaps(m,"main");
847  if(tmp_maps!=NULL){
848    map* tmpm=getMap(tmp_maps->content,"serverAddress");
849    map* tmpm1=getMap(tmp_maps->content,"tmpUrl");
850    if(tmpm!=NULL && tmpm1!=NULL){
851      sprintf(url,"%s/%s/%s_%i.xml",tmpm->value,tmpm1->value,service,pid);
852    }
853    if(tmpm!=NULL)
854      sprintf(tmp,"%s/",tmpm->value);
855  }
856
857  xmlNewProp(n,BAD_CAST "serviceInstance",BAD_CAST tmp);
858  if(status!=SERVICE_SUCCEEDED){
859    xmlNewProp(n,BAD_CAST "statusLocation",BAD_CAST url);
860  }
861
862  nc = xmlNewNode(ns, BAD_CAST "Process");
863  map* tmp2=getMap(serv->content,"processVersion");
864
865  if(tmp2!=NULL)
866    xmlNewNsProp(nc,ns,BAD_CAST "processVersion",BAD_CAST tmp2->value);
867 
868  printDescription(nc,ns_ows,serv->name,serv->content);
869  fflush(stderr);
870
871  xmlAddChild(n,nc);
872
873  nc = xmlNewNode(ns, BAD_CAST "Status");
874  const struct tm *tm;
875  size_t len;
876  time_t now;
877  char *tmp1;
878 
879  now = time ( NULL );
880  tm = localtime ( &now );
881
882  tmp1 = (char*)malloc((TIME_SIZE+1)*sizeof(char));
883
884  len = strftime ( tmp1, TIME_SIZE, "%Y-%m-%dT%I:%M:%SZ", tm );
885
886  switch(status){
887  case SERVICE_SUCCEEDED:
888    xmlNewProp(nc,BAD_CAST "creationTime",BAD_CAST tmp1);
889    nc1 = xmlNewNode(ns, BAD_CAST "ProcessSucceeded");
890    break;
891  case SERVICE_STARTED:
892    xmlNewProp(nc,BAD_CAST "creationTime",BAD_CAST tmp1);
893    nc1 = xmlNewNode(ns, BAD_CAST "ProcessStarted");
894    xmlNewProp(nc1,BAD_CAST "percentCompleted",BAD_CAST "NEED_SERVICE_ACCESS"); 
895    break;
896  case SERVICE_ACCEPTED:
897    xmlNewProp(nc,BAD_CAST "creationTime",BAD_CAST tmp1);
898    nc1 = xmlNewNode(ns, BAD_CAST "ProcessAccepted");
899    break;
900  case SERVICE_FAILED:
901    nc1 = xmlNewNode(ns, BAD_CAST "ProcessFailed");
902    break;
903  default :
904    printf("error code not know : %i\n",status);
905    exit(1);
906    break;
907  }
908  xmlAddChild(nc,nc1);
909  xmlAddChild(n,nc);
910  free(tmp1);
911
912#ifdef DEBUG
913  fprintf(stderr,"printProcessResponse 1 161\n");
914#endif
915
916  map* lineage=getMap(request,"lineage");
917  if(lineage!=NULL){
918    nc = xmlNewNode(ns, BAD_CAST "DataInputs");
919    int i;
920    maps* mcursor=inputs;
921    elements* scursor=serv->inputs;
922    while(mcursor!=NULL /*&& scursor!=NULL*/){
923      printIOType(doc,nc,ns,ns_ows,scursor,mcursor,"Input");
924      mcursor=mcursor->next;
925      //scursor=scursor->next;
926    }
927    xmlAddChild(n,nc);
928   
929#ifdef DEBUG
930    fprintf(stderr,"printProcessResponse 1 177\n");
931#endif
932
933    nc = xmlNewNode(ns, BAD_CAST "OutputDefinitions");
934    mcursor=outputs;
935    scursor=serv->outputs;
936    while(mcursor!=NULL /*&& scursor!=NULL*/){
937      printOutputDefinitions1(doc,nc,ns,ns_ows,scursor,mcursor,"Output");
938      mcursor=mcursor->next;
939      //scursor=scursor->next;
940    }
941    xmlAddChild(n,nc);
942  }
943#ifdef DEBUG
944  fprintf(stderr,"printProcessResponse 1 190\n");
945#endif
946
947  /**
948   * Display the process output only when requested !
949   */
950  if(status==SERVICE_SUCCEEDED){
951    nc = xmlNewNode(ns, BAD_CAST "ProcessOutputs");
952    maps* mcursor=outputs;
953    elements* scursor=serv->outputs;
954    while(mcursor!=NULL && scursor!=NULL){
955      printIOType(doc,nc,ns,ns_ows,scursor,mcursor,"Output");
956      mcursor=mcursor->next;
957      scursor=scursor->next;
958    }
959    xmlAddChild(n,nc);
960  }
961#ifdef DEBUG
962  fprintf(stderr,"printProcessResponse 1 202\n");
963#endif
964  xmlDocSetRootElement(doc, n);
965  printDocument(m,doc,pid);
966
967  xmlCleanupParser();
968  zooXmlCleanupNs();
969}
970
971
972void printDocument(maps* m, xmlDocPtr doc,int pid){
973  rewind(stdout);
974  char *encoding=getEncoding(m);
975  if(pid==getpid()){
976    printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
977  }
978  fflush(stdout);
979  xmlChar *xmlbuff;
980  int buffersize;
981  /*
982   * Dump the document to a buffer and print it on stdout
983   * for demonstration purposes.
984   */
985  xmlDocDumpFormatMemoryEnc(doc, &xmlbuff, &buffersize, encoding, 1);
986  printf((char *) xmlbuff);
987  //fflush(stdout);
988  /*
989   * Free associated memory.
990   */
991  xmlFree(xmlbuff);
992  xmlFreeDoc(doc);
993  xmlCleanupParser();
994  zooXmlCleanupNs();
995}
996
997void printOutputDefinitions1(xmlDocPtr doc,xmlNodePtr nc,xmlNsPtr ns_wps,xmlNsPtr ns_ows,elements* e,maps* m,char* type){
998  xmlNodePtr nc1;
999  nc1=xmlNewNode(ns_wps, BAD_CAST type);
1000  map *tmp=NULL; 
1001  if(e!=NULL && e->defaults!=NULL)
1002    tmp=e->defaults->content;
1003  else{
1004    /*
1005    dumpElements(e);
1006    */
1007    return;
1008  }
1009  while(tmp!=NULL){
1010    if(strncasecmp(tmp->name,"MIMETYPE",strlen(tmp->name))==0
1011       || strncasecmp(tmp->name,"ENCODING",strlen(tmp->name))==0
1012       || strncasecmp(tmp->name,"SCHEMA",strlen(tmp->name))==0
1013       || strncasecmp(tmp->name,"UOM",strlen(tmp->name))==0)
1014    xmlNewProp(nc1,BAD_CAST tmp->name,BAD_CAST tmp->value);
1015    tmp=tmp->next;
1016  }
1017  tmp=getMap(e->defaults->content,"asReference");
1018  if(tmp==NULL)
1019    xmlNewProp(nc1,BAD_CAST "asReference",BAD_CAST "false");
1020
1021  tmp=e->content;
1022
1023  printDescription(nc1,ns_ows,m->name,e->content);
1024
1025  xmlAddChild(nc,nc1);
1026
1027}
1028
1029void printOutputDefinitions(xmlDocPtr doc,xmlNodePtr nc,xmlNsPtr ns_wps,xmlNsPtr ns_ows,elements* e,map* m,char* type){
1030  xmlNodePtr nc1,nc2,nc3;
1031  nc1=xmlNewNode(ns_wps, BAD_CAST type);
1032  map *tmp=NULL; 
1033  if(e!=NULL && e->defaults!=NULL)
1034    tmp=e->defaults->content;
1035  else{
1036    /*
1037    dumpElements(e);
1038    */
1039    return;
1040  }
1041  while(tmp!=NULL){
1042    xmlNewProp(nc1,BAD_CAST tmp->name,BAD_CAST tmp->value);
1043    tmp=tmp->next;
1044  }
1045  tmp=getMap(e->defaults->content,"asReference");
1046  if(tmp==NULL)
1047    xmlNewProp(nc1,BAD_CAST "asReference",BAD_CAST "false");
1048
1049  tmp=e->content;
1050
1051  printDescription(nc1,ns_ows,m->name,e->content);
1052
1053  xmlAddChild(nc,nc1);
1054
1055}
1056
1057void printIOType(xmlDocPtr doc,xmlNodePtr nc,xmlNsPtr ns_wps,xmlNsPtr ns_ows,elements* e,maps* m,char* type){
1058  xmlNodePtr nc1,nc2,nc3;
1059  nc1=xmlNewNode(ns_wps, BAD_CAST type);
1060  map *tmp=e->content;
1061  //#ifdef DEBUG
1062  dumpMap(tmp);
1063  dumpElements(e);
1064  //#endif
1065  nc2=xmlNewNode(ns_ows, BAD_CAST "Identifier");
1066  nc3=xmlNewText(BAD_CAST e->name);
1067  xmlAddChild(nc2,nc3);
1068  xmlAddChild(nc1,nc2);
1069  xmlAddChild(nc,nc1);
1070  // Extract Title required to be first element in the ZCFG file !
1071  nc2=xmlNewNode(ns_ows, BAD_CAST tmp->name);
1072  nc3=xmlNewText(BAD_CAST tmp->value);
1073  xmlAddChild(nc2,nc3); 
1074  xmlAddChild(nc1,nc2);
1075  // Extract Abstract required to be second element in the ZCFG file !
1076  tmp=tmp->next;
1077  nc2=xmlNewNode(ns_ows, BAD_CAST tmp->name);
1078  nc3=xmlNewText(BAD_CAST tmp->value);
1079  xmlAddChild(nc2,nc3); 
1080  xmlAddChild(nc1,nc2);
1081  xmlAddChild(nc,nc1);
1082  tmp=tmp->next;
1083
1084  /**
1085   * IO type Reference or full Data ?
1086   */
1087  //#ifdef DEBUG
1088  fprintf(stderr,"FORMAT %s %s\n",e->format,e->format);
1089  //#endif
1090  map *tmpMap=getMap(m->content,"Reference");
1091  if(tmpMap==NULL){
1092    nc2=xmlNewNode(ns_wps, BAD_CAST "Data");
1093    if(strncasecmp(e->format,"LITERALOUTPUT",strlen(e->format))==0)
1094      nc3=xmlNewNode(ns_wps, BAD_CAST "LiteralData");
1095    else
1096      if(strncasecmp(e->format,"COMPLEXOUTPUT",strlen(e->format))==0)
1097        nc3=xmlNewNode(ns_wps, BAD_CAST "ComplexData");
1098      else
1099        nc3=xmlNewNode(ns_wps, BAD_CAST e->format);
1100    tmp=m->content;
1101    while(tmp!=NULL){
1102      if(strncasecmp(tmp->name,"value",strlen(tmp->name))!=0 &&
1103         strncasecmp(tmp->name,"extension",strlen(tmp->name))!=0)
1104        xmlNewProp(nc3,BAD_CAST tmp->name,BAD_CAST tmp->value);
1105      tmp=tmp->next;
1106      xmlAddChild(nc2,nc3);
1107    }
1108    tmp=getMap(e->defaults->content,"mimeType");
1109    map* tmp1=getMap(m->content,"encoding");
1110    map* tmp2=getMap(m->content,"mimeType");
1111    map* toto=getMap(m->content,"value");
1112    if((tmp1!=NULL && strncmp(tmp1->value,"base64",6)==0)
1113       || (tmp2!=NULL && (strncmp(tmp2->value,"image/",6)==0
1114                          || strncmp(tmp2->value,"application/",6)==0)) ){
1115      map* rs=getMap(m->content,"size");
1116      if(rs==NULL){
1117        char tmp1[1024];
1118        sprintf(tmp1,"%d",strlen(toto->value));
1119        rs=createMap("z",tmp1);
1120      }
1121      xmlAddChild(nc3,xmlNewText(BAD_CAST base64((const unsigned char*)toto->value,atoi(rs->value))));
1122    }
1123    else if(tmp!=NULL){
1124      if(strcmp(tmp->value,"text/js")==0)
1125        xmlAddChild(nc3,xmlNewCDataBlock(doc,BAD_CAST toto->value,strlen(toto->value)));
1126      else
1127        xmlAddChild(nc3,xmlNewText(BAD_CAST toto->value));
1128      xmlAddChild(nc2,nc3);
1129    }
1130    else
1131      xmlAddChild(nc3,xmlNewText(BAD_CAST toto->value));
1132  }
1133  else{
1134    nc3=nc2=xmlNewNode(ns_wps, BAD_CAST "Reference");
1135    xmlNewProp(nc3,BAD_CAST "href",BAD_CAST tmpMap->value);
1136    tmp=m->content;
1137    while(tmp!=NULL){
1138      if(strncasecmp(tmp->name,"value",strlen(tmp->name))!=0 &&
1139         strncasecmp(tmp->name,"reference",strlen(tmp->name))!=0 &&
1140         strncasecmp(tmp->name,"extension",strlen(tmp->name))!=0 &&
1141         strncasecmp(tmp->name,"abstract",strlen(tmp->name))!=0 &&
1142         strncasecmp(tmp->name,"status",strlen(tmp->name))!=0 &&
1143         strncasecmp(tmp->name,"storeExecuteResponse",strlen(tmp->name))!=0 &&
1144         strncasecmp(tmp->name,"asReference",strlen(tmp->name))!=0)
1145        xmlNewProp(nc3,BAD_CAST tmp->name,BAD_CAST tmp->value);
1146      tmp=tmp->next;
1147      xmlAddChild(nc2,nc3);
1148    }
1149  }
1150
1151  xmlAddChild(nc1,nc2);
1152  xmlAddChild(nc,nc1);
1153
1154}
1155
1156void printDescription(xmlNodePtr root,xmlNsPtr ns_ows,char* identifier,map* amap){
1157  xmlNodePtr nc2 = xmlNewNode(ns_ows, BAD_CAST "Identifier");
1158  xmlAddChild(nc2,xmlNewText(BAD_CAST identifier));
1159  xmlAddChild(root,nc2);
1160  map* tmp=amap;
1161  char *tmp2[2];
1162  tmp2[0]="Title";
1163  tmp2[1]="Abstract";
1164  int j=0;
1165  for(j=0;j<2;j++){
1166    map* tmp1=getMap(tmp,tmp2[j]);
1167    if(tmp1!=NULL){
1168      nc2 = xmlNewNode(ns_ows, BAD_CAST tmp2[j]);
1169      xmlAddChild(nc2,xmlNewText(BAD_CAST tmp1->value));
1170      xmlAddChild(root,nc2);
1171    }
1172  }
1173}
1174
1175char* getEncoding(maps* m){
1176  if(m!=NULL){
1177    map* tmp=getMap(m->content,"encoding");
1178    if(tmp!=NULL){
1179      return tmp->value;
1180    }
1181    else
1182      return "UTF-8";
1183  }
1184  else
1185    return "UTF-8"; 
1186}
1187
1188char* getVersion(maps* m){
1189  if(m!=NULL){
1190    map* tmp=getMap(m->content,"version");
1191    if(tmp!=NULL){
1192      return tmp->value;
1193    }
1194    else
1195      return "1.0.0";
1196  }
1197  else
1198    return "1.0.0";
1199}
1200
1201void printExceptionReportResponse(maps* m,map* s){
1202 
1203  int buffersize;
1204  xmlDocPtr doc;
1205  xmlChar *xmlbuff;
1206  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
1207  xmlNodePtr n,nc,nc1,nc2;
1208
1209  doc = xmlNewDoc(BAD_CAST "1.0");
1210  maps* tmpMap=getMaps(m,"main");
1211  char *encoding=getEncoding(tmpMap);
1212  printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
1213
1214  ns=xmlNewNs(NULL,BAD_CAST "http://www.opengis.net/ows/1.1",BAD_CAST "ows");
1215  n = xmlNewNode(ns, BAD_CAST "ExceptionReport"); 
1216  ns_ows=xmlNewNs(n,BAD_CAST "http://www.opengis.net/ows/1.1",BAD_CAST "ows");
1217  ns_xlink=xmlNewNs(n,BAD_CAST "http://www.w3.org/1999/xlink",BAD_CAST "xlink");
1218  ns_xsi=xmlNewNs(n,BAD_CAST "http://www.w3.org/2001/XMLSchema-instance",BAD_CAST "xsi");
1219  xmlNewProp(n,BAD_CAST "xsi:schemaLocation",BAD_CAST "http://www.opengis.net/ows/1.1 http://schemas.opengis.net/ows/1.1/owsExceptionReport.xsd");
1220  xmlNewProp(n,BAD_CAST "xml:lang",BAD_CAST "en");
1221  xmlNewProp(n,BAD_CAST "service",BAD_CAST "WPS");
1222
1223  xmlNewProp(n,BAD_CAST "version",BAD_CAST getVersion(tmpMap));
1224
1225  nc = xmlNewNode(ns, BAD_CAST "Exception"); 
1226
1227  map* tmp=getMap(s,"code");
1228  if(tmp!=NULL)
1229    xmlNewProp(nc,BAD_CAST "exceptionCode",BAD_CAST tmp->value);
1230  else
1231    xmlNewProp(nc,BAD_CAST "exceptionCode",BAD_CAST "NoApplicableCode");
1232
1233  tmp=getMap(s,"text");
1234  nc1 = xmlNewNode(ns, BAD_CAST "ExceptionText");
1235  nc2=NULL;
1236  if(tmp!=NULL){
1237    xmlNodeSetContent(nc1, BAD_CAST tmp->value);
1238  }
1239  else{
1240    xmlNodeSetContent(nc1, BAD_CAST "No debug message available");
1241  }
1242  xmlAddChild(nc,nc1);
1243  xmlAddChild(n,nc);
1244  xmlDocSetRootElement(doc, n);
1245
1246  xmlDocDumpFormatMemoryEnc(doc, &xmlbuff, &buffersize, encoding, 1);
1247  printf("%s",xmlbuff);
1248  fflush(stdout);
1249  xmlFreeDoc(doc);
1250  xmlFree(xmlbuff);
1251  xmlFreeNs(ns);
1252  xmlCleanupParser();
1253}
1254
1255
1256void outputResponse(service* s,maps* request_inputs,maps* request_outputs,
1257                    map* request_inputs1,int cpid,maps* m,int res){
1258#ifdef DEBUG
1259  dumpMaps(request_inputs);
1260  dumpMaps(request_outputs);
1261  fprintf(stderr,"printProcessResponse\n");
1262#endif
1263  map* toto=getMap(request_inputs1,"RawDataOutput");
1264  int asRaw=0;
1265  if(toto!=NULL)
1266    asRaw=1;
1267 
1268  if(asRaw==0){
1269#ifdef DEBUG
1270    fprintf(stderr,"REQUEST_OUTPUTS FINAL\n");
1271    dumpMaps(request_outputs);
1272#endif
1273    toto=getMap(request_outputs->content,"asReference");
1274    if(toto!=NULL && strcasecmp(toto->value,"true")==0){
1275      toto=getMap(request_outputs->content,"extension");
1276      map *tmp1=getMapFromMaps(m,"main","tmpPath");
1277      char *file_name=(char*)malloc((strlen(tmp1->value)+strlen(s->name)+strlen(toto->value)+13)*sizeof(char));
1278      sprintf(file_name,"%s/%s_%i.%s",tmp1->value,s->name,cpid+100000,toto->value);
1279      FILE *ofile=fopen(file_name,"w");
1280      map *tmp2=getMapFromMaps(m,"main","tmpUrl");
1281      map *tmp3=getMapFromMaps(m,"main","serverAddress");
1282      char *file_url=(char*)malloc((strlen(tmp3->value)+strlen(tmp2->value)+strlen(s->name)+strlen(toto->value)+13)*sizeof(char));
1283      sprintf(file_url,"%s/%s/%s_%i.%s",tmp3->value,tmp2->value,s->name,cpid+100000,toto->value);
1284      addToMap(request_outputs->content,"Reference",file_url);
1285      toto=getMap(request_outputs->content,"value");
1286      if(toto!=NULL)
1287        fwrite(toto->value,sizeof(char),strlen(toto->value),ofile);
1288      fclose(ofile);
1289      free(file_name);
1290      free(file_url);
1291    }
1292    map *r_inputs=getMap(s->content,"serviceProvider");
1293#ifdef DEBUG
1294    fprintf(stderr,"SERVICE : %s\n",r_inputs->value);
1295    dumpMaps(m);
1296#endif
1297    printProcessResponse(m,request_inputs1,cpid,
1298                          s,r_inputs->value,res,
1299                          request_inputs,
1300                          request_outputs);
1301  }
1302  else{
1303    /**
1304     * We get the first output only !!
1305     */
1306    char mime[1024];
1307    map* mi=getMap(request_outputs->content,"mimeType");
1308#ifdef DEBUG
1309    fprintf(stderr,"SERVICE OUTPUTS\n");
1310    dumpMaps(request_outputs);
1311    fprintf(stderr,"SERVICE OUTPUTS\n");
1312#endif
1313    map* en=getMap(request_outputs->content,"encoding");
1314    if(mi!=NULL && en!=NULL)
1315      sprintf(mime,
1316              "Content-Type: %s; charset=%s\r\nStatus: 200 OK\r\n\r\n",
1317              mi->value,en->value);
1318    else
1319      if(mi!=NULL)
1320        sprintf(mime,
1321                "Content-Type: %s; charset=UTF-8\r\nStatus: 200 OK\r\n\r\n",
1322                mi->value);
1323      else
1324        sprintf(mime,"Content-Type: text/plain; charset=utf-8\r\nStatus: 200 OK\r\n\r\n");
1325    printf("%s",mime);
1326    toto=getMap(request_outputs->content,"value");
1327    if(mi!=NULL && strncmp(mi->value,"image",5)==0){
1328      map* rs=getMapFromMaps(request_outputs,request_outputs->name,"size");
1329      fwrite(toto->value,atoi(rs->value),1,stdout);
1330    }
1331    else
1332      printf("%s",toto->value);
1333#ifdef DEBUG
1334    dumpMap(toto);
1335#endif
1336  }
1337}
1338
1339char *base64(const unsigned char *input, int length)
1340{
1341  BIO *bmem, *b64;
1342  BUF_MEM *bptr;
1343
1344  b64 = BIO_new(BIO_f_base64());
1345  bmem = BIO_new(BIO_s_mem());
1346  b64 = BIO_push(b64, bmem);
1347  BIO_write(b64, input, length);
1348  BIO_flush(b64);
1349  BIO_get_mem_ptr(b64, &bptr);
1350
1351  char *buff = (char *)malloc(bptr->length);
1352  memcpy(buff, bptr->data, bptr->length-1);
1353  buff[bptr->length-1] = 0;
1354
1355  BIO_free_all(b64);
1356
1357  fprintf(stderr,"BASE64 [%s] \n",buff);
1358  return buff;
1359}
1360
1361char* addDefaultValues(maps** out,elements* in,maps* m,char* type){
1362  elements* tmpInputs=in;
1363  maps* out1=*out;
1364  while(tmpInputs!=NULL){
1365    maps *tmpMaps=getMaps(out1,tmpInputs->name);
1366    if(tmpMaps==NULL){
1367      map* tmpMap1=getMap(tmpInputs->content,"minOccurs");
1368      if(strncmp(type,"inputs",6)==0)
1369        if(tmpMap1!=NULL && atoi(tmpMap1->value)>=1){
1370          return tmpInputs->name;
1371        }
1372      maps* tmpMaps2=(maps*)malloc(MAPS_SIZE);
1373      tmpMaps2->name=strdup((char*)tmpInputs->name);
1374      tmpMaps2->content=NULL;
1375      tmpMaps2->next=NULL;
1376      iotype* tmpIoType=tmpInputs->defaults;
1377      while(tmpIoType!=NULL){
1378        addMapToMap(&tmpMaps2->content,tmpIoType->content);
1379        tmpIoType=tmpIoType->next;
1380      }
1381      map *tmpMap=getMap(tmpMaps2->content,"value");
1382      if(tmpMap==NULL)
1383        addToMap(tmpMaps2->content,"value","NULL");
1384      if(out1==NULL){
1385        *out=dupMaps(&tmpMaps2);
1386      }
1387      else
1388        addMapsToMaps(&out1,tmpMaps2);
1389      freeMaps(&tmpMaps2);
1390      free(tmpMaps2);
1391      tmpMaps2=NULL;
1392    }
1393    else{
1394      map* tmpContent=tmpInputs->defaults->content;
1395     
1396      map* cval=NULL;
1397     
1398      while(tmpContent!=NULL){
1399        if((cval=getMap(tmpMaps->content,tmpContent->name))==NULL){
1400#ifdef DEBUG
1401          fprintf(stderr,"addDefaultValues %s => %s\n",tmpContent->name,tmpContent->value);
1402#endif
1403          if(tmpMaps->content==NULL)
1404            tmpMaps->content=createMap(tmpContent->name,tmpContent->value);
1405          else
1406            addToMap(tmpMaps->content,tmpContent->name,tmpContent->value);
1407        }
1408        tmpContent=tmpContent->next;
1409      }
1410    }
1411    tmpInputs=tmpInputs->next;
1412  }
1413  return "";
1414}
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