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

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

Make ZOO Kernel able to speak the natural language you teach him by using gettext tools for creating translation files. Add basic french translation .po files as current messages.po. Gettext Domains used are zoo-kernel and zoo-services.

File size: 46.3 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(strncasecmp(tmp2->name,"keywords",8)!=0 &&
312         strncasecmp(tmp2->name,"serverAddress",13)!=0 &&
313         strncasecmp(tmp2->name,"lang",4)!=0 &&
314         strncasecmp(tmp2->name,"encoding",8)!=0 &&
315         strncasecmp(tmp2->name,"version",7)!=0){
316        tmp2->name[0]=toupper(tmp2->name[0]);
317        nc1 = xmlNewNode(ns_ows, BAD_CAST tmp2->name);
318        xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
319        xmlAddChild(nc,nc1);
320      }
321      else
322        if(strcmp(tmp2->name,"keywords")==0){
323          nc1 = xmlNewNode(ns_ows, BAD_CAST "Keywords");
324          char *toto=tmp2->value;
325          char buff[256];
326          int i=0;
327          int j=0;
328          while(toto[i]){
329            if(toto[i]!=',' && toto[i]!=0){
330              buff[j]=toto[i];
331              buff[j+1]=0;
332              j++;
333            }
334            else{
335              nc2 = xmlNewNode(ns_ows, BAD_CAST "Keyword");
336              xmlAddChild(nc2,xmlNewText(BAD_CAST buff));             
337              xmlAddChild(nc1,nc2);
338              j=0;
339            }
340            i++;
341          }
342          if(strlen(buff)>0){
343            nc2 = xmlNewNode(ns_ows, BAD_CAST "Keyword");
344            xmlAddChild(nc2,xmlNewText(BAD_CAST buff));       
345            xmlAddChild(nc1,nc2);
346          }
347          xmlAddChild(nc,nc1);
348          nc2 = xmlNewNode(ns_ows, BAD_CAST "ServiceType");
349          xmlAddChild(nc2,xmlNewText(BAD_CAST "WPS"));
350          xmlAddChild(nc,nc2);
351          nc2 = xmlNewNode(ns_ows, BAD_CAST "ServiceTypeVersion");
352          xmlAddChild(nc2,xmlNewText(BAD_CAST "1.0.0"));
353          xmlAddChild(nc,nc2);   
354        }
355      tmp2=tmp2->next;
356    }
357  }
358  else{
359    fprintf(stderr,"TMP4 NOT FOUND !!");
360    return NULL;
361  }
362  xmlAddChild(n,nc);
363
364  nc = xmlNewNode(ns_ows, BAD_CAST "ServiceProvider");
365  nc3 = xmlNewNode(ns_ows, BAD_CAST "ServiceContact");
366  nc4 = xmlNewNode(ns_ows, BAD_CAST "ContactInfo");
367  nc5 = xmlNewNode(ns_ows, BAD_CAST "Phone");
368  nc6 = xmlNewNode(ns_ows, BAD_CAST "Address");
369  tmp4=getMaps(m,"provider");
370  if(tmp4!=NULL){
371    map* tmp2=tmp4->content;
372    while(tmp2!=NULL){
373      if(strcmp(tmp2->name,"keywords")!=0 &&
374         strcmp(tmp2->name,"serverAddress")!=0 &&
375         strcmp(tmp2->name,"lang")!=0){
376        tmp2->name[0]=toupper(tmp2->name[0]);
377        if(strcmp(tmp2->name,"ProviderName")==0){
378          nc1 = xmlNewNode(ns_ows, BAD_CAST tmp2->name);
379          xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
380          xmlAddChild(nc,nc1);
381        }
382        else{
383          if(strcmp(tmp2->name,"ProviderSite")==0){
384            nc1 = xmlNewNode(ns_ows, BAD_CAST tmp2->name);
385            xmlNewNsProp(nc1,ns_xlink,BAD_CAST "href",BAD_CAST tmp2->value);
386            xmlAddChild(nc,nc1);
387          } 
388          else 
389            if(strcmp(tmp2->name,"IndividualName")==0 || 
390               strcmp(tmp2->name,"PositionName")==0){
391              nc1 = xmlNewNode(ns_ows, BAD_CAST tmp2->name);
392              xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
393              xmlAddChild(nc3,nc1);
394            } 
395            else 
396              if(strncmp(tmp2->name,"Phone",5)==0){
397                char *toto=NULL;
398                char *toto1=tmp2->name;
399                toto=strstr(toto1,"Phone");
400                nc1 = xmlNewNode(ns_ows, BAD_CAST toto1+5);
401                xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
402                xmlAddChild(nc5,nc1);
403              }
404              else 
405                if(strncmp(tmp2->name,"Address",7)==0){
406                  char *toto=NULL;
407                  char *toto1=tmp2->name;
408                  toto=strstr(toto1,"Address");
409                  nc1 = xmlNewNode(ns_ows, BAD_CAST toto1+7);
410                  xmlAddChild(nc1,xmlNewText(BAD_CAST tmp2->value));
411                  xmlAddChild(nc6,nc1);
412                }
413        }
414      }
415      else
416        if(strcmp(tmp2->name,"keywords")==0){
417          nc1 = xmlNewNode(ns_ows, BAD_CAST "Keywords");
418          char *toto=tmp2->value;
419          char buff[256];
420          int i=0;
421          int j=0;
422          while(toto[i]){
423            if(toto[i]!=',' && toto[i]!=0){
424              buff[j]=toto[i];
425              buff[j+1]=0;
426              j++;
427            }
428            else{
429              nc2 = xmlNewNode(ns_ows, BAD_CAST "Keyword");
430              xmlAddChild(nc2,xmlNewText(BAD_CAST buff));             
431              xmlAddChild(nc1,nc2);
432              j=0;
433            }
434            i++;
435          }
436          if(strlen(buff)>0){
437            nc2 = xmlNewNode(ns_ows, BAD_CAST "Keyword");
438            xmlAddChild(nc2,xmlNewText(BAD_CAST buff));       
439            xmlAddChild(nc1,nc2);
440          }
441          xmlAddChild(nc,nc1);
442        }
443      tmp2=tmp2->next;
444    }
445  }
446  else{
447    fprintf(stderr,"TMP4 NOT FOUND !!");
448  }
449  xmlAddChild(nc4,nc5);
450  xmlAddChild(nc4,nc6);
451  xmlAddChild(nc3,nc4);
452  xmlAddChild(nc,nc3);
453  xmlAddChild(n,nc);
454
455
456  nc = xmlNewNode(ns_ows, BAD_CAST "OperationsMetadata");
457  char *tmp2[3];
458  tmp2[0]=strdup("GetCapabilities");
459  tmp2[1]=strdup("DescribeProcess");
460  tmp2[2]=strdup("Execute");
461  int j=0;
462
463  if(toto1!=NULL){
464    map* tmp=getMap(toto1->content,"serverAddress");
465    if(tmp!=NULL){
466      SERVICE_URL = strdup(tmp->value);
467    }
468    else
469      SERVICE_URL = strdup("not_found");
470  }
471  else
472    SERVICE_URL = strdup("not_found");
473
474  for(j=0;j<3;j++){
475    nc1 = xmlNewNode(ns_ows, BAD_CAST "Operation");
476    xmlNewProp(nc1,BAD_CAST "name",BAD_CAST tmp2[j]);
477    nc2 = xmlNewNode(ns_ows, BAD_CAST "DCP");
478    nc3 = xmlNewNode(ns_ows, BAD_CAST "HTTP");
479    nc4 = xmlNewNode(ns_ows, BAD_CAST "Get");
480    sprintf(tmp,"%s/%s",SERVICE_URL,service);
481    xmlNewNsProp(nc4,ns_xlink,BAD_CAST "href",BAD_CAST tmp);
482    xmlAddChild(nc3,nc4);
483    if(j>0){
484      nc4 = xmlNewNode(ns_ows, BAD_CAST "Post");
485      xmlNewNsProp(nc4,ns_xlink,BAD_CAST "href",BAD_CAST tmp);
486      xmlAddChild(nc3,nc4);
487    }
488    xmlAddChild(nc2,nc3);
489    xmlAddChild(nc1,nc2);   
490    xmlAddChild(nc,nc1);   
491  }
492  for(j=2;j>=0;j--)
493    free(tmp2[j]);
494  xmlAddChild(n,nc);
495
496  nc = xmlNewNode(ns, BAD_CAST "ProcessOfferings");
497  xmlAddChild(n,nc);
498
499  nc1 = xmlNewNode(ns, BAD_CAST "Languages");
500  nc2 = xmlNewNode(ns, BAD_CAST "Default");
501  nc3 = xmlNewNode(ns, BAD_CAST "Supported");
502 
503  toto1=getMaps(m,"main");
504  if(toto1!=NULL){
505    map* tmp1=getMap(toto1->content,"lang");
506    char *toto=tmp1->value;
507    char buff[256];
508    int i=0;
509    int j=0;
510    int dcount=0;
511    while(toto[i]){
512      if(toto[i]!=',' && toto[i]!=0){
513        buff[j]=toto[i];
514        buff[j+1]=0;
515        j++;
516      }
517      else{
518        nc4 = xmlNewNode(ns_ows, BAD_CAST "Language");
519        xmlAddChild(nc4,xmlNewText(BAD_CAST buff));
520        if(dcount==0){
521          xmlAddChild(nc2,nc4);
522          xmlAddChild(nc1,nc2);
523          dcount++;
524        }
525        nc4 = xmlNewNode(ns_ows, BAD_CAST "Language");
526        xmlAddChild(nc4,xmlNewText(BAD_CAST buff));
527        xmlAddChild(nc3,nc4);
528        j=0;
529        buff[j]=0;
530      }
531      i++;
532    }
533    if(strlen(buff)>0){
534      nc4 = xmlNewNode(ns_ows, BAD_CAST "Language");
535      xmlAddChild(nc4,xmlNewText(BAD_CAST buff));             
536      xmlAddChild(nc3,nc4);
537    }
538  }
539  xmlAddChild(nc1,nc3);
540  xmlAddChild(n,nc1);
541 
542  xmlDocSetRootElement(doc, n);
543  //xmlFreeNs(ns);
544  free(SERVICE_URL);
545  return nc;
546}
547
548void printGetCapabilitiesForProcess(maps* m,xmlNodePtr nc,service* serv){
549  xmlNsPtr ns,ns_ows,ns_xlink;
550  xmlNodePtr nr,n,nc1,nc2,nc3,nc4,nc5,nc6,pseudor;
551  /**
552   * Initialize or get existing namspaces
553   */
554  int wpsId=zooXmlAddNs(NULL,"http://www.opengis.net/wps/1.0.0","wps");
555  ns=usedNs[wpsId];
556  int owsId=zooXmlAddNs(NULL,"http://www.opengis.net/ows/1.1","ows");
557  ns_ows=usedNs[owsId];
558  int xlinkId=zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
559  ns_xlink=usedNs[xlinkId];
560
561  int cursor=0;
562  map* tmp1;
563  if(serv->content!=NULL){
564    nc1 = xmlNewNode(ns, BAD_CAST "Process");
565    tmp1=getMap(serv->content,"processVersion");
566    if(tmp1!=NULL)
567      xmlNewNsProp(nc1,ns,BAD_CAST "processVersion",BAD_CAST tmp1->value);
568    printDescription(nc1,ns_ows,serv->name,serv->content);
569    tmp1=serv->metadata;
570    while(tmp1!=NULL){
571      nc2 = xmlNewNode(ns_ows, BAD_CAST "Metadata");
572      xmlNewNsProp(nc2,ns_xlink,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
573      xmlAddChild(nc1,nc2);
574      tmp1=tmp1->next;
575    }
576    xmlAddChild(nc,nc1);
577  }
578}
579
580xmlNodePtr printDescribeProcessHeader(xmlDocPtr doc,char* service,maps* m){
581
582  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
583  xmlNodePtr n,nr;
584  xmlChar *xmlbuff;
585  int buffersize;
586
587  int wpsId=zooXmlAddNs(NULL,"http://schemas.opengis.net/wps/1.0.0","wps");
588  ns=usedNs[wpsId];
589  n = xmlNewNode(ns, BAD_CAST "ProcessDescriptions");
590  int owsId=zooXmlAddNs(n,"http://www.opengis.net/ows/1.1","ows");
591  ns_ows=usedNs[owsId];
592  xmlNewNs(n,BAD_CAST "http://www.opengis.net/wps/1.0.0",BAD_CAST "wps");
593  zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
594  int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
595  ns_xsi=usedNs[xsiId];
596 
597  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");
598  xmlNewProp(n,BAD_CAST "service",BAD_CAST "WPS");
599  xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.0.0");
600  addLangAttr(n,m);
601
602  xmlDocSetRootElement(doc, n);
603
604  return n;
605}
606
607void printDescribeProcessForProcess(maps* m,xmlNodePtr nc,service* serv,int sc){
608  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
609  xmlNodePtr nr,n,nc1,nc2,nc3,nc4,nc5,nc6,pseudor;
610
611  char tmp[256];
612  n=nc;
613 
614  int wpsId=zooXmlAddNs(NULL,"http://schemas.opengis.net/wps/1.0.0","wps");
615  ns=usedNs[wpsId];
616  int owsId=zooXmlAddNs(NULL,"http://www.opengis.net/ows/1.1","ows");
617  ns_ows=usedNs[owsId];
618  int xlinkId=zooXmlAddNs(NULL,"http://www.w3.org/1999/xlink","xlink");
619  ns_xlink=usedNs[xlinkId];
620
621  nc = xmlNewNode(NULL, BAD_CAST "ProcessDescription");
622  char *tmp4[3];
623  tmp4[0]="processVersion";
624  tmp4[1]="storeSupported";
625  tmp4[2]="statusSupported";
626  int j=0;
627  map* tmp1=NULL;
628  for(j=0;j<3;j++){
629    tmp1=getMap(serv->content,tmp4[j]);
630    if(tmp1!=NULL){
631      if(j==0)
632        xmlNewNsProp(nc,ns,BAD_CAST "processVersion",BAD_CAST tmp1->value);     
633      else
634        xmlNewProp(nc,BAD_CAST tmp4[j],BAD_CAST tmp1->value);     
635    }
636    else{
637      if(j>0)
638        xmlNewProp(nc,BAD_CAST tmp4[j],BAD_CAST "false");     
639    }
640  }
641 
642  printDescription(nc,ns_ows,serv->name,serv->content);
643
644  tmp1=serv->metadata;
645  while(tmp1!=NULL){
646    nc1 = xmlNewNode(ns_ows, BAD_CAST "Metadata");
647    xmlNewNsProp(nc1,ns_xlink,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
648    xmlAddChild(nc,nc1);
649    tmp1=tmp1->next;
650  }
651
652  tmp1=getMap(serv->content,"Profile");
653  if(tmp1!=NULL){
654    nc1 = xmlNewNode(ns, BAD_CAST "Profile");
655    xmlAddChild(nc1,xmlNewText(BAD_CAST tmp1->value));
656    xmlAddChild(nc,nc1);
657  }
658
659  nc1 = xmlNewNode(NULL, BAD_CAST "DataInputs");
660 
661  elements* e=serv->inputs;
662  while(e!=NULL){
663    nc2 = xmlNewNode(NULL, BAD_CAST "Input");
664    tmp1=getMap(e->content,"minOccurs");
665    if(tmp1){
666      xmlNewProp(nc2,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
667    }
668    tmp1=getMap(e->content,"maxOccurs");
669    if(tmp1){
670      xmlNewProp(nc2,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
671    }
672
673    printDescription(nc2,ns_ows,e->name,e->content);
674
675
676    nc3 = xmlNewNode(NULL, BAD_CAST e->format);
677    iotype* _tmp=e->defaults;
678    int datatype=0;
679    if(_tmp!=NULL){
680      int isAnyValue=1;
681      if(strcmp(e->format,"LiteralData")!=0){
682        nc4 = xmlNewNode(NULL, BAD_CAST "Default");
683        nc5 = xmlNewNode(NULL, BAD_CAST "Format");
684      }
685      else{
686        nc4 = xmlNewNode(NULL, BAD_CAST "UOMs");
687        nc5 = xmlNewNode(NULL, BAD_CAST "Default");
688        datatype=1;
689      }
690      tmp1=_tmp->content;
691      int default1=0;
692      xmlNodePtr nc7;
693      while(tmp1!=NULL){
694#ifdef DEBUG
695        printf("DATATYPE DEFAULT ? %s\n",tmp1->name);
696#endif
697        if(strncasecmp(tmp1->name,"DataType",8)==0){
698          nc6 = xmlNewNode(ns_ows, BAD_CAST "DataType");
699          xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
700          char tmp[1024];
701          sprintf(tmp,"http://www.w3.org/TR/xmlschema-2/#%s",tmp1->value);
702          xmlNewNsProp(nc6,ns_ows,BAD_CAST "reference",BAD_CAST tmp);
703          xmlAddChild(nc3,nc6);
704          tmp1=tmp1->next;
705          continue;
706        }
707        if(strcasecmp(tmp1->name,"asReference")!=0 && 
708           strcasecmp(tmp1->name,"DataType")!=0 && 
709           strncasecmp(tmp1->name,"AllowedValues",13)!=0 &&
710           strcasecmp(tmp1->name,"value")!=0 &&
711           strcasecmp(tmp1->name,"extension")!=0){
712          if(datatype==0){
713            char *tmp2=zCapitalize1(tmp1->name);
714            nc6 = xmlNewNode(NULL, BAD_CAST tmp2);
715            free(tmp2);
716          }
717          else{
718            char *tmp2=zCapitalize(tmp1->name);
719            nc6 = xmlNewNode(ns_ows, BAD_CAST tmp2);
720            free(tmp2);
721          }
722          xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
723          xmlAddChild(nc5,nc6);
724        }
725        else{
726          if(strcmp(tmp1->name,"value")==0){
727            nc7 = xmlNewNode(NULL, BAD_CAST "DefaultValue");
728            xmlAddChild(nc7,xmlNewText(BAD_CAST tmp1->value));
729            default1=1;
730          }
731          if(strncasecmp(tmp1->name,"AllowedValues",13)==0){
732            nc6 = xmlNewNode(ns_ows, BAD_CAST "AllowedValues");
733            char *token,*saveptr1;
734            token=strtok_r(tmp1->value,",",&saveptr1);
735            while(token!=NULL){
736                nc7 = xmlNewNode(ns_ows, BAD_CAST "Value");
737                char *tmps=strdup(token);
738                tmps[strlen(tmps)]=0;
739                xmlAddChild(nc7,xmlNewText(BAD_CAST tmps));
740                fprintf(stderr,"strgin : %s\n",tmps);
741                xmlAddChild(nc6,nc7);
742                token=strtok_r(NULL,",",&saveptr1);
743            }
744            xmlAddChild(nc3,nc6);
745            isAnyValue=-1;
746          }
747        }
748        tmp1=tmp1->next;
749      }
750      xmlAddChild(nc4,nc5);
751      xmlAddChild(nc3,nc4);
752      if(datatype==1 && isAnyValue==1){
753        xmlAddChild(nc3,xmlNewNode(ns_ows, BAD_CAST "AnyValue"));
754        if(default1>0)
755          xmlAddChild(nc3,nc7);
756      }
757      if(datatype==1 && default1>0)
758        xmlAddChild(nc3,nc7);
759    }
760    xmlAddChild(nc2,nc3);
761   
762    _tmp=e->supported;
763    while(_tmp!=NULL){
764      if(datatype==0){
765        nc4 = xmlNewNode(NULL, BAD_CAST "Supported");
766        nc5 = xmlNewNode(NULL, BAD_CAST "Format");
767      }
768      else{
769        nc5 = xmlNewNode(NULL, BAD_CAST "Supported");
770      }
771      tmp1=_tmp->content;
772      while(tmp1!=NULL){
773        /*if(strcmp(e->format,"LiteralData")==0)
774          xmlAddChild(nc5,nc6);*/
775        if(datatype==0){
776          char *tmp2=zCapitalize1(tmp1->name);
777          nc6 = xmlNewNode(NULL, BAD_CAST tmp2);
778          free(tmp2);
779        }
780        else{
781          char *tmp2=zCapitalize(tmp1->name);     
782          nc6 = xmlNewNode(ns_ows, BAD_CAST tmp2);
783          free(tmp2);
784        }
785        xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
786        xmlAddChild(nc5,nc6);
787        tmp1=tmp1->next;
788      }
789      if(datatype==0){
790        xmlAddChild(nc4,nc5);
791        xmlAddChild(nc3,nc4);
792      }else{
793        xmlAddChild(nc4,nc5);
794        //xmlAddChild(nc3,xmlNewNode(ns_ows, BAD_CAST "AnyValue"));
795      }
796      _tmp=_tmp->next;
797      if(strcmp(e->format,"LiteralData")!=0){
798        xmlAddChild(nc2,nc3);
799      }
800      xmlAddChild(nc1,nc2);
801    }
802   
803   
804    e=e->next;
805  }
806  xmlAddChild(nc,nc1);
807
808  nc1 = xmlNewNode(NULL, BAD_CAST "ProcessOutputs");
809 
810  e=serv->outputs;
811  while(e!=NULL){
812    nc2 = xmlNewNode(NULL, BAD_CAST "Output");
813    tmp1=getMap(e->content,"minOccurs");
814    if(tmp1){
815      xmlNewProp(nc2,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
816    }
817    tmp1=getMap(e->content,"maxOccurs");
818    if(tmp1){
819      xmlNewProp(nc2,BAD_CAST tmp1->name,BAD_CAST tmp1->value);
820    }
821
822    printDescription(nc2,ns_ows,e->name,e->content);
823
824    if(strncasecmp(e->format,"LITERALDATA",strlen(e->format))==0)
825      nc3 = xmlNewNode(NULL, BAD_CAST "LiteralOutput");
826    else
827      if(strncasecmp(e->format,"COMPLEXDATA",strlen(e->format))==0)
828        nc3 = xmlNewNode(NULL, BAD_CAST "ComplexOutput");
829      else
830        nc3 = xmlNewNode(NULL, BAD_CAST e->format);
831    iotype* _tmp=e->defaults;
832    int datatype=0;
833    if(_tmp!=NULL){
834     if(strcmp(e->format,"LiteralOutput")==0 ||
835        strcmp(e->format,"LiteralData")==0){
836        datatype=1;
837        nc4 = xmlNewNode(NULL, BAD_CAST "UOMs");
838        nc5 = xmlNewNode(NULL, BAD_CAST "Default");
839     }
840      else{
841        nc4 = xmlNewNode(NULL, BAD_CAST "Default");
842        nc5 = xmlNewNode(NULL, BAD_CAST "Format");
843      }
844      tmp1=_tmp->content;
845      while(tmp1!=NULL){
846#ifdef DEBUG
847        printf("DATATYPE DEFAULT ? %s\n",tmp1->name);
848#endif
849        if(strncasecmp(tmp1->name,"DataType",8)==0){
850          nc6 = xmlNewNode(ns_ows, BAD_CAST "DataType");
851          xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
852          char tmp[1024];
853          sprintf(tmp,"http://www.w3.org/TR/xmlschema-2/#%s",tmp1->value);
854          xmlNewNsProp(nc6,ns_ows,BAD_CAST "reference",BAD_CAST tmp);
855          xmlAddChild(nc3,nc6);
856          tmp1=tmp1->next;
857          datatype=1;
858          continue;
859        }
860        if(strcmp(tmp1->name,"asReference")!=0 &&
861           strncasecmp(tmp1->name,"DataType",8)!=0 &&
862           strcasecmp(tmp1->name,"extension")!=0){
863          if(datatype==0){
864            char *tmp2=zCapitalize1(tmp1->name);
865            nc6 = xmlNewNode(NULL, BAD_CAST tmp2);
866            free(tmp2);
867          }
868          else{
869            char *tmp2=zCapitalize(tmp1->name);
870            nc6 = xmlNewNode(ns_ows, BAD_CAST tmp2);
871            free(tmp2);
872          }
873          xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
874          xmlAddChild(nc5,nc6);
875        }
876        tmp1=tmp1->next;
877      }
878      xmlAddChild(nc4,nc5);
879      xmlAddChild(nc3,nc4);         
880    }
881    _tmp=e->supported;
882    while(_tmp!=NULL){
883    if(datatype==0){
884      nc4 = xmlNewNode(NULL, BAD_CAST "Supported");
885      nc5 = xmlNewNode(NULL, BAD_CAST "Format");
886      }
887      else
888      nc5 = xmlNewNode(NULL, BAD_CAST "Supported");
889      tmp1=_tmp->content;
890      while(tmp1!=NULL){
891#ifdef DEBUG
892        printf("DATATYPE SUPPORTED ? %s\n",tmp1->name);
893#endif
894        if(strcmp(tmp1->name,"asReference")!=0 && 
895           strcmp(tmp1->name,"DataType")!=0 &&
896           strcasecmp(tmp1->name,"extension")!=0){
897          if(datatype==0){
898            char *tmp2=zCapitalize1(tmp1->name);
899            nc6 = xmlNewNode(NULL, BAD_CAST tmp2);
900            free(tmp2);
901          }
902          else{
903            char *tmp2=zCapitalize(tmp1->name);
904            nc6 = xmlNewNode(ns_ows, BAD_CAST tmp2);
905            free(tmp2);
906          }
907          xmlAddChild(nc6,xmlNewText(BAD_CAST tmp1->value));
908          xmlAddChild(nc5,nc6);
909        }
910        tmp1=tmp1->next;
911      }
912      _tmp=_tmp->next;
913      if(datatype==0){
914         xmlAddChild(nc4,nc5);
915         xmlAddChild(nc3,nc4);
916      }else
917      xmlAddChild(nc4,nc5);
918    }
919    xmlAddChild(nc2,nc3);
920
921    xmlAddChild(nc3,nc4);
922     
923   
924    xmlAddChild(nc2,nc3);
925   
926    xmlAddChild(nc1,nc2);
927   
928    e=e->next;
929  }
930  xmlAddChild(nc,nc1);
931
932  xmlAddChild(n,nc);
933
934}
935
936void printProcessResponse(maps* m,map* request, int pid,service* serv,char* service,int status,maps* inputs,maps* outputs){
937  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
938  xmlNodePtr nr,n,nc,nc1,nc2,nc3,pseudor;
939  xmlDocPtr doc;
940  xmlChar *xmlbuff;
941  int buffersize;
942  time_t time1; 
943  time(&time1);
944  /**
945   * Create the document and its temporary root.
946   */
947  doc = xmlNewDoc(BAD_CAST "1.0");
948  int wpsId=zooXmlAddNs(NULL,"http://www.opengis.net/wps/1.0.0","wps");
949  ns=usedNs[wpsId];
950 
951  n = xmlNewNode(ns, BAD_CAST "ExecuteResponse");
952  int owsId=zooXmlAddNs(n,"http://www.opengis.net/ows/1.1","ows");
953  ns_ows=usedNs[owsId];
954  int xlinkId=zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
955  ns_xlink=usedNs[xlinkId];
956  int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
957  ns_xsi=usedNs[xsiId];
958  xmlNewNs(n,BAD_CAST "http://www.opengis.net/wps/1.0.0",BAD_CAST "wps");
959
960  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");
961 
962  xmlNewProp(n,BAD_CAST "service",BAD_CAST "WPS");
963  xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.0.0");
964  addLangAttr(n,m);
965
966  char tmp[256];
967  char url[1024];
968  memset(tmp,0,256);
969  memset(url,0,256);
970  maps* tmp_maps=getMaps(m,"main");
971  if(tmp_maps!=NULL){
972    map* tmpm1=getMap(tmp_maps->content,"serverAddress");
973    /**
974     * Check if the ZOO Service GetStatus is available in the local directory.
975     * If yes, then it uses a reference to an URL which the client can access
976     * to get information on the status of a running Service (using the
977     * percentCompleted attribute).
978     * Else fallback to the initial method using the xml file to write in ...
979     */
980    char ntmp[1024];
981#ifndef WIN32
982    getcwd(ntmp,1024);
983#else
984    _getcwd(ntmp,1024);
985#endif
986    struct stat myFileInfo;
987    int statRes;
988    char file_path[1024];
989    sprintf(file_path,"%s/GetStatus.zcfg",ntmp);
990    statRes=stat(file_path,&myFileInfo);
991    if(statRes==0){
992      char currentSid[128];
993      map* tmpm=getMap(tmp_maps->content,"rewriteUrl");
994      map *tmp_lenv=NULL;
995      tmp_lenv=getMapFromMaps(m,"lenv","sid");
996      if(tmp_lenv==NULL)
997        sprintf(currentSid,"%i",pid);
998      else
999        sprintf(currentSid,"%s",tmp_lenv->value);
1000      if(tmpm==NULL || strcasecmp(tmpm->value,"false")==0){
1001        sprintf(url,"%s/?request=Execute&amp;service=WPS&amp;version=1.0.0&amp;Identifier=GetStatus&amp;DataInputs=sid=%s&amp;RawDataOutput=Result",tmpm1->value,currentSid);
1002      }else{
1003        if(strlen(tmpm->value)>0)
1004          if(strcasecmp(tmpm->value,"true")!=0)
1005            sprintf(url,"%s/%s/GetStatus/%s",tmpm1->value,tmpm->value,currentSid);
1006          else
1007            sprintf(url,"%s/GetStatus/%s",tmpm1->value,currentSid);
1008        else
1009          sprintf(url,"%s/?request=Execute&amp;service=WPS&amp;version=1.0.0&amp;Identifier=GetStatus&amp;DataInputs=sid=%s&amp;RawDataOutput=Result",tmpm1->value,currentSid);
1010      }
1011    }else{
1012      map* tmpm2=getMap(tmp_maps->content,"tmpUrl");
1013      if(tmpm1!=NULL && tmpm2!=NULL){
1014        sprintf(url,"%s/%s/%s_%i.xml",tmpm1->value,tmpm2->value,service,pid);
1015      }
1016    }
1017    if(tmpm1!=NULL)
1018      sprintf(tmp,"%s/",tmpm1->value);
1019  }
1020
1021  xmlNewProp(n,BAD_CAST "serviceInstance",BAD_CAST tmp);
1022  if(status!=SERVICE_SUCCEEDED && status!=SERVICE_FAILED){
1023    xmlNewProp(n,BAD_CAST "statusLocation",BAD_CAST url);
1024  }
1025
1026  nc = xmlNewNode(ns, BAD_CAST "Process");
1027  map* tmp2=getMap(serv->content,"processVersion");
1028
1029  if(tmp2!=NULL)
1030    xmlNewNsProp(nc,ns,BAD_CAST "processVersion",BAD_CAST tmp2->value);
1031 
1032  printDescription(nc,ns_ows,serv->name,serv->content);
1033  fflush(stderr);
1034
1035  xmlAddChild(n,nc);
1036
1037  nc = xmlNewNode(ns, BAD_CAST "Status");
1038  const struct tm *tm;
1039  size_t len;
1040  time_t now;
1041  char *tmp1;
1042  map *tmpStatus;
1043 
1044  now = time ( NULL );
1045  tm = localtime ( &now );
1046
1047  tmp1 = (char*)malloc((TIME_SIZE+1)*sizeof(char));
1048
1049  len = strftime ( tmp1, TIME_SIZE, "%Y-%m-%dT%I:%M:%SZ", tm );
1050
1051  xmlNewProp(nc,BAD_CAST "creationTime",BAD_CAST tmp1);
1052
1053  char sMsg[2048];
1054  switch(status){
1055  case SERVICE_SUCCEEDED:
1056    nc1 = xmlNewNode(ns, BAD_CAST "ProcessSucceeded");
1057    sprintf(sMsg,_("Service \"%s\" run successfully."),serv->name);
1058    nc3=xmlNewText(BAD_CAST sMsg);
1059    xmlAddChild(nc1,nc3);
1060    break;
1061  case SERVICE_STARTED:
1062    nc1 = xmlNewNode(ns, BAD_CAST "ProcessStarted");
1063    tmpStatus=getMapFromMaps(m,"lenv","status");
1064    xmlNewProp(nc1,BAD_CAST "percentCompleted",BAD_CAST tmpStatus->value);
1065    sprintf(sMsg,_("ZOO Service \"%s\" is currently running. Please, reload this document to get the up-to-date status of the Service."),serv->name);
1066    nc3=xmlNewText(BAD_CAST sMsg);
1067    xmlAddChild(nc1,nc3);
1068    break;
1069  case SERVICE_ACCEPTED:
1070    nc1 = xmlNewNode(ns, BAD_CAST "ProcessAccepted");
1071    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);
1072    nc3=xmlNewText(BAD_CAST sMsg);
1073    xmlAddChild(nc1,nc3);
1074    break;
1075  case SERVICE_FAILED:
1076    nc1 = xmlNewNode(ns, BAD_CAST "ProcessFailed");
1077    map *errorMap;
1078    map *te;
1079    te=getMapFromMaps(m,"lenv","code");
1080    if(te!=NULL)
1081      errorMap=createMap("code",te->value);
1082    else
1083      errorMap=createMap("code","NoApplicableCode");
1084    te=getMapFromMaps(m,"lenv","message");
1085    if(te!=NULL)
1086      addToMap(errorMap,"text",te->value);
1087    else
1088      addToMap(errorMap,"text",_("No more information available"));
1089    nc3=createExceptionReportNode(m,errorMap,0);
1090    xmlAddChild(nc1,nc3);
1091    break;
1092  default :
1093    printf(_("error code not know : %i\n"),status);
1094    //exit(1);
1095    break;
1096  }
1097  xmlAddChild(nc,nc1);
1098  xmlAddChild(n,nc);
1099  free(tmp1);
1100
1101#ifdef DEBUG
1102  fprintf(stderr,"printProcessResponse 1 161\n");
1103#endif
1104
1105  map* lineage=getMap(request,"lineage");
1106  if(lineage!=NULL){
1107    nc = xmlNewNode(ns, BAD_CAST "DataInputs");
1108    int i;
1109    maps* mcursor=inputs;
1110    elements* scursor=serv->inputs;
1111    while(mcursor!=NULL /*&& scursor!=NULL*/){
1112      printIOType(doc,nc,ns,ns_ows,scursor,mcursor,"Input");
1113      mcursor=mcursor->next;
1114      //scursor=scursor->next;
1115    }
1116    xmlAddChild(n,nc);
1117   
1118#ifdef DEBUG
1119    fprintf(stderr,"printProcessResponse 1 177\n");
1120#endif
1121
1122    nc = xmlNewNode(ns, BAD_CAST "OutputDefinitions");
1123    mcursor=outputs;
1124    scursor=serv->outputs;
1125    while(mcursor!=NULL /*&& scursor!=NULL*/){
1126      printOutputDefinitions1(doc,nc,ns,ns_ows,scursor,mcursor,"Output");
1127      mcursor=mcursor->next;
1128      //scursor=scursor->next;
1129    }
1130    xmlAddChild(n,nc);
1131  }
1132#ifdef DEBUG
1133  fprintf(stderr,"printProcessResponse 1 190\n");
1134#endif
1135
1136  /**
1137   * Display the process output only when requested !
1138   */
1139  if(status==SERVICE_SUCCEEDED){
1140    nc = xmlNewNode(ns, BAD_CAST "ProcessOutputs");
1141    maps* mcursor=outputs;
1142    elements* scursor=serv->outputs;
1143    while(mcursor!=NULL && scursor!=NULL){
1144      printIOType(doc,nc,ns,ns_ows,scursor,mcursor,"Output");
1145      mcursor=mcursor->next;
1146      scursor=scursor->next;
1147    }
1148    xmlAddChild(n,nc);
1149  }
1150#ifdef DEBUG
1151  fprintf(stderr,"printProcessResponse 1 202\n");
1152#endif
1153  xmlDocSetRootElement(doc, n);
1154  printDocument(m,doc,pid);
1155
1156  xmlCleanupParser();
1157  zooXmlCleanupNs();
1158}
1159
1160
1161void printDocument(maps* m, xmlDocPtr doc,int pid){
1162  rewind(stdout);
1163  char *encoding=getEncoding(m);
1164  if(pid==getpid()){
1165    printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
1166  }
1167  fflush(stdout);
1168  xmlChar *xmlbuff;
1169  int buffersize;
1170  /*
1171   * Dump the document to a buffer and print it on stdout
1172   * for demonstration purposes.
1173   */
1174  xmlDocDumpFormatMemoryEnc(doc, &xmlbuff, &buffersize, encoding, 1);
1175  printf((char *) xmlbuff);
1176  //fflush(stdout);
1177  /*
1178   * Free associated memory.
1179   */
1180  xmlFree(xmlbuff);
1181  xmlFreeDoc(doc);
1182  xmlCleanupParser();
1183  zooXmlCleanupNs();
1184}
1185
1186void printOutputDefinitions1(xmlDocPtr doc,xmlNodePtr nc,xmlNsPtr ns_wps,xmlNsPtr ns_ows,elements* e,maps* m,char* type){
1187  xmlNodePtr nc1;
1188  nc1=xmlNewNode(ns_wps, BAD_CAST type);
1189  map *tmp=NULL; 
1190  if(e!=NULL && e->defaults!=NULL)
1191    tmp=e->defaults->content;
1192  else{
1193    /*
1194    dumpElements(e);
1195    */
1196    return;
1197  }
1198  while(tmp!=NULL){
1199    if(strncasecmp(tmp->name,"MIMETYPE",strlen(tmp->name))==0
1200       || strncasecmp(tmp->name,"ENCODING",strlen(tmp->name))==0
1201       || strncasecmp(tmp->name,"SCHEMA",strlen(tmp->name))==0
1202       || strncasecmp(tmp->name,"UOM",strlen(tmp->name))==0)
1203    xmlNewProp(nc1,BAD_CAST tmp->name,BAD_CAST tmp->value);
1204    tmp=tmp->next;
1205  }
1206  tmp=getMap(e->defaults->content,"asReference");
1207  if(tmp==NULL)
1208    xmlNewProp(nc1,BAD_CAST "asReference",BAD_CAST "false");
1209
1210  tmp=e->content;
1211
1212  printDescription(nc1,ns_ows,m->name,e->content);
1213
1214  xmlAddChild(nc,nc1);
1215
1216}
1217
1218void printOutputDefinitions(xmlDocPtr doc,xmlNodePtr nc,xmlNsPtr ns_wps,xmlNsPtr ns_ows,elements* e,map* m,char* type){
1219  xmlNodePtr nc1,nc2,nc3;
1220  nc1=xmlNewNode(ns_wps, BAD_CAST type);
1221  map *tmp=NULL; 
1222  if(e!=NULL && e->defaults!=NULL)
1223    tmp=e->defaults->content;
1224  else{
1225    /*
1226    dumpElements(e);
1227    */
1228    return;
1229  }
1230  while(tmp!=NULL){
1231    xmlNewProp(nc1,BAD_CAST tmp->name,BAD_CAST tmp->value);
1232    tmp=tmp->next;
1233  }
1234  tmp=getMap(e->defaults->content,"asReference");
1235  if(tmp==NULL)
1236    xmlNewProp(nc1,BAD_CAST "asReference",BAD_CAST "false");
1237
1238  tmp=e->content;
1239
1240  printDescription(nc1,ns_ows,m->name,e->content);
1241
1242  xmlAddChild(nc,nc1);
1243
1244}
1245
1246void printIOType(xmlDocPtr doc,xmlNodePtr nc,xmlNsPtr ns_wps,xmlNsPtr ns_ows,elements* e,maps* m,char* type){
1247  xmlNodePtr nc1,nc2,nc3;
1248  nc1=xmlNewNode(ns_wps, BAD_CAST type);
1249  map *tmp=e->content;
1250#ifdef DEBUG
1251  dumpMap(tmp);
1252  dumpElements(e);
1253#endif
1254  nc2=xmlNewNode(ns_ows, BAD_CAST "Identifier");
1255  nc3=xmlNewText(BAD_CAST e->name);
1256  xmlAddChild(nc2,nc3);
1257  xmlAddChild(nc1,nc2);
1258  xmlAddChild(nc,nc1);
1259  // Extract Title required to be first element in the ZCFG file !
1260  nc2=xmlNewNode(ns_ows, BAD_CAST tmp->name);
1261  nc3=xmlNewText(BAD_CAST _ss(tmp->value));
1262  xmlAddChild(nc2,nc3); 
1263  xmlAddChild(nc1,nc2);
1264  // Extract Abstract required to be second element in the ZCFG file !
1265  tmp=tmp->next;
1266  nc2=xmlNewNode(ns_ows, BAD_CAST tmp->name);
1267  nc3=xmlNewText(BAD_CAST _ss(tmp->value));
1268  xmlAddChild(nc2,nc3); 
1269  xmlAddChild(nc1,nc2);
1270  xmlAddChild(nc,nc1);
1271  tmp=tmp->next;
1272
1273  /**
1274   * IO type Reference or full Data ?
1275   */
1276#ifdef DEBUG
1277  fprintf(stderr,"FORMAT %s %s\n",e->format,e->format);
1278#endif
1279  map *tmpMap=getMap(m->content,"Reference");
1280  if(tmpMap==NULL){
1281    nc2=xmlNewNode(ns_wps, BAD_CAST "Data");
1282    if(strncasecmp(e->format,"LITERALOUTPUT",strlen(e->format))==0)
1283      nc3=xmlNewNode(ns_wps, BAD_CAST "LiteralData");
1284    else
1285      if(strncasecmp(e->format,"COMPLEXOUTPUT",strlen(e->format))==0)
1286        nc3=xmlNewNode(ns_wps, BAD_CAST "ComplexData");
1287      else
1288        nc3=xmlNewNode(ns_wps, BAD_CAST e->format);
1289    tmp=m->content;
1290    while(tmp!=NULL){
1291      if(strncasecmp(tmp->name,"value",strlen(tmp->name))!=0 &&
1292         strncasecmp(tmp->name,"extension",strlen(tmp->name))!=0 &&
1293         strncasecmp(tmp->name,"asReference",strlen(tmp->name))!=0 &&
1294         strncasecmp(tmp->name,"status",strlen(tmp->name))!=0 &&
1295         strncasecmp(tmp->name,"storeExecuteResponse",strlen(tmp->name))!=0 &&
1296         strncasecmp(tmp->name,"extension",strlen(tmp->name))!=0)
1297        xmlNewProp(nc3,BAD_CAST tmp->name,BAD_CAST tmp->value);
1298      tmp=tmp->next;
1299      xmlAddChild(nc2,nc3);
1300    }
1301    tmp=getMap(e->defaults->content,"mimeType");
1302    map* tmp1=getMap(m->content,"encoding");
1303    map* tmp2=getMap(m->content,"mimeType");
1304    map* toto=getMap(m->content,"value");
1305    if((tmp1!=NULL && strncmp(tmp1->value,"base64",6)==0)
1306       || (tmp2!=NULL && (strncmp(tmp2->value,"image/",6)==0
1307                          || strncmp(tmp2->value,"application/",6)==0)) ){
1308      map* rs=getMap(m->content,"size");
1309      if(rs==NULL){
1310        char tmp1[1024];
1311        sprintf(tmp1,"%d",strlen(toto->value));
1312        rs=createMap("z",tmp1);
1313      }
1314      xmlAddChild(nc3,xmlNewText(BAD_CAST base64((const unsigned char*)toto->value,atoi(rs->value))));
1315    }
1316    else if(tmp!=NULL){
1317      if(strncmp(tmp->value,"text/js",4)==0 ||
1318         strncmp(tmp->value,"application/js",14)==0)
1319        xmlAddChild(nc3,xmlNewCDataBlock(doc,BAD_CAST toto->value,strlen(toto->value)));
1320      else
1321        xmlAddChild(nc3,xmlNewText(BAD_CAST toto->value));
1322      xmlAddChild(nc2,nc3);
1323    }
1324    else
1325      xmlAddChild(nc3,xmlNewText(BAD_CAST toto->value));
1326  }
1327  else{
1328    nc3=nc2=xmlNewNode(ns_wps, BAD_CAST "Reference");
1329    xmlNewProp(nc3,BAD_CAST "href",BAD_CAST tmpMap->value);
1330    tmp=m->content;
1331    while(tmp!=NULL){
1332      if(strncasecmp(tmp->name,"value",strlen(tmp->name))!=0 &&
1333         strncasecmp(tmp->name,"reference",strlen(tmp->name))!=0 &&
1334         strncasecmp(tmp->name,"extension",strlen(tmp->name))!=0 &&
1335         strncasecmp(tmp->name,"abstract",strlen(tmp->name))!=0 &&
1336         strncasecmp(tmp->name,"status",strlen(tmp->name))!=0 &&
1337         strncasecmp(tmp->name,"storeExecuteResponse",strlen(tmp->name))!=0 &&
1338         strncasecmp(tmp->name,"asReference",strlen(tmp->name))!=0)
1339        xmlNewProp(nc3,BAD_CAST tmp->name,BAD_CAST tmp->value);
1340      tmp=tmp->next;
1341      xmlAddChild(nc2,nc3);
1342    }
1343  }
1344
1345  xmlAddChild(nc1,nc2);
1346  xmlAddChild(nc,nc1);
1347
1348}
1349
1350void printDescription(xmlNodePtr root,xmlNsPtr ns_ows,char* identifier,map* amap){
1351  xmlNodePtr nc2 = xmlNewNode(ns_ows, BAD_CAST "Identifier");
1352  xmlAddChild(nc2,xmlNewText(BAD_CAST identifier));
1353  xmlAddChild(root,nc2);
1354  map* tmp=amap;
1355  char *tmp2[2];
1356  tmp2[0]="Title";
1357  tmp2[1]="Abstract";
1358  int j=0;
1359  for(j=0;j<2;j++){
1360    map* tmp1=getMap(tmp,tmp2[j]);
1361    if(tmp1!=NULL){
1362      nc2 = xmlNewNode(ns_ows, BAD_CAST tmp2[j]);
1363      fprintf(stderr,"[%s] \n[%s]\n",tmp1->value,_ss(tmp1->value));
1364      xmlAddChild(nc2,xmlNewText(BAD_CAST _ss(tmp1->value)));
1365      xmlAddChild(root,nc2);
1366    }
1367  }
1368}
1369
1370char* getEncoding(maps* m){
1371  if(m!=NULL){
1372    map* tmp=getMap(m->content,"encoding");
1373    if(tmp!=NULL){
1374      return tmp->value;
1375    }
1376    else
1377      return "UTF-8";
1378  }
1379  else
1380    return "UTF-8"; 
1381}
1382
1383char* getVersion(maps* m){
1384  if(m!=NULL){
1385    map* tmp=getMap(m->content,"version");
1386    if(tmp!=NULL){
1387      return tmp->value;
1388    }
1389    else
1390      return "1.0.0";
1391  }
1392  else
1393    return "1.0.0";
1394}
1395
1396void printExceptionReportResponse(maps* m,map* s){
1397 
1398  int buffersize;
1399  xmlDocPtr doc;
1400  xmlChar *xmlbuff;
1401  xmlNodePtr n;
1402
1403  doc = xmlNewDoc(BAD_CAST "1.0");
1404  maps* tmpMap=getMaps(m,"main");
1405  char *encoding=getEncoding(tmpMap);
1406  if(m!=NULL){
1407    map *tmpSid=getMapFromMaps(m,"lenv","sid");
1408    if(tmpSid!=NULL){
1409      if( getpid()==atoi(tmpSid->value) )
1410        printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
1411    }
1412    else
1413      printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
1414  }else
1415    printf("Content-Type: text/xml; charset=%s\r\nStatus: 200 OK\r\n\r\n",encoding);
1416  n=createExceptionReportNode(m,s,1);
1417  xmlDocSetRootElement(doc, n);
1418  xmlDocDumpFormatMemoryEnc(doc, &xmlbuff, &buffersize, encoding, 1);
1419  printf("%s",xmlbuff);
1420  fflush(stdout);
1421  xmlFreeDoc(doc);
1422  xmlFree(xmlbuff);
1423  xmlCleanupParser();
1424}
1425
1426xmlNodePtr createExceptionReportNode(maps* m,map* s,int use_ns){
1427 
1428  int buffersize;
1429  xmlChar *xmlbuff;
1430  xmlNsPtr ns,ns_ows,ns_xlink,ns_xsi;
1431  xmlNodePtr n,nc,nc1,nc2;
1432
1433  maps* tmpMap=getMaps(m,"main");
1434
1435  ns=xmlNewNs(NULL,BAD_CAST "http://www.opengis.net/ows/1.1",BAD_CAST "ows");
1436  n = xmlNewNode(ns, BAD_CAST "ExceptionReport");
1437
1438  if(use_ns==1){
1439    ns_ows=xmlNewNs(n,BAD_CAST "http://www.opengis.net/ows/1.1",BAD_CAST "ows");
1440    int xsiId=zooXmlAddNs(n,"http://www.w3.org/2001/XMLSchema-instance","xsi");
1441    ns_xsi=usedNs[xsiId];
1442    int xlinkId=zooXmlAddNs(n,"http://www.w3.org/1999/xlink","xlink");
1443    ns_xlink=usedNs[xlinkId];
1444    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");
1445  }
1446  addLangAttr(n,m);
1447  xmlNewProp(n,BAD_CAST "version",BAD_CAST "1.1.0");
1448 
1449  nc = xmlNewNode(ns, BAD_CAST "Exception");
1450
1451  map* tmp=getMap(s,"code");
1452  if(tmp!=NULL)
1453    xmlNewProp(nc,BAD_CAST "exceptionCode",BAD_CAST tmp->value);
1454  else
1455    xmlNewProp(nc,BAD_CAST "exceptionCode",BAD_CAST "NoApplicableCode");
1456
1457  tmp=getMap(s,"text");
1458  nc1 = xmlNewNode(ns, BAD_CAST "ExceptionText");
1459  nc2=NULL;
1460  if(tmp!=NULL){
1461    xmlNodeSetContent(nc1, BAD_CAST tmp->value);
1462  }
1463  else{
1464    xmlNodeSetContent(nc1, BAD_CAST _("No debug message available"));
1465  }
1466  xmlAddChild(nc,nc1);
1467  xmlAddChild(n,nc);
1468  return n;
1469}
1470
1471
1472void outputResponse(service* s,maps* request_inputs,maps* request_outputs,
1473                    map* request_inputs1,int cpid,maps* m,int res){
1474#ifdef DEBUG
1475  dumpMaps(request_inputs);
1476  dumpMaps(request_outputs);
1477  fprintf(stderr,"printProcessResponse\n");
1478#endif
1479  map* toto=getMap(request_inputs1,"RawDataOutput");
1480  int asRaw=0;
1481  if(toto!=NULL)
1482    asRaw=1;
1483 
1484  if(asRaw==0){
1485#ifdef DEBUG
1486    fprintf(stderr,"REQUEST_OUTPUTS FINAL\n");
1487    dumpMaps(request_outputs);
1488#endif
1489    toto=getMap(request_outputs->content,"asReference");
1490    if(toto!=NULL && strcasecmp(toto->value,"true")==0){
1491      toto=getMap(request_outputs->content,"extension");
1492      map *tmp1=getMapFromMaps(m,"main","tmpPath");
1493      char *file_name=(char*)malloc((strlen(tmp1->value)+strlen(s->name)+strlen(toto->value)+13)*sizeof(char));
1494      sprintf(file_name,"%s/%s_%i.%s",tmp1->value,s->name,cpid+100000,toto->value);
1495      FILE *ofile=fopen(file_name,"w");
1496      map *tmp2=getMapFromMaps(m,"main","tmpUrl");
1497      map *tmp3=getMapFromMaps(m,"main","serverAddress");
1498      char *file_url=(char*)malloc((strlen(tmp3->value)+strlen(tmp2->value)+strlen(s->name)+strlen(toto->value)+13)*sizeof(char));
1499      sprintf(file_url,"%s/%s/%s_%i.%s",tmp3->value,tmp2->value,s->name,cpid+100000,toto->value);
1500      addToMap(request_outputs->content,"Reference",file_url);
1501      toto=getMap(request_outputs->content,"value");
1502      if(toto!=NULL)
1503        fwrite(toto->value,sizeof(char),strlen(toto->value),ofile);
1504      fclose(ofile);
1505      free(file_name);
1506      free(file_url);
1507    }
1508    map *r_inputs=getMap(s->content,"serviceProvider");
1509#ifdef DEBUG
1510    fprintf(stderr,"SERVICE : %s\n",r_inputs->value);
1511    dumpMaps(m);
1512#endif
1513    printProcessResponse(m,request_inputs1,cpid,
1514                         s,r_inputs->value,res,
1515                         request_inputs,
1516                         request_outputs);
1517  }
1518  else
1519    if(res!=SERVICE_FAILED){
1520      /**
1521       * We get the first output only !!
1522       */
1523      toto=getMap(request_outputs->content,"value");
1524      if(toto==NULL){
1525        map * errormap = createMap("text",_("Unable to fetch any result"));
1526        addToMap(errormap,"code", "InternalError");
1527        printExceptionReportResponse(m,errormap);
1528        freeMap(&errormap);
1529        free(errormap);
1530      }
1531      char mime[1024];
1532      map* mi=getMap(request_outputs->content,"mimeType");
1533#ifdef DEBUG
1534      fprintf(stderr,"SERVICE OUTPUTS\n");
1535      dumpMaps(request_outputs);
1536      fprintf(stderr,"SERVICE OUTPUTS\n");
1537#endif
1538      map* en=getMap(request_outputs->content,"encoding");
1539      if(mi!=NULL && en!=NULL)
1540        sprintf(mime,
1541                "Content-Type: %s; charset=%s\r\nStatus: 200 OK\r\n\r\n",
1542                mi->value,en->value);
1543      else
1544        if(mi!=NULL)
1545          sprintf(mime,
1546                  "Content-Type: %s; charset=UTF-8\r\nStatus: 200 OK\r\n\r\n",
1547                  mi->value);
1548        else
1549          sprintf(mime,"Content-Type: text/plain; charset=utf-8\r\nStatus: 200 OK\r\n\r\n");
1550      printf("%s",mime);
1551      if(mi!=NULL && strncmp(mi->value,"image",5)==0){
1552        map* rs=getMapFromMaps(request_outputs,request_outputs->name,"size");
1553        fwrite(toto->value,atoi(rs->value),1,stdout);
1554      }
1555      else
1556        printf("%s",toto->value);
1557#ifdef DEBUG
1558      dumpMap(toto);
1559#endif
1560    }else{
1561      char tmp[1024];
1562      map * errormap;
1563      map *lenv;
1564      lenv=getMapFromMaps(m,"lenv","message");
1565      if(lenv!=NULL)
1566        sprintf(tmp,_("Unable to run the Service. The message returned back by the Service was the following : %s"),lenv->value);
1567      else
1568        sprintf(tmp,_("Unable to run the Service. No more information was returned back by the Service."));
1569      errormap = createMap("text",tmp);     
1570      addToMap(errormap,"code", "InternalError");
1571      printExceptionReportResponse(m,errormap);
1572      freeMap(&errormap);
1573      free(errormap);
1574    }
1575}
1576
1577char *base64(const unsigned char *input, int length)
1578{
1579  BIO *bmem, *b64;
1580  BUF_MEM *bptr;
1581
1582  b64 = BIO_new(BIO_f_base64());
1583  bmem = BIO_new(BIO_s_mem());
1584  b64 = BIO_push(b64, bmem);
1585  BIO_write(b64, input, length);
1586  BIO_flush(b64);
1587  BIO_get_mem_ptr(b64, &bptr);
1588
1589  char *buff = (char *)malloc(bptr->length);
1590  memcpy(buff, bptr->data, bptr->length-1);
1591  buff[bptr->length-1] = 0;
1592
1593  BIO_free_all(b64);
1594
1595  fprintf(stderr,"BASE64 [%s] \n",buff);
1596  return buff;
1597}
1598
1599char* addDefaultValues(maps** out,elements* in,maps* m,char* type){
1600  elements* tmpInputs=in;
1601  maps* out1=*out;
1602  while(tmpInputs!=NULL){
1603    maps *tmpMaps=getMaps(out1,tmpInputs->name);
1604    if(tmpMaps==NULL){
1605      map* tmpMap1=getMap(tmpInputs->content,"minOccurs");
1606      if(strncmp(type,"inputs",6)==0)
1607        if(tmpMap1!=NULL && atoi(tmpMap1->value)>=1){
1608          return tmpInputs->name;
1609        }
1610      maps* tmpMaps2=(maps*)malloc(MAPS_SIZE);
1611      tmpMaps2->name=strdup((char*)tmpInputs->name);
1612      tmpMaps2->content=NULL;
1613      tmpMaps2->next=NULL;
1614      iotype* tmpIoType=tmpInputs->defaults;
1615      while(tmpIoType!=NULL){
1616        addMapToMap(&tmpMaps2->content,tmpIoType->content);
1617        tmpIoType=tmpIoType->next;
1618      }
1619      map *tmpMap=getMap(tmpMaps2->content,"value");
1620      if(tmpMap==NULL)
1621        addToMap(tmpMaps2->content,"value","NULL");
1622      if(out1==NULL){
1623        *out=dupMaps(&tmpMaps2);
1624      }
1625      else
1626        addMapsToMaps(&out1,tmpMaps2);
1627      freeMaps(&tmpMaps2);
1628      free(tmpMaps2);
1629      tmpMaps2=NULL;
1630    }
1631    else{
1632      map* tmpContent=tmpInputs->defaults->content;
1633     
1634      map* cval=NULL;
1635     
1636      while(tmpContent!=NULL){
1637        if((cval=getMap(tmpMaps->content,tmpContent->name))==NULL){
1638#ifdef DEBUG
1639          fprintf(stderr,"addDefaultValues %s => %s\n",tmpContent->name,tmpContent->value);
1640#endif
1641          if(tmpMaps->content==NULL)
1642            tmpMaps->content=createMap(tmpContent->name,tmpContent->value);
1643          else
1644            addToMap(tmpMaps->content,tmpContent->name,tmpContent->value);
1645        }
1646        tmpContent=tmpContent->next;
1647      }
1648    }
1649    tmpInputs=tmpInputs->next;
1650  }
1651  return "";
1652}
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